Skip to content

区块链:去中心化的分布式账本

字数
3051 字
阅读时间
13 分钟

一、比特币基础

比特币的基石是哈希算法和密码学。

1.1 密码学哈希函数

关键术语:

  • crypto-currency: 加密货币
  • cryptographic hash function: 加密哈希函数
  • collision resistance: 抗碰撞性。指找到两个不同的输入 xy,使得 H(x) = H(y) 在计算上是不可行的。这是哈希函数的关键性质之一。
  • brute-force: 暴力破解。
  • message digest: 信息摘要。
  • hiding: 隐藏性/不可逆性。指通过哈希函数的输出 H(x),在计算上无法反推出原始输入 x
  • digital commitment / digital equivalent of a sealed envelope: 数字承诺数字信封。这是 hidingcollision resistance 两个性质的结合应用。
  • puzzle friendly: 谜题友好性。指无法通过投机取巧的方式来求解哈希谜题,只能通过暴力尝试。这是比特币挖矿依赖的附加性质。
  • proof of work: 工作量证明。通过解决一个计算上困难但易于验证的谜题来证明你付出了努力。例如:求解 H(block_header) ≤ target

哈希算法示例:

  • MD5: 已被证明可以人为制造哈希碰撞,不再安全。
  • SHA-256 (Secure Hash Algorithm): 比特币所使用的哈希函数。

非对称加密:

  • asymmetric encryption algorithm: 非对称加密算法。比特币使用它来生成公私钥对,实现去中心化的账户管理。
  • a good source of randomness: 一个好的随机源,是生成安全密钥对的基础。

1.2 比特币的数据结构

哈希指针 (Hash Pointers)

哈希指针是一种数据结构,它不仅包含指向前一个结构体的指针(地址),还包含了该结构体内容的哈希值。

区块链 (Blockchain) 本质上就是一个使用哈希指针连接起来的链表。

Blockchain with Hash Pointers

默克尔树 (Merkle Tree)

默克尔树用于高效地汇总和验证区块中的大量交易。

  • Merkle proof: 默克尔证明,可以用来证明一个交易确实存在于一个区块中,而无需下载整个区块。
  • Sorted Merkle Tree: 排序默克尔树,可以用来高效地验证某个交易存在于区块中。
  • proof of membership / proof of inclusion: 存在性证明。
  • proof of non-membership: 不存在性证明。

Merkle Tree

区块 (Block)

一个区块由区块头区块体组成。

  • block header: 区块头,包含元数据。
  • block body: 区块体,主要包含交易列表。

网络中的节点分为全节点 (full node) 和轻节点 (light node)。

二、共识协议与系统实现

2.1 分布式共识

double spending attack: 双花攻击,是去中心化支付系统需要解决的核心问题。

比特币交易结构:

  • 输入: 币的来源(指向一个或多个 UTXO)。
  • 输出: 接收方的公钥哈希和金额。

Bitcoin Transaction

区块头 (Block Header) 结构:

  • version: 协议版本。
  • hash of previous block header: 指向前一个区块头的哈希指针。
  • Merkle root hash: 当前区块所有交易构成的默克尔树的根哈希。
  • target: 挖矿难度的目标值。
  • nonce: 用于工作量证明的随机数。

分布式共识的挑战:

  • impossibility result: 不可能结论,如 FLP 不可能原理、CAP 定理。
  • CAP Theorem: 一致性 (Consistency)、可用性 (Availability)、分区容错性 (Partition tolerance),三者不可兼得。
  • Paxos: 一种经典的分布式共识协议。

比特币共识协议 (Nakamoto Consensus):

  • 投票机制: 记账权(投票权)与算力(工作量证明)挂钩,以抵御 sybil attack (女巫攻击)。
  • 最长合法链原则: longest valid chain,节点永远沿着最长的链继续挖矿。
  • forking attack: 分叉攻击,攻击者试图通过算力优势创建一条比主链更长的分叉链来篡改交易。
  • orphan block: 孤儿区块,指其父区块尚未被本地节点接收的有效区块。

2.2 激励机制

  • block reward: 出块奖励,成功打包区块的矿工获得的奖励,是新比特币的发行方式。
    • coinbase transaction: 每个区块的第一笔交易,用于向矿工发放出块奖励。奖励约每四年减半(50 -> 25 -> 12.5 BTC...)。
  • transaction fee: 交易费,由交易发起者支付给矿工的小费,是矿工收入的另一部分。随着出块奖励的减少,交易费将成为矿工的主要收入来源。

2.3 系统实现

  • 账本模型:

    • transaction-based ledger: 基于交易的账本 (如比特币)。全节点需在内存中维护一个 UTXO (Unspent Transaction Output, 未花费交易输出) 集合。
    • account-based ledger: 基于账户的账本 (如以太坊)。直接记录每个账户的余额。
  • 挖矿 (Mining):

    • hash rate: 哈希率,全网每秒进行哈希运算的次数,是衡量网络算力的指标。
    • miner: 矿工,参与竞争记账权的节点。
  • 确认机制:

    • six confirmations: 六次确认。通常认为,一个交易所在区块之后再增长 6 个区块,该交易就基本上不可能被篡改了。
    • zero confirmation: 零确认,指交易已广播但尚未被打包进区块,安全性低。
  • selfish mining: 自私挖矿,一种特殊的 forking attack,矿工挖到区块后不立即广播,试图以此获得不正当优势。

