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?
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.
Edmundo Edgar
dino anastos
Edmundo Edgar
romano scher