Abrufen von tx.origin und msg.sender aus Blockchain-Daten

In Solidity können Herkunft und Absender leicht durch tx.origin bzw. msg.sender unterschieden werden.

Ist es auch möglich, sowohl Absender als auch Herkunft einer bestimmten Transaktion aus den Daten in der Blockchain selbst zu erfahren? Das mit getTransaction und getTransactionReceipt erhaltene from -Feld scheint immer tx.origin zu sein .

Konkret möchte ich dies mit der JS-API tun. Ich vermute, dass die Verarbeitung der Informationen in den Transaktionsprotokollen in der Quittung der Transaktion wahrscheinlich ein Weg ist, habe aber noch nicht herausgefunden, wie (obwohl ich auch einen einfacheren Weg erwarten würde).

Antworten (1)

TLDR: Es gibt keine einfache Möglichkeit oder API, um die msg.senderfür (interne) Nachrichtenaufrufe zu erhalten.

Im Ethereum-Protokoll gibt es nur Transaktionen und Nachrichtenaufrufe. Eine Transaktion ist eine Art Nachrichtenaufruf, und beide tx.originund msg.senderwerden immer der Wert des fromFelds sein.

Eine Transaktion kann andere Nachrichtenaufrufe ausführen, aber dies sind keine Transaktionen (auch wenn ein beliebter Blockchain-Explorer sie fälschlicherweise als „interne Transaktionen“ bezeichnet). Diese (internen) Nachrichtenaufrufe werden nicht in der Blockchain veröffentlicht, daher gibt es keine einfache Möglichkeit oder API, ihre msg.sender. Um herauszufinden, wie sich Verträge gegenseitig aufrufen, muss die Transaktion über die EVM verarbeitet werden (z. B. https://github.com/ethereumjs/ethereumjs-vm ).


Wenn Sie der Autor der Verträge sind, könnte jedes Mal, wenn ein Vertrag aufgerufen wird, ein Ereignis verwendet werden, um den Wert von auszugeben, msg.senderund Sie könnten dann die Protokolle verwenden getTransactionReceiptund analysieren.