4.BTC-具体实现

基于交易的账本(Transaction-based Ledger)

BTC使用UTXO模型 (Unspent Transaction Output Model - 未花费的交易输出模型),简单来说,比特币的账本不记录任何人的“账户余额”。相反,它记录一笔笔不可更改的交易历史。每个账户余额并不被记录在某个地方,而是分散在整个区块链历史中的、指向你的、尚未被花费的“数字支票”。

在一个转账交易中,可能存在多个输出。一个UTXO的结构非常简洁,它主要包含两个关键部分

1. 金额 (Value / Amount)

这部分指定了这张“数字支票”的面值是多少。

  • 单位:这个值通常用比特币的最小单位“聪” (Satoshi) 来记录。1个比特币等于1亿(10^8)聪。
  • 作用:明确定义了这个UTXO所代表的、可以被未来交易花费的比特币数量。

2. 锁定脚本 (Locking Script / scriptPubKey)

这是UTXO中最核心部分。它不是一个简单的“收款人”字段,而是一段简短的、可执行的代码

  • 作用:这个脚本定义了一个“谜题”或“解锁条件”。它规定了**“谁以及如何”** 才能在未来花费这个UTXO。
  • 灵活性:锁定脚本的编程能力虽然有限,但也允许一些更复杂的花费条件,例如:
    • 多重签名 (Multi-sig):需要多方(比如3个人中的2个)提供签名才能花费。
    • 时间锁 (Time Lock):规定这笔钱在某个特定的时间或区块高度之后才能被花费。

最常见的类型 (P2PKH - Pay-to-Public-Key-Hash):在绝大多数标准交易中,这个锁定脚本的内容大意是:

“任何人,只要他能提供一个公钥,这个公钥的哈希值与这个地址 [接收方的地址] 相匹配,并且他还能用这个公钥对应的私钥对这笔花费交易生成一个有效的数字签名,那么他就被允许花费这笔钱。”

需要注意的是,一个UTXO本身并不包含诸如“交易ID”或“它属于哪个交易”之类的信息。它只是一个纯粹的“输出”。

当一个节点需要追踪所有的UTXO时,它会通过扫描整个区块链来构建一个“UTXO集”。在这个集合中,为了方便索引,每个UTXO都会与创建它的那笔交易的ID和它在该交易输出列表中的位置(索引号)关联起来。

所以,一个被全节点所管理的、可供花费的UTXO,其完整信息通常是这样被引用的:

  • 创建该UTXO的交易ID (Transaction ID, TxID)
  • 它在该交易输出列表中的索引号 (Output Index)
  • 金额 (Value)
  • 锁定脚本 (scriptPubKey)

当要创建一笔新的比特币交易时,您钱包里的软件会自动执行以下操作:

  1. 选择UTXO:钱包会从它为您管理的UTXO列表中,挑选一个或多个总额足够支付本次交易的UTXO。
  2. 构建“输入” (Input):对于每一个被选中的UTXO,您的钱包都会在新交易的“输入”部分创建一个引用。这个引用不包含那个UTXO的金额或锁定脚本,而是只包含两个指向它的“指针”:
    • 交易ID (TxID):创建了这个UTXO的那笔原始交易的哈希值。这告诉网络要去哪张“转账凭证”上找。
    • 输出索引号 (Output Index / vout):这个UTXO在那笔原始交易的输出列表中的位置,从0开始计数。因为一笔交易可能有两个或更多的输出(一个给收款人,一个找零),所以必须用索引号来明确是哪一个。

区块头在挖矿中的实践

