Recuperando tx.origin y msg.sender de datos de blockchain

En Solidity, el origen y el remitente se pueden diferenciar fácilmente a través de tx.origin y msg.sender , respectivamente.

¿También es posible obtener tanto el remitente como el origen de una transacción específica a partir de los datos de la propia cadena de bloques? El campo from obtenido con getTransaction y getTransactionReceipt parece ser siempre tx.origin .

Específicamente, me gustaría hacerlo con la API de JS. Sospecho que de alguna manera procesar la información en los registros de transacciones en el recibo de la transacción es probablemente una forma de hacerlo, pero aún no he descubierto cómo (aunque también esperaría una forma más simple).

Respuestas (1)

TLDR: no hay una manera fácil o API para obtener las msg.senderllamadas de mensajes (internos).

En el protocolo Ethereum solo hay transacciones y llamadas de mensajes. Una transacción es un tipo de llamada de mensaje, y ambos tx.originy msg.sendersiempre serán el valor del fromcampo.

Una transacción puede realizar otras llamadas de mensajes, pero estas no son transacciones (a pesar de que un popular explorador de cadenas de bloques las etiqueta incorrectamente como "transacciones internas"). Estas llamadas de mensajes (internos) no se publican en la cadena de bloques, por lo que no hay una manera fácil ni una API para obtener su archivo msg.sender. Para averiguar cómo se llaman los contratos entre sí, la transacción debe procesarse a través de EVM (por ejemplo, https://github.com/ethereumjs/ethereumjs-vm ).


Si es el autor de los contratos, cada vez que se invoca un contrato, podría usar un evento para emitir el valor de msg.sender, y luego podría usar getTransactionReceipty analizar los registros.