Идентификатор метода для сгенерированной Solidity геттерной функции

По существу, байт-код для функций принимает значение web3.sha3 имени функции и первые 4 байта результирующего хэша в формате 0x00000000.

Итак, если у вас есть функция с именем totalsupply(), хэш будет 0x18160ddd.

Я понимаю, что общедоступные переменные имеют автоматически созданные геттеры.

Однако при попытке определить байт-код для общедоступной переменной, такой как «Имя». Я бы предположил, что созданная функция называется «Имя()», и поэтому байт-код равен 0x8052474d.

Однако, похоже, он не работает, когда я пытаюсь вызвать функцию, используя этот байт-код.

Любые мысли о том, что я делаю неправильно?

Ответы (3)

Для общедоступной переменной x я автоматически сгенерирую метод x(), чтобы вы могли получить доступ к этой переменной способом вызова метода. Я даю простую демонстрацию, как показано ниже:

pragma solidity ^0.4.2;

contract test{

    uint public age;

    function test(){
        age = 10;
    }

    function callData() returns (string){
        bool result = this.delegatecall(bytes4(sha3("age()")));
        if (result) {
            return "success";
        }
        return "failed";
    }

}

Надеюсь поможет~

Из примера в документации Solidity мы видим, что:

0xcdcd77c0: идентификатор метода. Это получается как первые 4 байта хэша Keccak формы ASCII подписи baz(uint32,bool)

Мы можем проверить хэш с помощью этого онлайн-инструмента для хеширования keccak 256, введя «baz (uint32, bool)»:

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

Кроме того, вы можете получить ABI контракта от etherscan и вставить его в этот инструмент: https://abi.hashex.org/#

который затем предоставляет хэши для ваших функций. Кажется, вам нужно ввести хотя бы первый параметр.

В браузере солидности указан байт-код для всех функций в контракте. Не нужно ломать голову... Обнаружил это сразу после публикации.

Вы выяснили, почему функция Name() отличается от того, что вы ожидали?
Я писал с заглавной буквы... функция имени была строчной
В качестве альтернативы, чтобы получить имена функций и их хэши, вы можете запустить solc --hashes your_contract.sol
Я думаю, вы имеете в виду Remix в разделе Компилятор Solidity -> Сведения о компиляции -> Хэши функций