Как получить хеш 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 байтов не дополняются нулями и не расширяются по знакам

  • динамические типы кодируются на месте и без длины.

  • элементы массива дополнены, но по-прежнему кодируются на месте

Другие вопросы по тегам