最近经常和一些朋友聊到区块链相关内容,很多人对区块链的理解只停留在数字货币,对整个区块链及其相关衍生物的了解程度都比较低,我来整理一下最基本的区块链工作原理及知识,以做科普。

区块链?

区块链概念最早可以追溯到中本聪时间。2008年中本聪提出了加密数字货币和相关加密算法的概念,从这个时间起,区块链就逐渐的开始在互联网上生根发芽。最早期大部分人都认为比特币是一个骗局,因为这种货币既没有实体,也没有实际价值(注意区分价值和价格,最早期价格也许有,但是价值是确实没有的),所以在最早期持有持有比特币的那一群人在领到mint后的不久都分分出售了手中的BTC,所以现在币圈很难见到手上有上千个BTC的投资者,如果从2012年持续持有BTC的话,现在的收益已经会有几千倍了,从BTC的市值就不难看出,web3在近些年的发展有多迅速了。

那么,现在有一个现实的问题,区块链就是加密货币吗?加密货币是否就是区块链的全部?

区块链原理(基于Ethereum 主网)

先从区块链这三个字进行解读,这个词可以拆分为区块和链两部分,区块顾名思义,就是一个一个的数据块,链就是一个链条,组合起来就可以把区块链解释为数据块组成的一个数据链条。我们可以用程序语言来理解这个数据结构就很容易被接受了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type Block struct {
Header *Header // 区块头(核心元数据)
Transactions []*Transaction // 交易列表
Uncles []*Header // 叔块头(以太坊特有)
}

type Header struct {
ParentHash common.Hash // 前一个区块哈希(32字节)
UncleHash common.Hash // 叔块哈希的Merkle根
Coinbase common.Address // 矿工地址
Root common.Hash // 状态树根哈希(关键!)
TxHash common.Hash // 交易树的Merkle根
ReceiptHash common.Hash // 交易收据树的Merkle根
Bloom Bloom // 日志过滤器
Difficulty *big.Int // 当前区块难度
Number *big.Int // 区块高度(BlockID的升级版)
GasLimit uint64 // 区块Gas上限
GasUsed uint64 // 本区块消耗的总Gas
Time uint64 // 区块时间戳
Extra []byte // 额外数据
MixDigest common.Hash // 随机数混合值
Nonce BlockNonce // 工作量证明随机数(8字节)
}

这是一个简单的区块数据结构,可以看到每个区块中都会包含上一个区块的哈希,也就是只有上一个区块数据被打包固定后才会生成的一个唯一Hash,然后被记录到新的区块中,这个反向链表有以下一些优势:

  1. 整个链仅可以向后追加,且全链都不可以更改。因为任意节点的数据发生变化后,其区块Hash一定会变,那么后续所有区块中的ParentHash也都会发生变化,相当于来说从这个节点以后的所有数据都成了不可信或者废数据。

  2. 数据完整性验证优势。当一个节点同步区块链数据时,可以用下一个区块中存储的上一个区块Hash来校验上一个区块的数据是否合法。

  3. 可以通过一个区块高度查到所有这个区块前的数据。推广一下这个特性,也就是如果在某一个区块之后网络发生了不可逆的问题,也可以回滚到某一个时间点的数据以及所有交易记录(以太坊主网在 2016 年 DAO 攻击事件后进行了硬分叉,回滚了攻击发生后的状态,形成了今天的 Ethereum(ETH)与 Ethereum Classic(ETC)两条链。)

其实从上面说的这些特点可以看出,区块链是一个主要用来存数据的东西,所有历史数据都是不可被篡改的,这其实就是区块链最大的价值。那么既然区块链要存大量的数据,这些数据要怎么存呢?数据优势怎么正确的被存起来的?这个就要从区块链网络结构来切入都存储原理了。

区块链结构(Ethereum 主网)

Ethereum 主网网络的结构可以大概归纳为这样:

7a58187e3fb87a6c466b7b49fd8a2f3f.png

看这个结构中有很多种类的节点,理解起来比较困难,那么我从完成一笔交易来解释整个网络工作的机制。

e53f0d29620beefd700a5ae610e5b0a1.png

比如,我的钱包发起 USDT 转账,本质是调用 USDT 合约的 transfer 函数。钱包构造交易并签名后,通过连接的 RPC 节点将交易广播到网络中的内存池。验证者从内存池中选取交易,在以太坊虚拟机(EVM)中执行合约调用,计算状态变更,并将交易打包进候选区块。随后,验证者通过权益证明(PoS)共识机制达成共识,确认该区块的有效性。所有全节点再执行区块内交易以验证一致性,最终将该区块写入链上,更新 USDT 合约的账户余额状态。

共识机制

早期以太坊采用 PoW(工作量证明)共识机制,出块权由矿工的算力决定,算力越高的矿工越有可能优先挖出新区块。当矿工节点接收到新的交易后,会将其加入内存池,并开始对新区块进行哈希计算,试图生成一个满足全网难度目标的区块头。一旦某个矿工率先算出合法区块,会将其广播至全网,由其他全节点进行验证。只要该区块中的交易合法,且哈希值满足难度要求,该区块就会被接受并添加至主链。网络会向成功出块的矿工发放奖励,包括交易中的 Gas 费用和系统的区块奖励。

当前 PoW 共识机制已被淘汰,以太坊主网已全面转向 PoS(权益证明)机制。在 PoS 模式下,出块者由原先的矿工变为验证者,系统会根据质押的 ETH 数量进行加权随机选择,决定哪个验证者负责出块。区块生成后,其他验证者将对其进行验证,一旦共识达成,该区块就会被正式添加到主链中。出块验证者可以获得交易手续费(Gas)以及可能的 MEV 奖励。相比 PoW 模式,PoS 不再依赖高强度的哈希运算,验证节点的硬件要求和能耗显著降低,出块能力与其质押的 ETH 数量正相关。

数字货币金融属性的诞生

从上边的整个原理可以看到,无论是 PoW 还是 PoS 共识机制,出块行为都伴随着实际的资源消耗。PoW 依赖矿工的算力竞争,需要大量电力和硬件设备;而 PoS 虽然计算强度较低,但仍需质押资产、维持节点在线等资源投入,因此都具有一定的运行成本。

当用户在链上发起交易时,需要支付 Gas 费用(以太坊网络中以 ETH 计价),这笔费用最终由成功出块的矿工或验证者获得,以激励其参与网络安全维护。随后,这些获得的代币往往会被出售或兑换成其他资产,从而流入市场,进一步推动了整个数字货币交易生态的形成。

从这个角度来看,数字货币本质上是为支撑区块链运行而设计的一种激励机制,是区块链技术体系中的一种经济衍生物,而不是区块链的全部。

杞人忧天

当前以太坊已全面转向 PoS(权益证明)机制。在这种模式下,验证者被选中参与出块的概率与其质押的 ETH 数量成正比,质押越多,被选为出块者的机会也就越高。这种机制虽然提升了网络能耗效率,但也引发一些安全担忧,例如:某个质押量极高的验证者是否有可能通过作恶来干扰网络运行?

在PoS机制下,一旦验证者存在恶意行为,如双签(double signing)、发布无效区块、长时间离线等,网络将对其进行惩罚(Slashing),从其质押的 ETH 中扣除一定比例作为惩罚,情节严重时甚至会完全没收质押并将其剔除出验证者集合。被剔除后,该节点将不再具备出块权,也无法继续打包交易,对主网的影响也就自然终止。