从本节开始进入到“挖矿”相关内容,我们将用几个章节的内容来详细描述比特币“挖矿”的技术原理。
这里我用了引号,原因是挖矿这个词有一些误导,比特币“挖矿”的目的实际不在于挖掘出新的比特币,而是为了组建安全可靠的去中心化数字货币网络,创造新币仅是一种激励手段。
比特币挖矿的基本信息
比特币总量:约等于2100万(实际精确的是2,099,999,997,690,000聪,1亿聪=1比特币)
区块产生的时间间隔:平均约10分钟(注意这里是平均时间,实际出块时间有可能1秒,也有可能1小时)
每个区块可创造的比特币数量:最开始为50枚,每过210000个区块(约4年)数量减半,目前2018年的数量为12.5枚
什么时间开始不再产生新的比特币:约在2140年(算力的大量提升可能会提前挖完,后面工作量证明章节讨论)
独立交易验证(全节点)
当比特币客户端创造一笔新交易,即是创建了一笔交易输入与交易输出,然后客户端会向相邻节点广播交易内容,再由相邻节点向其他节点广播,不断扩散到整个比特币网络。
当节点收到一笔交易时,会先进行验证,验证成功才会进行转发,否则交易将被丢弃,保证无效交易不会在网络中被大量传播,验证内容如下:
交易的语法与数据结构是否正确
输入输出不能为空
交易大小不能超过MAX_BLOCK_SIZE(块最大大小)
输出值必须在允许的范围内(大于1聪(1亿分之一比特币),小于2100万)
交易输入hash不能为0
nLockTime小于或等于INT_MAX。nLocktime与nSequence的值满足MedianTimePast(MedianTime是这个块的前面11个块按照block time排序后的中间时间)
交易大小大于等于100字节
交易中的签名数量(SIGOPS)小于签名操作数量上限
解锁脚本(scriptSig)只能够将数字写入栈中,并且锁定脚本(scriptPubkey)必须要符合isStandard的格式(将会拒绝非标准交易)
匹配交易在交易池或区块链中存在
对于每一个输入,引用的交易输出如果在交易池中已经存在,交易将被拒绝(不允许双重支付)
对于每一个输入,如果匹配的交易输出无法在交易池或区块链上找到,将交易放入孤立交易池(orphan pool)
对于每一个输入,如果引用的交易输出是一个coinbase输出,该输入必须至少获得 COINBASE_MATURITY(100)个确认。
对于每一个输入,引用的输出必须存在,并且没有被花费。
使用引用的输出交易获得输入值,并检查每一个输入值和总值是否在规定值的范围内(小于2100万,大于0)
交易输入总值必须小于引用的交易输出总值
拒绝交易费过低(小于minRelayTxFee)的交易
每一个输入的解锁脚本必须可以正确匹配相应输出的锁定脚本。
以上条件会随着比特币的发展会发生变化,可能会加入更多条件防止DOS攻击,也有可能放宽条件接受更多类型的交易。
打包交易到区块中
挖矿节点打包交易到区块中的步骤如下:
1.将验证通过的交易放入交易池中(通常在内存中,验证方法见上文)
2.打包交易池中的交易构建新候选区块(打包的交易总大小不能超过MAX_BLOCK_SIZE,比特币约为1MB,通常矿工会选择优先打包交易费高的交易)
3.开始完成有效的工作量证明
4.如果在完成工作量证明前收到了其他节点广播的新区块,则放弃当前区块的工作量计算,将交易池中与新区块包含的相同交易去除,在剩余的交易中选择交易开始构建一下个区块
Coinbase交易
当每个节点打包交易到区块中时,会添加一笔特殊交易即为Coinbase交易,交易输出的地址为矿工的地址,交易输出比特币作为节点完成工作量证明挖出区块的奖励,其中包括新比特币(目前为12.5个)+区块中所有交易的交易费。
Coinbase交易与普通交易的区别
以下截图来自比特币信息网站https://blockchain.info,例如块高度510972中的coinbase交易信息如下:
从blockchain.info中看到coinbase交易没有交易输入,实际上coinbase交易的交易输入部分仍然是存在的,只是没有解锁脚本等信息,coinbase交易输入格式如下:
Transaction Hash:均以32个字节的0表示,coinbase没有引用的交易输出
Output Index:字段均为0xFFFFFFFF,此处没有意义
Coinbase Data Size:取代Unlocking Script Size
Coinbase Data:取代Unlocking Script,大小在2-100字节,从块版本v2开始必须在开头包含块高度,之后的信息可任意定制(如中本聪在创世区块中的定制内容“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”)
Coinbase Data中常见的信息
Extra nonce:在比特币区块链章节中我们讨论了区块的信息,矿工通过变动nonce值来达成工作量证明要求的结果,但是区块头中的nonce仅为4个字节,随着工作量证明难度越来越高,4个字节开始不够用了,于是矿工可以在coinbase data中添加8个字节的extra nonce来增加可计算的空间。
矿池信息:不同矿池挖出的区块通常会添加矿池的信息,如“Mined by AntPool”表示该块由AntPool所挖。
引用资料:
[1]Andreas M. Antonopoulos, Mastering Bitcoin(sencond edition)
加入知识星球和HWer一起成长
更多好文请关注后查看历史消息
领取专属 10元无门槛券
私享最新 技术干货