中本聪白皮书(比特币)

0 概要

本文提出一种方案,使现金系统在点对点的环境下运行,并防止双重支付问题。

该网络通过随机散列对全部交易加上时间戳,将它们合并入一个不断延伸的基于随机散列的工作量证明的链条作为交易记录,除非重新完成全部的工作量证明,形成的交易记录将不可更改。

最长的链条一方面证明了计算力的强度,另一方面作为事件序列的证明。

1 简介

现有的贸易都是三方,卖家,买家和可信任担保人,并非能实现完全不可逆的交易。买卖双方需要有可信度。而在物理现金的支持下,就没有这样的问题。我们探索一种方法,能只有买卖双方在的情况下,就能保证不可逆转的交易,完全不需要第三方的参与。

这篇文章中,将提出一种通过点对点分布式时间戳服务器来生成依照时间前后排列并加以记录的电子交易证明,从而解决双重支付问题。
只要诚实的节点所控制的计算能力的总和,大于有合作关系的攻击者的计算能力的总和,该系统就是安全的。

2 最基础的东西 --交易

一枚电子货币是啥呢??
先上张图。

在这里插入图片描述
很显然可以看出,每个所有者通过对前一次交易自己的公钥签署一个随机散列的数字签名,并将这个签名附加在这枚电子货币的末尾,最后传送给下一位。而收款人通过对签名进行检验,就能够验证该链条的所有者。

这个方法很容易检验出这枚货币是否是某个人的,或者说这次交易是否成功。

但是这个方法很难检验,之前的某个主人,是否拿着这枚电子货币进行了双重支付,换而言之,就是一枚电子货币本来只应该用在这个地方,而你却同时用在了其他地方。

通常的解决方案,引入可信赖第三方(他知道全程交易)或者造币厂。造币厂对每一笔支付进行检验,防止双重支付。只要进行了一笔交易,造币厂就要进行回收这枚电子货币,然后再发行一枚新的电子货币,只要是造币厂发的货币才算数。

我们需要收款人有某种方法,能够确保之前的所有者没有对更早发生的交易实施签名。也就是说,我们需要关注本次交易之前的交易。有第三方的时候,第三方比如造币厂知晓全部的交易。在没有第三方存在的时候,那么交易的信息应该公之于众,交易系统中的全员来当监督人。收款人需要确保在交易期间绝大多数的人都认同该交易是首次出现。

广播交易账单防止抵赖

3 加点料 --时间戳服务器

在这里插入图片描述
我们获取要加盖时间戳的一组条目的hash值,并广泛地发布这个值。也就是说,我们把交易加上时间戳,然后再进行hash,而这个加上时间戳的交易在图中称为 item。该时间戳能够证实特定数据必然于某特定时间是的确存在的,因为只有在该时刻存在了才能获取相应的随机散列值。每个时间戳应当将前一个时间戳纳入其随机散列值,每一个随后的时间戳都对之前的一个时间戳进行增强,这样就形成了一个链条。

加时间戳防止双重支付

4 如何防止伪造 --工作量证明

只是在点对点的基础上构建一组分散化的时间戳服务器,这还是远远不够的,敌手完全可以自己造一个区块链,并且声明这才是自己的交易记录,所以我们要有个时间和能力的限制,使得别人伪造要花巨大的代价,或者是基本不可能实现的。

本文在原有的基础上,引入了工作量证明机制。工作量证明机制引入了对某一个特定值的扫描工作,比方说 SHA-256 下,随机散列值以一个或多个 0 开始。那么随着 0 的数目的上升, 找到这个解所需要的工作量将呈指数增长,而对结果进行检验则仅需要一次随机散列运算。

在这里插入图片描述

我们在区块中补增一个随机数(nonce),这个随机数要使得该给定区块的随机散列值出现了所需的那么多个 0。我们通过反复尝试来找到这个随机数,直到找到为止,这样我们就构建了一个工作量证明机制。

只要该 CPU耗费的工作量能够满足该工作量证明机制,那么除非重新完成相当的工作量,该区块的信息就不可更改。由于之后的区块是链接在该区块之后的,所以想要更改该区块中的信息,就还需要重新完成之后所有区块的全部工作量。

工作量证明机制本质是一CPU一票,而不是一ip一票,可以抵抗女巫攻击。“大多数”的决定表达为最长的链,因为最长的链包含了最大的工作量。如果大多数的 CPU 为诚实的节点控制,那么诚实的链条会超越其他的竞争链条。就算修改区块内容,由于链式结构,需要将后续的工作量都修改,且能赶上和超越诚实节点的工作量。而这几乎是不太可能的。

