¿Llamada de contrato de un contrato de un contrato?

Según tengo entendido, es posible que un contrato llame a otro contrato usando

othercontractaddress.call(gas_amount).value(eth amount)(tx data). 

O en este caso remitente -> contrato A -> contrato B.

¿Es posible ir un nivel más profundo?

remitente -> contrato A -> contrato B -> contrato C?

¿Algo como el siguiente pseudocódigo?:

   othercontractaddress.call(gas_amount).value(eth amount)(thatothercontract.call(gas_amount).value(eth amount)(2ndtxdata))

Respuestas (1)

Sí, aunque obviamente cada contrato tiene que ejecutar la llamada en sí. Puedes hacer esto 1024 veces hasta llegar a la profundidad máxima. A esa profundidad, todas las llamadas nuevas fallarán. Esto incluso condujo a vulnerabilidades en el pasado.

Dicho esto, EIP-150 aumentó tanto el costo del gas de las llamadas que ya no se puede alcanzar la profundidad máxima.

Eso tiene sentido. ¿Funcionaría algo como el código de llamada que publiqué o sería necesario modificarlo?
No, tendrías que definir cada llamada en el contrato que debe ejecutarla. Por ejemplo, en el contrato A tienes b_addr.call(gas_amount), luego en el contrato B tienes c_addr.call(gas_amount)y así sucesivamente. No puede "condensar" las llamadas en un solo contrato como en su código.
1024 se refiere a la profundidad máxima de la pila local, de la cual cada llamada usará más de 1 (hasta 16 usando Solidity), por lo que la cantidad máxima de llamadas anidadas probablemente sea mucho menor que 1024
Interesante, ¿puedes explicarlo? ¿Por qué una sola llamada en solidez produce un creador de profundidad de llamada que 1?
Como a él no le importa responder, esta es mi propia opinión al respecto: es incorrecta. Una llamada en solidez aumentará la profundidad de la llamada exactamente en uno. Nada de lo que he visto indica lo contrario y, de todos modos, no tendría ningún sentido. Al menos en el nivel de EVM, esto es definitivamente cierto: github.com/ethereum/pyethereum/blob/develop/ethereum/vm.py#L712 : msg.depth + 1para una CALLinstrucción.
¿Puedes escribir una respuesta detallada? @mafrasi2
@ferit ¿Qué otros detalles hay? Creo que he mencionado todo lo que hay que decir sobre esto, excepto publicar el código real en las implementaciones de EVM (bueno, me he vinculado a uno). El EVM no especifica funciones como sugiere el otro usuario, por lo que la pila de llamadas de solidez "intracontrato" no tiene nada que ver con la pila de llamadas "intercontrato" del EVM.