主页 > token.im钱包下载 > 深入比特币原理——比特币挖矿

深入比特币原理——比特币挖矿

token.im钱包下载 2023-05-22 06:34:55

从本节开始,我们将进入“挖矿”相关内容。我们将分几个章节详细介绍比特币“挖矿”的技术原理。

我在这里使用引号是因为挖掘这个词有些误导。比特币“挖矿”的目的不是挖出新的比特币,而是建立一个安全可靠的去中心化数字货币网络,新币的创造只是一种激励。

比特币挖矿基本信息

比特币总量:约等于2100万(实际准确为2,099,999,997,690,000聪,1亿聪=1比特币)

出块时间间隔:平均10分钟左右(注意这是平均时间,实际出块时间可能是1秒或1小时)

每个区块可以创建的比特币数量:开始时50个,每210,000个区块减半(大约4年),2018年当前数量为1个2.5

什么时候不会开始产生新的比特币:2140 年左右(可能会提前挖出大量的算力,在后面的工作量证明章节中讨论)

独立交易验证(全节点)

比特币客户端在创建新交易时,会创建交易输入和交易输出,然后客户端将交易内容广播给相邻节点,再由相邻节点广播给其他节点,不断传播到整个比特币网络.

比特币挖矿真的是在挖矿吗_比特币挖矿难度更新_比特币挖矿难度的历史演进

当节点收到一笔交易时,会先进行验证,验证成功则转发。否则,交易将被丢弃,以确保无效交易不会在网络中广泛传播。验证内容如下:

交易语法和数据结构是否正确?

输入输出不能为空

事务大小不能超过 MAX_BLOCK_SIZE(最大块大小)

输出值必须在允许范围内(大于 1 satoshi(比特币的亿分之一),小于 2100 万)

交易输入哈希不能为0

nLockTime 小于或等于 INT_MAX。 nLocktime和nSequence的值满足MedianTimePast(MedianTime是这个block的前11个block的中间时间,按block time排序)

事务大小大于或等于 100 字节

比特币挖矿难度的历史演进_比特币挖矿难度更新_比特币挖矿真的是在挖矿吗

交易中的签名次数(SIGOPS)小于最大签名操作次数

解锁脚本(scriptSig)只能将数字写入堆栈,锁定脚本(scriptPubkey)必须符合isStandard的格式(会拒绝非标准交易)

交易池或区块链中存在匹配交易

对于每一个输入,如果引用的交易输出已经存在于交易池中,则该交易将被拒绝(不允许双花)

对于每个输入,如果在交易池或区块链上找不到匹配的交易输出,则将交易放入孤儿池

对于每个输入,如果引用的交易输出是 coinbase 输出,则输入必须至少收到 COINBASE_MATURITY(100) 个确认。

对于每一个输入比特币挖矿难度的历史演进,引用的输出必须存在且不能被花费。

使用引用的输出交易获取输入值,并检查每个输入值和总值是否在指定值范围内(小于2100万,大于0)

比特币挖矿难度的历史演进_比特币挖矿难度更新_比特币挖矿真的是在挖矿吗

交易输入值必须小于引用的交易输出值

拒绝交易费用低(低于 minRelayTxFee)的交易

每个输入解锁脚本必须正确匹配对应的输出锁定脚本。

上述条件会随着比特币的发展而改变。可能会增加更多条件来防止 DOS 攻击,并且可以放宽条件以接受更多类型的交易。

将交易打包成区块

挖矿节点将交易打包成区块的步骤如下:

1.将经过验证的交易放入交易池中(一般在内存中,验证方式见上文)

2.将交易池中的交易打包构建一个新的候选区块(打包交易的总大小不能超过MAX_BLOCK_SIZE,比特币约1MB,通常矿工会选择先打包交易手续费高的交易)

比特币挖矿难度更新_比特币挖矿难度的历史演进_比特币挖矿真的是在挖矿吗

3.开始完成有效的工作量证明

4.如果在工作量证明完成之前收到其他节点广播的新区块,则放弃计算当前区块的工作量比特币挖矿难度的历史演进,新区块中包含的相同交易将被从交易池中删除。选择交易中的交易开始建块

Coinbase 交易

当每个节点将一笔交易打包成一个区块时,会添加一个特殊的交易,即 Coinbase 交易。交易输出地址为矿工地址,交易输出比特币作为节点完成工作量证明挖出区块。奖励,其中包括新的比特币(目前为 12.5)+ 区块内所有交易的交易费用。

Coinbase 交易与普通交易的区别

以下截图来自比特币信息网站,例如区块高度510972的coinbase交易信息如下:

从blockchain.info可以看出coinbase交易没有交易输入。其实coinbase交易的交易输入部分还是存在的,只是没有解锁脚本等信息。 coinbase交易输入格式如下:

交易哈希:全部用32字节的0表示,coinbase没有引用交易输出

比特币挖矿真的是在挖矿吗_比特币挖矿难度的历史演进_比特币挖矿难度更新

输出索引:字段都是0xFFFFFFFF,这里没有意义

Coinbase 数据大小:替换解锁脚本大小

Coinbase Data:替换Unlocking Script,大小为2-100字节,从block version v2开始,必须在开头包含block height,后面的信息可以任意定制(比如Satoshi Nakamoto的定制内容在创世区块“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”)

Coinbase 数据中的常用信息

额外随机数:我们在比特币区块链章节中讨论了区块信息。矿工改变nonce值来达到工作量证明要求的结果,但是块头中的nonce只有4个字节,而且随着工作量证明越来越难,4个字节是不够的,所以矿工可以为 coinbase 数据添加 8 字节的额外 nonce 以增加计算空间。

矿池信息:矿池信息通常添加到不同矿池挖出的区块中。例如,“Mined by AntPool”表示该区块由 AntPool 挖出。

引用:

[1]Andreas M. Antonopoulos,掌握比特币(第二版)

加入知识星球,与 HWer 一起成长

更多好文章,请关注并查看历史新闻