EOS 根据链Mongo数据判断交易状态
根据几个测试交易对比
- 正常发起普通交易(余额充足,非延迟)
- 正常发起延迟交易(余额充足,延迟)
- 正常发起延迟交易,交易到期前,将转出账户的余额转空(余额不足,延迟)
对比链Mongo表transactions
和transaction_traces
对于transactions
体现了交易所在块是否不可逆irreversible
,而transaction_traces
中
"receipt" : {
"status" : "hard_fail",
...
},
status
状态来判断交易状态。
对于交易对比的1和2对于数据来说只是delay_sec
数量问题,并且交易到期前,数据库中无法查到延迟交易。
1或2与3进行比较,transactions
无关键差别,transaction_traces
中status
状态存在差别。
清洗数据
为了方便数据的使用,最好还是需要单独新洗出一个交易状态表,此表中关键包含,
- 交易id
- 所在块号
- 交易状态
- 是否不可逆
测试数据如下
库名:trx_status
{
"_id" : ObjectId("5fbb8ef5349bfe65ef744506"),
"trx_id" : "c1811e16a77288e3f374faf2eb2b0308d2f480b3414a07357d6e45cf29ffe56e",
"block_num" : 11414152,
"status" : 0,
"irreversible" : true,
"block_time" : ISODate("2020-11-23T10:29:10.000Z"),
"block_timestamp" : NumberLong(1606127350000),
"createdAt" : ISODate("2020-11-23T10:29:09.952Z"),
"updatedAt" : ISODate("2020-11-23T10:31:05.985Z"),
"block_id" : "00ae2a8818a6bd8cd33e9873419ac7258813ea9578dde95c8e0771397351b952"
}
交易等待不可逆
status==0 && irreversible == fasle
交易丢失(丢块)
status==0 && irreversible == fasle && ((current_time - block_time) >((head_block_num - last_irreversible_block_num) * 0.5 + 容差值))
// current_time - block_time 为当前时间与交易创建时间的秒数
// 容差值是为了避免误判,通常为 1-2分钟即可
交易失败
status!=0
因为交易到执行时间前,数据库中没有插入数据,所以没有delayed
事件
当交易不可逆
status==0 && irreversible == true
备注
status的状态
status_enum {
// 这个表示执行成功(所以不需要执行出错逻辑)
executed = 0,
// 客观的来说,执行失败了(或者没有执行),某一个出错逻辑执行了
soft_fail = 1,
// 执行失败了,并且执行的出错逻辑也失败了,所以并没有状态改变
hard_fail = 2,
// 交易被延迟了,计划到未来的某个时间执行
delayed = 3,
// 交易过期了,并且存储空间返还给用户
expired = 4 ///< transaction expired and storage space refuned to user
};
修改配置
config.ini
配置中,去掉onblock
交易,较少垃圾数据
mongodb-filter-out = eosio:onblock: