比特币白皮书

比特币:一种点对点的电子现金系统

中本聪(Satoshi Nakamoto)

邮箱:satoshin@gmx.com

网址:www.bitcoin.org

2008年10月31日发布

摘要

纯点对点的电子现金版本,可让在线支付直接从一方发送到另一方,无需通过金融机构。数字签名为解决方案提供了部分支持,但如果仍需依赖可信第三方来防止双花,其主要优势便会丧失。我们提出一种基于点对点网络的双花问题解决方案:网络通过将交易哈希到一条持续延伸的、基于哈希的工作量证明链中,为交易添加时间戳,形成一份"若不重新完成工作量证明,就无法篡改"的记录。最长链不仅能证明所见证事件的先后顺序,还能证明其源自最大的算力池。只要控制多数算力的节点不串通攻击网络,它们就会生成最长链,从而超越攻击者的链条。该网络的结构需求极低:消息以"尽力而为"的方式广播,节点可随意退出或重新加入网络,只需将最长的工作量证明链视为自身离线期间发生事件的凭证即可。

技术概念补充

点对点(Peer-to-Peer,P2P):指网络中每个节点(如用户的电脑/设备)地位平等,无需通过中央服务器中转,直接互相通信。比如两人面对面现金交易,无需银行参与;而微信转账需经过腾讯服务器,不属于纯P2P。
数字签名(Digital Signature):一种密码学技术,类似"电子盖章"。用户拥有"私钥"(类似钥匙)和"公钥"(类似锁孔),用私钥对交易签名后,他人可通过公钥验证签名真实性,确保交易是本人发起、未被篡改。
双花(Double-Spending):指同一笔数字资产被重复花费。比如你有1个比特币,既转给A又转给B——由于数字文件可复制,若没有防护,可能出现"一笔钱花两次"。
哈希(Hash):一种密码学函数,能将任意长度的数据转化为固定长度的乱码字符串。特点是:①输入改1个字符,哈希值会完全变化;②无法从哈希值反推原数据。
工作量证明(Proof-of-Work,PoW):一种"需要消耗算力才能完成"的数学题,解题过程即"挖矿"。矿工需反复调整区块中的"随机数(nonce)"计算哈希,直到找到符合条件的数值。
算力(CPU Power):指节点的计算能力(每秒能算多少次哈希),是比特币网络的"投票权"——算力越强,生成区块、维护最长链的概率越高。

1 引言

互联网商业几乎完全依赖金融机构作为可信第三方来处理电子支付。尽管该系统对多数交易而言运转良好,但仍受制于"基于信任的模型"固有的缺陷:

  • 完全不可逆转的交易无法实现,因为金融机构难免要调解纠纷(如买家申请退款);
  • 调解成本会增加交易费用,既限制了"最小实际交易金额",也排除了"小额临时交易"的可能性;
  • 对于"不可逆服务",无法进行"不可逆支付",导致信任需求扩散。

线下使用实物现金可避免这些成本和支付不确定性,但在通信渠道上,尚无无需可信第三方的支付机制。

我们需要一种基于"密码学证明"而非"信任"的电子支付系统:让任意两个自愿交易的双方直接交互,无需可信第三方。"计算上不可逆转的交易"可保护卖家免受欺诈,而常规的托管机制也能轻松保护买家。本文提出一种解决方案:用点对点分布式时间戳服务器,为交易的时间顺序生成计算证明,只要诚实节点的总算力超过任何串通的攻击节点组,系统就是安全的。

技术概念补充

可信第三方(TTP):指双方都信任的中间机构,如银行、支付宝、PayPal。比特币无需这种中间机构。
不可逆转交易:指交易完成后无法撤销。比特币交易不可逆,是为了保护卖家——避免买家收到货后撤销转账。

3 时间戳服务器

我们的解决方案从"时间戳服务器"开始。时间戳服务器的工作原理是:对"需加时间戳的一组数据块"计算哈希值,然后广泛发布该哈希值(例如发布到报纸或Usenet帖子中)。时间戳的核心作用是"证明数据在该时间点已存在"——因为只有数据存在,才能算出对应的哈希值。

