以太坊学习(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【这里暂不提供,需要的请联系】

以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第1张图片

 三、我们可以使用上述封装好的函数进行调用

以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第2张图片

四、调用eth_sendTransaction后,会返回一个交易哈希,我们用它来检查调用的情况

这是返回的交易哈希:

检查交易情况:

  • 在geth客户端输入如下:
  • 注意:要与返回的哈希对应

 

直接返回null,因为还没开始挖矿确认。

确认后,再次检查交易情况:

以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第3张图片

  • 可以看到:logs并没有返回事件,表明调用失败
  • 我们再看gas使用情况:已经达到了传入参数限制,调用失败
  • 这一次调用是失败了的

五、现在开始检查

1、先来检查一下调用时input的data

在geth客户端输入:

eth.getTransaction("0x12bf6dcf88c305b03f07e135a71be36b0c013031a8b3093a7529a319cc1b1215")

 返回:

以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第4张图片

2、如何确认input的data是否正确呢?

(1)快速检查func选择器

由前置的资料可以知道,func选择器是input的data的前4Bytes,即前8位,按上图来看,就是0x40761d35,我们可以通过remix里面的detail来检查是否正确。

以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第5张图片

以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第6张图片

 由此对比,可以看见我们的func写错了。现在回代码看一下:

以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第7张图片

确实是多了一个点‘.’ 

(2)如果func检查正确的话,如何检查data剩下的部分?

快速法直接在remix里面调用一次,记录其交易哈希,然后在geth客户端里面查询,对比自己程序调用的交易input

a、在remix里面调用

以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第8张图片

b、调用成功后,复制其交易哈希

c、在geth里面检查

eth.getTransaction("0x99239aeee8e25b5be68dc62fbf5ab1a03f2eb592bda31d65de6d0effeeedf12e")

 以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第9张图片

对比自己程序调用的交易发起的input:

 以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第10张图片

即可快速定位错误

(3)如果在前置资料中看不懂input 的data如何构造,也可以通过这种方法来帮助理解data的构造,即查看正确的input例子

(4)这里有个在线网站,可以直接构造abi的data,可以帮助理解:https://abi.hashex.org/

六、修改错误,重新调用

geth里检查: 

以太坊学习(7)利用RPC-JSON【post|get】与节点进行交互【2】关于调用eth_sendTransaction失败的检查方法_第11张图片

  • 可以看到:
  • 这一次调用Log有返回,表示调用成功
  • 而且gas的消耗也正常了

另外,调用的时候注意gas的limit限制,如果不设置,会有默认值,可能不够消耗。

建议:先到remix的detail里面去看一下大概的gas 消耗,或者使用gasestimate? 

你可能感兴趣的:(区块链学习)