Как получить хеш keccak256 в Солидности
Я только начал с твердости, я использовал трюфель для компиляции и развертывания кода на ganache, все работает, как я ожидал, я могу вызывать другие функции в коде, но есть определенные функции, к которым может получить доступ только владелец, код кажется, использует keccak256, чтобы вернуть адрес, вызывающий функцию, и определить, разрешен ли адрес вызывающего абонента. Я попытался хешировать свой адрес eth с помощью этого веб-сайта:
https://emn178.github.io/online-tools/keccak_256.html
и затем добавьте хэш в код перед повторной компиляцией, но вызов функции владельца все еще выдает эту ошибку:
"Ошибка: исключение виртуальной машины при обработке транзакции: возврат"
Что я делаю неправильно?
Вот код с оригинальным хешем.
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;
}
2 ответа
Реализация keccak256 в Solidity сохраняет данные по-разному.
keccak256 (...) возвращает (bytes32): вычисляет хэш Ethereum-SHA-3 (Keccak-256) (плотно упакованных) аргументов
Просто используйте функцию самостоятельно при создании договора:
function PetShop() public {
// add owners here
owners[keccak256(msg.sender)] = true;
}
на данный момент
owners[keccak256(abi.encodePacked(_text, _num, _addr))}=true
abi.encodePacked(), Solidity поддерживает нестандартный упакованный режим, в котором:
типы короче 32 байтов не дополняются нулями и не расширяются по знакам
динамические типы кодируются на месте и без длины.
элементы массива дополнены, но по-прежнему кодируются на месте