主页 > 大陆如何下载imtoken > 【学习笔记】比特币挖矿与共识

【学习笔记】比特币挖矿与共识

大陆如何下载imtoken 2023-09-03 05:10:36

公式显示有问题,可以去原文

介绍完比特币交易和区块的相关内容后,本文记录下网络节点如何协同工作,共同记账

比特币的网络

Internet 中最常见的网络模型是“客户端-服务器”结构,其中中央服务器提供特定服务并响应客户端请求

当你打开浏览器上网,打开Outlook收发邮件时,都与该模式下的中央服务器通信

一个更简单的例子,当你使用手机时,需要电信运营商为你提供语音通讯和数据流量服务

如果中央服务器出现故障,您将无法使用

另一种常见的结构是点对点(P2P,Peer-to-Peer)

同一个P2P网络中的每个设备都是平等的,每个节点共同提供网络服务,没有特殊的节点

P2P网络没有中央服务器和集中服务,也没有层次结构。节点交互操作并相互协作。每个节点在对外提供服务的同时,也使用网络中其他节点提供的服务。

当你使用BT(BitTorrent)下载资源时,就是在P2P网络模型下与其他节点进行通信。您从其他节点下载数据,也向其他节点提供下载服务。您可以随时离开,无需担心整个网络的影响

比特币的网络是一个 P2P 结构。网络中的节点(运行比特币软件的计算机)相互对等,共同维护比特币的总账。

节点可以相互“发现”、建立连接和同步数据。就像你用BT下载资源一样,你从其他节点下载数据,同步你的本地状态,同时传播数据给其他节点提供同步。服务

节点收到新区块或新交易后,首先会验证数据的合法性。只有验证通过后才会保存在本地,并继续将数据传播到其他节点。

如果一个节点持有所有比特币区块的数据(所有比特币交易的账本),我们称之为全节点(Full Node)

矿业

网络不断产生新的交易,需要不断创建新的区块来“整理”这些交易

既然比特币网络中的所有节点都是对等点,那么我们如何一起维护这个总账呢?谁将保留书籍(创建积木)?为什么要让这个节点做账?

比特币网络使用工作量证明(PoW,Proof-of-Work)来确定记账权

比特币挖矿软件_比特币新人挖矿详细步骤指导_比特币挖矿真的是在挖矿吗

网络中的任何全节点都可以尝试创建区块,但一个区块只有至少满足以下条件才是合法的,并且会被其他节点识别和接受

满足第一个条件非常简单。节点只需对每笔交易进行验证,丢弃非法交易即可。

但很难满足第二个条件。我们先说一下这个目标值。

nBits

区块头中的 nBits 字段标识当前区块哈希必须小于或等于的目标值(target)。

注意,块头的 SHA256 结果有 256 位,而 nBits 是 4 字节,只有 32 位。用nBits计算目标值的规则如下,以区块277316为例

区块哈希为0x0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4,nBits为0x1903a30c(十进制为419668748)

目标值以系数/指数格式存储。前 2 位十六进制数字是指数,接下来的 6 位数字是系数。计算公式为

$$target = 系数 * 256^{exponent–3}$$

所以0x19是幂,0x03a30c是系数,这个块的hash应该小于等于目标值

$$目标 = 238348 * 256^{22} = 22829202948393929850749706076701368331072452018388575715328$$

在十六进制中,它是 0x0000000000000003a30c0000000000000000000000000000000000000000000

竞争簿记权

让我们看看一个完整的节点是如何尝试创建一个新块的,比如说

全节点开始尝试构建新区块

计算这 1000 笔交易的总手续费,计算目前每个区块需要发行的新比特币数量, new_coin 创建一个 Coinbase 交易并输出到自己的地址,金额为 new_coin + fee 使用默克尔树结构体来总结这1001笔交易,得到merkle_root,根据nBits的当前值,计算出区块哈希要满足的目标值target,构造出一共有6个字段的区块头

领域 | 价值--- | --- n版本 | 定值 hashPrevBlock | #100 块的哈希 hashMerkleRoot | 计算 merkle_root nTime | 当前 Unix 时间戳 nBits | 定值 nNonce | 0

对第5步构造的区块头进行两次SHA256运算,得到区块哈希

如果哈希目标创建新区块失败,调整区块头内容并重新计算,直到找到有效的区块哈希

节点收到新区块后,可以直接对区块头进行哈希运算,验证新区块是否符合要求,也可以验证新区块中包含的所有交易是否都是合法交易。

比特币挖矿真的是在挖矿吗_比特币挖矿软件_比特币新人挖矿详细步骤指导

简单来说,全节点有两种情况

