为什么比特币需要工作量证明

2008年10月31日,中本聪(Satoshi)发表了《比特币——一种点对点电子现金系统》白皮书,这是革命性货币体系的组成部分,也是比特币的规范协议。

为什么比特币需要工作量证明

2009年1月3日,随着Satoshi发表了第一个实现该论文的Block# 0 Genesis Block,该白皮书开始生效。这些代码大部分是用c++编写的,并且是开源的,可以在github上找到。
比特币是什么?
比特币建立在区块链系统之上,纯粹的点对点电子现金系统将允许直接从一方发送到另一方的在线支付,而无需经过金融机构。
为什么是点对点?
节点是运行比特币软件(比特币客户机)的计算机。节点连接到其他计算机以创建网络。每个节点都相互连接,所以形成了一个网络,每个节点都是对等的。节点之间相互通信,传递关于n/w其他部分的信息。
所以现在我们有了一组运行比特币软件的节点,这些节点连接在一起形成一个比特币n/w。让我们举个例子。Alice想通过Bob的比特币钱包发送5比特币,这个钱包创建了一个交易,并将其插入比特币的n/w节点。网络上的每个节点执行3个功能:
1. 遵循一套用比特币客户端软件编写的规则。如:检查这个人是否有足够的余额来消费,如果是,则接受该交易,如果没有拒绝,则将其传递给其他节点。因此,只有有效的交易才会被代理。
2. 擅自进行交易。有两种类型的交易是主动的—最近进入网络的新交易,已确认的交易,这些交易以块的形式共享,而不是单独的
3. 将已确认的交易追加到其区块链。
什么是区块链?
区块链可以看作是可以存储为一个平面文件或一个简单的数据库块链。例如,比特币的核心客户将区块链存储在谷歌的一级数据库。区块链的特性:
1. 区块链是一个链表数据结构。每个节点都有数据(块,稍后我们将看到每个块是什么)和指向前一个块哈希的链接。因此,每个节点都与之前的节点进行了隐式链接,使得每个节点不可变,篡改会破坏链。

2. 去中心化。区块链的副本存在于网络中的所有节点上,就像公共分类账一样。区块链就像比特币对点网络上的BitTorrent文件一样可以共享。 

挖矿目的
n/w上的每个节点都有一个内存池,一个临时存储缓冲区。每个节点还有一个本地存储到节点的区块链。当节点从其他节点接收到交易时,它将验证该交易并将其添加到内存池中。最终目标是创建一个包含这些交易的块,验证它们并将其添加到区块链上。一旦交易被添加到区块链中,它们就会被“确认”,这就允许比特币的新主人使用他们在这些交易中收到的比特币。
谁创建了块,谁将交易添加到块中——“矿工”。比特币n/w中的任何节点都可以成为矿工。
1. 挖矿用于确保不使用欺诈性交易。例如双重支出问题。
2. 挖矿会产生新的比特币,如果有新的区块,就会产生新的比特币,就像央行印新钱一样。比特币的数量是固定的,并随着时间的推移而递减。(这是用比特币协议写的)。矿工提供比特币n/w的处理能力,作为回报。
添加到内存池中的交易将等待挖掘程序拾取。矿工创建一个新块,将内存池中的部分或全部交易(基于优先级)添加到这个新的候选块中,并与其他矿工竞争,以解决一个基于加密哈希算法的数学难题。这个“工作量证明”问题的解决方案包含在块中,它可以作为采矿者花费了大量计算工作的证明。第一个解决该问题的矿工将获得奖励,验证块将被添加到区块链中。采矿者可以从采矿中获得两种奖励——创造新代币并给予采矿者交易费。
新代币的产生是固定的,并在不断减少,2009年开始是50比特币,2012年减半至25比特币,2016年减半至12.5比特币,大约每四年减少一次。预计每10分钟开采一个新区块。比特币软件对比特币总量有一个最高限额,即2100万比特币。所以到2140年左右,所有的比特币都将发行,之后不会再发行新的比特币。矿工只能从交易费中获利。
比特币区块链中的块是什么?
矿工创建的每个新块都有一个头块和一个主块。所有选定的交易都添加到主块中。
1. 上一个块哈希。
2. 时间戳,创建此块的日期/时间。
3. 难度目标,为使块生成时间保持在10分钟以内,难度目标是一个可以自行调整的动态值。
4. Nonce,一个初始化为0的计数器(稍后我们将看到它是什么)
5. Merkle root hash, Merkle tree是一种数据结构,用于有效地总结块中的所有交易。(我们将在接下来的博客中看到merkle树是什么以及它是如何构建的)。
挖矿过程
它使用SHA-256哈希函数。
挖掘的是块头的哈希,反复更改一个参数(nonce),直到得到的哈希小于或等于一个特定的目标。
什么是难度目标?
为了使块生成时间保持在10分钟,难度会相应地进行调整。如果n/w查找块的速度超过10分钟,则难度增加,如果块的查找速度较慢,则难度降低。您可以在power .cpp中的github上的reference erence实现中找到设置当前难度的代码。
工作量证明算法如何工作?
挖掘器负责构造一个充满交易的候选块,哈希块头以查看它是否小于或等于当前目标,如果不是,则修改nonce(通常递增1),然后重试,直到找到解决方案。挖掘需要大量的计算能力,因此现在节点使用ASIC硬件,其中100 -1000秒的集成电路并行运行SHA-256 algo。一旦找到一个解决方案,用于解决这个问题的nonce就被插入到块中的nonce字段中,节点立即将这个块传输给它的所有对等节点。它们接收、验证(验证规则可以在CheckBlock和checkblockheader文件中找到)并生成新块。当节点在网络周围波动时,每个节点将其添加到自己的区块链中,并将其扩展到一个新的高度。
因此挖掘就是在这个块上创建新的块,聚集和添加的新交易,在这个块之上运行算法的证明可以找到这个问题的答案,通过投资计算能力和预期回报(新生成的比特币和交易费用)宣传这一块。
为什么使用工作量证明算法?
工作量证明基本上确保了矿工不作弊,他们负责比特币的生成和创建新的区块添加到区块链。
我们无法相信网络中的每个人都是诚实的,因此,我们如何确保矿工不会通过在区块中添加交易、给自己带来比特币,来创建对自己有利的区块。它的工作原理是,你让一群人都试着猜这道数学题的答案,没有人知道谁会先得到正确的答案。首先得到正确答案的人将获得奖励,但前提是所有其他矿工同意接受该交易记录(如果某个矿工明显在创建欺诈性交易,那么其他矿工可以集体拒绝接受他们的贡献)。这就是为什么创建一个新块的过程被设计成能源密集型的原因,因此,创建每个新块都有相关的成本。这就阻止了矿工们简单地创造出一大堆新的欺诈性区块,并寄希望于这些区块可能会被接受,因为这样做的成本抵消了潜在的回报。如果要求每台计算机在发送每封邮件之前花一分钟处理PoW问题,那么只有真正有消息的人才会同意花时间。花费一分钟的电脑时间对一个人来说是非常低的成本,但是一个正在发送1000万封垃圾邮件的人却等不起1000万分钟。所以回到比特币上来看,每一个矿工解决每一个区块的机会是非常小的,因为解决这些区块需要花费大量的努力,他们不能只是用解决方案向网络发送垃圾邮件。这意味着只有当他们的贡献被网络接受时,他们才会被激励去付出努力。