以太坊學習(7)利用RPC-JSON【post|get】與節點進行互動【2】關於呼叫eth_sendTransaction失敗的檢查方法
關於呼叫eth_sendTransaction失敗的檢查方法
本篇主要講利用JSON-RPC介面呼叫以太坊中已經部署好的合約函式時,如果出現呼叫失敗的檢查方法。
前置知識:
- 呼叫eth_sendTransaction所需的abi編碼:https://www.jianshu.com/p/e8263bdb7dcf
一、假定我們有這麼一個合約
pragma solidity ^0.4.0; contract aPlusb{ function aPlusb(){} event happen(uint input,uint output); function plus(address addr,uint a,uint b) returns (uint){ uint aa; uint bb; uint cc; uint dd; aa+=bb; bb+=1; cc+=3; dd+=cc; happen(a,a+1); return a+1; } }
我們的目標是通過JSON-RPC介面呼叫這個合約中的plus函式
二、假定我們已經封裝好這個eth_sendTransaction【這裡暫不提供,需要的請聯絡】
三、我們可以使用上述封裝好的函式進行呼叫
四、呼叫eth_sendTransaction後,會返回一個交易雜湊,我們用它來檢查呼叫的情況
這是返回的交易雜湊:
檢查交易情況:
- 在geth客戶端輸入如下:
- 注意:要與返回的雜湊對應
直接返回null,因為還沒開始挖礦確認。
確認後,再次檢查交易情況:
- 可以看到:logs並沒有返回事件,表明呼叫失敗
- 我們再看gas使用情況:已經達到了傳入引數限制,呼叫失敗
- 這一次呼叫是失敗了的
五、現在開始檢查
1、先來檢查一下呼叫時input的data
在geth客戶端輸入:
eth.getTransaction("0x12bf6dcf88c305b03f07e135a71be36b0c013031a8b3093a7529a319cc1b1215")
返回:
2、如何確認input的data是否正確呢?
(1)快速檢查func選擇器
由前置的資料可以知道,func選擇器是input的data的前4Bytes,即前8位,按上圖來看,就是0x40761d35,我們可以通過remix裡面的detail來檢查是否正確。
由此對比,可以看見我們的func寫錯了。現在回程式碼看一下:
確實是多了一個點‘.’
(2)如果func檢查正確的話,如何檢查data剩下的部分?
快速法:直接在remix裡面呼叫一次,記錄其交易雜湊,然後在geth客戶端裡面查詢,對比自己程式呼叫的交易input
a、在remix裡面呼叫
b、呼叫成功後,複製其交易雜湊
c、在geth裡面檢查
eth.getTransaction("0x99239aeee8e25b5be68dc62fbf5ab1a03f2eb592bda31d65de6d0effeeedf12e")
對比自己程式呼叫的交易發起的input:
即可快速定位錯誤
(3)如果在前置資料中看不懂input 的data如何構造,也可以通過這種方法來幫助理解data的構造,即檢視正確的input例子
(4)這裡有個線上網站,可以直接構造abi的data,可以幫助理解:https://abi.hashex.org/
六、修改錯誤,重新呼叫
geth裡檢查:
- 可以看到:
- 這一次呼叫Log有返回,表示呼叫成功
- 而且gas的消耗也正常了
七、另外,呼叫的時候注意gas的limit限制,如果不設定,會有預設值,可能不夠消耗。
建議:先到remix的detail裡面去看一下大概的gas 消耗,或者使用gasestimate?