1. 程式人生 > >以太坊學習(7)利用RPC-JSON【post|get】與節點進行互動【2】關於呼叫eth_sendTransaction失敗的檢查方法

以太坊學習(7)利用RPC-JSON【post|get】與節點進行互動【2】關於呼叫eth_sendTransaction失敗的檢查方法

關於呼叫eth_sendTransaction失敗的檢查方法


本篇主要講利用JSON-RPC介面呼叫以太坊中已經部署好的合約函式時,如果出現呼叫失敗的檢查方法。


 前置知識:


一、假定我們有這麼一個合約

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?