为什么有的区块没有打包交易,是矿工忘记了吗?

2019-02-20 10:30 来源:白话区块链 阅读:8299
为什么有的区块没有打包交易,是矿工忘记了吗?

作者 | 晏文春出品

白话区块链在《比特币矿工一天赚多少钱?》一文介绍过:比特币出块奖励包括两部分:系统奖励(也称Coinbase奖励)和交易手续费奖励(也称矿工费)。矿工打包交易到所挖出的区块里,才能得到该笔交易的手续费。

我们做一个类比,这个问题就非常好理解了:

挖出区块的矿工相当于是客车司机,除了系统会给客车司机奖励以外,客车司机每招揽一名乘客,就能得到一笔乘车费,客车司机好不容易抢到一次发车权,会拼命往车里塞乘客,直到满座(车的容量是有有限的)。

矿工都是理智的,按理说矿工为了利益最大化,在待确认的交易足够多的情况下,每个区块都会被矿工尽可能多地填充交易。为什么有的区块里,除了Coinbase奖励以外没有其他交易呢?事出反常必有妖,我们今天就来“捉妖”吧。

01 天下武功唯快不破

白话区块链在《如果两名矿工同时挖出新区块,出块奖励该给谁呢?》一文介绍了,当矿工挖出区块后,越快将区块发布出去对矿工越有利。

白话区块链在《一个经典的故事,让你3分钟搞懂比特币挖矿》一文介绍了区块的构造:一个区块主要由区块头和区块体两部分组成。区块头的大小,仅占80个字节,一个满载的区块为1M大小,是区块头的12500倍。

我们知道,数据越小,传播和接收就越快,所以挖出新区块的矿工,为了让区块能更快地在全网发布,会把区块头和区块体的信息分开发布,只有80字节的区块头就能以更快的速度传播给其他矿工。

根据上面的介绍,我们知道,当一个新区块被挖出,矿工会更快接收到区块头信息,然后再接收到区块体信息。

02 挖矿争分夺秒

这时候矿工有两种选择:

接收到区块头后,马上构造区块开始挖矿;
继续等待接收区块体,验证区块内所有的交易后,才开始挖矿。

从接收到区块头到接收并验证区块体内所有交易,这中间是有时间差的,我们假设这个时间差是10秒钟。如果这10秒钟选择等待,一方面矿机在空跑,需要耗能;另一方面挖矿是一场竞赛,“时间就是金钱”,矿工会争取这10秒钟时间,如果在这段时间内,找到了合适的随机数,就能挖出新的区块,得到比特币奖励。

选择在这个时间差内挖矿,就必须放弃打包交易。这是因为矿工没有验证上一个区块内的交易,无法确定上一个区块内打包了哪些交易,如果打包的交易和上一个区块重复了,那么即使矿工挖出了新的区块,也会因为重复打包已确认的交易而被判无效。这就是为什么有的区块链只有Coinbase一条交易(就是系统给矿工奖励的那条交易)的原因。

03 总结

我们总结一下:矿工打包空块主要的原因是,矿工为了充分利用矿机,在接收到新区块的区块头信息且还没来得及验证该区块内的交易,在这个时间差内,矿工进行挖矿,如果在这个时间窗口内,刚好挖到区块,矿工就会选择打包空块,发布区块。因为在不清楚上一个区块打包了哪些交易的情况下,矿工打包交易,可能会与前一个区块打包的交易相同,这将导致矿工挖出的区块被判无效(非法),有捡了芝麻丢了西瓜的风险。

矿工挖出区块后,如果明确某一笔交易没有被之前的区块打包,可以将这笔交易添加到当前挖出的区块,然后再发布吗?欢迎到留言区分享你的观点。

声明:此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网站所提供的信息,只供参考之用。

点击阅读全文