I.C.S.21.006.Account.Bitcoin
加密货币已经是整个金融系统的重要组成部分。
1、加密算法
加密技术是Bitcoin能够成立的基础,分私钥/公钥,从私钥算公钥很容易,从公钥反推私钥在计算上不可行。Bitcoin利用密钥巨大的数据集代替账号,随机生成几十亿个账号也不可能有重复的可能性,全世界所有人可以共享同一个账本。
以自托管钱包为例,钱包在本地生成一个随机数私钥 k(256-bit),再由私钥推导出 公钥 K = k·G(椭圆曲线运算),再由公钥派生出 地址(address,不同链规则不同:BTC 是 hash160+编码),这个地址可以用来收取Bitcoin。
比如,对方的钱包会构造一笔交易,内容包括:(1)收款地址 = 你的 addres;(2)金额 = 1 个币;(3)手续费参数 = gas/fee,然后对方用自己的私钥对这笔交易签名(证明“这笔钱确实是我有权花的”),对方签完名后,钱包把交易广播到网络节点。
这里有一个问题是私钥 k是随机生成的,那么有没有可能碰巧生成某个已用地址?其中概率有多大?假设已经用过的地址是10^9(10 亿),碰巧碰撞的概率如下:
这是天文级别的低概率。
2、数据结构
Bitcoin的数据结构主要包括两个部分:(1)Block chain(区块链数据),这部分记录从创世块以来的“历史票据”;(2)UTXO set(Unspent Transaction Output),记录所有未结清票据的清单,在银行账户模型里,每个账户有一个余额数字,而在Bitcoin 的 UTXO 模型里,“钱”不是账户余额,而是一张张可花的“未花费输出”(UTXO)。
(1)Block chain
Block chain包括两个部分:(1)Block header,相当于一捆捆票据的号码,每一捆都引用前一捆的号码,把所有历史串起来,区块头的数据中还包括用于验证票据的(Merkle root)、携带 PoW 验证字段(nBits、nonce、timestamp 等);(2)Block body,这是存放票据清单的地方,包括第一笔 coinbase + 其他票据的原始序列化数据。
一捆票据的号码通过hash生成,需要耗费大量的资源(PoW,Proof of Work),PoW跟私钥/公钥类似,都是利用数学上的不对称,PoW的特点是难做易验,集全网的算力每10分种出1块,产生后可以把这期间的票据打包压缩后写入这个区块。这中间还搞了奖励机制,区块一般是由矿工挖出来的,矿工除了得到奖励的加密货币以外,打包写入的票据中都包含了手续费,这些手续费也是归矿工的。
Bitcoin的票据类似于AMEX在100多年发行的旅行支票,当时的旅行支票是一本本出售的,里面是一张张固定金额的支票(例如 $10/$20/$50/$100 等),使用时把对应金额的支票撕下来。Bitcoin的方法是类似的,一张未兑现的票据包括:(1)outpoint:这张支票的编号(由哪笔交易开出的第几张);(2)value:面额;(3)locking script:谁能兑现/兑现条件。
Bitcoin的数据结构注定了很难取代Visa/Mastercard的地位,Visa公开材料中宣称其每秒的处理能力超过65000笔,10分钟是3900万笔(大约GB~几十GB的数据),分布式的数据库根本没办法应对,无论是存储还是网络间的传输。
可行的解决方案是把绝大多数交易验证与存储移到其他地方,比如,交易所,主链只承担低频、可审计的净额结算或争议仲裁,这跟传统的支付结算系统没什么区别。
(2)UTXO set
UTXO(Unspent Transaction Output)是另一件核心的数据结构,在任何的时点,系统中肯定有一批未兑现的票据,UTXO set是所有未兑现票据的清单。
- 一个 UTXO = “某笔历史交易产生的一条输出,尚未被后续交易花掉”;
- 验证一笔新交易时,节点必须逐条检查它引用的每个 input 对应的 UTXO 是否存在、是否未花费、锁定脚本是什么、金额是多少。
3、关键假设
Bitcoin的底层是“数据库+驻守程序”,几乎所有的分析都是以一个完美假设为前提,那就是“数据库+驻守程序”不会出问题,肯定不是事实。
Bitcoin当前的价值是2万亿美元左右,背后只是一个个数据的节点,驻守这些数据节点的主要软件是Bitcoin Core,根据Coin Dance的统计,25032个public nodes中,19480个是Bitcoin Core,5519个是Bitcoin Knots,Knots本质上也是Bitcoin Core的代码分支。该项目在GitHub 上维护主仓库(bitcoin),参考:
《Bitcoin Core》,在公开报道与社区讨论显示目前有6人在维护Bitcoin Core的代码,包括:Marco Falke、Gloria Zhao、Ryan Ofsky、Hennadii Stepanov、Ava Chow、TheCharlatan。
数据库分布在网络上各个节点,或许没有谁能破坏所有的节点(这跟银行的备份数据库是相同的逻辑),但是每个节点都有“驻守程序”,单一版本的“驻守程序”能触及80%以上的节点,而这些程序由6个来路不明、身份不明的人负责维护。
以下是历史上发生过的错误事件。
- 2010 Value overflow:验证逻辑缺陷导致区块里出现不应存在的超大发币,参考:《Value overflow incident》。
- 2013 链分叉:版本差异导致网络分裂成两条链,参考:《11/12 March 2013 Chain Fork Information》。
- 2018 CVE-2018-17144:官方披露包含 DoS + critical inflation vulnerability,参考:《Disclosure of CVE-2018-17144》。
4、算法规则
Bitcoin的数据结构指向“账本应该长什么样、资产如何表达”,而算法规则指向的是“在不可信环境中如何执行、如何收敛、如何抵抗作恶与故障”,具体包括:
- 共识层(Consensus),当同时有多个候选“下一页账本”时,选哪一页,共识的作用是全网最终收敛到同一条历史主线(不是即时,但概率收敛);
- 网络层(Networking),交易和区块如何在开放网络里传播,确保候选数据能被看到,否则共识也无从谈起;
- 验证与存储层(Validation & storage),每个节点如何把“历史页 + 状态转移”落到本地,形成可复现的账本副本。
(1)Consensus
共识是算法规则的核心。
- PoW(Proof of Work,工作量证明)
在一个开放网络里,“无成员名单、任何人可加入”的系统里,如果“1 个节点 = 1 票”,攻击者可以轻易开 1 万个节点,就拿到 99.99% 的票——系统立刻被攻破。所以必须把“影响力”绑定到一个难以免费复制的资源,而不是绑定到身份数量。
在 PoW的工作机制中,谁先完成 PoW,谁就赢得把一批交易打包成区块并广播的机会(提案权),因此,“谁能更快出块/更影响链”取决于你占全网算力的比例,而不是你注册了多少节点。
- Chain selection(most accumulated work,最大累计工作量)
Bitcoin的网络做不到瞬时同步,PoW 的“谁先完成”是一个全局事实,但在现实网络里不同节点知道这个事实的时间不一样。于是会出现短时间内的“并发提案”,当节点看到多条分叉链时,选择“累计工作量最大”的那条作为主链(tip)。
可能出现的情况是某笔交易包含在某个分叉链,但是这个分叉链最终没有成为主链,该交易从“主链已确认”退回到“未确认(unconfirmed)”状态,然后被节点重新放回mempool(未确认交易池),等待再次被矿工打包进主链的新区块,这种来回确认是牺牲效率换取可靠性的必然结果,Bitcoin有一非常强的设计目标,包括:(1)无成员名单(permissionless);(2)不依赖身份(Sybil 在身份层无解);(3)网络存在传播延迟与分区可能(现实互联网);(4)仍要在对抗环境中收敛到统一历史。
在这组目标下,“短分叉 + 最终收敛”几乎是结构性现象,要么接受它(概率终局),要么就得引入别的结构(成员名单、委员会、中心化排序者、或更强同步假设)。
- Probabilistic finality(confirmations,确认数)
“交易最终不可逆”不是一个即时布尔值,而是一个概率,随确认数增加而迅速变小。比如,一笔交易被打包进区块 B:它有 1 次确认,在 B 后面又追加了 k 个区块:它有 1+k 次确认(常说 “k confirmations” 指后续追加了 k 个块)。
想把该交易回滚掉,攻击者必须从 B 的父块开始重挖一条替代链,并让替代链累计工作量超过当前链。需要重挖的区块越多,成本越高,成功概率越低。
在具体实践中,钱包/商户/交易所会设定:小额:1–3 次确认可能接受;大额:6 次确认是传统经验阈值(不是神数,只是把风险压低)。
(2)Networking
网络层解决交易和区块如何在开放网络里传播,确保候选数据能被看到,否则共识也无从谈起。
- Gossip relay(交易池、区块传播)
在没有中心服务器的情况下,如何把新交易、新区块扩散到全网,让矿工能打包、让节点能验证、让全网视图最终收敛,包括了交易传播和区块传播。
- 交易传播(tx relay)
- 你把交易发给一个节点(或你的节点生成交易)。
- 节点做基础检查(格式、签名、是否双花、费用/策略等)。
- 通过后放入本节点的 mempool(未确认交易池)。
- 节点用“八卦/口耳相传”(gossip)把交易告诉邻居节点(不是一次发全量,通常先发“我有这笔交易的 ID”再按需发正文,以节省带宽)。
- 区块传播(block relay)
- 矿工挖到新区块后广播。
- 收到区块的节点先验证区块头 PoW、结构、交易等。
- 通过后写入本地,并继续转发给邻居。
用效率换取可靠性的代价包括:(1)传播延迟导致短分叉不可避免;(2)mempool 不一致(各节点看到的交易集合不同);(3)区块越大、传播越慢 → stale block 更高 → 有效吞吐下降。
开放网络里,新节点上线后需要回答:“我该连谁?”没有中心目录、没有成员名单,必须有一套“冷启动 + 自组织发现”的机制,节点实际怎么做?
- Bootstrapping(引导):新节点用一组预置“种子”地址拿到第一批 peers(例如 DNS seeds 解析出一些可连接节点)。
- 地址传播(addr gossip):连上几个节点后,彼此交换“我还知道哪些节点地址”(IP:port),逐步扩展对等体集合。
- 地址管理(addrman):节点本地维护一个地址库,记录历史见过的 peers,下次启动可直接尝试连接。
- 连接策略:节点通常维持一定数量的出站连接,并允许一定数量入站连接(若开放端口)。
用效率换取可靠性的代价包括:(1)爬虫可枚举可达节点;(2)Eclipse 攻击风险:攻击者试图控制你连接到的邻居,让你看到“被投喂的网络视图”;(3)需要连接管理策略(随机化、分散 AS、限制同网段等)来降低被隔离概率。
- Anti-DoS / relay policy(影响可用性,但不是共识)
在开放环境下保持网络活性,防止垃圾把系统拖死,开放网络里任何人都能连你、给你发垃圾数据。要防:
- 带宽/CPU/内存被打爆(DoS)
- mempool 被垃圾交易塞满
- 传播被恶意放大(放大攻击)
- 节点被迫做大量昂贵验证
- 连接层防护:限制入站连接数量、每 IP 的连接数;对异常行为的 peer 断开/惩罚(ban/score);速率限制(rate limit)。
- 交易中继策略(relay policy):只转发满足“标准性(standardness)”与最低费率门槛的交易;丢弃明显不经济的 dust 输出/过大脚本等;mempool 有容量上限,拥堵时优先保留费率高的交易。
- 区块/交易的早期拒绝(cheap checks first):先做便宜检查(格式、大小、基本结构);再做昂贵检查(脚本验证、签名验证),避免被垃圾拖垮。
(3)Validation & storage
这个部分解决每个节点如何把“历史页 + 状态转移”落到本地,形成可复现的账本副本,确保每个节点都能独立复现同一结果(在同一规则下)。
- Full validation(逐块逐交易验证)
让每个节点不依赖任何第三方,仅凭自己拿到的数据就能判断:(1)区块是否有效;(2)交易是否有效;(3)该链是否符合共识规则。收到一个新区块(header+body)后,节点典型验证包含:
- 区块头级检查(便宜)
- prev_hash 是否指向已知父块;
- PoW 是否满足难度目标;
- 时间戳是否在规则范围内;
- 难度(nBits)是否符合难度调整规则。
- 区块体级检查
- 交易列表解析是否正确
- 第一笔是否 coinbase,且 coinbase 格式合规
- 区块大小/weight 是否符合共识上限
- 逐笔交易验证(贵)
- 语法有效、不会产生负值/溢出
- inputs 引用的 UTXO 确实存在且未花费(防双花)
- 脚本/签名验证通过(解锁条件满足)
- sum(inputs) ≥ sum(outputs)(差额是手续费)
- coinbase 奖励不超发(subsidy + fees 上限)
这一步是“驻守程序”的核心门禁。任何一条不满足,区块无效,节点拒收,不写入主链视图。
运行态索引,把“流水”折叠成“未结清明细”,让节点在验证新交易/新区块时,不必回溯全历史,而是用一个“当前状态索引”快速判断:(1)某个 input 引用的输出是否还未花费;(2)花费后如何更新“未结清票据清单”。
UTXO set 的每条记录本质包含:(1)outpoint = (txid, vout) 作为键;(2)value(金额);(3)locking script(锁定条件);(4)以及一些辅助元信息(例如是否 coinbase、确认高度等)。
对每笔交易:(1)对每个 input:从 UTXO set 删除它引用的 outpoint(标记为已花费);对每个 output:把 (txid, index) + (value, scriptPubKey) 加入 UTXO set。
所以 chainstate 是“运行态”,不是区块的一部分;它是从区块历史确定性推导出来的状态。
热门主题
Recent Articles
I.C.S.21.006.Account.Bitcoin
加密货币已经是整个金融系统的重要组成部分。 1、加密算法 加密技术是Bitcoin能够成立的基础,分私钥/公钥,从私钥算公钥很容易,从公钥反推私钥在计算上不可行。Bitcoin利用密钥巨大的数据集代替账号,随机生成几十亿个账号也不可能有重复的可能性,全世界所有人可以共享同一个账本。 以自托管钱包为例,钱包在本地生成一个随机数私钥 k(256-bit),再由私钥推导出 公钥 K = k·G(椭圆曲线运算),再由公钥派生出 地址(address,不同链规则不同:BTC 是 ...
1996-03-01 Warren Buffett.Helzberg
Refer To:《1996-03-01 Warren Buffett's Letters to Berkshire Shareholders》。 Helzberg's Diamond Shops Helzberg 钻石连锁店 A few years back, management consultants popularized a technique called "management by walking around" (MBWA). At Berkshire, we've ...
2010-05-26 Warren Buffett.Investment, Speculation, Gambling
Refer To:《2010-05-26 Warren Buffett.Investment, Speculation, Gambling》。 WARREN BUFFETT: It’s a question of being, it’s the ability to inject enormous amounts of leverage into a system where leverage is dangerous. And without people fully appreciating ...
1997-02-28 Warren Buffett.USAir
Refer To:《1997-02-28 Warren Buffett's Letters to Berkshire Shareholders》。 USAir When Richard Branson, the wealthy owner of Virgin Atlantic Airways, was asked how to become a millionaire, he had a quick answer: “There’s really nothing to it. Start as ...
1997-02-28 Warren Buffett.Super-Cat Insurance
Refer To:《1997-02-28 Warren Buffett's Letters to Berkshire Shareholders》。 Super-Cat Insurance 超级巨灾保险 As in the past three years, we once again stress that the good results we are reporting for Berkshire stem in part from our super-cat business having ...