ID de método para una función getter generada por Solidity

En solidez, el código de bytes para funciones toma el valor web3.sha3 de un nombre de función y toma los primeros 4 bytes del hash resultante en el formato de 0x00000000

Entonces, si tiene una función llamada totalsupply(), el hash sería 0x18160ddd

Entiendo que las variables públicas tienen captadores creados automáticamente.

Sin embargo, al intentar determinar el código de bytes para una variable pública como 'Nombre'. Asumiría que la función creada es 'Nombre ()' y, por lo tanto, el código de bytes es 0x8052474d.

Sin embargo, no parece funcionar cuando intento llamar a una función usando ese código de bytes.

¿Alguna idea de lo que estoy haciendo mal?

Respuestas (3)

Para una variable pública x, generaré automáticamente el método x(), para que pueda acceder a esta variable de la forma en que llama al método. Doy una demostración simple, de la siguiente manera:

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";
    }

}

Espero que ayude ~

Del ejemplo en la documentación de Solidity , podemos ver que:

0xcdcd77c0: el ID del método. Esto se deriva como los primeros 4 bytes del hash Keccak de la forma ASCII de la firma baz(uint32,bool)

Podemos verificar el hash usando esta herramienta de hash keccak 256 en línea ingresando "baz(uint32,bool)":

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

Además, puede obtener el contrato ABI de etherscan y pegarlo en esta herramienta: https://abi.hashex.org/#

que proporciona entonces los hashes para sus funciones. Parece que necesita ingresar al menos el primer parámetro.

En el navegador solidity se proporciona el código de bytes para todas las funciones en un contrato. No hay necesidad de romperte la cabeza... Lo descubrí momentos después de publicar esto.

¿Descubriste por qué la función Name() era diferente de lo que esperabas?
Estaba en mayúsculas... la función del nombre estaba en minúsculas
Alternativamente, para obtener los nombres de las funciones y sus valores hash, puede ejecutar solc --hashes your_contract.sol
Creo que te refieres a Remix, bajo Solidity Compiler -> Compilation Details -> Function Hashes