工作量证明也是随着算力进行动态调整的。工作量证明的难度将采用移动平均目标的方法来确定,即令难度指向令每小时生成区块的速度为某一个预定的平均数。如果区块生成的速度过快,那么难度就会提高。

5 网络

大致流程:

  1. 新的交易向全网进行广播
  2. 每一个节点收到交易信息,把信息放入一个区块中
  3. 每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明
  4. 当一个节点找到了一个工作量证明,它就向全网进行广播
  5. 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性
  6. 其他节点表示他们接受该区块,而表示接受的方法,则是在
跟随该区块的末尾,制造新的区块以延长该链条

而将被接受区块的随机散列值视为先于新区快的随机散列值

如果遇上两个节点同时广播不同版本的新区块,那么其他节点在接收到该区块的时间上将存在先后差别。当此情形,他们将在率先收到的区块基础上进行工作,但也会保留另外一个链条,以防后者变成最长的链条。

新的交易广播实际上不需要抵达全部节点。只要交易信息能够抵达足够多的节点,那么他们将很快被整合进一个区块中。如果一个节点没有收到某特定区块,那么该节点将会发现自己缺失了某个区块,也就可以提出自己下载该区块的请求。

6 激励

两个地方生成:

  1. 第一笔交易成功者获得
    每个区块的第一笔交易进行特殊化处理,该交易产生一枚由该区块创造者拥有的新的电子货币。这样就增加了节点支持该网络的激励。
  2. 交易费(差值)
    如果某笔交易的输出值小于输入值,那么差额就是交易费,该交易费将被增加到该区块的激励中。

激励也有利于节点保持诚实。如果有一个贪婪的攻击者能够调集比所有诚实节点加起来还要多的CPU 计算力,那么他就面临一个选择:

  • 将其用于诚实工作产生新的电子货币
  • 将其用于进行二次支付攻击

按照规则行事、诚实工作是更有利可图的。因为该等规则使得他能够拥有更多的电子货币,而不是破坏这个系统使得其自身财富的有效性受损。

7 回收硬盘空间

如果最近的交易已经被纳入了足够多的区块之中,那么就可以丢弃该交易之前的数据,以回收硬盘空间。

为了同时确保不损害区块的随机散列值,交易信息被随机散列时,被构建成一种梅克尔树(Merkle tree)的形态,使得只有根被纳入了区块的随机散列值。通过将该树的分支拔除的方法,老区块就能被压缩。而内部的随机散列值是不必保存的。
在这里插入图片描述

8 简化的支付确认

一个用户需要保留最长的工作量证明链条的区块头的拷贝,它可以不断向网络发起询问,直到它确信自己拥有最长的链条,并能够通过梅克尔树(Merkle tree)的分支通向它被加上时间戳并纳入区块的那次交易。在这里插入图片描述
但是一旦被一个计算力占优的攻击者攻击时,整个系统就会比较脆弱。为此,只要发现了一个无效的区块,就发出警报,收到警报的用户将立刻开始下载被警告有问题的区块或交易的完整信息,以便对信息的不一致进行判定。

9 组合与分割

单个单个对电子货币进行处理,是可以的,但是还是比较浪费时间。事实上,交易是被设计成多个多个输入和多个输出。这样方便一个大的交易构成单一输入或者几个小的交易构成并行输入。输出最多两个:一个用于支付,另一个如需找零的话用于找零。
在这里插入图片描述

10 隐私

在这里插入图片描述
传统的造币厂模型为买卖双方提供了一定程度的隐私保护,因为试图向可信任的第三方索取交易信息是严格受限的。但是如果将交易信息向全网进行广播,就意味着这样的方法失效了。

本文中,隐私依然可以得到保护:将公钥保持为匿名。公众得知的信息仅仅是有某个人将一定数量的货币发所给了另外一个人,但是难以将该交易同特定的人联系在一起,也就是说,公众难以确信,这些人究竟是谁。

而且使用者可以让每次交易都生成一个新的地址,以确保这些交易不被追溯到一个共同的所有者。但是由于并行输入的存在,一定程度上的追溯还是不可避免的,因为并行输入表明这些货币都属于同一个所有者。此时的风险在于,如果某个人的某一个公钥被确认属于他,那么就可以追溯出此人的其它很多交易。

conference

[1] Satoshi Nakamoto. Bitcoin: A Peer-to-Peer Electronic Cash System.

猜你喜欢

转载自blog.csdn.net/qq_37195179/article/details/104979008