更关键的是:每个时间戳的哈希值中,都会包含"前一个时间戳的哈希值",从而形成一条链条。每新增一个时间戳,都会强化之前所有时间戳的可信度(若要篡改某旧时间戳,需同时篡改后续所有时间戳的哈希,难度极大)。

图2:时间戳服务器

Item Item ... Hash Item Item ... Hash Item Item ... Hash 包含前一个哈希 包含前一个哈希

时间戳服务器通过对以时间戳形式存在的一组数据实施随机散列而加上时间戳,并将该随机散列进行广播。每个时间戳应当将前一个时间戳纳入其随机散列值中,每一个随后的时间戳都对之前的一个时间戳进行增强,这样就形成了一个链条。

技术概念补充

时间戳(Timestamp):给数据"盖一个时间章",证明"该数据在某个时间点已存在"。例:你写了一篇文章,2024年5月1日将文章哈希值发布到论坛,即使后来有人篡改文章内容,你拿出"2024年5月1日的哈希值",就能证明当时的原文是真实的。
时间戳链条:假设块1的哈希是H1,块2的哈希H2中包含H1,块3的哈希H3中包含H2——形成H1→H2→H3的链条。若要篡改块1的数据,块1的哈希会变成H1',导致H2必须改成包含H1'的H2',H3也要改成包含H2'的H3'……后续所有块的哈希都要改,成本极高。

4 工作量证明

要在点对点网络中实现分布式时间戳服务器,需使用类似亚当·拜克(Adam Back)提出的Hashcash(2002)的工作量证明系统,而非报纸或Usenet帖子。

工作量证明的核心是:寻找一个数值(即"随机数nonce"),使得该数值与数据块结合后的哈希值(如用SHA-256算法)满足"开头有指定数量的零比特"。特点是:①解题难度呈指数级增长(开头多1个零,需尝试的nonce数量可能翻倍);②验证难度极低(只需算一次哈希,看是否符合零比特要求)。

在我们的时间戳网络中,工作量证明的实现方式是:矿工不断递增区块中的nonce,直到找到一个数值,使区块的哈希值满足"开头零比特"要求。一旦消耗算力完成工作量证明,该区块就无法篡改——若要改区块数据,需重新计算工作量证明;而若区块后已链接了新区块,还需同时重新计算后续所有区块的工作量证明。

图3:工作量证明

Block Prev Hash Nonce Tx Tx Block Prev Hash Nonce Tx Tx Block Prev Hash Nonce Tx Tx 00000... 00000... 00000... CPU CPU CPU

工作量证明机制通过在区块信息中加入一个随机数,使得该区块的随机散列值以一个或多个0开始。平均工作量将随所需的0的位数呈指数增长,而验证工作量只需要执行一次随机散列。

工作量证明还解决了"多数决策的代表性问题":若按"一IP一票",攻击者可伪造大量IP作弊;而工作量证明本质是"一算力一票"——多数决策由"最长链"代表,因为最长链投入的工作量证明最多。

只要诚实节点控制多数算力,诚实链的增长速度就会超过任何竞争链条(攻击链)。攻击者若要篡改某旧区块,需:①重新计算该区块的工作量证明;②重新计算后续所有区块的工作量证明;③追上并超越诚实链的长度。后文将证明:随着后续区块数量增加,攻击者追上的概率会呈指数级下降。

为应对"硬件算力提升"和"节点参与度变化",工作量证明的难度会通过"移动平均值"动态调整:目标是每小时生成固定数量的区块(比特币实际目标是10分钟/块)。若区块生成速度过快(如10分钟出2块),难度就会提高(要求哈希开头更多零);若过慢,则降低难度。

技术概念补充

随机数(Nonce):区块中一个可任意调整的数值,是工作量证明的"解题关键"。例:区块数据固定时,矿工需试nonce=1、2、3……直到找到一个nonce,使"区块数据+nonce"的哈希值开头有18个零——这过程可能需要试几百万次,消耗大量CPU算力。
Hashcash:早期反垃圾邮件技术,发送邮件前需完成简单工作量证明(如算一个哈希),避免垃圾邮件群发(群发需大量算力,成本过高)。比特币的工作量证明正是基于Hashcash改进。
难度调整:比特币每2016个区块(约2周)调整一次难度。若前2016个区块的平均出块时间小于10分钟,说明算力增长,难度上调;若大于10分钟,难度下调——确保出块速度稳定,避免因算力波动导致交易确认时间忽快忽慢。

