首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂式智能合约的构造器不断还原

工厂式智能合约的构造器不断还原
EN

Stack Overflow用户
提问于 2021-07-15 09:19:52
回答 1查看 48关注 0票数 0

我正在处理两个合同,一个管理用户对特定足球比赛的下注,另一个(工厂风格)生成这些单独的合同,以便单独管理。

Generator合同如下:

代码语言:javascript
复制
pragma solidity ^0.8.0;

contract Generator {
    address immutable public owner;
    string public matchGenerated;
    Management[] public bettingHistory;

    constructor(string memory _league, string memory _match) {
        owner = msg.sender;
        matchGenerated = string(abi.encodePacked(_league, "_", _match));
        Management newBetContract = new Management(address(this));
        bettingHistory.push(newBetContract);
    }
}

管理契约从Generator接收数据以定义管理器和匹配值,如下所示(简称):

代码语言:javascript
复制
contract Management {
    address payable immutable public manager;

    string public matchDispute;
    
    Generator generator;

    constructor(address _contract) {
        generator = Generator(_contract);
        manager = payable(generator.owner());
        matchDispute = generator.matchGenerated();
    }

一旦我尝试在Remix中部署Generator契约,就会导致一个还原错误。如果我在管理契约中删除生成器的实例,并在两个契约中重复构造函数参数,它就可以工作,但我希望避免冗余,并自动获取已存储在generator变量中的值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-17 03:08:34

要使用接口实现上述内容,您的解决方案将如下所示:

Generator.sol文件

代码语言:javascript
复制
pragma solidity ^0.8.0;

contract Generator {
    address immutable public owner;
    string public matchGenerated;
    Management[] public bettingHistory;

    constructor(string memory _league, string memory _match) {
        owner = msg.sender;
        matchGenerated = string(abi.encodePacked(_league, "_", _match));
        Management newBetContract = new Management(address(this));
        bettingHistory.push(newBetContract);
    }
}

IGenerator.sol文件

代码语言:javascript
复制
 pragma solidity ^0.8.0;
 interface IGenerator{
     function owner() external view returns (address);
     function matchGenerated() external view returns (string)
 }

Management.sol文件

代码语言:javascript
复制
pragma solidity ^0.8.0;

import "IGenerator.sol";

contract Management {
address payable immutable public manager;

string public matchDispute;

constructor(address _contract) {
    manager = payable(IGenerator(_contract).owner());
    matchDispute = IGenerator(_contract).matchGenerated();
}

正如您在上面看到的,我已经公开了管理所需的Generator的所有函数,并将两者的定义分开。试一试,看看它是否工作,如果不能,让我们知道新的错误消息是什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68386743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档