目录
摘要
纯点对点的电子现金版本,可让在线支付直接从一方发送到另一方,无需通过金融机构。数字签名为解决方案提供了部分支持,但如果仍需依赖可信第三方来防止双花,其主要优势便会丧失。我们提出一种基于点对点网络的双花问题解决方案:网络通过将交易哈希到一条持续延伸的、基于哈希的工作量证明链中,为交易添加时间戳,形成一份"若不重新完成工作量证明,就无法篡改"的记录。最长链不仅能证明所见证事件的先后顺序,还能证明其源自最大的算力池。只要控制多数算力的节点不串通攻击网络,它们就会生成最长链,从而超越攻击者的链条。该网络的结构需求极低:消息以"尽力而为"的方式广播,节点可随意退出或重新加入网络,只需将最长的工作量证明链视为自身离线期间发生事件的凭证即可。
技术概念补充
1 引言
互联网商业几乎完全依赖金融机构作为可信第三方来处理电子支付。尽管该系统对多数交易而言运转良好,但仍受制于"基于信任的模型"固有的缺陷:
- 完全不可逆转的交易无法实现,因为金融机构难免要调解纠纷(如买家申请退款);
- 调解成本会增加交易费用,既限制了"最小实际交易金额",也排除了"小额临时交易"的可能性;
- 对于"不可逆服务",无法进行"不可逆支付",导致信任需求扩散。
线下使用实物现金可避免这些成本和支付不确定性,但在通信渠道上,尚无无需可信第三方的支付机制。
我们需要一种基于"密码学证明"而非"信任"的电子支付系统:让任意两个自愿交易的双方直接交互,无需可信第三方。"计算上不可逆转的交易"可保护卖家免受欺诈,而常规的托管机制也能轻松保护买家。本文提出一种解决方案:用点对点分布式时间戳服务器,为交易的时间顺序生成计算证明,只要诚实节点的总算力超过任何串通的攻击节点组,系统就是安全的。
技术概念补充
3 时间戳服务器
我们的解决方案从"时间戳服务器"开始。时间戳服务器的工作原理是:对"需加时间戳的一组数据块"计算哈希值,然后广泛发布该哈希值(例如发布到报纸或Usenet帖子中)。时间戳的核心作用是"证明数据在该时间点已存在"——因为只有数据存在,才能算出对应的哈希值。
更关键的是:每个时间戳的哈希值中,都会包含"前一个时间戳的哈希值",从而形成一条链条。每新增一个时间戳,都会强化之前所有时间戳的可信度(若要篡改某旧时间戳,需同时篡改后续所有时间戳的哈希,难度极大)。
图2:时间戳服务器
时间戳服务器通过对以时间戳形式存在的一组数据实施随机散列而加上时间戳,并将该随机散列进行广播。每个时间戳应当将前一个时间戳纳入其随机散列值中,每一个随后的时间戳都对之前的一个时间戳进行增强,这样就形成了一个链条。
技术概念补充
4 工作量证明
要在点对点网络中实现分布式时间戳服务器,需使用类似亚当·拜克(Adam Back)提出的Hashcash(2002)的工作量证明系统,而非报纸或Usenet帖子。
工作量证明的核心是:寻找一个数值(即"随机数nonce"),使得该数值与数据块结合后的哈希值(如用SHA-256算法)满足"开头有指定数量的零比特"。特点是:①解题难度呈指数级增长(开头多1个零,需尝试的nonce数量可能翻倍);②验证难度极低(只需算一次哈希,看是否符合零比特要求)。
在我们的时间戳网络中,工作量证明的实现方式是:矿工不断递增区块中的nonce,直到找到一个数值,使区块的哈希值满足"开头零比特"要求。一旦消耗算力完成工作量证明,该区块就无法篡改——若要改区块数据,需重新计算工作量证明;而若区块后已链接了新区块,还需同时重新计算后续所有区块的工作量证明。
图3:工作量证明
工作量证明机制通过在区块信息中加入一个随机数,使得该区块的随机散列值以一个或多个0开始。平均工作量将随所需的0的位数呈指数增长,而验证工作量只需要执行一次随机散列。
工作量证明还解决了"多数决策的代表性问题":若按"一IP一票",攻击者可伪造大量IP作弊;而工作量证明本质是"一算力一票"——多数决策由"最长链"代表,因为最长链投入的工作量证明最多。
只要诚实节点控制多数算力,诚实链的增长速度就会超过任何竞争链条(攻击链)。攻击者若要篡改某旧区块,需:①重新计算该区块的工作量证明;②重新计算后续所有区块的工作量证明;③追上并超越诚实链的长度。后文将证明:随着后续区块数量增加,攻击者追上的概率会呈指数级下降。
为应对"硬件算力提升"和"节点参与度变化",工作量证明的难度会通过"移动平均值"动态调整:目标是每小时生成固定数量的区块(比特币实际目标是10分钟/块)。若区块生成速度过快(如10分钟出2块),难度就会提高(要求哈希开头更多零);若过慢,则降低难度。
技术概念补充
2 交易
我们将"电子硬币"定义为一串数字签名链:每个所有者将硬币转给下一个人时,需对"前一笔交易的哈希值"和"下一个所有者的公钥"进行数字签名,并将签名添加到硬币的末尾。收款人可通过验证签名,确认所有权链条的合法性。
图1:交易链
每个所有者通过对前一笔交易的哈希和下一个所有者的公钥签署一个数字签名,并将这个签名添加到这枚硬币的末尾,来将这枚硬币转移给下一个所有者。
但核心问题是:收款人无法验证"之前的所有者是否没有双花这笔硬币"。常规解决方案是引入"可信中央机构"(即"铸币厂"),由其检查每笔交易是否存在双花。但该方案的缺陷在于:整个货币系统的命运依赖于运营铸币厂的公司——本质和银行无异。
解决方案要求
- 交易必须公开广播(让所有节点知晓)
- 需建立一套系统,让参与者对"交易接收顺序"达成统一历史记录
收款人需要的证明是:在每笔交易发生时,多数节点都认可它是"最早收到的那笔"。
技术概念补充
7 回收磁盘空间
当某枚硬币的"最新交易"被足够多的后续区块覆盖后,该交易之前的"已花交易"(即历史交易记录)就可删除,以节省磁盘空间。
为实现这一点且不破坏区块哈希,交易需按"默克尔树(Merkle Tree)"结构哈希:区块中所有交易先各自哈希,再两两合并哈希(形成父节点),重复此过程直到只剩一个"根哈希(默克尔根)"——仅默克尔根会被存入区块头的哈希中。
这样,旧区块可通过"修剪默克尔树分支"来压缩:删除已花交易的哈希,仅保留"默克尔根+必要的分支节点"。内部哈希无需存储,不影响区块头哈希的有效性。
图4:回收磁盘空间
压缩前的区块
压缩后的区块
一旦某笔交易中最新的交易已经被足够多的区块覆盖,这笔交易之前的支出交易就可以被丢弃,以节省磁盘空间。为了使得在不破坏区块随机散列值的前提下实现这一点,交易信息被随机散列时,被构建成一个Merkle树的形状,只有根被纳入了区块的随机散列值。
区块头(不含交易)约80字节。若按10分钟生成1个区块计算,每年仅需存储80字节×6(每小时6块)×24(每天24小时)×365(每年365天)≈4.2MB。2008年时电脑内存普遍为2GB,且按摩尔定律(每年增长1.2GB),即使需将区块头存入内存,存储也完全不是问题。
技术概念补充
8 简化支付验证
无需运行全节点(即无需下载所有区块数据),也能验证支付有效性——这就是"简化支付验证(Simplified Payment Verification,SPV)"。
用户只需做两件事:
- 获取"最长工作量证明链的区块头"(可通过向多个网络节点查询,确认自己拿到的是最长链);
- 获取"将目标交易链接到其所在区块的默克尔分支"(即验证交易所需的默克尔树分支节点)。
用户无法自行验证交易的全部细节,但通过"将交易链接到链上某个区块",可确认:①该交易已被网络节点接受;②后续新增的区块进一步确认了网络对该交易的认可。
图5:简化的支付确认
在不运行完整网络节点的情况下,也能够对支付进行检验。一个用户需要保留最长的工作量证明链的区块头的副本,他可以不断向网络发起询问,直到他确信自己拥有最长的链,并能够通过merkle的分支通向它被加上时间戳并纳入区块的那笔交易。
简化验证的可靠性依赖于"诚实节点控制网络":若攻击者掌控多数算力,可能伪造交易欺骗SPV用户(但全节点能识别伪造)。应对策略是:SPV客户端可接收全节点的"无效区块警报"——当全节点发现无效区块时,SPV客户端会下载该区块及相关交易,手动确认一致性。
对于频繁收款的商家(如电商平台),建议运行全节点:既能获得更独立的安全性(不依赖其他节点的警报),也能更快验证交易(无需等待SPV的分支查询)。
技术概念补充
9 合并与拆分价值
虽然可对单个硬币单独处理,但对小额转账(如几分钱)单独发起交易会非常繁琐。为实现"价值的拆分与合并",比特币交易支持"多输入、多输出":
- 输入:通常是"一笔大额历史交易的输出"或"多笔小额历史交易的输出合并"(凑够转账金额);
- 输出:最多两个——一个是转给收款人的金额,另一个是"找零"(将剩余金额转回自己的地址)。
图6:合并和分割价值
为了使得价值易于分割和合并,交易被设计为包含多个输入和输出。一般而言是某个较大金额的单一输入或者某几个较小金额的多个输入,以及最多两个输出:一个用于支付,另一个用于找零(如果有的话)返还给支付方。
需注意:"扇出(Fan-out)"问题(即一笔交易依赖多笔交易,这些交易又依赖更多交易)不会影响系统——因为无需提取某笔交易的完整历史记录,只需通过默克尔树验证它在链上即可。
技术概念补充
10 隐私
传统银行模型的隐私保护方式是"限制信息访问":仅交易双方和可信第三方能查看交易详情。但比特币需"公开广播所有交易",无法用这种方式,因此需通过"断开身份与公钥的关联"来保护隐私——即"公钥匿名"。
具体来说:区块链上能看到"某公钥向另一公钥转账的金额和时间",但无法知晓这些公钥对应的真实身份(如姓名、手机号)。这类似证券交易所的"行情tape":公众能看到每笔交易的时间、金额,但看不到买卖双方是谁。
图7:隐私
传统隐私模型
比特币隐私模型
传统的银行模式能够达到一定程度的隐私保护,因为试图向可信的第三方限制信息的获取。但是如果将交易信息向全网进行广播,这种方法就失效了。隐私依然可以得到保护:将公钥保持为匿名。公众能够看到的只是有某个人将一定数量的货币发送给了另外一个人,但是难以将该交易同特定的人联系起来,也就是说,公众无法确信,这些人就是交易的参与方。
进一步的隐私保护建议:每次交易使用新的公钥对(即新地址),避免因"同一公钥多次使用"导致交易被关联。需注意:多输入交易仍会泄露部分信息——若一笔交易的多个输入来自不同公钥,这些公钥必然属于同一人(因为只有同一人能控制多个私钥签名)。
风险在于:若某公钥的身份被曝光,所有与该公钥关联的交易(如多输入中的其他公钥)都会被追溯到同一人。
技术概念补充
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年。
补充:经典概率论教材,比特币中"攻击者追上概率"的计算模型(赌徒破产问题)即来自该书。