2 交易

我们将"电子硬币"定义为一串数字签名链:每个所有者将硬币转给下一个人时,需对"前一笔交易的哈希值"和"下一个所有者的公钥"进行数字签名,并将签名添加到硬币的末尾。收款人可通过验证签名,确认所有权链条的合法性。

图1:交易链

Owner 0's Public Key Owner 0's Signature Owner 1's Public Key Owner 1's Signature Owner 2's Public Key Owner 2's Signature Hash Hash Hash Verify Verify

每个所有者通过对前一笔交易的哈希和下一个所有者的公钥签署一个数字签名,并将这个签名添加到这枚硬币的末尾,来将这枚硬币转移给下一个所有者。

但核心问题是:收款人无法验证"之前的所有者是否没有双花这笔硬币"。常规解决方案是引入"可信中央机构"(即"铸币厂"),由其检查每笔交易是否存在双花。但该方案的缺陷在于:整个货币系统的命运依赖于运营铸币厂的公司——本质和银行无异。

解决方案要求

  1. 交易必须公开广播(让所有节点知晓)
  2. 需建立一套系统,让参与者对"交易接收顺序"达成统一历史记录

收款人需要的证明是:在每笔交易发生时,多数节点都认可它是"最早收到的那笔"。

技术概念补充

铸币厂(Mint):传统货币体系中"发行+验证"的中央机构,如央行发行人民币、银行验证转账。比特币无铸币厂,由全网节点共同验证交易、发行新币(通过挖矿奖励)。
交易公开广播:节点发起交易后,会将交易信息发给周围所有可达节点,这些节点再转发给各自的邻居节点——类似"传话",几分钟内整个网络就能知晓这笔交易。

7 回收磁盘空间

当某枚硬币的"最新交易"被足够多的后续区块覆盖后,该交易之前的"已花交易"(即历史交易记录)就可删除,以节省磁盘空间。

为实现这一点且不破坏区块哈希,交易需按"默克尔树(Merkle Tree)"结构哈希:区块中所有交易先各自哈希,再两两合并哈希(形成父节点),重复此过程直到只剩一个"根哈希(默克尔根)"——仅默克尔根会被存入区块头的哈希中。

这样,旧区块可通过"修剪默克尔树分支"来压缩:删除已花交易的哈希,仅保留"默克尔根+必要的分支节点"。内部哈希无需存储,不影响区块头哈希的有效性。

图4:回收磁盘空间

压缩前的区块
Block Header Prev Hash | Nonce | Root Hash Root Hash01 Hash23 Hash0 Hash1 Hash2 Hash3 Tx0 Tx1 Tx2 Tx3 完整的默克尔树
压缩后的区块
Block Header Prev Hash | Nonce | Root Hash Root Hash23 已删除的 交易数据 Hash3 Tx3 压缩后的默克尔树

一旦某笔交易中最新的交易已经被足够多的区块覆盖,这笔交易之前的支出交易就可以被丢弃,以节省磁盘空间。为了使得在不破坏区块随机散列值的前提下实现这一点,交易信息被随机散列时,被构建成一个Merkle树的形状,只有根被纳入了区块的随机散列值。

区块头(不含交易)约80字节。若按10分钟生成1个区块计算,每年仅需存储80字节×6(每小时6块)×24(每天24小时)×365(每年365天)≈4.2MB。2008年时电脑内存普遍为2GB,且按摩尔定律(每年增长1.2GB),即使需将区块头存入内存,存储也完全不是问题。

技术概念补充

默克尔树(Merkle Tree):一种树形哈希结构,核心作用是"高效验证交易是否在区块中"。例:要验证Tx3是否在区块中,无需下载所有4笔交易,只需获取"Tx3的哈希Hash3、Tx2的哈希Hash2、Hash01、默克尔根"——先算Hash2+Hash3=Hash23,再算Hash01+Hash23=默克尔根,若与区块头的默克尔根一致,即可证明Tx3在区块中,大幅节省存储和带宽。
区块压缩(Pruning):对已确认很久的旧区块(如1年前的区块),删除其中已花交易的详细数据,仅保留默克尔树的核心节点和区块头——比特币全节点可通过这种方式将存储需求从几十GB压缩到几GB,适合存储有限的设备。

