共识协议
比特币本质是去中心化的数字货币。
数字货币
一种基于数字形式存在的货币,它可以通过电子方式进行存储、转移和交易。
与传统的纸币或硬币不同,数字货币只存在于计算机网络或电子设备中。
它通过密码学技术来确保交易安全和防止伪造。
数字货币可以分为两大类:中央银行数字货币(CBDC)和加密货币。
数字货币突破传统货币交易的天然实体壁障,给交易带来了巨大的便利。 但凡事皆有两面,数字货币也有其需要处理的问题
双花攻击 (Double-Spending Attack)
双花攻击是指在数字货币或加密货币系统中,一个人试图使用相同的一笔货币在不同的交易中进行多次支付。
举例:攻击者试图利用网络延迟或其他系统特性,使同一笔加密货币同时在两笔交易中被使用。简单来说,攻击者创建两笔交易,并希望它们都被验证和记账,达到用一笔钱支付两次的效果。
与假钞的制造难度不同,数字货币本身为带有签名的数据文件,可以随时进行复制。
如果是CBDC
,则需要依赖于中央银行的信用系统来确保货币的流通和交易。 中央银行印证该笔货币的真实性,并将其上链,确保其不可伪造。是一个典型的第三方中心化方式
如果是加密货币
,则需要依赖于密码学的安全机制来确保货币的安全。 加密货币的交易需要通过数字签名来验证,确保交易双方的身份和交易内容的真实性。
去中心化需要解决的问题
- 既是货币,那就牵扯到发行。 货币该由谁发行,如何发行,发行多少? 何时发行?
中心化系统中这是央行需要考虑的问题。 而在比特币系统中,由挖矿来决定货币发行权和发行量。 - 如何验证交易有效?如何防止双花攻击?
同样在中心化的系统中,这依旧是需要中央银行来解决。 而在比特币系统中,交易的有效性验证依赖于系统中维护的一个数据结构,记录货币的使用情况(是否被花过?被谁花过?)。该数据结构由系统中全体用户共同维护,保证了交易的有效性。该数据结构,便是区块链。
比特币系统依靠名为工作量证明(Proof of Work,PoW)的共识协议来处理如上问题。
共识协议
共识协议是分布式系统中用来确保多个节点(参与者)就某个状态或决策达成一致的机制。 除了比特币所使用的 PoW 算法,还有其他共识协议,如 PBFT、Raft、ZAB、ViewStamped Replication 等。
工作量证明(Proof of Work,PoW)
简单讲就是通过计算来证明你有能力解决某个问题。比特币系统中,通过挖矿来获得记账权。
挖矿的过程:
- 选择一个随机数(nonce)
- 在交易池中挑选交易,将这些交易列表放入
block body
中。 - 计算
Hash(block header + nonce)
- 如果
Hash(block header + nonce)< target
,则证明你有能力解决这个问题,可以获得记账权。 - 否则,重复上述过程,直到找到符合条件的 nonce。
挖矿的目标值:
- 目标值越大,挖矿难度越小
- 目标值越小,挖矿难度越大
- 目标值根据网络的总算力和区块生成时间动态调整,以保持平均每 10 分钟生成一个新区块。
挖矿的奖励:记账权 + Block Reward
- 矿工将获得一定数量的比特币作为奖励。起始为 50 BTC,每 210,000 (大约 4 年)个区块减半。
- 在挖矿开始前,矿工会在交易池中挑选交易,将这些交易打包成区块。 除了区块奖励,还有这些交易的交易费用作为奖励。
- 这个激励机制鼓励矿工们积极打包交易,并帮助网络的运行。
行使记账权
- 所谓记账权,其实就是候选区块转正的过程。
- 一旦成功挖矿成功将拥有记账权,矿工将完整的新区块(包括其哈希值和所有打包的交易)提交给区块链网络。
- 其他节点将验证该区块,并将其添加到自身节点维护的区块链中
提示
- 挖矿的过程不具有可预测性,即前一次的结果与后一次计算没有任何因果关系,每次都是独立重复。
- 挖矿的过程需要消耗大量的计算资源。
- 这些计算本身毫无意义。
// 区块的大致结构
{
"block Header": {
// 区块头
"Hash of previous block header": "", // (指向前一个区块指针)
"target": "", // (挖矿难度目标阈值)
"nonce": "", // (随机数)
"Merkle root hash": "" //(默克尔树根哈希)
},
"block body": {
"transactions": [] //(交易列表)
}
}
防止双花举例
比特币要求每笔交易都表明该币的来源。
比如,假定 A 获得铸币权,新发布了 10 个比特币(该交易称为铸币交易)。
A 将 10 个比特币转给了 B(5 个)和 C(5 个),A 对该交易进行签名,同时该交易需要说明所花掉 10 个比特币来源(来自铸币交易)。
之后,B 将自己的 5 个比特币转给 C(2 个)和 D(3 个),该交易需要 B 的签名,该交易需要说明所花掉的 5 个比特币来自于第二个交易中。
然后,C 将自己所拥有的全部 7 个比特币都转给 E,并对该交易签名,可以发现该交易中 C 的比特币来源于两个交易中。
这样,就构成了一个简单的区块链。【红色部分为比特币来源】
这里面有两种哈希指针。
第一种为指向前面的区块(白色),使得各个区块形成链;
第二种则是为了说明比特币的来源(红色)。说明比特币的来源并非凭空捏造,可以防止双花攻击。
在进行交易时,需要付款人的签名和收款人的地址,在比特币系统中,该地址即为收款人的公钥的哈希。可以将其视为银行账户,根据此进行转账交易。(虽然公钥可以公开,但实际中更多公开的是公钥的哈希)
在交易中,收款方需要知道付款方的公钥,从而验证 A 签名是否有效。即 A 需要提供自己的公钥。 该公钥需要和铸币交易中公钥对的上,这样就防止了恶意节点伪造 A 的公钥来“偷”走 A 的比特币。
在比特币系统中,通过执行脚本实现上述验证过程。将当前交易输入脚本与前一个交易输出脚本(说明币的来源的交易)拼接执行,如果可以正确执行,说明交易合法。