首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在创建契约时将所有者设置为构造函数

如何在创建契约时将所有者设置为构造函数
EN

Ethereum用户
提问于 2017-09-19 17:48:46
回答 1查看 2.2K关注 0票数 1

我有一份合同,我希望在代码中不使用set地址的情况下为我的合同设置所有者。共建合同代码:

代码语言:javascript
运行
复制
function StepanToken2 (address _ownerFirst, address _ownerSecond){
       ownerFirst = _ownerFirst;
       ownerSecond = _ownerSecond;

       balances[ownerFirst] = SafeMath.div(totalTokens, 3);
       balances[ownerSecond] = SafeMath.sub( totalTokens, balances[ownerFirst]);
    }

我可以用myEtherWallet或其他方式设置所有者吗?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2017-09-19 18:56:50

设置所有者(S)的最简单方法是这样做:

代码语言:javascript
运行
复制
pragma solidity ^0.4.0;

contract OwnedContract {

    mapping (address => bool) private _owners;
    mapping (address => uint) private _balances;

    modifier isOwner() {
        require(_owners[msg.sender]);
        _;
    }

    function OwnedContract() {
        _owners[msg.sender] = true;
    }

    function addOwner(string _addr)
        isOwner {
        _owners[parseAddr(_addr)] = true;
    }

    function removeOwner(string _addr)
        isOwner {
        _owners[parseAddr(_addr)] = false;
    }

    // From https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_pre0.4.sol#L157
    function parseAddr(string _a) internal returns (address){
        bytes memory tmp = bytes(_a);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i=2; i<2+2*20; i+=2){
            iaddr *= 256;
            b1 = uint160(tmp[i]);
            b2 = uint160(tmp[i+1]);
            if ((b1 >= 97)&&(b1 <= 102)) b1 -= 87;
            else if ((b1 >= 48)&&(b1 <= 57)) b1 -= 48;
            if ((b2 >= 97)&&(b2 <= 102)) b2 -= 87;
            else if ((b2 >= 48)&&(b2 <= 57)) b2 -= 48;
            iaddr += (b1*16+b2);
        }
        return address(iaddr);
    }

    // ... other functionality

}

您在第一次初始化时即自己创建契约的所有者,然后您可以自由地添加和删除所有者。您还可以对以下内容执行主管理概念:

代码语言:javascript
运行
复制
pragma solidity ^0.4.0;

contract OwnedContract {

    mapping (address => bool) private _owners;
    address private _masterAdmin;

    modifier isOwner() {
        require(_masterAdmin == msg.sender || _owners[msg.sender]);
        _;
    }

    function OwnedContract() {
       _masterAdmin = msg.sender;
    }

    // ... other functionality

}

这样,您的其他管理员都不能删除主管理员。

还有其他限制功能的方法,如:

代码语言:javascript
运行
复制
modifier isContract() {
    require(address(this) == msg.sender);
    _;
}

这将功能限制在契约地址本身上。

希望这回答了你的问题。

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

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

复制
相关文章

相似问题

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