随着挖矿难度呈指数级增长,如今单纯调整Nonce找到有效哈希的概率已经小到可以忽略不计。比特币区块头中留给Nonce的空间是一个32位的无符号整数。Nonce的总可能性只有 232 个,大约是43亿。当矿工在一瞬间遍历完整个Nonce空间却没有找到解时,他们必须改变区块头的其他部分,来创造一个全新的哈希题目,然后再重新开始遍历Nonce。区块头里的大部分字段是固定的(如版本号、上一个区块的哈希)。矿工能够有效改变的,主要是以下两个部分:

  1. 改变时间戳 (Timestamp)矿工可以轻微地调整区块头中的时间戳。每改变一次时间戳,整个区块头的哈希计算题目就变了,矿工又可以重新从0到43亿遍历一遍Nonce。但这提供的变化空间也有限。
  2. 改变默克尔根 (Merkle Root) - 这是最主要的方法默克尔根是区块中所有交易的哈希摘要。要改变默克尔根,只需要改变交易列表中的任何一点数据即可。矿工最常使用的是一种被称为 "ExtraNonce" 的技巧:
    • Coinbase交易:每个区块的第一笔交易是Coinbase交易,这是矿工用来领取区块奖励和手续费的。这笔交易是由矿工自己创建的。
    • ExtraNonce空间:Coinbase交易中有一个特殊的、可以写入任意数据的区域。矿工可以在这里设置一个计数器,称之为额外Nonce(ExtraNonce)

挖矿的概率分析

系统的出块时间

比特币挖矿中的每一次哈希计算,都可以被看作是一次伯努利试验。每一次哈希计算都是一个完全独立的事件,每一次尝试都是一个全新的开始。这就是挖矿的无记忆性。那么整个挖矿过程就可以用一个更进一步的概率模型来描述——几何分布 (Geometric Distribution)

当我们关心的问题变成在固定的时间段内,会发生多少次成功事件时候,整个事件可以用泊松分布来近似。而指数分布 (Exponential Distribution),正是用来描述一个泊松过程中,两次连续事件之间等待时间的概率分布。因此整个系统的出块时间的概率密度如下:

  • 短的出块时间更常见t(时间)越接近0,概率密度越高。这意味着,出现较短的出块间隔(例如1分钟、2分钟)的可能性,要比想象的频繁得多。
  • 长的出块时间很稀有:随着t的增加,曲线迅速下降。这意味着,出现超长的出块间隔(例如40分钟、1小时)是可能的,但概率非常非常低。

比特币系统通过动态的调整,维持系统的出块时间保持在十分钟左右。

矿工的出块时间

矿工的出块时间,和矿工的算力占全网总算力的百分比有关,平均出块时间遵循下面的这个公式:

矿工的平均出块时间 = 全网平均出块时间 / (矿工的算力 / 全网总算力)

或者写作:

T_miner = T_network / 算力份额

一个具体的例子如下,假设前提:

  • 全网平均出块时间: 10 分钟
  • 全网总算力: 约 750 EH/s (750×1018 H/s)

情况一:一个拥有顶级矿机的个人矿工

  • 个人算力: 假设您购买了一台当前最顶级的ASIC矿机,算力为 200 TH/s (200×1012 H/s)。
  • 计算算力份额: 份额 = (200 * 10^12) / (750 * 10^18) ≈ 0.000000267 (大约是全网算力的百万分之0.267)。
  • 计算平均出块时间: T_miner = 10 分钟 / 0.000000267 ≈ 37,453,183 分钟

让我们把这个时间转换成更容易理解的单位:

  • 37,453,183 分钟 ≈ 624,220 小时
  • 624,220 小时 ≈ 26,009 天
  • 26,009 天 ≈ 71.2 年

结论:在当前的网络难度下,一个拥有顶级个人矿机的矿工如果选择独立挖矿 (Solo Mining),他平均需要等待超过70年才有可能挖到一个区块。这在经济上是完全不可行的。

情况二:一个大型矿池

  • 矿池算力: 假设一个大型矿池控制了全网 15% 的算力。
  • 计算算力份额: 份额 = 0.15
  • 计算平均出块时间: T_pool = 10 分钟 / 0.15 ≈ 66.7 分钟

结论:这个大型矿池平均每隔1小时零7分钟左右就能挖出一个区块。这使得他们的收入变得非常稳定和可预期。矿池会将挖到的区块奖励,按照矿池内每个成员贡献的算力比例进行分配,从而让拥有少量算力的个人也能每天获得持续、微薄的收益。

