基本原理

区块链本质上是一个只可追加的数据库。取本身是由区块构成,而且每个区块中都包含了前一个区块的 hash。这种特性导致随着区块链链长的增加,导致同一个区块被修改的代价越来越高。

传统的关系型数据库可以通过 DDL 进行修改,数据库保存了当前的状态。通过将数据库的操作日志导出,就可以在另一台计算机上恢复数据库。同关系数据库进行对比,可以发现传统数据库记录的是当前的状态,而区块链记录的是操作日志。

一致性问题

一致性问题描述了多个节点数据状态的一致程度。一致性分为下面几种类型:

  • 强一致性:所有节点立即看到最新的写入操作结果。

  • 最终一致性:所有节点最终会看到最新的写入操作结果,但在一段时间内可能会看到旧版本的数据。

  • 因果一致性:如果事件 A 因果地先于事件 B 发生,则所有节点都会按照这个因果顺序观察到这两个事件。

  • 读已提交、单调读等其他中间一致性模型。

一致性描述了数据的状态是否达成了同步。

共识算法

共识描述了多个节点如何就单个问题达成一致的过程。共识算法用于解决在网络分区、节点故障等情况下的协调问题,确保即使某些节点失败或网络条件恶劣,整个系统仍然能够达成一致决策。

同一致性相比,共识算法关注在网络不稳定或节点故障的情况下如何保证系统的整体行为一致。

在分布式中节点进行沟通可能会出现两种情况:

  • 节点无响应或者出现故障,但是不会伪造信息。这种情况称为非拜占庭错误

  • 恶意节点伪造信息导致的错误称为拜占庭错误

拜占庭问题最早由 Leslie Lamport 等学者于 1982 年在论文《The Byzantine Generals Problem》中正式提出,是用来解释异步系统中共识问题的一个虚构模型。拜占庭是古代东罗马帝国的首都,由于地域宽广,假设其守卫边境的多个将军(系统中的多个节点)需要通过信使来传递消息,达成某些一致决定。但由于将军中可能存在叛徒(系统中节点出错),这些叛徒将向不同的将军发送不同的消息,试图干扰共识的达成。

拜占庭问题即讨论在此情况下,如何让忠诚的将军们能达成行动的一致。

一般分布式场景下,拜占庭需求并不多见,但在特定场景下会有较大意义。例如容易匿名参与的系统(如比特币),或是出现欺诈可能造成巨大损失的情况(金融系统)。

根据两类错误,共识算法可以分为 CFT(Crash Fault Tolerance)和 BFT(Byzantine Fault Tolerance)两类。

  • CFT 典型算法包括 Paxos、Raft 等,可以容忍不超过一半的故障节点。

  • BFT 典型算法包括以 PBFT(Practical Byzantine Fault Tolerance)的确定性系列算法、POW 为代表的概论算法等。这类算法可以容忍不超过 1/3 的故障节点。

CFT 算法无法容忍恶意节点。

比特币

下面以比特币为例,演示区块链的基本流程。

比特币中包含了三个基本概念:

  • 交易:交易代表了用户之间的转账操作。

  • 区块:区块代表了一段时间内网络中的交易记录。

  • 区块链(账本):由区块构成的链表。代表了已经记录在案的交易。

比特币网络中具备者一些全局状态,这些状态包括了参与者的身份信息、参与者拥有的比特币数量等。这些状态可以通过区块链查询。

当用户之间发起转账交易时,首先将交易转发到比特币网络中。网络中的矿工(类似现实中的银行)负责收集这些交易,然后将这些交易打包成区块,再将这些区块追加到区块链上。

打包区块者在实行 POW 机制的区块链网络中被称为矿工,在实行 PoS 机制的区块链网络中被称为验证者。

由于比特币是一个 p2p 网络,因此任何人都有权利成为矿工。这时候需要一个机制来决出谁有权限将区块追加到区块链上。比特币中使用了 POW(Proof of Work)机制来解决这个问题。

经过合理的设定,比特币网络中每 10 分钟会产生一个区块。

POW 通过计算难题的方式来选举出矿工,因此矿工对账本的权利与其算力成正比。

矿工对区块打包成功后就可以将区块广播到网络中,其它节点验证区块的合法性后,就会将这个区块追加到自己的区块链上。

如果在一段时间内多个节点都计算出了区块,那么就会出现分叉。这时候网络会选择最长的链作为主链,其它链则会被抛弃。

随着链长的增加,单个区块被推翻的可能性也越来越低。因此部分机构会等待区块链的链长达到一定程度后再确认交易。

矿工奖励

由于矿工进行了工作,因此需要给予矿工一定的奖励。矿工奖励分为两种:

  • 区块奖励:每个区块中都会包含一笔奖励交易,这笔交易的输出就是矿工的奖励。

    对于比特币这样的网络而言,其比特币总量是固定的。矿工能得到的区块奖励每 21 万个区块减半。因此随着链长度的增加,矿工的区块奖励会逐渐减少。

    对于以太坊这样的网络而言,其 ETH 的数量是无限的。但是每笔交易都会导致消耗一定数量的 ETH,从而避免的 ETH 的通胀。

    以太坊的区块奖励是根据多种因素计算出来的,这些因素包含了矿工质押的 ETH 数量、以太坊中 ETH 的总量。但是总体而言矿工质押的 ETH 数量越多,则能获得的奖励越多,同样对矿工而言风险也越大。

  • 手续费:用户在发起交易时可以设置手续费,这笔手续费会被矿工收取。

区块奖励:每当矿工成功将一个区块追加到区块链上都能获得一部分奖励。这类似于现实中央行将货币投放到银行中。

手续费:

每次交易都包含了下面几个部分:

  • 转账人的地址

  • 转账的金额

  • 接收人的地址

  • 接收人收到的金额

一次交易中可能存在多个转账人和收帐人。矿工收到交易后会负责验证交易的有效性。

接收人收到的金额和转账的金额之间往往会有一部分差值,这部分差值就是手续费。由于区块能包含的交易数量是有限的,因此矿工往往倾向于选择单位字节手续费最高的交易。

创币交易

区块链中的第一笔交易是特殊交易,被称为创币交易。创币交易是用来奖励矿工奖励的,同时也是为了驱动整个区块链网络启动。

区块链网络的更新

区块链网络的更新是一个复杂的过程,需要社区、开发者和所有利益相关者的共同努力。区块链的更新分为两种:

  • 硬分叉:更新客户端后新客户端和旧客户端不兼容。

  • 软分叉:新客户端依然兼容旧客户端。

硬分叉是一个复杂的过程,需要社区首先达成共识,然后由官方选择一个时间点通知所有人进行更新。

如果社区不服从硬分叉,就会导致区块链发生分裂。这时旧网和新网同时存在,同时形成两个独立的社区。

在比特币和以太坊历史上发生过多次硬分叉导致的社区分裂。

Last moify: 2024-12-26 02:48:38
Build time:2025-07-18 09:41:42
Powered By asphinx