一、阅读比特币源头 Bitcoin: A Peer-to-Peer Electronic Cash System

比特币的创始人 Satoshi Nakamoto 在文章 Bitcoin: A Peer-to-Peer Electronic Cash System 中第一次提出并阐述了bitcoin这一概念;该文完整描述了bitcoin的产生原因和工作原理。要了解比特币和区块链,该文适合拿来作为第一篇阅读材料。

原文链接为 https://bitcoin.org/bitcoin.pdf,下面为本人翻译,供大家参考。

比特币:一个点对点的电子货币系统

摘要。一个纯粹的点对点电子货币应当允许从一方直接到另一方的在线交易,而不需要经过任何财务机构。电子签名可以解决部分问题,但是仍然需要一个第三方机构来解决双花问题(double-spending problem),一旦如此,那么点对点系统的最主要优点就会丢失。我们提出一种方案,使用点对点的网络来解决双花问题。这个网络将所有交易都打上标签;它将交易进行hash,并且放入一个基于hash工作证明(POW)的链条中;在链条产生一条记录之后,要想修改这个记录,就需要重新完成这个工作证明。最长的链条不仅记录着所有的被目击的事件,同时也说明这个链条来自拥有最大计算能力的CPU池。只要大部分CPU没有被攻击网络的人占用,那么它们就会产生最长的链条,战胜攻击者。该网络的结构简单;消息会在网络上尽可能的传播;网络节点可以随时加入和离开网络,当它们再次加入时,只需要接收最长的链条,就可以知道它们离开时发生了什么。

1. 简介

网上贸易都依赖于专门的财务机构;在电子交易中,这些机构充当着受信任的第三方。虽然对于绝大多数交易,此类系统都工作良好,但是它仍然有一些先天的不足,这些不足是由这个信任模型带来的。绝对不可逆的交易无法在此类系统中实现,因为这些财务机构都不可避免的会陷入一些纠纷。调节这些纠纷会增加交易成本,限制交易最小金额,无法支持日常的小额交易;更严重的是,对于那些不可逆的服务,不能提供不可逆的交易。就因为交易可逆,使得信任变得重要。商人需要对客户更加谨慎,向他们询问更多的信息,而这些根本对完成交易没有任何作用。一定比例的诈骗被认为是不可避免的。这些成本以及不确定性,可以通过使用物理现金来避免,但是在网上交易的话,除了寻求第三方的信任机构,没有其他更好的办法。

要想解决这个问题,需要一个基于密码证明的线上交易系统,而不是基于信任的;这个系统允许任何两者直接交易,而不需要寻求第三方的信任机构。从计算层面上来说,交易是不可逆的,从而使卖家不再受到欺骗;常规的托管机制可以很容易实现,以保护买家。这篇文章中,我们介绍一种使用点对点分布式标签服务器来解决双花问题的方法,该服务器对交易时间序列生成计算证明。这个系统中,只要忠实节点的CPU运算能力大于其他攻击节点,那么系统就是安全的。

2.交易

我们将一个电子硬币定义成一个数字签名链条。该硬币的拥有者可以通过这种方式将硬币转移给下一个拥有者:将上一次的整个交易数据进行hash,并且连同下一个拥有者的公钥(public key)一起放入该链条的末尾。接收者可以通过验证签名来验证当前链条的拥有者,如图2-1。


2-1

问题是,这个链条的接收者并不能确定,之前的拥有者没有双花(double-spend)这个硬币。通常的解决办法是引入一个中央信任机构,或者铸造厂,它来验证每一个交易都没有双花问题。每次交易过后,每个硬币都必须被回收到铸造厂重新铸造,只有从铸造厂发出的硬币才被认为是没有双花的。这种解决方案的问题在于,整个货币系统的命运完全决定于铸造厂拥有者的手中,因为所有的交易都需要经过他们,就像银行一样。

我们需要找到一个办法,让硬币的接收者完全可以信任:他收到的这个硬币,之前的拥有者们一定没有拿这个硬币进行过其他的交易。对我们来说,最早发生的交易才能算数,因此那些晚一些的交易是不被承认的。接收者要确认是否有其他的他不知情的交易存在,唯一的办法就是他需要知道这个硬币的所有交易。在铸造厂模型中,铸造厂掌握所有交易信息,他们决定了哪一个交易是先发生的。要想不依赖中心机构达到此目的,所有交易必须是公开声明的,并且需要一个系统,让所有的参与者对唯一的一条交易链认同。硬币的接收者需要知道,他所接收到的这个链条中每一个交易,都是大家所认可的最早发生的交易。