比特币的总量

比特币的总量上限被硬编码(Hard-coded)在比特币的核心协议中,总量为 2100万枚

比特币的总量限制是通过其独特的发行机制——区块奖励 (Block Reward)减半 (Halving) 来实现的。

  1. 发行方式:新的比特币是通过“挖矿”作为区块奖励凭空创造出来的,并支付给成功创建新区块的矿工。这是比特币进入流通的唯一途径。
  2. 减半机制:比特币协议规定,大约每四年(或准确地说是每210,000个区块),矿工挖出新区块所获得的比特币奖励数量就会减少一半

由于区块奖励以指数级递减,虽然绝大多数(超过90%)的比特币已经被挖出,但剩下的少量比特币将会花费很长的时间才能全部挖完。根据这个减半的时间表,预计最后一枚比特币(确切地说是最后一个“聪”,比特币的最小单位)将在大约公元2140年被挖出。届时,比特币将不再有新的供应量增加,总量将永久恒定在2100万枚。之后,矿工的收入将完全来自于用户支付的交易手续费 (Transaction Fees)。虽然理论总量是2100万,但据估计,有数百万枚早期的比特币因为私钥丢失等原因,已经永久地退出了流通,这使得实际可用的比特币数量比理论值要更少,进一步增加了其稀缺性。

Bitcoin is secured by money

比特币的安全性,直接源于、并正比于为了维护它而投入的、以及可以从中获得的真金白银(经济价值)。安全不是凭空产生的,也不是仅仅依靠高超的密码学算法。它是由一个精心设计的、以“钱”为核心的经济博弈系统来保证的。

虽然挖矿的过程没有实际的意义,但是每一次挖矿,都是矿工将现实世界中的真金白银——主要是电费硬件折旧费——转化成一个区块的过程。我们之前讨论的“没有实际意义的求解”,其实就是一种可验证的“成本证明”。这相当于为数字化的区块链,建立了一条物理世界的、由能源和金钱构筑的护城河。要篡改一个历史区块,攻击者必须付出同样高昂、甚至更高的真实经济成本来重新进行工作量证明。一个区块越古老,它上面叠加的“加密成本”就越多。要进行51%攻击,攻击者需要投入的硬件和电力成本将是天文数字。因此,系统的安全性与全网矿工持续投入的“钱”(总算力成本)是成正比的。网络越有价值,吸引的算力就越多,用于“烧钱”保卫它的资金就越多,它就越安全。

同时,这些能“赚到”的钱校准了参与者行为。矿工花费巨额成本去挖矿,他们的目标是赢取区块奖励(新发行的比特币 + 交易手续费)。这个奖励是诚实地遵守协议规则、创建有效区块的直接回报。但是如果现在,假设一个掌握了51%算力的巨型矿工想要作恶,比如进行双重支付。首先,他为了获得这51%的算力,已经投入了数十亿甚至上百亿美元的资金购买矿机和建设基础设施。这些都是他的沉没成本。之后,即使成功发动了攻击,这个事件会立刻被公之于众。整个市场对比特币的信任将瞬间崩溃,导致比特币的价格暴跌。那么,他辛辛苦苦通过攻击获得的比特币,其价值会大大缩水。他作为矿工持有的、未来本可以稳定赚取的区块奖励,其价值也会暴跌。他那上百亿美元的、除了挖比特币外别无他用的ASIC矿机,会立刻变成一堆几乎一文不值的废铁。这个系统通过高额的奖励,将矿工的经济利益与比特币网络的整体安全紧紧地捆绑在了一起。保护比特币,就是保护他们自己的财富和投资。

在BTC中,矿工投入的巨额金钱(挖矿成本)构成了防止外部攻击的坚固城墙,而对未来赚取更多金钱的预期(区块奖励),则确保了城墙内最有力量的守护者(矿工)会自觉地、忠诚地保卫这座城市,因为城市的繁荣与他们自身的利益完全一致。

