起源与基本原理
理解去中心化电子现金的目标、信任问题与早期设计。
按议题整理 · 中文阅读 · 13 条发言。英文及完整讨论可回到对应档案查看。
为什么不能只靠信任
4 条
有可能。他们讨论的仍是旧式的 Chaum 中央铸币方案,不过也许只是因为当时只有这条路可走。他们或许会对新的方向感兴趣。
有可能。他们讨论的仍是旧式的 Chaum 中央铸币方案,不过也许只是因为当时只有这条路可走。他们或许会对新的方向感兴趣。
很多人看到 1990 年代以来那么多公司失败,就不假思索地认为电子货币没有前途。我希望大家能看清,真正让那些系统失败的,只是它们受中央控制的本质。我想,这应该是我们第一次尝试一种去中心化、无需信任的系统。
我开发了一种新的开源点对点电子现金系统,叫作 Bitcoin。它完全去中心化,没有中央服务器,也没有需要信任的参与方,因为一…
我开发了一种新的开源点对点电子现金系统,叫作 Bitcoin。它完全去中心化,没有中央服务器,也没有需要信任的参与方,因为一切都基于密码学证明,而不是信任。试试看,或者看看截图和设计论文:
在 http://www.bitcoin.org 下载 Bitcoin v0.1
传统货币的根本问题,在于让它运作所必需的种种信任。我们必须相信中央银行不会让货币贬值,但法币的历史充满了对这种信任的背弃。我们必须相信银行会保管我们的钱,并以电子方式转账,但它们却一轮又一轮地把钱借出去,制造信贷泡沫,储备金只保留很少一部分。我们必须相信它们会保护我们的隐私,相信它们不会让身份窃贼掏空我们的账户。它们庞大的运营成本,使微支付无法实现。
上一代的多用户分时计算机系统也有类似问题。在强加密出现以前,用户必须依靠密码保护来保障文件安全,相信系统管理员会对自己的信息保密。管理员随时可以凭自己的判断,在隐私原则与其他考虑之间权衡,或者按照上级要求,越过隐私限制。后来,普通人也能使用强加密,信任就不再是必需的了。数据可以得到这样的保护:无论出于什么理由,借口多么充分,无论如何,其他人都无法从物理上访问它。
钱也该拥有同样的保护了。借助基于密码学证明的电子货币,无需信任第三方中间人,资金可以得到安全保障,交易也可以轻松完成。
这种系统的基本组成部分之一是数字签名。数字币包含其所有者的公钥。要转移它,所有者将这个币与下一位所有者的公钥一起签名。任何人都能检查签名,验证所有权的传递链。这能很好地保障所有权,却留下一个大问题没有解决:双重支付。任何所有者都可能尝试把已经花掉的币再次签给另一个人,再花一次。通常的解决办法,是由一家可信公司通过中央数据库检查双重支付,但这又回到了信任模式。公司处于中心地位,就能凌驾于用户之上,而维持公司所需的费用又让微支付不切实际。
比特币的解决办法,是使用点对点网络检查双重支付。简单来说,网络像一个分布式时间戳服务器,为花费某个币的第一笔交易加盖时间戳。它利用了信息易于传播、难以压制的特性。工作原理的细节,请参阅设计论文: http://www.bitcoin.org/bitcoin.pdf
结果是一个没有单点故障的分布式系统。用户持有自己资金的密码学密钥,彼此直接交易,并由点对点网络帮助检查双重支付。
Satoshi Nakamoto http://www.bitcoin.org
我开发了一个新的开源 P2P 电子现金系统,叫 Bitcoin。它完全去中心化,没有中央服务器,也不需要可信第三方,因为一切…
我开发了一个新的开源 P2P 电子现金系统,叫 Bitcoin。它完全去中心化,没有中央服务器,也不需要可信第三方,因为一切都建立在密码学证明而不是信任上。欢迎试用,也可以先看看截图和设计论文:
在 http://www.bitcoin.org 下载 Bitcoin v0.1
传统货币的根本问题,是它需要太多信任才能运作。我们必须相信中央银行不会让货币贬值,但法定货币的历史充满了对这种信任的背叛。我们必须相信银行能替我们保管资金并完成电子转账,可它们只保留很少的准备金,却一轮又一轮地放出信贷、吹大泡沫。我们还得把隐私交给银行,相信它们不会让身份窃贼冒用我们的身份、掏空账户。银行庞大的运营成本也让微支付无法实现。
一代人以前,多用户分时计算机系统也遇到过类似问题。在强加密技术出现之前,用户只能靠密码保护文件,把隐私寄托在系统管理员身上。管理员随时可能在权衡隐私原则与其他顾虑后,自行决定不再保护隐私,也可能按照上级要求这么做。后来强加密技术走向大众,人们不再需要这种信任。数据可以得到真正可靠的保护:无论别人有什么理由、借口多么充分,都无法从物理上访问它。
现在,货币也该有同样的保护了。电子货币可以建立在密码学证明上,不必信任第三方中介,资金可以得到安全保障,交易也可以轻松完成。
数字签名是这类系统的基础组成部分之一。一个数字货币单元包含所有者的公钥。转账时,所有者把这个币和下一位所有者的公钥放在一起签名。任何人都可以检查这些签名,验证所有权链。这样能很好地保护所有权,却还有一个大问题没有解决:双重支付,也就是把同一笔钱花两次。任何所有者都可以把已经花掉的币再次签给另一个人,试图重复花费。通常的做法,是让一家可信公司通过中央数据库检查双重支付,但这又回到了信任模型。这家公司处在系统中心,有权推翻用户的决定;维持公司运作所需的费用,也会让微支付变得不切实际。
Bitcoin 的解决办法,是让点对点网络检查双重支付。简单说,这个网络就像一台分布式时间戳服务器,为第一次花费某个币的交易盖上时间戳。它利用了信息容易传播、却很难被封锁的特点。工作原理详见设计论文:http://www.bitcoin.org/bitcoin.pdf
最终得到的是一个没有单点故障的分布式系统。用户自己掌握资金的密码学密钥,彼此直接交易,由 P2P 网络帮助检查双重支付。
Satoshi Nakamoto
是的,但我们可以在这场军备竞赛中赢下一场重要战役,获得一片能维持数年的新自由领地。
引用原文发言者未注明[省略了关于系统容易受到武力垄断者攻击的长篇论述。]
你无法在密码学中找到政治问题的解决方案。
是的,但我们可以在这场军备竞赛中赢下一场重要战役,获得一片能维持数年的新自由领地。
政府擅长斩首 Napster 这样的中央控制网络,但 Gnutella 和 Tor 这样的纯 P2P 网络似乎仍能站稳脚跟。
Satoshi
比特币最初是什么样
9 条
这种级别的匿名需要通过 TOR 连接,0.2 版就能做到,离发布只有几个星期了。到时我会贴出 TOR 使用说明。
这条发言承接前面的讨论,可通过下方入口查看完整上下文。
1-3:
这种级别的匿名需要通过 TOR 连接,0.2 版就能做到,离发布只有几个星期了。到时我会贴出 TOR 使用说明。
4:
0.1.5 版:备份整个 %appdata%\Bitcoin 目录。
0.2 版:只备份 wallet.dat 即可。
5:
不行。整个设计就是为了防止这种情况得逞。
6:
那些比特币将永远无法找回,总流通量也会相应减少。由于实际流通量下降,其余比特币会略微升值。这正好与政府印钞、让现有货币贬值相反。
7:
目前是 29,296 个区块。流通量等于区块数乘以 50,所以当前流通量是 1,464,800 个比特币。
如果你只有 24k 个区块,说明初始区块下载还没完成。退出 bitcoin 再重新启动。0.2 版的初始区块下载更快更好。
8:
目前,一台机器通常每天能挖到几百个比特币。现在挖矿还很容易,但随着网络扩大,难度会越来越高。
9:
好问题,是 TCP。网站应该更新为"TCP 端口 8333"。
端口转发是为了让其他节点能连上你,这样你能与更多节点保持连接。按 IP 地址收款也需要它。
10:
不会,其他节点不会接受那种东西。
开源意味着任何人都能独立审查代码。如果软件闭源,就没人能验证它是否安全。我认为,这类程序必须开源。
11:
速度较慢的机器获得的比特币更少,产出与 CPU 速度成正比。
12:
还会有更多。
13:
它用的是名为 Berkeley DB 的事务型数据库。系统崩溃也不会丢数据。交易在收到的那一刻就写入了数据库。
14:
目前你可以直接用区块总数乘以 50。比特币网络已经运行了将近一年。设计和编码始于 2007 年。
那太好了!我已经把你(dmp1ce)添加为 SourceForge 项目的开发者,并给了你编辑网站空间和其他内容的权限。
阅读完整通信正文 · Martti Malmi · 2009-05-03 · 回复:比特币
好,我可以负责网站和常见问题。我现在就开始编写常见问题,先写我能想到的那些问题。
我对程序有一个功能建议:提供一个界面工具,用来创建受密码保护的私钥,并将它保存到自定义位置。备份密钥可以避免失去对自己币的控制,也方便在多台电脑上使用这些币。密码保护则能让偶然找到密钥文件的人更难动用你的钱。
也许可以在 Sourceforge 项目页面上建立一个跟踪程序缺陷和功能需求的系统?
只要我的电脑开着,我就一直运行比特币节点,差不多一周七天、每天二十四小时都在运行。比特币是个很棒的项目,能参与其中真让人兴奋!
—Martti Malmi
Martti 的来信Martti Malmi来源 ↗好的,网站和常见问题解答可以由我来做。我现在就开始写常见问题解答,先写我能想到的问题。
那太好了!我已经把你(dmp1ce)添加为 SourceForge 项目的开发者,并给了你编辑网站空间和其他内容的权限。
Martti 的来信Martti Malmi来源 ↗我对程序有个功能建议:做一个界面工具,用来创建受密码保护的私钥,并保存到自选位置。为了避免失去对币的控制,也为了在多台电脑上使用这些币,需要备份密钥。密码保护可以让碰巧找到密钥文件的人,更难使用你的钱。
当然。等事情发展起来,这会是一个绝对必需的功能,让你能用强加密锁住财富,并以比任何实体保险箱都更安全的方式备份。到目前为止,我一直把它往后推,优先做其他功能,因为在比特币开始有价值之前,它还不是关键。
我计划接下来做托管功能。要让实物交易更安全,以及开始用法币为这种货币提供支持,都需要先具备这个功能。
Martti 的来信Martti Malmi来源 ↗只要 PC 开着,我就一直运行比特币节点,也就是大约全天候运行。比特币是个很棒的项目,能够参与真的很酷!
谢谢!现在网络里有很多人不能接收入站连接,所以每个能接收的节点都很有帮助。在我于 v0.1.6 中降低“(未接受)”问题的发生概率之前,更多这类节点有助于减少这个问题。
我想,常见问题解答里应该有一条,解释如何设置防火墙转发 8333 端口,以便接收入站连接。问题可以类似“如果我的连接数是 0,怎么办”,答案可以说,原因可能是不做这个设置,能够连接的节点就很有限。
这里汇集了我在论坛和电子邮件中回答过的问题,应该能帮助你了解大家常问什么,以及我用过的一些回答。不是要把这里的材料全部或者大部分用上,只要挑选即可。这只是把我回答过的所有内容倒出来。
有些问题我们没有简单的答案,最好不主动提起。普通用户似乎愿意直接相信系统能按所述方式运作(它确实如此),而深入设计细节,只会引出一连串麻烦的问题,没有对系统的深入理解就无法回答。我收到的进阶问题大多因人而异,最好分别回答。
**** 问答汇集 ****
凡是用在常见问题解答中的问题,大概都应该换一种表述。
问题:
问答汇编中的提问(原存档未具名)提问者未具名来源 ↗界面底部显示:
正在生成 4 个连接 4024 个区块 164 笔交易
我理解“正在生成”;我猜我连接到了另外 4 个节点;也知道我记录了 164 笔交易(包括失败的生成尝试)。我不清楚“区块”这个数字指什么。它远小于我所有交易旁边显示的区块数量总和。
它是区块链中的区块总数,也就是网络的区块链,每个人都有一份副本。每个比特币节点都显示同样的数字,大约每 10 分钟,有人生成一个区块时,它就增加一次。如果你有一阵子没运行程序,连接上后,它会快速增长,因为程序正在下载你离开期间生成的区块,追上网络进度。我不确定该如何准确描述它(要能放进状态栏,1 个词,最多也许 2 个词),你有什么想法吗?
交易旁边状态栏里的区块数,是那笔交易之后出现的区块数量。实质上,你的交易“包含在”这么多个区块里。
Satoshi
问答汇编中的引文Mike Hearn来源 ↗我觉得最有可能的解释是:这是全局链的长度,而开始时快速增长,是因为软件正在下载并验证链中已有的区块是否有效。
对。我正在想更清楚的表述,也许用“%d 个网络区块”或者“%d 个区块的链”。
问答汇编中的提问(原存档未具名)提问者未具名来源 ↗我的“区块未接受”失败出现得异常频繁,我想告诉你一声,看看这是否有什么意义。
你看到的未接受比例是多少?我这里没看到异常。如果连续出现超过,比如说 4 个,那就不正常,可能是网络通信中断。如果只是零散出现,比例低于 25%,那就是随机的坏运气。随机出现一定比例的未接受是正常而且无害的,当然,随机事件有时也会扎堆,看起来像某种规律。
加入显示/隐藏未接受区块的选项,是个好主意;显示/隐藏所有生成区块也不错,这样就更容易看到收款交易。看到未接受区块只会让人烦恼和沮丧。每个人面对的未接受比例都一样,这只是过程的一部分。大概最好默认隐藏未接受区块,免得让人觉得先得到了什么,随后又被拿走,而其实从未得到过;新生成的区块,也至少等到有一个确认再显示。这只意味着你比通常晚 15 分钟知道自己生成了一个区块,而且反正还要再等 119 个区块才成熟。这已经列入 v0.1.6 的待办事项。
Satoshi
[注:我在 0.1.6 中做了一些改进,可以一定程度上减少这个问题;网络规模变大后,情况也会改善]
问答汇编中的引文Mike Hearn来源 ↗不知道为什么,你给我的转账显示“来自:未知”,尽管我已经把你加进了地址簿。
我的交易列表里有一行“已生成(未接受)”,看起来是一次生成币的尝试出了问题。不清楚这里发生了什么——难道我的节点成功求解了一个区块,但在发送到网络之前,我就离线了?
发送到比特币地址的交易总会显示“来自:未知”。交易只说明收款对象是谁。按比特币地址发送存在一些问题,但能有这样一个备用选项,无论对方是否在线都能向其付款,实在很好。以后有几个想法可以尝试改进。如果事情像现实世界一样发展,绝大多数交易都是与商家进行,那么目前商家基本上总会确保设置好按 IP 接收。点对点文件共享网络似乎相当成功,能让很大比例的用户设置防火墙,转发一个端口。
我非常想找到一种办法,在间接转账中附带备注,但实在没有办法。比特币使用 EC-DSA,这对让区块链足够紧凑、能在当今技术条件下实际使用至关重要,因为它的签名比 RSA 小一个数量级。但 EC-DSA 不能像 RSA 那样加密消息,只能用来验证签名。
“已生成(未接受)”通常发生在两个节点几乎同时找到区块时,其中一个不会被接受。这是正常而且无法避免的。我计划在 v0.1.6 中隐藏这些条目,因为它们只会令人困惑和烦恼,用户没有必要看见。在网络像现在这样规模仍小时,如果你不能接受入站连接,就会更吃亏,因为你无法那么直接地收到区块公告。
问答汇编中的引文Dustin D. Trammell来源 ↗……到目前为止,出现了两条“已生成”消息,但它们的“收入”栏都是 0.00,余额也没有变化。这是因为币要有效,就必须达到规定的年龄或成熟期吗?
对,收入栏在成熟之前一直是 0.00,成熟后就会变为 50.00。顺便说一下,你可以双击一行查看详情。
问答汇编中的引文Mike Hearn来源 ↗……如果我理解正确,只有一条(或者几条)全局链,所有交易都通过哈希纳入其中。如果只有一条链记录所谓“经济的故事”,它如何扩展?假设在全世界部署,每小时就会有数百万乃至数十亿笔交易通过哈希纳入链中……
……我觉得激励那一节很难理解。尤其是,我不清楚,在什么情况下,运行节点的动机会从铸造新币,转为收取手续费(BitCoin 的目的,不就是在很大程度上消除交易成本吗?)。想必有某个人掌管着系统……
……你如何决定 v1 的通胀时间表?2100 万个币是怎么来的?这些币是什么面额?你提到了合并和拆分价值的方法,但我不清楚它如何工作。例如,比特币总是以整数为单位,还是可以有不足一个的比特币?……
……我很少遇到真正革命性的想法。上次让我对一种新货币方案如此兴奋,还是发现 Ripple 的时候。如果你对 Ripple 有什么看法,我也很想听听。
全世界只有一条链。
现有的 Visa 信用卡网络,每天在全球处理约 1500 万笔网上购物。凭借现有硬件,比特币已经可以扩展到远超这个规模,而成本只需其中一小部分。它实际上不会碰到规模上限。如果你有兴趣,我可以详细说明它如何应对极大的规模。
根据摩尔定律,我们可以预期硬件速度在 5 年后变为 10 倍,在 10 年后变为 100 倍。即使比特币以疯狂的速度普及,我也认为计算机速度的增长会超过交易数量的增长。
我预计近期不需要手续费,但如果运行节点的负担变得过重,就可以运行一种只处理附带手续费的交易的节点。节点所有者自行决定能接受的最低手续费。目前,这样的节点什么也赚不到,因为没人附带手续费;但如果足够多的节点这么做,用户附带手续费就会更快得到接受,不附带则会更慢。市场最终确定的手续费应该很低。如果一个节点要求更高手续费,就会放弃所有手续费更低的交易。尽可能处理更多付费交易,它就能增加业务量,也可能赚得更多。不过,这个转变不是由某个掌管系统的人控制的,而是个人各自对市场力量作出反应。
比特币的一个关键特点是,网络的安全性会随着网络规模和需要保护的价值增加而增强。缺点是,它在起步阶段规模很小时容易受到攻击,不过,能够偷走的价值应该始终低于行窃所需付出的代价。如果有人出于其他动机,想证明某一点,那他们证明的也只是我已经承认的一点。
币的数量和发行时间表,是我根据已有认识作出的估计。这是个艰难的选择,因为网络一旦开始运行,规则就固定下来,我们只能接受它。我想选一个能让价格与现有货币类似的方案,但不知道未来,这很难做到。最后,我选了一个折中的方案。如果比特币一直是小众事物,每单位的价值就会低于现有货币。如果设想它被用于世界商业活动的一部分,那么全世界只有 2100 万个币,每单位价值就会高得多。金额用 64 位整数表示,保留 8 位小数,所以 1 个币在内部表示为 100000000。如果通常的价格变得很小,仍有足够细的精度。例如,如果 0.001 值 1 欧元,改变小数点的显示位置可能更方便:你如果有 1 个比特币,就显示为 1000,而 0.001 则显示为 1。
Ripple 很有意思,因为除了比特币,它是唯一没有把信任集中到中央服务器、而是对信任采取其他处理方式的系统。
Satoshi
问答汇编中的引文Mike Hearn来源 ↗如果我们认为 0.1% 是可以接受的风险率,那么 z=5,因此任何交易都必须等待将近一小时,才能在链中确定下来。用于网页内容或虚拟商品等的微支付,顾名思义就需要很低的额外负担,等一小时似乎是个相当大的障碍。
计算实际风险时,要把 0.1% 乘以买家是一个拥有庞大计算机网络的攻击者的概率。
对于微支付,你可以安全地立即接受付款。金额太小,不值得费力去偷。微支付几乎总是用来购买知识产品,商家不会有实物损失。试图通过微支付逃单的人,无论如何大概都不会成为付费客户;而且,如果他们想盗取这些知识产品,可以使用文件共享网络。
目前,商家会接受一定比例的坏账。我相信,即使只有 1 个、甚至 0 个确认区块,风险也会远低于已验证信用卡交易的拒付率。
对不等待确认区块的商家,常见的骗局会是先向商家付款,然后赶在商家的交易副本之前,迅速尝试向网络传播一笔双重支付。商家可以广播自己的交易,再监测网络中是否出现任何双重支付副本。窃贼无法在监测期间广播,否则商家的节点就会收到副本。商家只需监测一两分钟,直到大多数网络节点拥有自己的版本,而窃贼的版本已经来不及追上并传遍大量节点。只延迟一两分钟,就能把不付款而得手的概率降到不值得行骗的程度。窃贼通常需要很高的概率免费拿到商品,才值得做。除了上述骗局,再投入大量 CPU 算力进行论文中讨论的暴力攻击,也不会显著增加窃贼的胜算。
凡是授予某种访问权限的东西,例如需要一段时间才能下载的内容、网站访问、虚拟主机、订阅或服务,都可以在几分钟后交易被拒绝时取消。
问答汇编中的引文Mike Hearn来源 ↗每个区块所要求的难度,是如何在网络中传播并达成一致的?
它不需要传播。公式硬编码在程序里,每个节点都进行相同的计算,从而知道下一个区块要求的难度。如果有人偏离公式,他的区块就不会被大多数节点接受。
问答汇编中的提问(原存档未具名)提问者未具名来源 ↗代码是自由/开源的,还是仅仅开源?
它是自由开源的。采用 MIT 许可证,只要求在源代码中保留一些免责声明文字,除此之外,你几乎可以随意使用。源代码包含在主下载包里。
Satoshi
问答汇编中的引文Mike Hearn来源 ↗有没有办法获知新版本?应用会自动更新吗?有个邮件列表之类的就太好了。
邮件列表是: bitcoin-list@lists.sourceforge.net 订阅/退订页面: http://lists.sourceforge.net/mailman/listinfo/bitcoin-list 存档: http://sourceforge.net/mailarchive/forum.php?forum_name=bitcoin-list
我会一直在那里公告新版本。自动更新,或者至少通知新版本,肯定在计划之中。
[这段通胀讨论发生在手续费机制和固定发行 2100 万个币的计划公布之前,因此如今可能已经不太适用了]
问答汇编中的提问(原存档未具名)提问者未具名来源 ↗既然可以免费创造它们(或者成本只是人们原本就因其他原因拥有的计算能力),那么把它们货币化,就等于白送钱。
你仍然在假设难度会低到让人们想生成多少比特币就生成多少。
设想一下,你必须让电脑全天候运行一个月,才能生成 1 分。一年后,你能生成 12 分。这不会让人们想生成多少比特币拿去花,就生成多少。
比特币的价值会与生成它们消耗的电力相关。所有现代 CPU 在空闲时都会节电。如果你全天候运行计算任务,不让它空闲,它的耗电量会显著增加,你也会注意到它产生更多热量。额外消耗的电力会直接体现在电费账单上,而你生成的比特币的价值,会比这个数额低一些。
问答汇编中的提问(原存档未具名)提问者未具名来源 ↗既然他们靠生成新币就能赚钱,为什么还要那么做?
不,他们不能靠这种方式赚钱。他们付的电费会比卖出这些比特币得到的钱更多。
历史上,人们曾把稀缺商品当作货币,必要时就用手边的东西,例如贝壳或石头。每种东西都有一点实际用途,帮助这个过程起步,但货币价值最终远高于单纯的功能价值。大部分价值来自其他人赋予它的价值。例如,黄金美观、不易腐蚀、容易塑形,但它的大部分价值显然不是由此而来。黄铜也有光泽,颜色也相似。绝大多数黄金闲置在金库中,归那些根本不在乎它是否美观的政府所有。
在此之前,还不存在一种稀缺商品,可以不经过可信第三方,直接通过通信渠道交易。如果人们想采用一种无需可信第三方就能在互联网上交易的货币,那么现在,这已经可以做到了。
Satoshi
问答汇编中的提问(原存档未具名)提问者未具名来源 ↗随着更强大的计算机硬件出现,每个用户的自然供应量会在摩尔定律的每个周期翻倍。
实际上,这已经处理了。系统使用一个移动平均值,根据投入的总算力调整难度,使总产量保持不变。随着电脑变强,难度也会提高,作为补偿。
问答汇编中的提问(原存档未具名)提问者未具名来源 ↗我不记得经济史上有哪一种自然供应量不断增长的商品曾被当作货币。
黄金就是一个。黄金供应量每年增加约 2%-3%。任何法币的平均通胀率,通常都比这高。
问答汇编中的提问(原存档未具名)提问者未具名来源 ↗随着电脑变快、能更快求解工作量证明问题,难道不会出现大规模通胀吗?
难度由一个移动平均值控制,它会根据投入的总算力调整难度,使总产量保持不变。随着电脑变强,难度也会提高,作为补偿。
问答汇编中的引文Ray Dillinger来源 ↗如果有人进行双重支付,交易记录就可以解除盲化,揭露作弊者的身份吗?
系统不使用身份,也不依赖事后追索。全都靠事前预防。
问答汇编中的引文Ray Dillinger来源 ↗……你的意思是,根本不尝试识别并排除不合作的节点?我怀疑这会带来麻烦,甚至可能导致 DOS 攻击。
系统不依赖识别任何人。正如你说的,这没有意义,用马甲身份就能轻易绕过。
证明某个人是真实参与者的凭据,是提供 CPU 算力的能力。
问答汇编中的引文Ray Dillinger来源 ↗但在没有身份的情况下,如果他们已经拿到了通过双重支付换来的商品(网站访问、下载,或其他东西),那么即使支付无效,对他们也没有坏处。商家只会拿着“无效”的币吃亏,除非他们等上那神奇的“几个区块”(而且他们怎么知道要几个?),再把付款人视为已经付款。
消费者花了币,却要等一小时结算后才能得到所购买的东西,他们就不会使用它。商家发现币因为客户双重支付而无效,却又没办法向客户追收款项,他们也不会使用它。
这是第 2 版要解决的问题。我相信,对于大多数应用,都能相当令人满意地解决。
竞争在于先让你的交易在网络中传播。想想 6 个自由度——传播是指数式的。大概只需 2 分钟,一笔交易就能传播得足够广,使后来起步的竞争者几乎不可能在第一笔交易覆盖整个网络前,抢到很多节点。在这 2 分钟里,商家的节点可以留意有没有双重支付交易。双重支付者无法把另一笔交易大规模发往全球,却不让商家收到,因此必须等一等才能开始。
如果真正的交易到达了 90% 的节点,而双重支付交易到达了 10%,双重支付者就只有 10% 的机会不付款,有 90% 的可能仍然会花掉钱。对几乎任何商品来说,这都不值得骗子去做。
网站访问或下载等信息商品,无法作为赃物转卖。没人能靠偷取网站访问或下载权限谋生。要偷这些,他们可以去文件共享网络。对于大多数即时访问类产品,人们不会有很大的偷窃动机。
如果商家确实遇到偷窃问题,可以让客户等 2 分钟,或者等一封邮件,许多商家本来就这样做。如果真想优化,而且是个大文件下载,可以在交易被发现双重支付时,中途取消下载。如果是网站访问,通常先让客户访问 5 分钟,再在交易被拒绝时切断访问,也不是什么大问题。反正很多这样的网站都有免费试用。
Satoshi
[回应一个关于规模的问题]
考虑大规模运行时,可以用 100,000 个生成区块的节点作为大致规模。按今天的价格,一笔交易在整个网络传播两遍,总共会消耗价值 US$ 0.02 的带宽。实际中,许多节点用掉的只是分配带宽中多余的部分,或者某个较便宜骨干网络提供的不限量套餐。SPV 客户端可能有数百万个。它们的影响只在于产生多少交易。如果支付 1 或 2 美分手续费,就足以承担自身成本。我已经把代码写成,你可以自愿支付任意金额的手续费。当激励补贴最终逐步减少时,可能需要为交易附上由市场决定的手续费,确保节点及时处理。
为了设想真正庞大的交易负载是什么样,我参考了现有的信用卡网络。我又找到一些关于网上购物交易数量的估算。全世界互联网的全部电子商务负载,大约是每天 1500 万笔交易。按每笔交易 1KB 计算,每个生成区块的节点每天需要 15GB 带宽,大约相当于两部 DVD 电影。即使采用今天的技术,看起来也做得到。
要记住,即使比特币以互联网企业那样的速度增长,也要多年后,才会占全部交易中一个可观的比例。我相信,硬件最近已经变得足够强大,能够处理大规模应用;但即使对此还有疑虑,等到真正需要时,带宽速度、价格、磁盘空间和计算能力,也都会改善很多。
Satoshi
问答汇编中的引文Dustin D. Trammell来源 ↗我还有一个问题……是什么阻止拥有最多 CPU 算力的单个节点生成并保留大多数比特币?如果每个节点都独立工作,而其中一个明显比其他节点强大,那么这个节点难道不很可能比其他节点更早得出正确结果吗?算力不足的节点或许偶尔会走运,但如果它们在算力上有显著优势,我会预期大多数比特币都由最强大的节点生成。
这不像赛车,不是某辆车速度快一倍,就总会赢。这里做的是一次不到一微秒的 SHA-256 计算,每次猜测都有独立的成功概率。每台电脑找到哈希碰撞的概率,与其 CPU 算力成线性正比。速度只有一半的电脑,得到的币也只有一半。
[关于应该备份什么的问题]
文件位于“%appdata%\Bitcoin”,这就是要备份的目录。
%appdata% 采用各用户分别的访问权限。Firefox 等大多数新程序都把设置文件保存在那里,尽管 Microsoft 每发布一版 Windows 就更改目录名,而且路径里全是空格,长到超出屏幕,这些都很碍事。
[关于应该备份什么的问题]
目录是“%appdata%\Bitcoin”里面有空格,所以需要引号 cd "%appdata%\bitcoin"
在 XP 上通常是: C:\Documents and Settings[username]\Application Data\Bitcoin
备份整个目录。所有数据文件都在这个目录里。没有临时文件。
[关于应该备份什么的问题]
需要备份的关键文件是 wallet.dat。如果 Bitcoin 正在运行,就必须备份整个 %appdata%\bitcoin 目录,包括 database 子目录;但即使程序没有运行,始终备份整个目录,显然也让人更安心。
不幸的是,数据库把文件命名为“log.0000000001”。对其他人来说,“log”意味着可以随便删;但对数据库人员来说,它意味着删了就会丢掉其他文件中的所有内容。我把它们放到 database 子目录里,尽量避免误伤。以后我会编写代码,在钱包每次变化后刷新日志,让 wallet.dat 几乎始终能独立安全地使用。
问答汇编中的引文Dustin D. Trammell来源 ↗引文中再次引用的中本聪旧信中本聪来源 ↗你知道,我觉得 90 年代对此感兴趣的人多得多,但经过十多年基于可信第三方的系统(Digicash 等)接连失败,他们认为这件事已经没有希望了。我希望他们能看出区别:据我所知,这是我们第一次尝试一种不以信任为基础的系统。
是的,这就是最吸引我的特点。真正难的是让人们切实认可比特币的价值,使它成为货币。
Hal 隐约提到,它或许可以被看作一种成功概率很低的投资。我们已经知道该怎样实现电子货币,使它不至于因可信第三方临阵退缩而被迫简化。如果 10 年后我们还没有以某种形式使用电子货币,我会很意外。
一旦起步,如果你能像往自动售货机里投币一样,轻松向网站支付几分钱,就会有很多应用。
[下面这部分后来引起了很大争议。人们对垃圾邮件解决方案,尤其是工作量证明,存在极深的成见。]
它现在已经可以用于付费发送电子邮件。发送对话框可以调整大小,你可以输入任意长度的消息。连接建立后,消息会直接发送。收件人双击交易,就能看到完整消息。如果某位名人收到的电子邮件多到读不完,但仍想让粉丝有办法联系自己,就可以运行 Bitcoin,并在网站上公布 IP 地址。“向这个 IP 上的优先热线发送 X 个比特币,我会亲自阅读消息。”
订阅网站如果需要为免费试用增加一些工作量证明,以免试用影响付费订阅,就可以为试用收取比特币。
[再说一次,我也不知道为什么要把这段放进来,因为最好避开关于垃圾邮件的主张。只要有人提出垃圾邮件解决方案,人们就会自动作出激烈的反对反应。]
问答汇编中的引文Jonathan Thornburg来源 ↗垃圾邮件发送者的僵尸网络可以轻而易举地突破按次付费发送的邮件过滤器(和往常一样,成本由僵尸网络控制者和垃圾邮件发送者以外的人承担)。
那你就可以建立按次付费发送的电子邮件地址,收集所有垃圾邮件付来的钱,赚取可观利润。你可以把这些钱卖回给僵尸网络不够大、无法自行生成货币的垃圾邮件发送者,帮助这种货币的价值起步。随着更多人发现这一点,他们会建立越来越多的假地址来收集它。等到《我如何靠利用垃圾邮件发送者致富,你也可以》这本书出版时,假地址就会多到让垃圾邮件发送者不得不放弃。
问答汇编中的引文Hal Finney来源 ↗问答汇编中的引文Jonathan Thornburg来源 ↗
- 垃圾邮件发送者的僵尸网络可以轻而易举地突破按次付费发送的邮件过滤器
如果工作量证明代币真的有用,尤其是成为货币,机器就不会再闲着。用户会期望电脑替自己赚钱(假设收入高于运行成本)。如果一台电脑的收益被僵尸网络偷走,主人会比现在更容易注意到,所以我们可以预期,在那样的世界里,用户会更努力地维护电脑,清除僵尸网络的感染。
如果工作量证明代币有价值,还有一个因素会减少垃圾邮件:人们会有逐利动机,建立大量虚假邮箱,从垃圾邮件中收集工作量证明代币。实质上,他们是在用自动邮箱对垃圾邮件发送者以其人之道还治其人之身:收集对方的工作量证明,却不读消息。虚假邮箱与真人的比例可能变得太高,以至于发送垃圾邮件不再划算。
这个过程本身就有可能最初确立工作量证明代币的价值,因为没有僵尸网络的垃圾邮件发送者,可以向收集者购买代币。虽然回购会暂时让更多垃圾邮件通过,但它只会加快这种适得其反的循环,最终让太多收集者从垃圾邮件发送者身上获利。
有趣的是,一个 e-gold 系统已经有一种叫作“撒尘”的垃圾信息。发送者转出一点点金粉,好在交易备注栏中放入垃圾信息。如果系统允许用户设置愿意接收的最低付款金额,或者至少设置能够附带消息的最低金额,用户就可以设定,收多少钱才愿意接收垃圾邮件。
问答汇编中的引文John Gilmore来源 ↗我们最不需要的,就是在整个互联网上部署一个专门耗尽所有可用计算周期、消耗电力并产生二氧化碳的系统,只为了生成少量 bitbux,让电子邮件或垃圾邮件通过。
我们就不能把银行账户里的真金白银换成 bitbux—— 成本低廉,又不用交碳税吗?拜托?
如果我们最终不得不在经济自由和节约资源之间作选择,那就太讽刺了。
不幸的是,工作量证明是我找到的唯一能让点对点电子现金在没有可信第三方的情况下运作的办法。即使我不顺便用它来分配最初发行的货币,工作量证明对于协调网络和防止双重支付,仍然是根本所在。
如果它发展到消耗大量能源的规模,我认为,比起它所取代的那些耗费大量人力和资源的传统银行业务,它仍然浪费得更少。银行收取数十亿费用,用来支付实体建筑、摩天大楼和垃圾邮件式的信用卡推销,而这里的成本会比那少一个数量级。
Satoshi
问答汇编中的引文Hal Finney来源 ↗顺便说一下,我不记得我们是否谈过这个,但前几天有人提到了安全时间戳。你想要能够证明,某个文件在过去某个时间已经存在。在我看来,比特币堆叠的区块很适合做这个。
确实,比特币就是一个为交易服务的分布式安全时间戳服务器。只需几行代码,就能创建一笔交易,在其中加入任何需要加盖时间戳的内容的额外哈希。我应该加入一条命令,用这种方式给文件加盖时间戳。
以下来自 p2presearch 上的一个讨论串,开头是我对信任的抱怨:信任是所有传统金融系统的根本弱点。 http://listcultures.org/pipermail/p2presearch_listcultures.org/2009-February/thread.html
我开发了一种新的开源点对点电子现金系统,叫作 Bitcoin。它完全去中心化,没有中央服务器,也没有需要信任的参与方,因为一切都基于密码学证明,而不是信任。试试看,或者看看截图和设计论文:
在 http://www.bitcoin.org 下载 Bitcoin v0.1
传统货币的根本问题,在于让它运作所必需的种种信任。我们必须相信中央银行不会让货币贬值,但法币的历史充满了对这种信任的背弃。我们必须相信银行会保管我们的钱,并以电子方式转账,但它们却一轮又一轮地把钱借出去,制造信贷泡沫,储备金只保留很少一部分。我们必须相信它们会保护我们的隐私,相信它们不会让身份窃贼掏空我们的账户。它们庞大的运营成本,使微支付无法实现。
上一代的多用户分时计算机系统也有类似问题。在强加密出现以前,用户必须依靠密码保护来保障文件安全,相信系统管理员会对自己的信息保密。管理员随时可以凭自己的判断,在隐私原则与其他考虑之间权衡,或者按照上级要求,越过隐私限制。后来,普通人也能使用强加密,信任就不再是必需的了。数据可以得到这样的保护:无论出于什么理由,借口多么充分,无论如何,其他人都无法从物理上访问它。
钱也该拥有同样的保护了。借助基于密码学证明的电子货币,无需信任第三方中间人,资金可以得到安全保障,交易也可以轻松完成。
这种系统的基本组成部分之一是数字签名。数字币包含其所有者的公钥。要转移它,所有者将这个币与下一位所有者的公钥一起签名。任何人都能检查签名,验证所有权的传递链。这能很好地保障所有权,却留下一个大问题没有解决:双重支付。任何所有者都可能尝试把已经花掉的币再次签给另一个人,再花一次。通常的解决办法,是由一家可信公司通过中央数据库检查双重支付,但这又回到了信任模式。公司处于中心地位,就能凌驾于用户之上,而维持公司所需的费用又让微支付不切实际。
比特币的解决办法,是使用点对点网络检查双重支付。简单来说,网络像一个分布式时间戳服务器,为花费某个币的第一笔交易加盖时间戳。它利用了信息易于传播、难以压制的特性。工作原理的细节,请参阅设计论文: http://www.bitcoin.org/bitcoin.pdf
结果是一个没有单点故障的分布式系统。用户持有自己资金的密码学密钥,彼此直接交易,并由点对点网络帮助检查双重支付。
Satoshi Nakamoto http://www.bitcoin.org
问答汇编收录的来信Martien van Steenbergen来源 ↗Martien van Steenbergen Martien at AardRock.COM Thu Feb 12 08:40:53 CET 2009
很有意思。这与 David Chaum 的匿名数字货币相似吗?他的构想能保证货币匿名,除非规则被破坏,也就是同一笔钱被花费多次。一旦出现这种情况,“造假者”就会立即被公开揭露。
另外,比特币的货币供应量是否有限(因而必须管理)?还是说,货币恰好在交易时创建?
祝成功、愉快,
Martien。
问答汇编中的引文Martien van Steenbergen来源 ↗很有意思。这与 David Chaum 的匿名数字货币相似吗?他的构想能保证货币匿名,除非规则被破坏,也就是同一笔钱被花费多次。一旦出现这种情况,“造假者”就会立即被公开揭露。
相似之处在于,币都使用数字签名;不同之处在于保护隐私和防止双重支付的方法。比特币的收款人可以检查,这是否是第一次花费,第二次花费不会被接受。它没有在事后揪出双重支付者并公开羞辱的离线模式,因为那会要求参与者具有身份。
为保护隐私,密钥对只使用一次,每笔交易都使用新的密钥对。谁持有一个币的私钥,谁就是它的所有者。
当然,最大的区别是没有中央服务器。这是 Chaum 式系统的致命弱点:中央公司关门,货币也就停止运作。
问答汇编中的引文Martien van Steenbergen来源 ↗另外,比特币的货币供应量是否有限(因而必须管理)?还是说,货币恰好在交易时创建?
货币供应量有限。流通量将是 21,000,000 个币。交易只转移所有权。
谢谢你的问题,
Satoshi
问答汇编中的引文Martien van Steenbergen来源 ↗这让我想起:
* AardRock » Wizard Rabbit Treasurer <http://wiki.aardrock.com/Wizard_Rabbit_Treasurer>;以及 * AardRock » Pekunio <http://wiki.aardrock.com/Pekunio>
确实,在把每笔交易的冗余副本散发给网络中多个对等节点这一点上,它与 Pekunio 很相似,但实现方式并不是 Wizard Rabbit Treasurer 那样的信誉网络。事实上,比特币完全不使用信誉。它把网络看成一个大群体,并不太在乎自己与谁通信、谁告诉了它什么,只要其中至少有一个人转发正在网络中广播的信息就够了。它不在乎,是因为根本没办法对它撒谎。你要么给出某件事的密码学证明,要么它就忽略你。
问答汇编中的引文Martien van Steenbergen来源 ↗你了解 Ripple 吗?
就信任系统而言,Ripple 的独特之处,在于分散信任,而不是把信任集中起来。
[至少还有 4 次,别人问过我“你听说过 Ripple 吗?”]
问答汇编中的引文Michel Bauwens来源 ↗你的项目运作到什么程度了?你觉得还要多久,人们才能在现实生活中使用它?
它已经完全可以运作,网络也在增长。如果你试用软件,就把比特币地址通过电子邮件发给我,我会给你发送几个币。
我们只需要把消息传播出去,不断吸引更多人关注。
这是最初在 Cryptography 邮件列表介绍论文的链接。(后来我为支持手续费和有限流通量计划作了修改,取代了之前的通胀问题讨论。这个链接所指的内容会变化:这个存档页只是显示往前一定天数的内容,讨论会不断往后滚动到下一页。) http://www.mail-archive.com/cryptography@metzdowd.com/mail3.html
软件发布时的一点后续讨论。 http://www.mail-archive.com/cryptography@metzdowd.com/mail2.html
我对比特币如何解决拜占庭将军问题的描述: http://www.bitcoin.org/byzantine.html
Martien van Steenbergen 写道:
Martien van Steenbergen 写道:
引用的来信Martien van Steenbergen来源 ↗我也很希望它能支持一种无需供应和管理货币的方式。这样维护会更容易、成本更低,并且始终随处都有足够的货币。不短缺,不过剩,任何时候数量都恰到好处,自行组织。
这是可以做到的。可以通过编程让它遵循任何一套规则。
如果你想实现可编程的点对点社会货币,例如 Marc 的想法和这里讨论的其他方案,我认为比特币是一个基础,也是第一步。首先需要让普通、基本的点对点货币运作起来。一旦它确立并得到验证,动态智能货币就是很容易迈出的下一步。
我很喜欢由不受地域限制的虚拟社区来试验新经济模式的想法。
引用的来信Martien van Steenbergen来源 ↗这让我想起:
- AardRock » Wizard Rabbit Treasurer http://wiki.aardrock.com/Wizard_Rabbit_Treasurer;以及
- AardRock » Pekunio http://wiki.aardrock.com/Pekunio
确实,在把每笔交易的冗余副本散发给网络中多个对等节点这一点上,它与 Pekunio 很相似,但实现方式并不是 Wizard Rabbit Treasurer 那样的信誉网络。事实上,比特币完全不使用信誉。它把网络看成一个大群体,并不太在乎自己与谁通信、谁告诉了它什么,只要其中至少有一个人转发正在网络中广播的信息就够了。它不在乎,是因为根本没办法对它撒谎。你要么给出某件事的密码学证明,要么它就忽略你。
引用的来信Martien van Steenbergen来源 ↗你了解 Ripple 吗?
就信任系统而言,Ripple 的独特之处,在于分散信任,而不是把信任集中起来。
引用的来信Martien van Steenbergen来源 ↗比特币是否也提供协议规范(便于不同语言的绑定和实现;规范统一,实现竞争)?
最好参考 C++ 源代码。我计划实现一些接口,让任何语言都能通过这个软件收发交易,这样服务器端代码就能轻松把它用于网上电子商务网站。
Satoshi
想告诉你,我刚刚发布了几个月前发给你的那篇论文的完整实现——比特币 v0.1。详情、下载和截图都在 www.bitcoin.…
你好,中本聪。b-money 于 1998 年在密码朋克邮件列表上公布。这是当时那封邮件的存档:https://cypherpunks.venona.com/date/1998/11/msg00941.html
这里还有一些相关讨论:https://cypherpunks.venona.com/date/1998/12/msg00194.html。
谢谢你告诉我你的论文。我会读一下,有什么意见或问题再告诉你。
想告诉你,我刚刚发布了几个月前发给你的那篇论文的完整实现——比特币 v0.1。详情、下载和截图都在 www.bitcoin.org
我认为,它几乎实现了你在 b-money 论文中提出的所有目标。
这个系统完全去中心化,没有任何服务器或可信方。网络基础设施能够支持各种托管交易和合约,但目前重点还是货币和交易的基本功能。
密码学邮件列表上讨论过这个设计。Hal Finney 做了一个很好的总体概述:
引用的来信Hal Finney来源 ↗我想提到的一点是,从很多方面来看,比特币包含两个独立的想法:一是解决 James 在这里列出的这类问题,创建一个全局一致却又去中心化的数据库;二是用它构建类似 Wei Dai 的 b-money(论文中引用了它)的系统,不过它基于交易和币,而不是账户。正如 James 强调的,解决全局、大规模去中心化数据库的问题,可以说是更难的部分。我认为,用工作量证明作为实现这个目标的工具,是一个新颖的想法,非常值得进一步研究。
Satoshi
我一直在开发一种新的电子现金系统,它完全采用点对点方式,无需可信第三方。
我一直在开发一种新的电子现金系统,它完全采用点对点方式,无需可信第三方。
论文在这里: http://www.bitcoin.org/bitcoin.pdf
主要特点: 通过点对点网络防止双重支付。 没有铸币机构或其他可信方。 参与者可以匿名。 新币通过 Hashcash 式的工作量证明产生。 生成新币的工作量证明同时也支撑网络, 防止双重支付。
比特币:一种点对点电子现金系统
摘要。完全采用点对点方式的电子现金,可以让一方直接向另一方在线付款,免去经过金融机构的负担。数字签名提供了部分解决方案,但如果仍然需要可信方来防止双重支付,其主要优势也就不复存在。我们提出一种使用点对点网络解决双重支付问题的方案。网络将交易进行哈希运算,纳入一条持续延伸、基于哈希的工作量证明链,以此为交易加上时间戳,形成一份不重新完成工作量证明就无法更改的记录。最长链不仅证明了所见事件的先后顺序,也证明生成它所汇集的 CPU 算力最多。只要诚实节点控制着网络中最多的 CPU 算力,就能生成最长链并超过任何攻击者。网络本身只需要最基本的结构。消息尽力广播,节点可以随时离开并重新加入网络,接受最长工作量证明链,作为其离线期间所发生事件的证明。
论文全文在这里: http://www.bitcoin.org/bitcoin.pdf
Satoshi Nakamoto
比特币:一种点对点电子现金系统
比特币:一种点对点电子现金系统
Satoshi Nakamoto
satoshi@vistomail.com
www.bitcoin.org
摘要。 一种完全采用点对点方式的电子现金,可以让一方直接向另一方在线付款,免去经由金融机构的负担。数字签名提供了部分解决方案,但如果仍然需要可信任的一方来防止双重支付,主要的好处就会丧失。我们提出一种利用点对点网络解决双重支付问题的方案。网络把交易进行哈希运算,纳入一条持续延伸、基于哈希的工作量证明链,为交易加上时间戳,形成一份不重新完成工作量证明就无法更改的记录。最长链不仅证明了所见事件的先后顺序,也证明生成它所汇集的 CPU 算力最多。只要诚实节点掌握网络中最多的 CPU 算力,它们就能生成最长链,超过任何攻击者。网络本身只需要极少的结构。消息以尽力而为的方式广播,节点可以自由离开和重新加入网络,并将最长的工作量证明链作为它们离开期间所发生事情的证明。
1. 引言
互联网商业几乎完全依赖金融机构作为可信任的第三方来处理电子支付。虽然这套系统足以满足大多数交易的需要,但它仍然存在基于信任的模式所固有的弱点。完全不可撤销的交易实际上无法实现,因为金融机构无法避免调解争议。调解成本增加了交易成本,限制了实际可行的最低交易金额,也排除了零星的小额交易的可能性;对于无法撤回的服务,不能进行不可撤销的支付,还带来了更广泛的成本。由于支付可能被撤销,需要依赖信任的环节也随之增多。商家必须提防顾客,不断向他们索要原本并不需要的更多信息。人们接受了这样一个现实:一定比例的欺诈无法避免。当面使用实物货币可以避免这些成本和支付的不确定性,但目前还没有一种机制,可以在无需可信任一方的情况下通过通信渠道进行支付。
我们需要一种基于密码学证明而非信任的电子支付系统,让任何有意愿的双方都能直接交易,无需可信任的第三方。因撤销所需计算量过大而难以撤销的交易可以保护卖家免受欺诈,而常规的托管机制也可以很容易地实现,以保护买家。本文提出一种解决双重支付问题的方案:使用点对点的分布式时间戳服务器,为交易的时间顺序生成计算证明。只要诚实节点合计掌握的 CPU 算力超过任何一组相互协作的攻击节点,这个系统就是安全的。
2. 交易
我们把一枚电子货币定义为一条数字签名链。每位所有者对上一笔交易和下一位所有者的公钥计算哈希,再对该哈希进行数字签名,并将这些内容添加到这枚币的末尾,从而把币转给下一位所有者。收款人可以验证这些签名,以验证所有权链。
问题当然在于,收款人无法验证某位所有者是否对这枚币进行了双重支付。一种常见的解决方案是引入一个可信任的中央机构,也就是铸币机构,由它检查每笔交易是否存在双重支付。每次交易之后,币都必须交回铸币机构,以发行一枚新币;只有铸币机构直接发行的币,才被认为没有被双重支付。这种方案的问题在于,整个货币系统的命运都取决于经营铸币机构的公司,每笔交易都必须经过它,就像银行一样。
我们需要一种方法,让收款人知道之前的所有者没有签署过任何更早的交易。对于我们的目的而言,只有最早的交易算数,因此我们不关心之后的双重支付尝试。确认一笔交易不存在的唯一方法,就是知晓所有交易。在基于铸币机构的模式中,铸币机构知道所有交易,并决定哪笔先到。要在没有可信任一方的情况下做到这一点,就必须公开宣布交易 [1],而且需要一个系统,让参与者对唯一一份交易接收顺序记录达成一致。收款人需要证据,证明在每笔交易发生时,多数节点都同意它是最先收到的那笔。
3. 时间戳服务器
我们提出的方案从时间戳服务器开始。时间戳服务器的工作方式是:对一组需要加上时间戳的项目组成的区块计算哈希,然后广泛发布该哈希,例如刊登在报纸上或发布到 Usenet 帖子中 [2-5]。时间戳证明这些数据在当时必然已经存在,因为显然,只有先存在,才能被纳入哈希。每个时间戳的哈希都包含前一个时间戳,从而形成一条链,每个新增的时间戳都会加强它之前的时间戳。
4. 工作量证明
要以点对点的方式实现分布式时间戳服务器,我们需要使用类似 Adam Back 的 Hashcash [6] 的工作量证明系统,而不是报纸或 Usenet 帖子。工作量证明需要不断寻找一个值,使它经过 SHA-256 等哈希运算后,所得哈希以若干个零比特开头。所需的平均工作量随要求的零比特数量呈指数增长,而验证只需要执行一次哈希运算。
对于我们的时间戳网络,实现工作量证明的方法是递增区块中的 nonce,直到找到一个值,使区块哈希具有所要求数量的零比特。CPU 一旦付出计算工作,使区块满足工作量证明要求,不重新完成这些工作就无法修改该区块。随着后续区块连接在它后面,修改这个区块所需的工作还包括重新计算它之后的所有区块。
工作量证明也解决了多数决策中如何确定代表权的问题。如果多数建立在一个 IP 地址一票的基础上,任何能够分配大量 IP 地址的人都可以破坏它。工作量证明本质上是一个 CPU 一票。最长链代表多数决定,因为生成它所投入的工作量证明计算最多。如果诚实节点掌握多数 CPU 算力,诚实链就会增长得最快,超过所有竞争链。要修改过去的一个区块,攻击者必须重新完成该区块及其之后所有区块的工作量证明,然后追上并超过诚实节点的工作量。后面我们将说明,随着后续区块的增加,速度较慢的攻击者追上的概率会呈指数下降。
5. 网络
运行网络的步骤如下:
- 新交易广播给所有节点。
- 每个节点把新交易收集到一个区块中。
- 每个节点为自己的区块寻找一个难以求得的工作量证明。
- 当节点找到工作量证明时,就把该区块广播给所有节点。
- 节点只有在区块中的所有交易都有效,而且所花费的币尚未被花费过时,才接受该区块。
- 节点使用已接受区块的哈希作为前一区块的哈希,着手创建链中的下一个区块,以此表示接受该区块。
节点始终把最长链视为正确的链,并持续努力延长它。如果两个节点同时广播不同版本的下一个区块,一些节点可能先收到其中一个,另一些节点则先收到另一个。此时,它们会在最先收到的区块上继续工作,但也保留另一个分支,以防它变得更长。当下一个工作量证明被找到、某个分支变得更长时,平局就会被打破;此前在另一个分支上工作的节点便会切换到较长的分支。
新交易的广播不一定需要到达所有节点。只要到达足够多的节点,它们不久就会进入一个区块。区块广播也能容忍消息丢失。如果一个节点没有收到某个区块,它会在收到下一个区块、发现自己漏了一个时,请求补收。
6. 激励
按照惯例,区块中的第一笔交易是一笔特殊交易,它创建一枚归该区块创建者所有的新币。这为节点支持网络增添了激励,也提供了一种最初将币分配到流通中的方式,因为这里没有发行货币的中央机构。以稳定的速度增加固定数量的新币,类似于金矿工人消耗资源,让黄金进入流通。在我们的系统中,消耗的是 CPU 时间和电力。
这种激励也有助于鼓励节点保持诚实。如果一个贪婪的攻击者能集结超过所有诚实节点的 CPU 算力,他就必须作出选择:是用这些算力把已付出去的钱偷回来、欺骗人们,还是用它来生成新币。他应该会发现,遵守规则比破坏系统和自己财富的有效性更有利可图,因为这些规则使他能获得比其他所有人加起来还多的新币。
为了适应硬件速度不断提高,以及人们运行节点的意愿随时间变化,工作量证明的难度由移动平均值决定,目标是使每小时平均生成一定数量的区块。如果区块生成得太快,难度就会上升。
7. 回收磁盘空间
当一枚币的最新交易被足够多的区块覆盖后,它之前已花费的交易就可以丢弃,以节省磁盘空间。为了在不破坏区块哈希的情况下做到这一点,交易被组织成一棵 Merkle 树并进行哈希运算 [7][2][5],其中只有树根哈希参与区块哈希的计算。这样就可以通过剪去树的分支来压缩旧区块。内部哈希无需存储。
不含交易的区块头大约为 80 字节。假设每 10 分钟生成一个区块,则每年需要 80 字节 * 6 * 24 * 365 = 4.2MB。2008 年出售的计算机系统通常配有 2GB 内存,而摩尔定律预测目前每年增长 1.2GB,因此即使必须把区块头保存在内存中,存储也不成问题。
8. 简化支付验证
无需运行完整的网络节点,也可以验证支付。用户只需保存最长工作量证明链的区块头副本;他可以查询网络节点,直到确信自己拿到的是最长链,然后取得一条 Merkle 分支,用它将交易连接到为该交易加上时间戳的区块。他无法自行检查这笔交易,但把它连接到链上的一个位置后,就能看到已有网络节点接受了它;此后添加的区块进一步确认网络已经接受它。
因此,只要诚实节点控制网络,这种验证就是可靠的;但如果攻击者压倒了网络,它就更容易受到攻击。网络节点可以自行验证交易,只会面临交易被撤销的风险;而对于简化方法,只要攻击者能够持续压倒网络,就能用伪造的交易欺骗它。一种防范策略是接受网络节点在检测到无效区块时发出的警报,促使用户软件下载完整区块及所报告的交易,以确认不一致之处。经常接收付款的商家,可能仍会希望运行自己的节点,以获得更独立的安全保障和更快的验证。
9. 价值的合并与拆分
虽然可以逐枚处理币,但若转账中的每一分钱都需要一笔单独的交易,就会很不方便。为了让价值可以拆分和合并,交易包含多个输入和输出。通常,一笔交易要么只有一个输入,来自此前金额较大的一笔交易;要么有多个输入,将较小的金额合并起来;而输出最多有两个:一个用于付款,另一个在需要找零时,把零钱退还给付款人。
需要指出,一笔交易依赖几笔交易,而这些交易又依赖更多交易,这种扇出关系在这里并不构成问题。任何时候都不需要提取一笔交易历史的完整独立副本。
10. 隐私
传统银行模式通过把信息访问权限限制在交易相关方及可信任的第三方之间,获得一定程度的隐私。所有交易都必须公开宣布,因此无法采用这种方法,但仍可以在其他地方切断信息流来保护隐私:让公钥保持匿名。公众可以看到有人向另一个人发送了一笔钱,却没有信息能把这笔交易与任何人联系起来。这与证券交易所公开的信息程度相似:单笔交易的时间和规模,也就是逐笔行情记录,是公开的,但不透露交易双方是谁。
作为一道额外的防线,每笔交易都应使用一对新的密钥,以免它们被关联到同一位所有者。不过,多输入交易仍然无法避免某些关联,因为它们必然会暴露这些输入属于同一位所有者。风险在于,如果某个密钥的所有者身份被揭露,关联分析就可能揭露同一位所有者的其他交易。
11. 计算
我们考虑这样一种情况:攻击者试图以比诚实链更快的速度生成另一条链。即使他做到了,也不能任意更改系统,例如凭空创造价值,或取走从未属于攻击者的钱。节点不会把无效交易当作付款接受,诚实节点也绝不会接受包含此类交易的区块。攻击者只能尝试更改自己的一笔交易,以拿回他最近花出去的钱。
诚实链与攻击者链之间的竞争,可以描述为二项随机游走。成功事件是诚实链延长一个区块,使其领先幅度增加 +1;失败事件是攻击者链延长一个区块,使差距的变化量为 -1。
攻击者从给定的落后幅度追上的概率,类似于赌徒破产问题。假设一个拥有无限信用额度的赌徒从亏损状态开始,可以进行无限次尝试,试图回到收支平衡。我们可以如下计算他最终回到收支平衡的概率,也就是攻击者最终追上诚实链的概率 [8]:
- p = 诚实节点找到下一个区块的概率
- q = 攻击者找到下一个区块的概率
- qz = 攻击者从落后 z 个区块最终追上的概率
根据我们关于 p > q 的假设,随着攻击者需要追赶的区块数量增加,这个概率呈指数下降。形势对他不利;如果他没有在一开始幸运地大幅前进,那么随着他越落越远,机会就会变得微乎其微。
现在考虑一笔新交易的收款人需要等待多久,才能有足够把握认为付款人无法更改交易。我们假设付款人就是攻击者,他想让收款人暂时相信自己已收到付款,过一段时间后再把这笔钱改为付回给自己。发生这种情况时,收款人会得到警告,但付款人希望到那时已经太晚了。
收款人生成一对新密钥,并在签名前不久把公钥交给付款人。这样可以防止付款人提前准备一条区块链,一直计算,等到足够幸运、领先足够多时再执行交易。交易发出后,不诚实的付款人开始秘密构建一条并行链,其中包含这笔交易的另一个版本。
收款人等待交易被加入某个区块,并且该区块后又连接了 z 个区块。他不知道攻击者已经推进了多少,但假设诚实节点出块所用的时间等于平均预期时间,攻击者可能取得的进展就服从泊松分布,其期望值为:
为了得到攻击者此时仍能追上的概率,我们把攻击者可能取得的每种进展对应的泊松概率密度,乘以他从那个位置追上的概率:
重新整理,避免对分布的无穷尾部求和……
转换成 C 代码:
#include <math.h>
double AttackerSuccessProbability(double q, int z)
{
double p = 1.0 - q;
double lambda = z * (q / p);
double sum = 1.0;
int i, k;
for (k = 0; k <= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i <= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 - pow(q / p, z - k));
}
return sum;
}
运行程序算出一些结果后,可以看到概率随 z 的增大呈指数下降。
q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006
求解 P 小于 0.1% 的情况……
P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340
12. 结论
我们提出了一种无需依赖信任的电子交易系统。我们从由数字签名构成的币这一常见框架出发,它能有力地控制所有权,但缺少防止双重支付的方法,就仍不完整。为了解决这一点,我们提出一种点对点网络,使用工作量证明记录公开的交易历史;只要诚实节点掌握多数 CPU 算力,这份交易历史很快就会在计算上变得难以被攻击者更改。网络无需固定的组织结构,因而简单而稳健。节点同时工作,几乎无需协调。它们不需要身份识别,因为消息无需路由到任何特定位置,只要尽力传送即可。节点可以自由离开和重新加入网络,并将工作量证明链作为它们离开期间所发生事情的证明。它们用 CPU 算力投票,通过继续延长有效区块来表示接受,通过拒绝在无效区块上继续工作来表示拒绝。这种共识机制可以执行任何所需的规则和激励。
参考文献
[1] W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998.
[2] H. Massias、X.S. Avila 和 J.-J. Quisquater,《设计一种信任要求最低的安全时间戳服务》,第 20 届比荷卢信息论研讨会,1999 年 5 月。
[3] S. Haber、W.S. Stornetta,《如何为数字文档加上时间戳》,《密码学杂志》,第 3 卷第 2 期,第 99-111 页,1991 年。
[4] D. Bayer、S. Haber、W.S. Stornetta,《提高数字时间戳的效率和可靠性》,《序列 II:通信、安全与计算机科学中的方法》,第 329-334 页,1993 年。
[5] S. Haber、W.S. Stornetta,《位串的安全名称》,第 4 届 ACM 计算机与通信安全会议论文集,第 28-35 页,1997 年 4 月。
[6] A. Back,《Hashcash——一种拒绝服务攻击对策》,http://www.hashcash.org/papers/hashcash.pdf, 2002 年。
[7] R.C. Merkle,《公钥密码系统的协议》,1980 年安全与隐私研讨会论文集,IEEE 计算机学会,第 122-133 页,1980 年 4 月。
[8] W. Feller,《概率论及其应用导论》,1957 年。
我读了你的 b-money 网页,觉得很有意思。我正准备发表一篇论文,把你的想法扩展成一个完整、可运行的系统。Adam Ba…
我读了你的 b-money 网页,觉得很有意思。我正准备发表一篇论文,把你的想法扩展成一个完整、可运行的系统。Adam Back(hashcash.org)注意到其中的相似之处,告诉了我你的网站。
我需要知道你的 b-money 网页是哪年发表的,以便在论文中引用。引用格式会是这样:
[1] W. Dai,《b-money》,http://www.weidai.com/bmoney.txt,(2006?)。
你可以在 http://www.upload.ae/file/6157/ecash-pdf.html 下载预发布草稿。你觉得还有谁会感兴趣,也请随意转发给他们。
标题:无需可信第三方的电子现金
信中附上的论文摘要中本聪来源 ↗一种完全采用点对点方式的电子现金,可以让一方直接向另一方在线付款,免去经过金融机构的负担。数字签名提供了部分解决办法,但如果仍需要可信方来防止双重支付,其主要优势也就不复存在。我们提出一种利用点对点网络解决双重支付问题的方案。网络通过哈希运算,把交易纳入一条不断延伸、基于哈希的工作量证明链,为交易加盖时间戳,形成一种记录:若不重新完成工作量证明,就无法更改它。最长链既能证明所见证事件的先后顺序,也能证明生成它所汇集的 CPU 算力最多。只要诚实节点控制着网络中最多的 CPU 算力,就能生成最长链,超过任何攻击者。网络本身只需要极少的组织结构。消息尽力广播,节点可以随时离开和重新加入网络,并接受最长的工作量证明链,以此证明它们离开期间发生的事情。
Satoshi
谢谢,我之前不知道 b-money 这个页面,但我的想法恰好有着相同的出发点。我会给他发邮件确认发表年份,以便注明他的贡献。
是的,引用信息看起来没问题,我会读一下你的论文。你可能知道 Wei Dai 提出的“B-money”方案,我想用 Google 就能搜到,它听起来和你的论文有些关联。(b-money 的想法只在他的网页上作了简要说明,他没有写成论文。)
Adam
谢谢,我之前不知道 b-money 这个页面,但我的想法恰好有着相同的出发点。我会给他发邮件确认发表年份,以便注明他的贡献。
我的系统主要增加的一点,是同时使用工作量证明来支持分布式时间戳服务器。用户通过生成工作量证明为自己创造新币时,同一份工作量证明也在支持网络的时间戳功能。这代替了 Usenet。
Satoshi
Adam 回信的末尾(署名)Adam Back来源 ↗Adam
Adam 引用的中本聪旧信中本聪来源 ↗我正准备发表一篇引用了你的 Hashcash 论文的文章,想确认引用信息无误。
阅读完整回信 · Adam Back · 2008-08-21
抱歉,我还没读你的论文。不过,还有一篇相关论文,是 Rivest 等人写的,叫作 MicroMint。它利用 k 路碰撞,让银行在造币时拥有随时间积累的计算优势。你提到一组参与者会因计算量而占据优势,这让我想到了 MicroMint。在 MicroMint 中,银行的优势会随时间不断增大,因为已经积累的部分计算结果,能帮助它以更低的成本进一步找到部分碰撞,形成累积优势。
Adam
我准备发表一篇论文,其中引用了你的 Hashcash 论文,想确认引用格式是否正确。我目前写的是:
我准备发表一篇论文,其中引用了你的 Hashcash 论文,想确认引用格式是否正确。我目前写的是:
[5] A. Back,"Hashcash——一种拒绝服务攻击对策," http://www.hashcash.org/papers/hashcash.pdf,2002。
我想你会觉得有意思,因为它为基于哈希的工作量证明找到了新用途,用它来实现电子现金。你可以在 http://www.upload.ae/file/6157/ecash-pdf.html 下载发表前的草稿。欢迎转发给其他你认为会感兴趣的人。我也快完成一个 C++ 实现了,准备以开源形式发布。
标题:无需可信第三方的电子现金
摘要:完全采用点对点方式的电子现金,可以让一方直接向另一方在线付款,免去经过金融机构的负担。数字签名提供了部分解决方案,但如果仍然需要可信方来防止双重支付,其主要优势也就不复存在。我们提出一种使用点对点网络解决双重支付问题的方案。网络将交易进行哈希运算,纳入一条持续延伸、基于哈希的工作量证明链,以此为交易加上时间戳,形成一份不重新完成工作量证明就无法更改的记录。最长链不仅证明了所见事件的先后顺序,也证明生成它所汇集的 CPU 算力最多。只要诚实节点控制着网络中最多的 CPU 算力,就能生成最长链并超过任何攻击者。网络本身只需要最基本的结构。消息尽力广播,节点可以随时离开并重新加入网络,接受最长工作量证明链,作为其离线期间所发生事件的证明。
目录与阅读顺序由本站整理;原话保留各自日期与上下文。文中软件版本、费用和设置属于当时的历史语境。