首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Solidity契约:如何将部署程序保存为可以在创建的克隆中调用的存储变量?

Solidity契约:如何将部署程序保存为可以在创建的克隆中调用的存储变量?
EN

Ethereum用户
提问于 2022-09-02 10:47:35
回答 1查看 82关注 0票数 2

我使用的是OpenZeppelin克隆库,这样我的dapp用户就可以创建我的实现契约的克隆。我的dapp将遵循EIP-1167标准.

对于功能,我需要保存部署者地址(实现契约)。传统的方法是在构造函数中这样做,但是克隆契约不读取“创建-代码”,它们只查看“运行时代码”,因此如果我使用构造函数保存部署人员地址,则克隆的合同将无法访问保存的变量(据我所知)。

我想保存部署者地址的原因是因为我希望得到所有克隆合同余额的一定百分比的报酬。

请有人告诉我,我将如何保存部署者的地址,这样我就可以从克隆的合同中得到报酬。我也愿意接受其他途径,只要我能够收到付款给我的部署者的地址。

我的一个想法是将部署者地址(或任何其他个人地址)存储为实现契约中的变量,并将所有付款转移到该地址。这将消除在构造函数中设置部署程序地址的需要。

这是一个很好的方法去做,还是有一个更“正确”的方法,我可以使用这一点?

任何帮助都将不胜感激!提前感谢!

EN

回答 1

Ethereum用户

发布于 2022-09-03 22:56:45

最常用的方法是在实现中有一个initialize函数,您可以在其中存储“一劳永逸”的工厂变量。

因此,例如,实现可能是这样的:

代码语言:javascript
复制
contract Implementation {
    bool private initialized;

    address public deployer;   // aka the factory
    address public user;

    function initialize(address _user) public {
        require(!initialized, "Already initialized!");
        initialized = true;

        deployer = msg.sender;
        user = _user;
    }

    ...
}

部署人员(Factory)必须在部署契约后立即调用initialize函数。示例:

代码语言:javascript
复制
interface IImplementation {
    function initialize(address) external;
}

contract Factory {
    address public implementation = 0x...;

    // an user calls this function to make a new contract (clone)
    function createNewContract() public {
        address newcontract = Clones.clone(implementation);
        IImplementation(newcontract).initialize(msg.sender);
    }

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

https://ethereum.stackexchange.com/questions/134857

复制
相关文章

相似问题

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