Opcode para sin gasolina dentro de una llamada de mensaje

Según la documentación de Solidity :

Se genera una excepción de estilo requerido en las siguientes situaciones:

...

Si llama a una función a través de una llamada de mensaje pero no finaliza correctamente ( es decir, se queda sin combustible , no tiene una función coincidente o genera una excepción)

...

Internamente, Solidity realiza una operación de reversión (instrucción 0xfd) para una excepción de estilo requerido y ejecuta una operación no válida (instrucción 0xfe) para generar una excepción de estilo de afirmación.

Sin embargo, en esta0xfe transacción se realiza un código de operación (consulte el paso 1394) que se usa para excepciones de estilo de aserción.

¿La documentación es incorrecta o el compilador no sigue la documentación?

Respuestas (1)

Si observa el código fuente de la función retirarTokens

function withdrawToken(address token, uint amount) {
  if (token==0) throw;
  if (tokens[token][msg.sender] < amount) throw;
  tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
  if (!Token(token).transfer(msg.sender, amount)) throw;
  Withdraw(token, msg.sender, amount, tokens[token][msg.sender]);
}

Tiene explícitamente un tiro, y el tiro generará 0xfe.

El contrato se compiló con la versión v0.4.9, y require y assert solo están disponibles a partir de la v0.4.10 .

¿Significa que Token(token).transfer() devuelve falso cuando se queda sin gasolina?
Tiene razón, si una llamada a un subcontrato se queda sin combustible, provocará una excepción y se propagará a la persona que llama.
Entonces, en este caso, ¿no tiene nada que ver con la instrucción throw?
Sí, tienes razón de nuevo. La traza muestra profundidad=2, lo que significa que está dentro de la función de transferencia. Intenta ejecutar SSTORE con 435 gas restante, pero necesita 5000, esto provoca una excepción de falta de gas. La transferencia no devuelve falso porque es una llamada directa, sino que propagará la excepción.
Supongo que el culpable es la versión del compilador. ¿Aparentemente en versiones anteriores usaba 0xfe para quedarse sin gasolina?