我有一份合同,我希望在代码中不使用set地址的情况下为我的合同设置所有者。共建合同代码:
function StepanToken2 (address _ownerFirst, address _ownerSecond){
ownerFirst = _ownerFirst;
ownerSecond = _ownerSecond;
balances[ownerFirst] = SafeMath.div(totalTokens, 3);
balances[ownerSecond] = SafeMath.sub( totalTokens, balances[ownerFirst]);
}
我可以用myEtherWallet或其他方式设置所有者吗?
发布于 2017-09-19 18:56:50
设置所有者(S)的最简单方法是这样做:
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
}
您在第一次初始化时即自己创建契约的所有者,然后您可以自由地添加和删除所有者。您还可以对以下内容执行主管理概念:
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
}
这样,您的其他管理员都不能删除主管理员。
还有其他限制功能的方法,如:
modifier isContract() {
require(address(this) == msg.sender);
_;
}
这将功能限制在契约地址本身上。
希望这回答了你的问题。
https://ethereum.stackexchange.com/questions/26726
复制相似问题