Aquí hay un ejemplo de solidity docs sobre métodos de tipo de dirección ( call
método específicamente):
dirección nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
nameReg.call("registrar", "MiNombre");
nameReg.call(bytes4(sha3("fun(uint256)")), a);
No puedo entender lo que hace la segunda línea. ¿Llama a la función de reserva con estos dos argumentos? ¿O pasa la cadena MyName al registro de funciones en el contrato nameReg ?
Desde el enlace en la pregunta , la parte importante nameReg.call("register", "MyName")
es (negrita mía):
para interactuar con contratos que no se adhieren a la ABI ,
call
se proporciona la función que toma un número arbitrario de argumentos de cualquier tipo. Estos argumentos se rellenan a 32 bytes y se concatenan.
Mira la nota aquí :
Nota: el ABI es una abstracción que no forma parte del protocolo central de Ethereum. Cualquiera puede definir su propia ABI para sus contratos, y cualquier llamador de dichos contratos tendría que cumplir con esa ABI para obtener resultados significativos. Sin embargo, es más sencillo para todos los desarrolladores usar Solidity, Serpent y web3.js, que cumplen con el ABI anterior.
nameReg.call("register", "MyName")
no invocará register
en un nameReg
contrato compilado por Solidity. La razón es que Solidity no usa "registrar" para buscar "funciones" (usa los primeros 4 bytes como la identificación del método. Por ejemplo, el pseudocódigo EVM que produce Solidity, vea esto ). Aquí hay un código para una prueba rápida :
contract NameReg {
bytes32 public nn;
bytes public calldata;
function register(bytes32 name) {
nn = name;
}
function() {
calldata = msg.data;
}
function doesNotCallRegister() {
this.call("register", "MyName");
}
}
Con un nameReg
contrato compilado por Solidity, nameReg.call("register", "MyName")
invocará la función de respaldo donde msg.data
estará "registrar", "MiNombre" rellenado a 32 bytes y concatenado: 0x72656769737465720000000000000000000000000000000000000000000000004d794e616d650000000000000000000000000000000000000000000000000000
.
Este fragmento de código se basa en uno de los contratos de ejemplo en la página Contratos en la documentación de Solidity:
contract NameReg {
function register(bytes32 name);
function unregister();
}
Asi que:
¿O pasa la cadena MyName al registro de funciones en el contrato nameReg?
Sí.
kk-dev11
ética
nameReg.call("register", "MyName")
pasará más gas: es un.call
y ver Caso 2 de ethereum.stackexchange.com/a/5993/42