我准备发表一篇论文,其中引用了你的 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 算力,就能生成最长链并超过任何攻击者。网络本身只需要最基本的结构。消息尽力广播,节点可以随时离开并重新加入网络,接受最长工作量证明链,作为其离线期间所发生事件的证明。
是的,引用信息看起来没问题,我会读一下你的论文。你可能知道 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
我读了你的 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
比特币:一种点对点电子现金系统
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 年。
我一直在开发一种新的电子现金系统,它完全采用点对点方式,无需可信第三方。
论文在这里: http://www.bitcoin.org/bitcoin.pdf
主要特点: 通过点对点网络防止双重支付。 没有铸币机构或其他可信方。 参与者可以匿名。 新币通过 Hashcash 式的工作量证明产生。 生成新币的工作量证明同时也支撑网络, 防止双重支付。
比特币:一种点对点电子现金系统
摘要。完全采用点对点方式的电子现金,可以让一方直接向另一方在线付款,免去经过金融机构的负担。数字签名提供了部分解决方案,但如果仍然需要可信方来防止双重支付,其主要优势也就不复存在。我们提出一种使用点对点网络解决双重支付问题的方案。网络将交易进行哈希运算,纳入一条持续延伸、基于哈希的工作量证明链,以此为交易加上时间戳,形成一份不重新完成工作量证明就无法更改的记录。最长链不仅证明了所见事件的先后顺序,也证明生成它所汇集的 CPU 算力最多。只要诚实节点控制着网络中最多的 CPU 算力,就能生成最长链并超过任何攻击者。网络本身只需要最基本的结构。消息尽力广播,节点可以随时离开并重新加入网络,接受最长工作量证明链,作为其离线期间所发生事件的证明。
论文全文在这里: http://www.bitcoin.org/bitcoin.pdf
Satoshi Nakamoto
引用的来信James A. Donald来源 ↗Satoshi Nakamoto 写道:
引用的中本聪旧文中本聪来源 ↗我一直在开发一种新的电子现金系统,它完全采用点对点方式,无需可信第三方。
我们非常、非常需要这样的系统,但按我对你的方案的理解,它似乎无法扩展到所需的规模。
可转让的工作量证明代币要有价值,就必须具有货币价值。要有货币价值,就必须在一个非常大的网络中转让—— 例如类似 bittorrent 的文件交换网络。
要及时发现并拒绝一次双重支付,就必须掌握交易中那些币的大部分过往交易;如果直接实现,就要求每个对等节点掌握大部分过往交易,或者最近发生的大部分过往交易。如果数亿人都在交易,就需要很大的带宽——每个人都必须知道全部交易,或其中相当大的一部分。
早在网络接近这么大的规模之前,用户就可以安全地使用简化支付验证(第 8 节)检查双重支付,这只需要保存区块头链,大约每天 12KB。只有尝试生成新币的人才需要运行网络节点。起初,大多数用户都会运行网络节点,但随着网络增长到一定程度,这项工作会越来越多地交给拥有专用硬件服务器群的专业人员。一个服务器群只需要在网络中运行一个节点,局域网里的其他机器都连接这个节点。
带宽要求可能没有你想的那么难以承受。一笔典型交易大约是 400 字节(ECC 非常紧凑)。每笔交易需要广播两次,所以我们按每笔交易 1KB 算。Visa 在 2008 财年处理了 370 亿笔交易,平均每天 1 亿笔。这么多交易需要 100GB 的带宽,相当于 12 张 DVD 或 2 部高清电影的大小,按当前价格计算,带宽费用约为 $18。
如果网络达到那么大的规模,也需要好几年,到那时,在互联网上传送 2 部高清电影大概就不算什么大事了。
Satoshi Nakamoto
引用的来信John Levine来源 ↗引用的中本聪旧文中本聪来源 ↗只要诚实节点掌握网络中最多的 CPU 算力,它们就能生成最长链,超过任何攻击者。
但事实并非如此。坏人经常控制着由 100,000 台甚至更多机器组成的僵尸网络。我认识一些维护垃圾邮件僵尸机黑名单的人,他们告诉我,经常一天就看到一百万台新僵尸机。
这也是 hashcash 在今天的互联网上行不通的原因 ——好人的计算能力远远不如坏人。
谢谢你提出这一点。
我那句话其实还可以说得更明确。要求是,好人合计拥有的 CPU 算力要超过任何单个攻击者。
会有许多较小的僵尸网络,它们的规模不足以压倒整个网络,但仍能通过生成比特币来赚钱。这样一来,较小的僵尸网络就是“诚实节点”。(我需要找一个比“诚实”更好的词。)越多的小型僵尸网络转而生成比特币,压倒网络的门槛就越高,使得更大的僵尸网络也变得不足以压倒它,于是它们不如也去生成比特币。按照“长尾”理论,小型、中型和只是较大型的僵尸网络加在一起,规模应该远大于最大的僵尸网络。
即使坏人真的压倒了网络,也并不意味着他会立刻发财。他能做的只是拿回自己花出去的钱,就像开出一张会被退票的支票。要利用这一点,他必须先从商家那里买东西,等货物发出后,再压倒网络,试图把钱拿回来。我不认为他靠这种类似盗刷的骗局,能赚得比生成比特币更多。有了那么大的僵尸网络,他能生成的比特币会比其他所有人加起来还多。
比特币网络实际上可能会让僵尸网络转去生成比特币,从而减少垃圾邮件。
Satoshi Nakamoto
引用原文发言者未注明[省略了关于系统容易受到武力垄断者攻击的长篇论述。]
你无法在密码学中找到政治问题的解决方案。
是的,但我们可以在这场军备竞赛中赢下一场重要战役,获得一片能维持数年的新自由领地。
政府擅长斩首 Napster 这样的中央控制网络,但 Gnutella 和 Tor 这样的纯 P2P 网络似乎仍能站稳脚跟。
Satoshi
Ray Dillinger:
引用的来信Ray Dillinger来源 ↗这种“货币”的通胀率约为 35%,因为计算机每年提速的幅度就是这么大 ……这种技术几乎保证了 35% 的通胀率
硬件速度增长的问题已经处理了:“为了适应硬件速度不断提高,以及人们运行节点的意愿随时间变化,工作量证明的难度由移动平均值决定,目标是使每小时平均生成一定数量的区块。如果区块生成得太快,难度就会上升。”
随着计算机速度变快,以及用于创建比特币的总算力增加,难度也会按比例增加,以保持新增产量不变。因此,未来每年会产生多少新比特币,是可以提前知道的。
新币的产生意味着货币供应量按计划增加,但这不一定导致通货膨胀。如果货币供应量的增长速度与使用人数的增长速度相同,价格就会保持稳定。如果供应增长赶不上需求,就会出现通货紧缩,早期持币者会看到其价值上升。
总得有一种办法把币初始分配出去,恒定速率似乎是最好的办法。
Satoshi Nakamoto
Hal Finney 写道:
引用的来信Hal Finney来源 ↗文中提到,如果一笔广播的交易没有到达所有节点,也没关系,因为它很快就会进入区块链。这是怎样发生的——如果创建“下一个”区块的节点(第一个找到 hashcash 碰撞的节点)没收到这笔交易,随后又有几个区块由同样没收到这笔交易的节点添加上去,会怎么样?所有收到它的节点,是否都会一直保留这笔交易,希望等自己足够幸运,成为找到下一个碰撞的节点时,把它纳入区块?
是的,节点会把交易保留在工作集中,直到它们进入一个区块。如果一笔交易到达了 90% 的节点,那么每次找到新区块时,它就有 90% 的概率被纳入其中。
引用的来信Hal Finney来源 ↗或者举个例子,如果一个节点保留着两条或更多条链,等着看哪条增长最快,这时链 A 收到一个区块,其中包含对链 B 中某个币的双重支付,会怎么样?会不会检查这种情况?(如果有人双重支付,而两组不同的节点分别听到了使用同一个币的两笔不同交易,就可能出现这种情况。)
不需要检查这种情况。哪个分支最终领先,其中的交易就有效,另一个分支中的交易就无效。如果有人这样尝试双重支付,总会有且只有一次支付变得有效,其他的都无效。
交易接收方通常需要等待大约一小时或更久,让这类潜在冲突有时间得到解决。他们仍然可以立即把币再次花出去,但在发货等操作之前应该等待。
引用的来信Hal Finney来源 ↗我也不完全理解,一个能调集比所有诚实参与者更多算力的强大攻击者,究竟如何实现双重支付或取消交易。我知道他可以创建新区块,把它们接起来,形成最长链,但他怎么能删除或添加链上的旧交易?攻击者发出新区块时,诚实节点不能进行一致性检查,确认没有任何内容被删除吗?如果能进一步解释这种攻击,会更有助于判断攻击者从中得到的收益,与单纯使用自己的算力诚实地铸造新币相比如何。
攻击者不是在末尾添加区块。他必须回头重做包含自己交易的区块,以及之后的所有区块,还包括他做这些工作时网络继续添加到末尾的所有新区块。他是在改写历史。一旦他的分支更长,它就成为新的有效分支。
这涉及一个关键点。即使所有在场的人都看到了这些小动作,也无法利用这个事实。
必须始终严格地把最长链视为有效链。在场的节点可能记得,一个分支先出现,后来被另一个取代,但它们无法向不在场的节点证明这一点。不能让节点分成几个小派别:一派坚持自己认为最早的分支,一派先看到了另一个分支,还有一派后来才加入,根本没看到发生了什么。基于 CPU 算力的工作量证明投票必须拥有最终决定权。让所有人保持一致的唯一办法,就是无论发生什么,都相信最长链始终有效。
引用的来信Hal Finney来源 ↗至于支付交易,币的接收方需要进行哪些检查?她需要追溯这个币的完整转手历史,确认列表中的每笔交易确实都已链接到“时间戳”区块链中吗?还是只需要检查最近的一笔?
接收方只需要沿交易历史往回验证,追溯到区块链中足够久远的位置,通常只需要追溯 2 笔交易的深度。再早的所有交易都可以丢弃。
引用的来信Hal Finney来源 ↗时间戳节点会不会检查交易,确保某个币的上一笔交易已经在链上,从而保证链上的所有交易都代表有效的币?
对,正是如此。节点收到一个区块时,会根据已有区块中的先前交易,检查其中每笔交易的签名。区块中的交易,只能依赖于先前区块或同一区块中的有效交易。交易 C 可以依赖于同一区块中的交易 B,而 B 又依赖于更早区块中的交易 A。
引用的来信Hal Finney来源 ↗抱歉问了这么多问题,但正如我说的,这的确是一个很有前景而且很新颖的想法,我很期待看到这个概念进一步发展。如果能更侧重流程来描述这个想法,提供各种对象(币、区块、交易)的数据结构细节、消息中包含的数据,以及对系统中各种可能事件的处理步骤作出算法描述,都会很有帮助。你提到正在编写一个实现,但我认为下一步如果能给出更正式的系统文字描述,会很有帮助。
感谢你的提问。实际上,我做这件事的顺序有点反过来了。我必须先写出全部代码,才能确信自己能解决每一个问题,然后才写论文。我想,发布代码所需的时间应该比写出详细规范更短。你自行补全的那些细节,绝大多数假设已经是对的了。
Satoshi Nakamoto
James A. Donald 写道:
引用的来信James A. Donald来源 ↗核心概念是,许多实体保存着关于谁拥有哪些比特币的完整而一致的信息。
但保持一致性很棘手。我不清楚,如果有人把一笔交易报告给一位维护者,另一个人又把另一笔交易传给另一位维护者,会发生什么。只有把交易纳入所有历史交易的全网共同视图后,才能知道它是否有效;而只有过了一段时间,又有许多新交易到来之后,才可能知道这个关于所有历史交易的全网共同视图,是否真的是全网共同接受的。
你是否解释过该怎么做,只是我没理解,还是说你确信能做到,但对细节还不太明确?
工作量证明链解决了同步问题,也解决了如何在无需信任任何人的情况下,知道全网共同视图是什么的问题。
交易会很快传播到整个网络,因此如果同一笔交易的两个版本几乎同时被报告,领先的那个版本在抢先到达更多节点方面会占很大优势。节点只接受最先看到的版本,拒绝后到的版本,所以较早的交易会有多得多的节点努力将其纳入下一个工作量证明。实际上,每个节点都是通过把自己最先看到的那笔交易纳入工作量证明的计算,来为自己的看法投票。
如果两笔交易确实在完全相同的时间到达,支持它们的节点也正好各占一半,那么结果就是随机的:哪笔先进入工作量证明,哪笔就被判定为有效。
当一个节点找到工作量证明时,新区块会传播到整个网络,所有人都将它加入链中,并开始计算它之后的下一个区块。之前收到另一笔交易的节点会停止尝试把它纳入区块,因为按照已接受的链,它现在已经无效。
工作量证明链本身就足以证明,它来自全网共同视图。只有网络中的多数节点合力,才有足够的 CPU 算力生成难度如此高的工作量证明链。任何用户收到工作量证明链后,都可以看到网络中的多数节点认可了什么。一旦某笔交易经哈希运算被纳入链中的一环,而后面又接上了几环,它就牢牢地刻进了全网历史。
Satoshi Nakamoto
James A. Donald 写道:
引用的来信James A. Donald来源 ↗好,假设一个节点把一批交易纳入了自己的工作量证明,这些交易全都是诚实、合法的单次支付;另一个节点把另一批交易纳入自己的工作量证明,这些也同样都是诚实、合法的单次支付,而两个证明大约在同一时间生成。
接下来会发生什么?
它们都会广播自己的区块。所有节点都会收到并保留两者,但只在最先收到的那个区块上继续工作。假设恰好一半先收到一个,另一半先收到另一个。
不久后,所有交易都会传播完毕,让每个人都拥有完整的交易集合。两边工作的节点都会尝试补入自己这一边缺少的交易。当下一个工作量证明被找到时,无论该节点此前在计算哪个区块,那个分支都会变得更长,平局就此打破。无论是哪一边,新区块都会包含另一半交易,因此不管哪种情况,该分支都会包含所有交易。即使出现了连续两次分裂这种不太可能的情况,第二次分裂的两边也都会包含完整的交易集合。
交易多等一个或几个周期才进入区块,并不是什么问题。
Satoshi Nakamoto