¿Por qué el código de solidez compilado hace esta verificación en el argumento con el que fue llamado?

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 0xf55332abcomo 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?

Sugeriría visitar este recurso para descompilar el contrato inteligente en un código similar a la solidez y obtener más información sobre el código de bytes: ethervm.io
Ese sitio web parece un recurso realmente bueno si desea comprender la máquina virtual que ejecuta los contratos inteligentes de Ethereum.

Respuestas (1)

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.