转载微信订阅号(区块链之录)文章:
上篇文章为大家讲解了如何在前端通过web3j来调用合约方法,我们知道以太坊的平均出块时间是15s(设计细节可以参考:
https://github.com/ethereum/wiki/wiki/Design-Rationale),那么当用户在页面上进行操作调用了合约方法后,DAPP需要很快做出响应,而不是等15s后才提示用户操作完成与否,此时就需要用到上篇文章里提到的调用合约方法后返回的交易hash,下面会讲解该hash该怎么使用。
通常来说我们需要把该交易hash传递到后台,在前端给出提示信息,告诉用户该操作正在确认中,然后给出一个查看结果的页面或者在交易结束后给出推送信息。
此时在后台,我们可以简单采用轮询的方式来验证该交易是否已经完成。
以上篇文章里的sendCoin方法为例,当在前端调用该方法后,首先把产生的hash值传到后台保持到数据库中,然后通过轮询该hash的状态来验证,代码如下:
letWeb3 =require('web3');
letmysql =require('mysql');
//初始化数据库连接
varconnection = mysql.createConnection({ host :'127.0.0.1', user :'root', password :'123456', database :'test'
});connection.connect();
letweb3;
//连接到私链
web3 =newWeb3(newWeb3.providers.HttpProvider('http://127.0.0.1:8545'));
varcontractInstance = web3.eth.contract(ABI).at(contractHash);
varquerySql ='select hash from tbl_txn where status = 0';
while(true){ connection.query(querySql, (err,rows) => {
if
(!err){
for
(vari =0; i < rows.length; i++) {
var
receipt = rows[i].hash; web3.eth.getTransactionReceipt(receipt,(err,result) => {//从event中读取数据
if
(result.logs[0]){
var
data = result.logs[0].data;
var
address_from = data.substring(0,66);
var
address_to = data.substring(66,130);
var
value = data.substring(130,194);
//输出或者存库,update db status}
//调用合约方法
contractInstance.getBalance.call(account, (err,res) => {
console
.log(res); }); }); } } });}
主要有以下几个步骤:
1) 从数据库中获取保持的未确定状态的交易hash;
2)调用web3j库的getTransactionReceipt方法,如果有结果返回则表示该交易是存在的,此时如果该合约方法有创建event的话,还可以从该event中获取到写入的数据,里面的每个字段都是64位的16进制数据;
3)拿到数据后确认交易完成后,可以更新下db里交易状态;
4)此时还可以和前端一样调用合约里的方法。
网友评论