3. 时间戳服务器

我们的方案从一个时间戳服务器开始。时间戳服务器的工作是计算一个被打上时间戳区块的hash值,并将该值广泛传播,例如发表到报纸上,或者Usenet帖子中。时间戳证明了这个数字区块在当时肯定是存在的,因为计算了其hash值。所有的时间戳将其之前的时间戳都包含在hash值中,按照这个规则,形成一个链条,链条每新增一个时间戳,都是之前时间戳的加强版,如图3-1。


3-1

4. 工作证明(Proof-of-Work,POW)

在实现基于点对点的分布式时间戳服务器的时候,我们不能使用报纸或者Usenet帖子,而使用一种工作证明系统,类似 Adam Back's Hashcash [6]。这个工作证明的工作方式是扫描一个值,其hash值(例如SHA-256)是由若干个0 bit开头的。这个证明的工作量和开头0 bit的要求数量成指数关系,而验证它只需要做一次hash计算。

在时间戳网络中,我们通过不停地增加区块中一个数值来进行POW,直到满足了要求的0 bit的数量为止。一旦这个要求被满足,那么这个区块即不能被篡改,除非重新进行一遍工作证明。由于链条中后续的区块都是根据当前区块计算而来,因此要改动当前区块,一定得重新计算后续所有的区块。

4-1

这种工作证明同时也使货币链条代表了多数人的决定。如果多数投票是建立在一个IP一张票的方案上,那么IP资源的持有者就会拥有决定权。工作证明本质上是一个CPU一张选票的。最长的链条代表了大多数人的意见,因为最长的链条意味着最多的工作证明投入。如果大多数CPU都是忠实的节点,那么忠实的链条就会增长最快,打败其他竞争的链条。要想更改链条中过去的一个区块,攻击者需要重新对该区块以及其后面所有区块做工作证明,这样才能赶上忠实链条。后面我们将会展示,一个落后的攻击者赶上忠实链条的可能性,会随着链条长度的增长,成指数递减。

为了补偿计算机硬件计算速度的增加,以及人们对运行服务器节点兴趣热度的变化,工作证明的难度会进行调节,以保证每小时产生的区块数量和预期值近似。如果区块数量过多,那么就增加POW的难度。

5. 服务器网络

运行服务器网络按照下面几个步骤进行:

(1) 新的交易被广播到所有的节点;
(2) 每一个节点都将新的交易加入一个区块中;
(3) 每一个节点都努力寻找该区块的工作证明;
(4) 当一个节点找到工作证明后,它将该区块广播到所有其他节点;
(5) 其他节点对接收到的区块进行验证,确定其中的所有交易都是合法的,并且没有被花费;验证通过后,接受该区块;
(6) 接受该区块之后,节点们将这个区块加入到链条的尾部,将该区块的hash值作为作为Prev Hash(如图4-1)。

节点们都认为最长的链条才是正确的链条,因此它们都会在该链条上面工作。如果两个节点同时传播一个交易的两个不同版本区块时,这两种区块都可能被一部分节点作为最先到达的区块而被接受。此时,节点们会在先到达的链条上工作,而将后到达的链条保存起来以免后者后来成为最长链条。这种局面会在下一个工作证明找到时被打破,因为那时有一个链条将会胜出;那些工作在另一个链条的节点就会转移到最长链条工作。

新的消息并不一定要被广播到所有的节点。只要它达到足够数量的节点,那么该消息很快就会形成区块。区块的广播也允许部分丢失;如果一个节点没有收到一个区块的广播消息,当下一个区块到来时该节点便会知道他之前有过缺失,从而请求补偿。

6.激励

按照约定,一个链条的第一笔交易是一类特别的交易,其创造了一个新的硬币,该硬币被链条第一个区块的创建者拥有。这个约定,对节点在服务器网络中工作产生了激励,同时也解决了新硬币发布方法,因为并没有一个中心机构来发布更多的硬币。硬币数量的稳定增长,意味着掘金者向系统中添加更多的掘进资源。具体来说,是指CPU时间及其消耗的电力。

