08 交易
本章涉及好几个问题和答案。作为比特币交易的第一位接收者,哈尔•芬尼提出了问题。
中本聪在第一部分里解释了矿工如何保留交易直到形成区块。
中本聪在第二部分里解释了如何在区块链上避免双重消费,以及当两个矿工同时解出区块问题时哪条区块链会胜出。另外还介绍了接收方需要等待一小时, 直到交易正式被确认进入了区块链。中本聪认为6个区块(每个区块10分钟,6个区块就是1小时)是适当的时间,让交易得以确认并成为区块链的永久部分。
在第三个问题中,中本聪描述了攻击者可能会“改写历史”,即重新构建并更改区块链。添加或删除以前区块中的交易需要重写的速度比现有区块链网络上工作的矿工快。请回忆前面关于孤块的讨论,网络采用的是最长的区块链。中本聪说:CPU驱动的工作量证明投票必须有最终发言权。让大家意见一致的唯一办法就是相信最长的链总是有效的。
第四个问题涉及收款人转账的交易验证。
第五个问题涉及系统节点(即矿工)的作用。当一个矿工发现了工作量证明 (前几位有合适数量0的哈希值),他就会把刚“挖到”的区块广播出去,其中包含一些交易。网络上收到该区块的每个矿工必须检查该区块中每笔交易的有效性。
最后,中本聪报告说为了证明所有问题都解决了,他在写《比特币白皮书》之前就已经把代码都写好了。
回复:比特币:点对点的电子现金支付
中本聪,星期日,2008年11月9日,11: 13: 34 UTC+8
哈尔•芬尼写道:
有人提到如果有一笔交易没能广播到所有节点,并不存在任何问题,因为该交易很快就会进入区块链。如果“下一个”区块的创建者没有收到过这笔交易的通知,接下来的几个区块创建者同样也没接到那笔交易的通知,那会发生什么情况呢?所有接到通知的节点会不会一直保存这笔交易,直到其中一个幸运节点发现下次碰撞时将该交易合并到区块中去呢?
对,节点将交易保留在工作集中,直到进入区块。如果90%的节点包含这笔交易,那么每次发现一个新区块时,该交易就有90%的可能性存在于区块里。
再假如某节点保留了两条或更多条链,等待其中的一条胜出,这时A链中加入一个区块,如果其中包含了B链中同一枚比特币的双重消费那该怎么办呢?会不会检查这种情况?(如果某人双重消费,两组不同的节点分别收到同一枚比特币的两条不同交易,这种情况就会发生。)
这种情况无需检查。领先区块链分支中的交易会成为有效的交易,而另一个分支中的交易将是无效的。如果有人以这种方式重复消费,有且仅有一次消费永远有效,其他的均无效。
交易接收者通常要等1小时或更久,以便为解决这种可能性留有时间。
他们仍然可以立即再次花掉这笔比特币,但应该在采取实际行动之前等待,比如说发货。
我不太理解比所有诚实参与者聚集更多计算能力的超级攻击者到底是怎么做到双重消费或取消交易的。我明白他可以创建新区块并添加这些新区块来创建最长的链,但是他怎么能在链中删除或者添加旧的交易呢?当攻击者发出新区块时,诚实节点难道不做一致性检查以确保没有删除任何内容吗?攻击者是发动攻击还是仅仅使用其计算能力来诚实地铸造新币,对攻击的更多解释将有助于判断二者的收益。
攻击者不会向区块链的末尾添加区块。他必须回去重新计算其交易所在的区块、后续的所有区块以及同时网络不断添加到区块链末尾的新区块。他在改写历史。一旦他的分支变得更长,就变成了有效的区块链。
这里讨论了一个关键点。即使在场的每个人都可以看到其诡计得逞,也拿它没有办法。
永远相信最长的链为有效链绝对有必要。在场的节点也许还能记得原来的分支被另一个新分支所取代,但无法说服那些不在场的节点。不能出现有些节点跟随自己首先看到的分支,而其他节点跟随它们先看到的另一个分支,还有一些加入晚了的节点,根本就没见到发生了什么。工作量证明投票的计算能力必须有最终的发言权。无论如何,让大家取得一致的唯一方法就是相信最长链为有效链。
至于支付交易,比特币收款者必须做哪些检查?是否需要回溯该币的整个转让历史以确保过去每笔交易都确实链接在有“时间戳”的区块链上?还是只可以检查最后一笔?
收款方只需要在区块链上回溯一定的深度进行验证即可,通常只需要回溯2笔交易。再之前的所有交易都可以丟弃。
是否应该由时间戳节点来检查交易以确保比特币先前的交易存在于区块链上,从而实施以下的规则:区块链上的所有交易都代表有效的比特币呢?
的确如此。当节点收到区块时,它根据区块上的先前交易检查每笔交易的签名是否正确。区块可能仅包含依赖当前或先前区块的有效交易。例如,交易C可以依赖同区块中的交易B,而B依赖于早先区块中的交易A。
很不好意思问了这么多问题,但我认为这个想法似乎非常有前途和创新,我期待着能看到这个概念的进一步发展。如果能看到有关这个想法更为过程化的描述,包括各种对象(币、区块、交易)数据结构的具体细节、消息里包含的数据以及系统中发生的各种事件的程序算法的描述等会有所帮助。您提到正在把该想法落地实施,但是在我看来对系统更正式的文字描将会是下一步更好的选择。
谢谢您的提问。我确实做了些本末倒置的事。在说服自己可以解决所有问题
之前,我一定要先写下所有的代码,然后才写下这篇论文。我觉得自己能在写出详细的说明书之前发布代码。您对自己的疑问所做出的大部分假设都是正确的。
中本聪
密码学邮件组