我们在做去区块链数字钱包,交易所等产品的时候,任何涉及到区块链交易的场合,都需要结合共识算法来考虑交易确认数的问题。
什么是交易确认数
imToken (数字货币钱包)
在使用 imToken 进行转账的时候,如果注意查看交易记录,会看到一个进度条,进度条右边有个如下图所示 “4/12” 字样的数字,并且过几秒钟这个数字会变为 “5/12”,“6/12” ... 一直到 “12/12”。这里显示的就是确认数,“4/12” 表示这笔交易需要 12 个确认,当前已经有了 4 个确认。
etherscan (区块链浏览器)
在 etherscan 上查看交易的时候,如果注意观察,在 Block Height 这一栏,会显示 xxxx(xxx block confirmations) 的字样,在下图这个例子中,显示的就是 6246347(21325 block confirmations)。这里面的 “21325 block confirmations” 就是说明该交易已经有了 21325 个区块确认,过段时间再看同一个交易,这个确认数会不断增加。
究竟什么是 “确认”
上面我们看到 imToken 和 etherscan 上显示的都有交易的确认数。那么究竟什么是 “确认”,我们该如何理解它呢?
这就和区块链的链式结构有关了,一个极度抽象的区块链的链式结构是下面这个样子的。
当我们提交一个交易,正常情况下,这个交易最终会被矿工放到某个区块中,这个时候,我们可以说,这笔交易获得了 0 个确认。当有另外一个区块链到这笔交易所在区块,也就是把这笔交易所在区块为父区块时,我们就说这笔交易获得了 1 个确认,以此类推。一笔交易获得了多少个确认,就是这笔交易所在区块后面又链接了多少个区块。
那问题又来了,交易被打包到交易里面不就可以了么?为啥还要关注确认数呢?
为啥要关注确认数
因为区块链有可能分叉啊!!!
如上图所示,如果我们的交易被悲催的打包到了蓝色区块里,交易就有被撤销的风险,因为当一个区块被认为是非主链时,区块里的交易都会被回滚,这个时候交易发送者再发起一笔交易就有可能把原来这笔交易冲掉。
如何计算确认数
公式很简单:确认数 = 当前区块高度 - 指定交易所在区块高度
有的同学可能直接就知道怎么做了:
- 提交交易
- 通过交易回执获取交易所在区块高度,并记下该区块高度
- 定时获取当前区块高度
- 当前区块高度减去第 2 步记录的区块高度,得到确认数
有毛病么?
毛病大了
这样去算确认数,和不算没有区别。
正确的做法是怎样的呢?
- 提交交易,得到交易哈希
- 定时获取当前区块高度,并使用交易哈希获取交易所在区块高度,两者相减,得到确认数
看到差别了么?
确认数多少合适
比特币是 6 个确认,以太坊是 12 个确认,EOS 是 15 个确认。
每个交易都需要去监控确认数么
一般来说,发生跨主体资产转移的交易,最好都进行确认数监控。常见的场景是从第三方接收一笔转账。
像通过智能合约批量给用户空投代币这种场景,我看就算了吧,你说呢?
结语
实际做项目的时候,很多同学都不知道怎么去算这个确认数。写下此文,希望能给你带来一些帮助。还有什么不清楚的,欢迎给我留言或加我微信联系。