确认(Confirmation)

比特币中的“确认”(Confirmation),是一个衡量交易安全性和不可逆转程度的关键指标。简单来说,一笔交易的“确认数”,指的是包含这笔交易的那个区块之后,又新链接了多少个区块。

  1. 0次确认 (Unconfirmed)
    • 当您发出一笔比特币交易后,它首先会被广播到整个网络中,进入一个叫做“内存池”(Mempool)的“等待区”。
    • 此时,这笔交易是未经确认的,状态为“0次确认”。它有被双重支付或替换的风险。
  2. 第1次确认 (1 Confirmation)
    • 矿工从内存池中挑选交易,将它们打包进一个候选区块,然后进行挖矿。
    • 当一个矿工成功挖出一个区块(完成了工作量证明)并将其广播到网络后,如果您的交易恰好被包含在这个区块里,那么您的交易就获得了它的第1次确认
    • 这意味着,您的这笔交易已经被正式地、第一次写入了区块链这个公共账本上。
  3. 第2、3、... N次确认 (2, 3, ... N Confirmations)
    • 区块链是不断向前延伸的。当网络中的矿工在包含您交易的那个区块(我们称之为区块N)之上,又成功挖出了一个新的区块(区块N+1)时,您的交易就获得了2次确认
    • 当区块N+2被挖出后,您的交易就获得了3次确认,以此类推。

所以,一笔交易的确认数可以这样计算: 确认数 = (当前最新的区块高度 - 包含该交易的区块高度) + 1

每一次新的确认,都相当于在您的交易之上又加了一道不可逆转的“安全锁”,极大地增加了篡改这笔交易的难度。在实际中,这是为了抵御一些分叉攻击的风险。

  1. 抵御“区块链重组”的风险 (Chain Reorganization)

在一个去中心化的网络中,偶尔会有两个矿工几乎在同一时间挖出不同的区块,导致区块链出现一个短暂的分叉。您的交易可能只在其中一个分叉上。网络会通过“最长链规则”自动解决这个冲突,最终只有一条链会胜出,另一条较短的链会被抛弃。

  • 如果交易不幸在被抛弃的那个分叉上,它就会从“已确认”状态变回“未确认”,重新进入内存池等待下一次打包。
  • 每多一次确认,就意味着您的交易所在的链条变得更长、更稳固,它被抛弃的可能性就以指数级下降。通常在2-3次确认后,这种风险就变得微乎其微。
  1. 抵御“51%攻击”和“双重支付” (51% Attack / Double-Spending)

这是更深层次的安全保障。要篡改一个历史区块,攻击者必须重新计算该区块及其之后所有区块的工作量证明,并且其计算速度必须超过全网的其他诚实矿工。

  • 1次确认:意味着攻击者只需要自己再挖一个块,并超过主网,就有可能实现双花。虽然仍很难,但对于拥有巨大算力的实体来说,并非完全不可能。
  • 6次确认:意味着在您的交易之上,已经堆叠了5个新的区块。攻击者现在必须拥有超强的算力,在私下里连续、秘密地挖出6个区块,并且速度要超过整个诚实网络公开挖出6个区块的速度,才能成功篡改您的交易。这在计算和经济上的成本是天文数字,被认为是实践上不可能完成的。

在实际中,确认数和风险数是挂钩的:

  • 0次确认:风险极高,不应被信任(除非是像买杯咖啡这样的小额即时支付场景,且商家愿意承担风险)。
  • 1次确认:对大多数小额、日常交易来说足够快且相对安全。
  • 3-6次确认:这是行业内普遍接受的交易最终完成的标准。绝大多数交易所和商家在处理较大金额的充值或付款时,都会要求达到6次确认。
  • 100次确认:对于像Coinbase交易(矿工给自己的奖励)这样新产生的比特币,协议要求必须经过100次确认后才能花费。这是一种极高级别的安全措施。