8 简化支付验证

无需运行全节点(即无需下载所有区块数据),也能验证支付有效性——这就是"简化支付验证(Simplified Payment Verification,SPV)"。

用户只需做两件事:

  1. 获取"最长工作量证明链的区块头"(可通过向多个网络节点查询,确认自己拿到的是最长链);
  2. 获取"将目标交易链接到其所在区块的默克尔分支"(即验证交易所需的默克尔树分支节点)。

用户无法自行验证交易的全部细节,但通过"将交易链接到链上某个区块",可确认:①该交易已被网络节点接受;②后续新增的区块进一步确认了网络对该交易的认可。

图5:简化的支付确认

最长的工作量证明链 Block Header Prev|Nonce|Root Block Header Prev|Nonce|Root Block Header Prev|Nonce|Root Block Header Prev|Nonce|Root 用于验证交易的默克尔分支 Root Hash01 Hash23 Hash2 Hash3 Tx3 (验证) SPV 客户端 只需要: 区块头+分支 全节点 存储所有 交易数据 提供默克尔分支 区块头

在不运行完整网络节点的情况下,也能够对支付进行检验。一个用户需要保留最长的工作量证明链的区块头的副本,他可以不断向网络发起询问,直到他确信自己拥有最长的链,并能够通过merkle的分支通向它被加上时间戳并纳入区块的那笔交易。

简化验证的可靠性依赖于"诚实节点控制网络":若攻击者掌控多数算力,可能伪造交易欺骗SPV用户(但全节点能识别伪造)。应对策略是:SPV客户端可接收全节点的"无效区块警报"——当全节点发现无效区块时,SPV客户端会下载该区块及相关交易,手动确认一致性。

对于频繁收款的商家(如电商平台),建议运行全节点:既能获得更独立的安全性(不依赖其他节点的警报),也能更快验证交易(无需等待SPV的分支查询)。

技术概念补充

全节点(Full Node):下载并存储所有区块数据(截至2024年约500GB),验证每笔交易和每个区块的合法性,是比特币网络的"骨干"。例:比特币核心客户端(Bitcoin Core)就是全节点,会检查交易是否双花、区块是否符合工作量证明要求。
SPV客户端:仅下载区块头(约4.2MB/年),通过默克尔分支验证交易,适合手机、平板等存储/带宽有限的设备。例:多数手机比特币钱包(如Electrum)都是SPV客户端,你收到比特币时,钱包会向全节点请求默克尔分支,验证后告诉你"交易已确认"。

9 合并与拆分价值

虽然可对单个硬币单独处理,但对小额转账(如几分钱)单独发起交易会非常繁琐。为实现"价值的拆分与合并",比特币交易支持"多输入、多输出":

  • 输入:通常是"一笔大额历史交易的输出"或"多笔小额历史交易的输出合并"(凑够转账金额);
  • 输出:最多两个——一个是转给收款人的金额,另一个是"找零"(将剩余金额转回自己的地址)。

图6:合并和分割价值

输入1 0.3 BTC 输入2 0.5 BTC 输入3 0.2 BTC 交易 总输入: 1.0 BTC 手续费: 0.001 BTC 可用: 0.999 BTC 输出1 0.7 BTC 输出2 (找零) 0.299 BTC 多个输入 多个输出 手续费 0.001 BTC

为了使得价值易于分割和合并,交易被设计为包含多个输入和输出。一般而言是某个较大金额的单一输入或者某几个较小金额的多个输入,以及最多两个输出:一个用于支付,另一个用于找零(如果有的话)返还给支付方。

需注意:"扇出(Fan-out)"问题(即一笔交易依赖多笔交易,这些交易又依赖更多交易)不会影响系统——因为无需提取某笔交易的完整历史记录,只需通过默克尔树验证它在链上即可。

技术概念补充