另一方面,交易手续费也可以产生激励效果。如果一个交易的输出值小于其输入值,那这个差值就是交易手续费,也就是包含该交易区块的激励值。当某一天,硬币总量不再发生变化时,那么系统的激励手段将会完全变成交易手续费,并避免通货膨胀的影响。

激励手段也可以估计节点们保持忠实。当一个贪婪的攻击者有能力掌握大多数的CPU资源时,他需要决定是用这些CPU资源来防止他人骗取他的交易,还是用其产生挖掘更多的硬币。攻击者会发现,按照合法规则来出牌他可以有更多的盈利;这些规则决定,与其推翻当前系统,还不如挖掘更多新的硬币来的划算。

7. 回收硬盘空间

当一个链条中的区块数量足够多时,之前的交易可以被舍弃掉,以节约硬盘资源。为了在不打破区块hash值得前提下完成该功能,我们将所有交易都hash到一个 Merkle Tree [7][2][5] 中,只有树的根节点才会被放入当前区块的hash。老的区块作为子节点被填入这棵树中;树的内部节点不需要存储。

7-1

一个没有交易的区块头大小为80 bytes。假设每10分钟产生一个区块,那么一年可以产生 80bytes624*365=4.2MB 大小的数据。2008年,个人计算机内存大小主流为2GB,根据摩尔定律每年按照1.2GB速度增长,可以看到,即使将区块头直接放在内存中,也不会是个问题。

8.简化的支付验证

并不需要运行一个完整节点来验证一次交易。一个用户只需要持有一份最长链条区块头的备份即可;有了这个备份,他可以询问其他节点,直到他被其他节点确信是最长链条;同时也可以用这个备份获取Merkle Tree上该交易对应区块的链接。用户无法自己确认这个交易,但是通过链条上的一环,用户可以看到网络节点接受了这个交易。

8-1

只要整个网络是由忠实节点做主导,这种验证就是可靠的;但是当一个攻击者拥有过量资源时,其会变得很危险。因为网络中的节点可以验证支付,那么攻击者就可以随意捏造一个交易,并使用其大量节点资源对该交易进行验证。一种应对方案是让用户接受来自节点的报警信息,当节点发现了非法区块时,其向用户报警并促使用户下载完整的区块以及被报警的交易,已确定不一致性。建议那些经常被支付的公司建立一些自己的节点,以保证更多的安全性和更快速的验证。

9. 整合和分割

虽然可以对每个硬币分别处理,但是为每一分钱都创建一个新的交易是不明智的做法。为了使交易金额可大可小,交易包含了多个输入和输出。通常,输入要么是一个金额较大的交易值,要么是若干个金额较小的交易值;输出最多有两个:一个是接收金额,另一个是找零,找零将会退回到付款者。

9-1

需要指出的是,这种扇出并不是什么问题:一个交易依赖其他多个交易,而它们又依赖更多交易。完全没有必要将一个交易的所有历史都抽取出来。

10. 隐私

传统的银行模型通过对交易双方信息的保护,达到了一定程度的隐私效果。但是在本系统中,所有的交易都需要被公开,因此这种传统方法不再奏效。但是,我们通过在另一个地方切断信息流的方法来达到目的——保持公钥的匿名。公众可以看到某个人将一定数量的硬币发送给了另一个人,但是他们完全不知道这两个人究竟是谁。这有点像股票交易,交易时间和金额、以及“tape”都是公开的,但是交易双方身份无法知道。

10-1

为构造额外的一座防火墙,每次交易都应该生成新的密钥对,以防止多笔交易都联系到相同的个体。但是,由于多重输入交易的存在,这种联系是不可避免的。因为多重输入意味着,这些所有输入都是来自同一个用户。而当这些输入某一个key对应的用户被曝光之后,其牵连的其他很多交易,也会被曝光出来。

11. 计算

我们假设该场景,一个攻击者试图产生比当前忠实链条更长的链条。即使这个目的达成,也并不意味着系统可以被随意篡改,比如随便制造数值或者随意从其他账户中提取硬币。节点不会接受一个非法交易当做付款;忠实节点永远不会接受任何包含非法交易的区块。一个攻击者能做的,只是改动他自己最近的一次交易,拿回他所花掉的硬币。

