我们可以用一个数字账本来做类比:
- 交易 (Transaction):账本中的每一条记账记录。
- 区块 (Block):账本中的每一页,上面写满了记账记录。
- 链 (Chain):整本账本,由一页一页按顺序装订而成。
下面我们来详细拆解它们的结构和关系。
1. 交易 (Transaction):基础数据单元
交易是区块链中最基本、最小的组成单位。它本质上是一条记录,声明了“谁在什么时间,把什么东西,转移给了谁”。
交易的结构 (以比特币为例):
一个基本的交易通常包含以下几个部分:
- 输入 (Inputs):指明了这笔交易的资金来源。它引用了你之前收到的、尚未花费的交易输出(UTXO - Unspent Transaction Output)。你可以把它理解为:“我用我钱包里之前收到的这几笔钱来支付”。
- 输出 (Outputs):指明了资金的去向。它包含:
- 收款方地址 (Recipient's Address):钱要转给谁。
- 金额 (Amount):要转多少钱。
- 找零 (Change):如果你的输入金额大于支付金额,多余的钱会作为一笔新的输出返回给你自己的地址,这就是找零。
- 数字签名 (Digital Signature):这是最关键的部分。发送者用自己的私钥对整个交易进行签名,以此证明:
- 所有权:只有拥有私钥的人才能花费这些资金。
- 不可篡改性:一旦交易被签名,任何内容的微小改动(如金额、收款人)都会导致签名失效。
简单理解: 交易就像一张你填写好并签了名的支票,上面写着付款人、收款人、金额,你的签名确保了这张支票是你本人开出且内容无误。
2. 区块 (Block):交易的容器
单个的交易在网络中广播后,并不会立即被确认。矿工(或验证者)会将一定时间段内(比如10分钟)收集到的大量待确认交易打包在一起,形成一个“区块”。
区块的结构:
一个区块主要由两部分组成:
-
1. 区块头 (Block Header):这是区块的元数据和摘要信息,包含了区块的身份证明。
- 前一个区块的哈希值 (Previous Block Hash):这是实现“链”的关键。它像一个指针,指向链条中的上一个区块,将所有区块串联起来。
- 时间戳 (Timestamp):该区块被创建的大致时间。
- 默克尔树根 (Merkle Root):一种高效的密码学工具。它将区块内所有交易数据进行两两哈希,再对结果进行哈希,层层向上,最终生成一个唯一的哈希值。这个值可以用来快速验证区块中是否包含了某笔特定交易,并确保所有交易都未被篡改。
- 随机数 (Nonce):一个没有任何意义的数字。在工作量证明(PoW)机制中,矿工通过不断改变这个数值并进行哈希运算,来寻找一个满足特定难度要求(比如开头有若干个0)的哈希结果。这个寻找过程就是“挖矿”。
- 难度目标 (Difficulty Target):规定了挖矿的难度。
-
2. 区块体 (Block Body):
- 交易列表 (Transaction List):包含了这个区块打包的所有交易记录的完整列表。
简单理解: 区块就像账本的一页纸。区块头是这一页的页眉,记录了页码(通过前一个区块哈希)、记录时间、以及本页所有交易内容的防伪摘要(默克尔树根)。区块体就是这一页上密密麻麻写满的交易记录。
3. 链 (Chain):区块的有序集合
当一个新区块被成功“挖出”(即找到了符合要求的Nonce)并被网络中的大多数节点验证通过后,它就会被添加到现有区块链的末端。这个过程不断重复,形成了一条不断增长的链条。
链的结构与关系:
- 通过哈希值链接:链的核心在于,每个区块的区块头都包含了前一个区块的哈希值。
区块 N
的头部包含了区块 N-1
的整体哈希值。区块 N+1
的头部又会包含区块 N
的整体哈希值。
- 不可篡改性:这种链式结构提供了极高的安全性。
- 如果你试图篡改
区块 N
中的一笔交易,那么区块 N
的默克尔树根会改变,进而导致区块 N
的整体哈希值也改变。 - 由于
区块 N+1
的头部记录了区块 N
的原始哈希值,现在它对不上了,区块 N+1
就会变得无效。 - 这会引发连锁反应,后续所有区块(N+2, N+3, ...)全部失效。
- 要想让篡改合法化,你必须重新计算从
区块 N
开始往后所有区块的哈希值(即重新“挖矿”),这在算力分散的去中心化网络中几乎是不可能完成的任务。
- 如果你试图篡改
简单理解: 链就是整本账本。每一页(区块)的页眉都写着上一页的“指纹”(哈希值)。如果你想偷偷撕掉或修改其中一页,那么后面所有页上记录的“上一页指纹”就都对不上了,整个账本就作废了,篡改行为会立即被发现。
总结:三者的关系
-
包含关系:
- 链 由多个 区块 组成。
- 区块 由一个 区块头 和一个包含多笔 交易 的 区块体 组成。
-
流程关系(从产生到确认):
- 步骤 1:创建交易
- 用户发起一笔交易,并用私钥签名,然后广播到网络中。
- 步骤 2:打包成块
- 矿工从网络中收集待确认的交易,将它们打包进一个候选区块。
- 步骤 3:链接成链
- 矿工通过解决密码学难题(挖矿),为这个区块找到一个有效的哈希值,然后将其广播出去。
- 其他节点验证通过后,将这个新区块连接到现有链的末端,区块中的所有交易至此得到确认。
- 步骤 1:创建交易
最终的比喻:
- 交易是一块块积木。
- 区块是一个装满积木的透明盒子,盒子上贴着标签(区块头),写着盒子的内容摘要和上一个盒子的编号。
- 链就是用这些盒子按编号顺序一个接一个地堆叠起来的高塔,由于每个盒子都依赖上一个盒子的编号,你无法在中间抽走或替换任何一个盒子而不被发现。