多输入多输出示例:你有三笔历史收款:0.2枚、0.3枚、0.5枚比特币(共1枚),要转给朋友0.8枚。交易结构为:输入:0.2枚(来自交易A)、0.3枚(来自交易B)、0.5枚(来自交易C);输出1:0.8枚(转给朋友的地址);输出2:0.2枚(找零,转回自己的另一个地址);交易费:0(若输入1枚=输出0.8+0.2,无差额;若输出0.8+0.199,差额0.001即为交易费)。
找零地址:建议每次转账用新的找零地址,避免地址关联(保护隐私)——比如这次找零用地址X,下次用地址Y,别人无法通过找零地址判断X和Y属于同一人。

10 隐私

传统银行模型的隐私保护方式是"限制信息访问":仅交易双方和可信第三方能查看交易详情。但比特币需"公开广播所有交易",无法用这种方式,因此需通过"断开身份与公钥的关联"来保护隐私——即"公钥匿名"。

具体来说:区块链上能看到"某公钥向另一公钥转账的金额和时间",但无法知晓这些公钥对应的真实身份(如姓名、手机号)。这类似证券交易所的"行情tape":公众能看到每笔交易的时间、金额,但看不到买卖双方是谁。

图7:隐私

传统隐私模型
可信 第三方 A 交易方A B 交易方B 公众 隐私屏障 身份+交易信息对第三方可见 对公众不可见
比特币隐私模型
公开 账本 公钥A 匿名 公钥B 匿名 公众 身份隐私 交易金额 公开可见 交易信息公开,身份匿名 通过新公钥保护隐私

传统的银行模式能够达到一定程度的隐私保护,因为试图向可信的第三方限制信息的获取。但是如果将交易信息向全网进行广播,这种方法就失效了。隐私依然可以得到保护:将公钥保持为匿名。公众能够看到的只是有某个人将一定数量的货币发送给了另外一个人,但是难以将该交易同特定的人联系起来,也就是说,公众无法确信,这些人就是交易的参与方。

进一步的隐私保护建议:每次交易使用新的公钥对(即新地址),避免因"同一公钥多次使用"导致交易被关联。需注意:多输入交易仍会泄露部分信息——若一笔交易的多个输入来自不同公钥,这些公钥必然属于同一人(因为只有同一人能控制多个私钥签名)。

风险在于:若某公钥的身份被曝光,所有与该公钥关联的交易(如多输入中的其他公钥)都会被追溯到同一人。

技术概念补充

公钥与地址:比特币地址是公钥经过哈希处理后的字符串(如"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"),用户转账时公开地址,而非直接公开公钥(进一步保护隐私)。但地址仍需定期更换——若你长期用同一个地址收款,别人能通过区块链追踪你所有的收款记录。
隐私增强技术:比特币原生隐私性有限,因此出现了Zcash(零知识证明,完全隐藏金额和地址)、Monero(环签名,混淆交易来源)等隐私币,以及比特币的闪电网络(部分交易在链下进行,不公开)。

12 结论

我们提出了一种"无需依赖信任"的电子交易系统:

  • 以"数字签名链构成的电子硬币"为基础,确保所有权控制;
  • 通过"点对点网络+工作量证明"解决双花问题,生成"公开、不可篡改的交易历史记录";
  • 网络结构简洁且健壮:节点无需协调即可同步工作,无需身份验证;
  • 共识机制(算力投票)可强制执行规则,激励机制鼓励节点保持诚实。

该系统实现了"去中心化电子现金"的核心目标

无需金融机构,任意双方可直接安全交易

参考文献

[1] 戴伟(W. Dai),《b-money》,1998年。

补充:b-money是早期去中心化电子现金构想,提出"点对点交易+工作量证明发行货币",直接影响了比特币的设计。

[6] 亚当·拜克(A. Back),《Hashcash——一种拒绝服务攻击防御机制》,2002年。

补充:Hashcash是比特币工作量证明的直接原型,最初用于反垃圾邮件,后被中本聪改编用于比特币的区块验证。

[7] R.C. 默克尔(R.C. Merkle),《公钥密码系统协议》,1980年。

补充:默克尔树的提出者,该结构被广泛用于比特币、区块链、分布式系统中,实现高效数据验证。

[8] W. 费勒(W. Feller),《概率论及其应用导论》,1957年。

补充:经典概率论教材,比特币中"攻击者追上概率"的计算模型(赌徒破产问题)即来自该书。