He compilado el siguiente código de Solidity:
pragma solidity ^0.4.9;
import "./Callee.sol";
contract Caller{
function call(address callee_address){
Callee callee = Callee(callee_address);
callee.callee_function();
}
}
Esto se convierte en el siguiente EVM: http://pastebin.com/BeUPghsT
No entiendo el siguiente fragmento de código. Solo el código después de la dirección 0x1c se copia en el bytearray del contrato al momento de la ejecución. Entonces, todas las direcciones deben ser 0x1c más bajas que lo que se indica aquí.
Address 0x1c
PUSH1 0x60
PUSH1 0x40
MSTORE
PUSH1 0x00
CALLDATALOAD
Address 0x24
PUSH29 0x0100000000000000000000000000000000000000000000000000000000
Address 0x42
SWAP1
DIV
PUSH4 0xf55332ab
EQ
PUSH1 0x3a
JUMPI
JUMPDEST
UNKNOWN OPCODE "0xFE"
¿CALLDATALOAD coloca el argumento de la dirección (callee_address) en la pila? Si es así, parece que se llama al código de operación desconocido FE (¿una forma de detener toda ejecución?) Si la dirección no tiene 0xf55332ab
como sus primeros cuatro bytes. ¿Se entiende correctamente?
¿Por qué la dirección debe comenzar con 0xf55332ab
? No hay sumas de verificación en las direcciones de Ethereum, ¿verdad?
¿Estoy en lo cierto al entender que aquí es donde aterriza una llamada a la función o es un código muerto?
La ejecución de código en EVM siempre comienza con PC=0. Entonces, el método al que ha llamado salta a un segmento de código similar a un interruptor al comienzo del código de bytes del EVM.
CALLDATALOAD no es el argumento dado a la función "llamar". CALLDATALOAD es la firma de la función que se calcula como web3.sha3('call(address)').substr(0,10)
donde "llamada" es el nombre de la función en este ejemplo, y "dirección" es el tipo de argumento (o el tipo de parámetro, si se quiere) que toma la función. ¡Y he aquí! web3.sha3('initNumbers()').substr(0,10)=0xf55332ab
.
Por lo tanto, se llama a 0xFE (la detención) si llama a algo que no sea el método "llamar" con el conjunto correcto de argumentos en este contrato implementado. En otras palabras: el inicio del contrato EVM actúa como una declaración de cambio que lo envía al método correcto dentro del contrato. Este tipo de estructura se llama tabla de salto.
k06a
Thorkil Vaerge