2.4 比特币网络

  • 设计原则: 简单、鲁棒,而非高效。
  • 网络层级: super node, master node, seed node 等不同角色的节点共同组成 P2P 网络。
  • best effort: 尽力而为的交付模式。
  • 区块大小限制: 约 1MB,限制了每秒可处理的交易数量。

三、挖矿与比特币脚本

3.1 挖矿难度调整

  • 目标: 维持全网平均出块时间在 10 分钟左右。
  • 公式: difficulty = difficulty_1_target / target
  • 调整周期: 每 2016 个区块(约两周)调整一次。
    • new_target = old_target * (actual_time / expected_time)
    • expected_time = 2016 * 10 minutes
    • actual_time 是过去 2016 个区块的实际花费时间。

3.2 挖矿硬件与矿池

  • 硬件演进: CPU -> GPU -> FPGA -> ASIC (专用集成电路)。
  • ASIC resistance: 抗 ASIC,一些加密货币采用对内存要求高的算法,以抵制 ASIC 矿机带来的算力中心化。
  • 矿池 (Mining Pool):
    • 矿工将算力接入矿池,共同挖矿,按贡献分配收益。
    • pool manager (矿池管理员) 负责组织矿工,并运行全节点。

3.3 比特币脚本语言 (Script)

比特币内置一种简单的、基于栈的、非图灵完备的脚本语言,用于定义交易的解锁条件。

Bitcoin Script

常见脚本类型:

  • P2PK (Pay-to-Public-Key): 支付给公钥。
  • P2PKH (Pay-to-Public-Key-Hash): 支付给公钥哈希(最常用)。
  • P2SH (Pay-to-Script-Hash): 支付给脚本哈希,常用于多重签名。
  • Proof of Burn: 销毁证明,通过向一个无法花费的地址发送比特币来销毁它们。可用于获取 AltCoin 或在区块链上写入数据。

四、分叉与匿名性

4.1 硬分叉与软分叉

  • protocol fork: 协议分叉,指区块链协议规则发生改变。
  • hard fork: 硬分叉。协议规则发生不向后兼容的变更。旧节点无法验证新规则下的区块。这会导致区块链永久性分裂,如 block size 增加。
  • soft fork: 软分叉。协议规则发生向后兼容的变更(通常是收紧规则)。旧节点仍然可以接受新规则下的区块,但自己无法产生合法的新区块。分叉是临时性的,如 block size 减小。

4.2 匿名性与隐私保护

  • 比特币的匿名性: 比特币是假名 (pseudonymity) 而非匿名的。地址和真实身份之间没有直接关联,但所有交易在链上都是公开可追溯的。
  • 破坏匿名性的方法:
    1. 地址关联: 通过分析交易图谱,将多个地址关联到同一个实体。
    2. 链下关联: 将链上地址与现实世界身份关联(如交易所 KYC、商家支付信息)。
  • 增强匿名性的方法:
    1. coin mixing: 混币服务,将多个用户的币混合在一起,打乱资金流向。
    2. 使用不同的钱包地址。

4.3 零知识证明 (Zero-Knowledge Proof)

零知识证明是指一方(证明者)能向另一方(验证者)证明某个论断是正确的,而无需泄露除了“该论断是正确的”之外的任何信息。

  • 同态隐藏 (Homomorphic Hiding): 是一种允许在加密数据上直接进行计算的加密形式,是构建某些零知识证明系统的基础。

Homomorphic Hiding 1Homomorphic Hiding 2

五、以太坊 (Ethereum)

以太坊是一个开源的、支持智能合约 (smart contract) 的公共区块链平台。

5.1 与比特币的对比

  • 出块时间: 更短,约十几秒。
  • 挖矿算法: 早期采用 Ethash 算法,具有一定的 ASIC resistance。现已转向 Proof of Stake
  • 共识机制: 从 Proof of Work (工作量证明) 转向 Proof of Stake (权益证明)。
  • 账本模型: account-based ledger (基于账户的模型)。
  • 核心功能: 支持图灵完备的智能合约。

5.2 账户类型

  • externally owned account (EOA): 外部账户,由用户通过私钥控制。
    • balance: 账户余额。
    • nonce: 交易计数器,用于防止 replay attack (重放攻击)。
  • smart contract account: 合约账户,由代码控制,没有私钥。
    • balance: 账户余额。
    • code: 合约的字节码。
    • storage: 合约的持久化存储。

5.3 数据结构:MPT (Merkle Patricia Trie)

以太坊使用 Merkle Patricia Trie (MPT) 这种数据结构来高效地组织和验证状态。区块头中包含了三棵 MPT 的根哈希:

  1. 状态树 (State Trie): 包含所有账户的状态信息。
  2. 交易树 (Transaction Trie): 包含当前区块的所有交易。
  3. 收据树 (Receipts Trie): 包含每笔交易执行后的“收据”。

MPT 结构

以太坊的运行过程可以看作是一个交易驱动的状态机 (transaction-driven state machine)。

5.4 GHOST 协议

GHOST (Greedy Heaviest Observed Subtree) 协议是以太坊早期用于解决因出块时间缩短而导致分叉增多问题的协议。它通过将叔块(uncle block)的算力也计入主链权重,来提高网络的稳定性和安全性。

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写