忠实链条和攻击者链条这件的比赛可以被看做是 Binomial Random Walk。成功的事件是忠实链条完成一次工作证明,将其链条长度加1,相对攻击者链条的领先长度也+1;失败的事件是攻击者链条加1,其相对忠实链条的长度差-1.

在一个确定的长度差下,计算攻击者追赶上忠实链条的概率,和Gambler's Ruin(赌徒破产问题)问题相似。假设一个赌徒背负一定数量的赤字,其贷款金额无限,并且尝试次数无限。我们来计算其达到收支平衡的概率,也就是攻击者链条赶上忠实链条的概率:

p=忠实链条发现下一个区块的概率
q=攻击者链条发现下一个区块的概率
qz=攻击者赶上z个区块的概率

11-1

我们假设p>q,那么攻击者赶上的概率会随着区块的增加呈指数下降。因为概率本来就低,因此攻击者的机会随着他落后的越来越多而变得更加渺茫。
接下来,我们来计算一个交易的接收者需要等多长时间,才能保证付款者已经无法对此次交易进行篡改了。假设付款者是一个攻击者,他希望接收者相信他已经付款一段时间了,然后修改交易将硬币返回到自己手中。接收者会收到警告,但是付款者希望此时已经太晚。
接收者产生一对新的密钥对,并在签名交易之前一会将公钥交给付款者,这可以防止付款者提前准备好一个区块链条。当交易被发出时,付款者开始生产一个和忠实链条平行的非法链条,其包含他篡改后的交易区块。
接收者保持等待,直到此次交易被添加到链条中,并且z个新的后续区块也被添加进来。他不知道攻击者此时已经完成到什么程度,但是假设忠实区块按照平均速度被添加,那么攻击者的可能进度会是一个Poisson分布,并且期望值为:

11-2

为了计算攻击者当前赶上的概率,我们将其可能达到的每一种程度的Poisson密度和从该程度开始能够在当前赶超的概率相乘:

11-3

重写式子以避免出现无限级数:

11-4

用C代码实现:


11-5

运行一些测试用例,我们会发现,最终的概率会随着z值的增长呈指数下降:

11-6

为使概率在0.1%以下,下面是z的取值:


11-7

12.结论

我们介绍了一种不基于信任的电子交易系统。我们从一个使用电子签名的硬币框架开始,该框架让硬币拥有者具有绝对的控制权,但是该框架不能够解决硬币的双花问题。为解决双花问题,我们介绍一种点对点的网络,该网络使用工作证明来记录一系列公开的交易信息;只要网络中忠实节点的CPU运算能力大于攻击者节点的运算能力,那么这些交易就无法被攻击者所更改。这个网络结构简单,有很强的鲁棒性。所有节点可以同时工作,而不需要过多的协调。节点们不需要被标记出来,因为网络中的消息并不会定点发送,它们只会尽量散步到多的节点即可。节点可以随时离开和加入网络,通过工作证明,它们可以轻易知道在它们离开时发生了哪些交易。通过接受合法的区块,以及拒绝不合法的区块,每个节点完成了根据CPU资源的投票。任何必要的规则或者激励都可以在这个共识规则中执行。

参考文献

[1] W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998
[2] H. Massias, X.S. Avila, and J.-J. Quisquater, "Design of a secure timestamping service with minimal trust requirements," In 20th Symposium on Information Theory in the Benelux, May 1999
[3] S. Haber, W.S. Stornetta, "How to time-stamp a digital document," In Journal of Cryptology, vol 3, no 2, pages 99-111, 1991
[4] D. Bayer, S. Haber, W.S. Stornetta, "Improving the efficiency and reliability of digital time-stamping," In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.
[5] S. Haber, W.S. Stornetta, "Secure names for bit-strings," In Proceedings of the 4th ACM Conference on Computer and Communications Security, pages 28-35, April 1997.
[6] A. Back, "Hashcash - a denial of service counter-measure," http://www.hashcash.org/papers/hashcash.pdf, 2002.
[7] R.C. Merkle, "Protocols for public key cryptosystems," In Proc. 1980 Symposium on Security and Privacy, IEEE Computer Society, pages 122-133, April 1980
[8] W. Feller, "An introduction to probability theory and its applications," 1957.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容