Go-Ethereum
如何獲取非常量事務函式返回的值?
根據我的理解,當我在合約中呼叫一個沒有交易的常量函式時,如果該函式返回一些結果,我可以在 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_traceTransaction
,abi
是被呼叫的合約方法的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)