如何在 Solidity 中获取 keccak256 哈希

How to get keccak256 hash in Solidity

我刚开始接触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;
}

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

keccak256(...) returns (bytes32): compute the Ethereum-SHA-3 (Keccak-256) hash of the (tightly packed) arguments

创建合约时自己使用函数即可:

function PetShop() public {
    // add owners here
    owners[keccak256(msg.sender)] = true;   
}

截至目前

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

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

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

  • 动态类型就地编码并且没有长度。

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