关于调用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?