Instrumentación EVM

Necesito obtener todas las transacciones internas del contrato . Para hacerlo, necesitaré instrumentar Ethereum EVM.

Mi pregunta es: ¿qué debo hacer para obtener los detalles de la transacción? En este momento, estoy buscando el código, pero si alguien puede indicarme la parte correcta del código, se lo agradeceré.

Sugerencias de mejora de preguntas: (1) especifique lo que quiere decir con "contratar transacciones internas". (2) agregue un enlace al código (parte del código) que está viendo.
Estoy buscando un proyecto go-ethereum en GitHub: github.com/ethereum/go-ethereum
Sí estuve allí. Estoy buscando a alguien que lo hizo para simplificar la tarea.

Respuestas (1)

Para hacer esto, debe definir un recopilador de registros de VM, que implemente StructLogCollector . Esta función se llama en cada paso de la VM y se proporciona con copias de la memoria, la pila y las partes modificadas del almacenamiento, junto con el contador del programa, el código de operación actual, el combustible restante y otros datos. También se llama cuando se produce un error que hace que falle una transacción.

Para extraer los datos que desea, debe estar atento a varias cosas: los códigos de operación 'CREATE', 'CALL', 'CALLCODE' y 'DELEGATECALL', que invocan nuevos contratos o cuentas y potencialmente transfieren valor, y 'SUICIDIO' que devuelve valor a la persona que llama También debe estar atento a cualquier cosa que provoque que se devuelva una llamada y a los errores antes mencionados.

Durante el seguimiento, debe mantener una pila que represente la pila de llamadas realizadas por la transacción actual, con cada marco de pila que contiene una lista de transferencias de valor que se han realizado hasta el momento. Un retorno sin error abre un marco de pila, agregando todas sus transferencias de valor al marco a continuación. Un retorno de error abre el marco, descartando todas las transferencias. Cuando abre el cuadro final, el conjunto de transferencias en él son las que se finalizaron como parte de la transacción.

Una implementación de todo esto se puede ver como parte de mi código Etherquery .