出块可以获得奖励,不断驱动节点相互竞争记账权

计算能力

计算区块哈希会使用SHA256哈希函数,计算结果被认为是一个一致的随机序列,即SHA256计算结果中某位的值,它的概率为二进制 0 或 1,是相同的

SHA256 的计算结果是 256 位二进制。如果掷硬币,结果是正面为 0,反面为 1

您可以将 1 个区块哈希计算为 256 次抛硬币

目标值0x00000000000000003A3000000000000000000000000000000000000000000000000000全为0,即如果要小于等于这个目标值,则区块哈希至少有60位为0为0

1 次尝试需要 256 次抛硬币,为了使前 60 次在给定尝试中正面朝上,您平均需要 $2^{60}$ 次尝试

如果你能在一秒内计算出十亿次($10^9$)的SHA256次,排除运气,你需要大约1152921504秒来计算一个有效块,大约需要36.5年,而在比特币网络中,平均每十分钟,一个节点将计算一个新块

我们把单位时间内计算hash的速度称为算力

为了赢得比赛,需要一个计算 SHA256 的自定义设备(矿工)

在撰写本文时(2019 年 1 月 11 日)

最新的Antminer S15,计算速度28T(计算$28 * 10^{12}$ hashes per second),功耗1600瓦,价格约万元

全网算力(所有节点算力之和)为

比特币版 | 全网算力---| --- 比特币 (BTC) | 42.19 Eh/s, $42.19 * 10^{18}$ 次每秒哈希比特币现金 (BCH) | 1.25 Eh/s 比特币 SV (BSV) | 1.04 Eh/s

工作证明

通过以上描述,你会发现只有不断投入新设备,让自己拥有更快的哈希计算速度,不断消耗能量(支付电费),才能赢得竞争,获得更多收益,此外没有别的办法

而且这样的比赛没有门槛,规则是公开的,任何人都可以参加,只要你愿意付出成本

你付钱,你玩

为了使区块哈希满足要求,节点别无他法,只能不断尝试,微调区块头数据,失败后重新计算,直到网络中的某个节点首先构造出下一个合法区块

比特币挖矿软件_比特币挖矿真的是在挖矿吗_比特币新人挖矿详细步骤指导

当你成功搭建了一个合法区块,全网所有人都知道这是你不断试算的结果

您不需要提供任何其他证据来证明您已经进行了大量计算并投入了大量成本。下一个合法区块的最快构建是你工作量的最好证明。

您也不需要提供构建此块的详细过程,因为除了尝试之外别无他法

比特币是通过区块发行的。尝试创建一个新区块就像开采矿产资源,需要大量的成本和精力。节点相互竞争记账权的过程,形象地称为“挖矿”。运行全节点 为挖矿提供算力的人,也称为“矿工”

需要注意的一点是,比特币软件会自动控制和调整 nBits 的值,以确保平均 10 分钟的出块速度。调整规则和计算规则在程序中是固定的,所有节点会同时计算相同的值。的目标值,如果你悄悄地改变nBits的值(让目标更容易实现)然后创建一个“合法”的区块,也会导致其他节点的验证失败

工作量证明的想法在生活中随处可见

如何证明自己掌握了必要的专业知识,熟练操作各种网络设备,胜任网络工程师职位?只需提供CCIE证书

常规分叉和共识

你有没有注意到,只要计算出的区块哈希值小于指定的目标值,这个新创建的区块就是合法的(不考虑其他限制)

如果目标值为100,只要区块哈希在[0, 99]范围内,就是合法的,即下一个合法区块不唯一

数据在网络中传输时,仍然会有一定的延迟。如果不同节点几乎同时发现下一个合法区块,整个网络应该如何应对?

目前所有节点状态相同,最新区块为星号

两个节点同时成功构建下一个区块,并像网络一样广播

随着数据的传播,区块链分叉,一些节点“跟随”白色三角形块并尝试在其上构建下一个块,而另一部分节点“跟随”橙色三角形块

一段时间后,“跟随”白色三角形块的节点最先发现下一个绿色菱形块并向网络广播

所有节点同步到最新的绿色菱形块

比特币新人挖矿详细步骤指导_比特币挖矿软件_比特币挖矿真的是在挖矿吗

区块链是连续的,计算下一个区块时,必须在区块头中记录当前区块的哈希值

“跟随”一条链是基于此链接的最新区块,试图构建下一个区块以扩展链

此时,所有节点都可以看到两条链,并且会按照规则“跟随”工作量最大的链(通常是最长的链)。

节点会在短时间内消除分歧,再次达成共识

交易确认和共识攻击

当全节点收到新的交易时,会先将其放入自己的内存池中(等待打包成块),然后继续广播给其他节点。此时,交易“未确认”

