如何在 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 字节的类型既不补零也不扩展符号
动态类型就地编码并且没有长度。
数组元素被填充,但仍就地编码
我刚开始接触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 字节的类型既不补零也不扩展符号
动态类型就地编码并且没有长度。
数组元素被填充,但仍就地编码