0

我刚开始使用solidity,我已经使用truffle编译并部署代码到ganache,一切正常,我可以调用代码中的其他函数,但是有些函数只有所有者才能访问,代码似乎使用 keccak256 来取回调用函数的地址并确定是否允许调用者地址,我尝试使用此网站对我的 eth 地址进行哈希处理:

https://emn178.github.io/online-tools/keccak_256.html

然后在再次重新编译之前将哈希添加到代码中,但调用所有者函数仍然会抛出此错误:

“错误:处理事务时出现 VM 异常:还原”

我究竟做错了什么 ?

这是带有原始哈希的代码。

modifier onlyOwner(){
    address _customerAddress = msg.sender;
    require(owners[keccak256(_customerAddress)]);
    _;
}

// owners list
mapping(bytes32 => bool) public owners;


function PetShop()
    public
{
    // add owners here
    owners[0x66e62cf7a807daaf3e42f7af3befe7b2416a79ba5348820245a69fe701f80eb4] = true;   
}

/*----------  Owner ONLY FUNCTIONS  ----------*/

function disableDogs() 
    onlyOwner()
    public
{
    onlyDogs = false;
}

/*-----replace owner ------*/
function setOwner(bytes32 _identifier, bool _status)
    onlyOwner()
    public
{
    owners[_identifier] = _status;
}

/*-----set price for pet adoption----*/
function setAdoptionRequirement(uint256 _amountOfTokens)
    onlyOwner()
    public
{
    AdoptionRequirement = _amountOfTokens;
}
4

2 回答 2

1

Solidity 中的 keccak256 实现以不同的方式存储数据。

keccak256(...) 返回 (bytes32):计算(紧密打包的)参数的 Ethereum-SHA-3 (Keccak-256) 哈希

只需在创建合约时自己使用该函数:

function PetShop() public {
    // add owners here
    owners[keccak256(msg.sender)] = true;   
}
于 2018-04-12T18:27:09.600 回答
0

截至目前

 // .encodePacked merges inputs together
 owners[keccak256(abi.encodePacked(_text, _num, _addr))}=true

abi.encodePacked() ,Solidity 支持非标准打包模式,其中:

  • 小于 32 字节的类型既不补零也不扩展符号

  • 动态类型是就地编码的,没有长度。

  • 数组元素被填充,但仍就地编码

于 2021-11-07T05:45:00.847 回答