Skip to content

共识协议

比特币本质是去中心化数字货币

数字货币

一种基于数字形式存在的货币,它可以通过电子方式进行存储、转移和交易。
与传统的纸币或硬币不同,数字货币只存在于计算机网络或电子设备中。
它通过密码学技术来确保交易安全和防止伪造。
数字货币可以分为两大类:中央银行数字货币(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 年)个区块减半。
    • 在挖矿开始前,矿工会在交易池中挑选交易,将这些交易打包成区块。 除了区块奖励,还有这些交易的交易费用作为奖励。
    • 这个激励机制鼓励矿工们积极打包交易,并帮助网络的运行。
  • 行使记账权

    • 所谓记账权,其实就是候选区块转正的过程。
    • 一旦成功挖矿成功将拥有记账权,矿工将完整的新区块(包括其哈希值和所有打包的交易)提交给区块链网络。
    • 其他节点将验证该区块,并将其添加到自身节点维护的区块链中

提示

  • 挖矿的过程不具有可预测性,即前一次的结果与后一次计算没有任何因果关系,每次都是独立重复。
  • 挖矿的过程需要消耗大量的计算资源。
  • 这些计算本身毫无意义。
json
// 区块的大致结构
{
  "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 的比特币来源于两个交易中。

这样,就构成了一个简单的区块链。【红色部分为比特币来源】

image.png

这里面有两种哈希指针。

第一种为指向前面的区块(白色),使得各个区块形成链;

第二种则是为了说明比特币的来源(红色)。说明比特币的来源并非凭空捏造,可以防止双花攻击

在进行交易时,需要付款人的签名和收款人的地址,在比特币系统中,该地址即为收款人的公钥的哈希。可以将其视为银行账户,根据此进行转账交易。(虽然公钥可以公开,但实际中更多公开的是公钥的哈希)

在交易中,收款方需要知道付款方的公钥,从而验证 A 签名是否有效。即 A 需要提供自己的公钥。 该公钥需要和铸币交易中公钥对的上,这样就防止了恶意节点伪造 A 的公钥来“偷”走 A 的比特币。

在比特币系统中,通过执行脚本实现上述验证过程。将当前交易输入脚本与前一个交易输出脚本(说明币的来源的交易)拼接执行,如果可以正确执行,说明交易合法。

参考

北京大学肖臻老师《区块链技术与应用》

君子慎独