“已确认”表示交易已打包成区块并写入比特币的全球账本

验证后的交易会按优先级顺序打包,假设当前最新区块高度为100

该交易包含在 #101 区块中,此时我们说该交易具有“一次确认”

随着区块链的不断扩展,该交易的确认数量也在增加。确认次数越多,交易被重写的可能性就越低。

因为区块是按顺序连接的,如果你想重写交易(例如从区块中移除,相当于你不付钱)

因为“最长链”共识的存在,你必须能够足够快地计算,从区块#101开始比特币新人挖矿详细步骤指导,重新计算当前链上积累工作最多的链,然后让其他节点“跟随” . 达到改写区块链的目的

上述场景称为共识攻击,也常被称为“51%算力攻击”。如果攻击者的算力很大,那么这次尝试可能会成功(当算力超过全网的51%时,攻击尝试几乎肯定会成功)

值得注意的是,共识攻击不允许攻击者直接从一个地址窃取比特币或支付比特币而无需签名,也不影响加密算法的安全性,只会影响区块链未来的共识(阻塞交易)在特定地址,拒绝服务攻击)或过去几个区块的共识(不久前重写区块,双花)

这也是比特币大额转账需要等待确认的原因

爱丽丝去鲍勃的商店用比特币买咖啡,导致了一笔目前未经证实的交易

Bob愿意不等交易确认就直接把咖啡给Alice,因为与顾客购物的良好体验相比,“小额转账双花”的风险微不足道(Alice可以立即拿到咖啡)

请注意,比特币现金(BCH)和比特币SV(BSV)是小额支付的零确认安全性(双花成功需要一定的算力)

由于在 BIP-125 中引入了 RBF(按费用替换)功能,比特币 (BTC) 不再适用于这种情况。如果 Bob 不等待交易被确认,Alice 可以拿走咖啡并用 RBF 代替。未经确认的交易,双花(无需计算能力)

比特币挖矿真的是在挖矿吗_比特币新人挖矿详细步骤指导_比特币挖矿软件

中位时间过去

比特币挖矿节点相互独立,不同节点时间精度不同

区块头中的时间戳由矿工确定。考虑到网络传输延迟,共识规则允许一定的误差来解决去中心化节点之间的时间准确性问题,但这可能会诱使矿工撒谎,通过让区块包含仍未释放的时间锁定交易来赚取额外的交易费用

BIP-113引入了Median Time-Past(MTP,Median Time-Past)的概念比特币新人挖矿详细步骤指导,通过计算最后11个区块的时间戳的中位数作为当前共识时间,代码在这里

enum { nMedianTimeSpan = 11 };
int64_t GetMedianTimePast() const {
    int64_t pmedian[nMedianTimeSpan];
    int64_t *pbegin = &pmedian[nMedianTimeSpan];
    int64_t *pend = &pmedian[nMedianTimeSpan];
    const CBlockIndex *pindex = this;
    for (int i = 0; i < nMedianTimeSpan && pindex;
         i++, pindex = pindex->pprev) {
        *(--pbegin) = pindex->GetBlockTime();
    }
    std::sort(pbegin, pend);
    return pbegin[(pend - pbegin) / 2];
}

网络中所有与时间相关的计算都使用共识时间

比特币需要大约 10 分钟来生成一个新块,因此共识时间将比挂墙时间(现实世界时间)慢一个小时左右

费用狙击

这是一种潜在的攻击,称为费用狙击

矿工试图通过选择那些应该包含在未来区块中的高费用交易来重写过去的区块以最大化收入

费用狙击是一种理论上的攻击场景,矿工试图重写过去的区块,从未来的区块中“狙击”更高费用的交易,以最大限度地提高盈利能力。

假设当前区块高度为 100

诚实的矿工将尝试构建 #101 区块,扩展区块链

有些矿工会重新计算block#100(收到block#100后)以获得更高的收益,并选择那些交易费用(satoshi/KB)较高的交易进行打包,这些交易可以是block#100的交易,也可以是当前mempool中的交易

如果重新计算的block #100后来被网络接受了(原来的block #100变成了孤儿),就成功了,但这并不容易实现(需要一定的算力和运气)

在所有比特币发行之前,由于 Coinbase 的奖励,这可能不会那么有利可图,但这种潜在风险可能会在未来出现

为了避免这种情况,可以在创建交易时使用nLocktime时间锁来限制交易在当前区块高度之后才被打包

这样的时间锁对事务的打包时间没有影响

总结

因为共识的存在,具有算力的全节点相互竞争,共同合作,共同维护比特币区块链,让网络健康持续运行

参考