Go-Ethereum

如何獲取非常量事務函式返回的值?

  • September 6, 2021

根據我的理解,當我在合約中呼叫一個沒有交易的常量函式時,如果該函式返回一些結果,我可以在 EthereumJ 或 Go-Ethereum 中得到它,但是當在函式上執行交易時,它會返回一個十六進制價值。請建議如何從已執行交易的函式中獲取返回值。

您需要使用事件,請參見範例:

contract answer{
 // ...
 event VoteEvent(string ID, bool returnValue);

 function vote(string ID, uint qNum, uint ans) returns (bool) {
   // ...
   VoteEvent(ID, true);
   return true;
 }
}

debug_traceTransaction您可以通過在 Geth 中呼叫並查看跟踪中的最後一步來獲取從事務返回的值。它通常是一個RETURN操作碼,因此前 2 個堆棧值給出了記憶體中預期返回數據的偏移量和長度。然後,您可以使用 ABI 相應地格式化此數據。

這是一些在 Python 中實現此目的的範常式式碼。step是通過呼叫獲得的堆棧跟踪的最後一步debug_traceTransactionabi是被呼叫的合約方法的abi。

from eth_abi import decode_abi
from hexbytes import HexBytes


def get_return_value(step, abi):
   offset = int(step['stack'][-1], 16) * 2
   length = int(step['stack'][-2], 16) * 2
   memory = HexBytes("".join(step['memory'])[offset:offset+length])
   return decode_abi([i['type'] for i in abi['outputs']], memory)

引用自:https://ethereum.stackexchange.com/questions/6380