首页 > 解决方案 > 类工厂智能合约的构造器不断还原

问题描述

我正在使用 2 份合同,一份管理用户对特定足球比赛的投注,另一份(工厂风格)生成这些单独的合同以单独管理。

生成器合约是这样的:

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);
    }
}

管理合约从生成器接收数据以定义管理器和匹配值,如下(短版):

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 中部署生成器合约,就会导致恢复错误。如果我在管理合同中删除生成器的实例并在两个合同中重复构造函数参数,它可以工作,但我想避免冗余并自动获取已经存储在生成器变量中的值。

标签: ethereumsolidity

解决方案


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

生成器.sol 文件

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 文件

 pragma solidity ^0.8.0;
 interface IGenerator{
     function owner() external view returns (address);
     function matchGenerated() external view returns (string)
 }

Management.sol 文件

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();
}

正如您在上面看到的,我已经公开了管理所需的所有生成器功能,并将两者的定义分开。试试看它是否有效,如果没有,让我们知道新的错误消息是什么。


推荐阅读