比特币论文研读:论文原文分析

本文将浅析论文原文,对论文中一笔带过的重要逻辑,或者难以理解的地方进行详述,有助于定性地理解论文描述的模型。

一、标题

原文

Bitcoin: A Peer-to-Peer Electronic Cash System
Satoshi Nakamoto
satoshin@gmx.com
www.bitcoin.org

翻译

比特币:一个点对点的电子货币系统
中本聪(中本 聡,なかもと さとし)
satoshin@gmx.com
www.bitcoin.org

解析

中本聪直接取了名字比特币,并且下了一个定义:电子现金系统。这里的形容词点对点 Peer-to-Peer是当时很新颖的P2P技术。

P2P抛弃了当时流行的Client-Server客户端服务器概念,把每个机器都看作是对等节点,能够互相传输数据,避免CS架构中客户端太多,服务器机器和带宽资源不够支撑客户端访问的问题。迅雷、快播也都是利用P2P在当时快速兴起。比特币利用P2P技术实现了去中心化,一方面这样就没有中央集权控制资金了,另一方面去掉了中央服务器的资源瓶颈。

论文的提出是2008年,正值全球金融危机,人们手中的货币在变成废纸,此时提出比特币,刚好迎上了风口。

二、摘要

原文

Abstract. A purely peer-to-peer version of electronic cash would allow online payments to be sent directly from one party to another without going through a financial institution. Digital signatures provide part of the solution, but the main benefits are lost if a trusted third party is still required to prevent double-spending. We propose a solution to the double-spending problem using a peer-to-peer network. The network timestamps transactions by hashing them into an ongoing chain of hash-based proof-of-work, forming a record that cannot be changed without redoing the proof-of-work. The longest chain not only serves as proof of the sequence of events witnessed, but proof that it came from the largest pool of CPU power. As long as a majority of CPU power is controlled by nodes that are not cooperating to attack the network, they’ll generate the longest chain and outpace attackers. The network itself requires minimal structure. Messages are broadcast on a best effort basis, and nodes can leave and rejoin the network at will, accepting the longest proof-of-work chain as proof of what happened while they were gone.

翻译

摘要. 一种完全的点对点电子货币应当允许在线支付从一方直接发送到另一方而不需要通过一个金融机构。数字签名提供了部分解决方案,但如果仍需一个可信任第三方来防止双重支付,那就失去了电子货币的主要优点。我们提出一种使用点对点网络解决双重支付问题的方案。该网络通过将交易哈希进一条持续增长的基于哈希的工作量证明链来给交易打上时间戳,形成一条除非重做工作量证明否则不能更改的记录。最长的链不仅是被见证事件序列的证据,而且也是它本身是由最大CPU算力池产生的证据。只要多数的CPU算力被不打算联合攻击网络的节点控制,这些节点就将生成最长的链而超过攻击者。这种网络本身只需极简的架构。信息将被尽力广播,节点可以随时离开和重新加入网络,只需接受最长的工作量证明链作为它们离开时发生事件的证据。

解析

这里可以看出,比特币解决的核心问题是:不需要任何第三方信任机构,直接通过P2P网络就能完成网络转账,且精心设计的P2P网络能够避免双重支付。

所谓双重支付问题是指,我有10块钱,在A商店买了10块钱的东西,同一时刻在B商店也买了10块钱的东西,因为没有中心机构来执行“严格顺序扣钱”动作,所以在购买B商店的东西时,B商店不知道这10块钱已经被花过了,导致10块钱被用了2次。

三、简介

原文

Introduction

Commerce on the Internet has come to rely almost exclusively on financial institutions serving as trusted third parties to process electronic payments. While the system works well enough for most transactions, it still suffers from the inherent weaknesses of the trust based model. Completely non-reversible transactions are not really possible, since financial institutions cannot avoid mediating disputes. The cost of mediation increases transaction costs, limiting the minimum practical transaction size and cutting off the possibility for small casual transactions, and there is a broader cost in the loss of ability to make non-reversible payments for nonreversible services. With the possibility of reversal, the need for trust spreads. Merchants must be wary of their customers, hassling them for more information than they would otherwise need. A certain percentage of fraud is accepted as unavoidable. These costs and payment uncertainties can be avoided in person by using physical currency, but no mechanism exists to make payments over a communications channel without a trusted party.

What is needed is an electronic payment system based on cryptographic proof instead of trust, allowing any two willing parties to transact directly with each other without the need for a trusted third party. Transactions that are computationally impractical to reverse would protect sellers from fraud, and routine escrow mechanisms could easily be implemented to protect buyers. In this paper, we propose a solution to the double-spending problem using a peer-to-peer distributed timestamp server to generate computational proof of the chronological order of transactions. The system is secure as long as honest nodes collectively control more CPU power than any cooperating group of attacker nodes.

翻译

简介

互联网贸易已经变得几乎完全依赖金融机构作为可信任第三方来处理电子支付。尽管对于大部分交易这种系统运行得足够好,但仍需忍受基于信任模型这个固有缺点。由于金融机构不可避免的需要仲裁纠纷,完全的不可撤销交易实际是做不到的。仲裁成本增加了交易成本,限制了最小实际交易额度从而杜绝了日常小额交易的可能性,而且由于不支持不可撤销支付,对不可撤销服务进行支付将需要更大的成本。由于存在交易被撤销的可能性,对于信任的需求将更广泛。商家必须警惕他们的客户,麻烦他们提供更多他本不必要的信息。一定比例的欺诈被认为是不可避免的。虽可通过当面使用实物货币来避免这些成本及支付的不确定性,但不存在不引入一个可信任方而能在通信通道上进行支付的机制。

我们需要的是一个基于密码学原理而不是信任的电子支付系统,该系统允许任何有交易意愿的双方能直接交易而不需要一个可信任第三方。交易在计算上的不可撤销将保护卖家不被欺诈,用来保护买家的程序化合约机制也应该较容易实现。在这篇论文中,我们提出一种使用点对点分布式时间戳服务器为基于时间的交易序列生成计算上的证据来解决双重支付问题的方案。只要诚实节点集体控制的CPU算力大于每一个合作攻击节点群的CPU算力,这个系统就是安全的。

四、交易

原文

Transactions

We define an electronic coin as a chain of digital signatures. Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.

bitcoin_transactions.jpg

The problem of course is the payee can’t verify that one of the owners did not double-spend the coin. A common solution is to introduce a trusted central authority, or mint, that checks every transaction for double spending. After each transaction, the coin must be returned to the mint to issue a new coin, and only coins issued directly from the mint are trusted not to be double-spent. The problem with this solution is that the fate of the entire money system depends on the company running the mint, with every transaction having to go through them, just like a bank.

We need a way for the payee to know that the previous owners did not sign any earlier transactions. For our purposes, the earliest transaction is the one that counts, so we don’t care about later attempts to double-spend. The only way to confirm the absence of a transaction is to be aware of all transactions. In the mint based model, the mint was aware of all transactions and decided which arrived first. To accomplish this without a trusted party, transactions must be publicly announced [1], and we need a system for participants to agree on a single history of the order in which they were received. The payee needs proof that at the time of each transaction, the majority of nodes agreed it was the first received.

翻译

交易

我们定义一枚电子货币就是一条数字签名链。每个拥有者都通过将上一次交易和下一个拥有者的公钥的哈希值的数字签名添加到此货币末尾的方式将这枚货币转移给下一个拥有者。收款人可以通过验证数字签名来证实其为该链的所有者。

bitcoin_transactions_cn.jpg

这里的问题是收款人不能证实拥有者之一没有对此货币进行双重支付。通常的做法是引入一个可信任的中央机构或铸币厂来检查每笔交易是否存在双重支付。每笔交易之后,都需要将这枚货币退回铸币厂以换取发行一枚新的货币,只有由铸币厂直接发行的货币才能被确认没有被双重支付。这个方案的问题在于整个货币系统的命运都依赖于运营铸币厂的公司,每笔交易都需要经过它们,就像银行一样。

我们需要一种能让收款人知道上一个货币拥有者没有对任何更早的交易签名的方法。对我们来说,最早的那次交易是唯一有效的,所以我们不需要关心本次交易后面的双重支付尝试。唯一能确保一笔交易不存在的方法是知晓所有之前的交易。在铸币厂模型中,铸币厂知晓所有交易并能确定哪笔交易最先到达。在不引入一个可信任方的前提下要达到这个目的,所有交易就必须公开发布 [1],而且需要一个能让所有参与者对交易收到顺序的单一历史达成共识的系统。收款人在每笔交易时,都需要多数节点认同此交易是最先收到的证据。

解析

1、一枚电子货币就是一条数字签名链

所谓货币,只是一个衡量工作价值的证明而已,便于人们进行“等价交换”,它的形式并不重要,可以是贝壳,可以是金银,可以是国家印发的纸片,也可以是银行电子账户的数字。在比特币这里,货币是一条数字签名链。

我们考虑一个电子支付的场景来理解这种说法。

首先我们知道现实生活中货币是这样的:
(1)银行印发纸片,说这是货币,可以在国家体系内流通
(2)国家引导一些项目(比如基础设施建设),只要你出力气工作,就能得到这些纸片货币,将货币发行出去。
(3)普通民众可以通过“耕种”、“捕捞”、“养殖”、或者非物质性的“金融”、“互联网”等,制造出产品,用纸片货币来互相交换这些产品。
(4)纸片货币可以存入银行,变成银行账户上的一个数字,以便于携带,它们是等价的。

然后假设:
(1)A通过工作,拿到了初始的1元,作为工作价值证明,存在银行里

A银行余额 B银行余额
1元 0元

(2)A通过银行转账,把1元支付给B,购买了B生产的价值1元的商品

A银行余额 B银行余额
0元 1元

这1元钱最开始衡量了A的工作价值,然后衡量了B生产商品的价值。我们当然可以通过查询银行来知道自己的余额是多少,同样地,也可以通过一条记录着这1元货币经手的所有交易节点的链,来推导出各自的余额:

  • 交易节点1:A工作,产生了1元工作量的价值。A在上面签了名,证明这1元的价值是自己的
  • 交易节点2:A将1元转移给了B。A在上面签了名,证明自己支付了这1元,B在上面也签了名,证明自己得到了1元

推导余额

  • A遍历这条链,得到余额:1-1=0
  • B遍历这条链,得到余额:0+1=1

比特币就采用了类似的原理。这条数字签名链,和纸质货币的1元,或者电子账户上的1元,都是等价的。

2、每个拥有者都通过将上一次交易和下一个拥有者的公钥的哈希值的数字签名添加到此货币末尾的方式将这枚货币转移给下一个拥有者。收款人可以通过验证数字签名来证实其为该链的所有者。

bitcoin_transactions_cn.jpg

这里货币转移的过程是:
(1)把上一次的交易下一个拥有者的公钥进行哈希
(2)用上一个拥有者的私钥对这个哈希值进行数字签名
(3)最后把这笔新的交易链接在链上,交易内容就是“所有者1的公钥、哈希值、所有者0的签名”

货币转移实际上就是要能够:

  • 证明这条链(这枚货币)已经不是“上一个拥有者”的了
  • 证明这条链(这枚货币)的确是“下一个拥有者的”的了

我们以上图为例,同时通过类比银行来解释为什么这样做就能够完成货币转移:
(1)所有者0产生一个初始签名,相当于银行发行了货币
(2)所有者0对“所有者1的公钥”的哈希值进行了签名,相当于银行给打工人1发了工资,工资已写到银行余额,或者发纸质货币到了手里。

所有者1怎么知道所有者0已经转账了?
所有者1可以通过所有者0的公钥,来对所有者0的签名进行验证,如果成功,证明所有者0的确已经转账了。

所有者1怎么知道是转给了自己而不是所有者2、3、4?
交易内容上有所有者1的公钥。

所有者0怎么知道自己已经失去了这枚货币?
由于此时最新的交易内容已经是所有者1的公钥,如果再用所有者0的私钥去进行签名交易,下下个拥有者很容易发现所有者1的公钥并不能验签所有者0的签名,肯定不会承认这笔交易,也就是相当于所有者0再也使用不了这条链(这枚货币)了,相当于失去了这枚货币。

(3)所有者1购买了所有者2的商品,于是将“第1笔交易”和“所有者2的公钥”进行了哈希,并用自己的私钥产生了签名,把这笔交易挂在上一笔交易节点之后,完成1向2的转账。

3、避免双重支付

所有者0只有1元,但是同时向所有者1和所有者2发起了1元转账,如果没有“银行”这种中心可信机构来保证交易串行化,所有者1和所有者2都会认为自己收到了1元钱,也就是会产生2条链:

  • 根节点 -> A -> B
  • 根节点 -> A -> C

很明显,“最早的一笔交易”所在的链才是合法的链。比特币没有中心机构,为了知道“最早的一笔交易”到底是哪个链,于是要求:

  • 交易信息需要广播给所有的节点
  • 交易顺序需要所有节点达成共识

P2P系统达成共识,通常是“多数节点同意”就达成共识,比特币也采用了类似的思路,后面会提及。也就是说,如果多数节点都承认“根节点 -> A -> B”是合法交易,那么“根节点 -> A -> C”就会自动被放弃,这样永远只会有1条合法交易的链,也就避免了双重支付。

五、时间戳服务器

原文

Timestamp Server

The solution we propose begins with a timestamp server. A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post [2-5]. The timestamp proves that the data must have existed at the time, obviously, in order to get into the hash. Each timestamp includes the previous timestamp in its hash, forming a chain, with each additional timestamp reinforcing the ones before it.
timestamp_server.jpg

翻译

时间戳服务器

我们提出的方案从时间戳服务器开始。时间戳服务器计算包含多个需要被打时间戳的数据项的区块的哈希值并广泛地发布这个哈希值,就像在报纸或新闻组帖子里 [2-5]。时间戳能证明要得到这个哈希值,显然这些数据当时一定是存在的。每个时间戳的哈希值都纳入了上一个时间戳,形成一条链,后面的时间戳进一步增强前一个时间戳。
timestamp_server_cn.jpg

六、工作量证明(PoW)

原文

To implement a distributed timestamp server on a peer-to-peer basis, we will need to use a proofof-work system similar to Adam Back’s Hashcash [6], rather than newspaper or Usenet posts. The proof-of-work involves scanning for a value that when hashed, such as with SHA-256, the hash begins with a number of zero bits. The average work required is exponential in the number of zero bits required and can be verified by executing a single hash.

For our timestamp network, we implement the proof-of-work by incrementing a nonce in the block until a value is found that gives the block’s hash the required zero bits. Once the CPU effort has been expended to make it satisfy the proof-of-work, the block cannot be changed without redoing the work. As later blocks are chained after it, the work to change the block would include redoing all the blocks after it.

proof_of_work.jpg

The proof-of-work also solves the problem of determining representation in majority decision making. If the majority were based on one-IP-address-one-vote, it could be subverted by anyone able to allocate many IPs. Proof-of-work is essentially one-CPU-one-vote. The majority decision is represented by the longest chain, which has the greatest proof-of-work effort invested in it. If a majority of CPU power is controlled by honest nodes, the honest chain will grow the fastest and outpace any competing chains. To modify a past block, an attacker would have to redo the proof-of-work of the block and all blocks after it and then catch up with and surpass the work of the honest nodes. We will show later that the probability of a slower attacker catching up diminishes exponentially as subsequent blocks are added.

To compensate for increasing hardware speed and varying interest in running nodes over time, the proof-of-work difficulty is determined by a moving average targeting an average number of blocks per hour. If they’re generated too fast, the difficulty increases.

翻译

为了实现一个基于点对点的时间戳服务器,我们需要使用一个类似 Adam Back 提出的哈希货币 [6] 的工作量证明系统,而不是报纸或新闻组帖子那样。工作量证明采取搜索一个数,使得被哈希时,如使用 SHA-256,得到的哈希值以数个 0 比特开始。平均所需工作量将随所需 0 比特呈指数级增长而验证却只需执行一次哈希。

对于我们的时间戳网络。我们通过在区块中加入一个随机数,直到使得区块的哈希值满足所需 0 比特的数被找到的方式实现工作量证明。一旦消耗了 CPU 算力使区块满足了工作量证明,那么除非重做这个工作否则就无法更改区块。由于后面的区块是链接在这个区块后面的,改变这个区块将需要重做所有后面的区块。

proof_of_work_cn.jpg

工作量证明同时解决了在多数决定中确定投票方式的问题。如果多数是按 IP 地址投票来决定,那么它将可能被能分配大量 IP 地址的人破坏。工作量证明本质上是按 CPU 投票。最长的链代表了多数决定,因为有最大的计算工作量证明的精力投入到这条链上。如果多数的 CPU 算力被诚实节点控制,诚实的链就会增长得最快并超过其他的竞争链。要修改过去的某区块,攻击者必须重做这个区块以及其后的所有区块的工作量证明从而赶上并超过诚实节点的工作。我们后面会证明随着后续的区块被添加一个更慢的攻击者赶上诚实节点的概率将呈指数级递减。

为了抵消硬件运算速度的增加及平衡不同时期运行节点的利益,工作量证明的难度将由移动平均数法来确定每小时生成区块的平均数。如果区块生成得过快,那么生成的难度就会增加。

解析

1、为什么需要工作量证明

(1)比特币也需要类似“银行投资基建”一样,把“工资”发出去,才能有货币流通。那发给谁,就看谁在工作。
(2)恰好比特币有一个任务,那就是“所有节点投票选出最长链”。可是交易是并发的,每个节点都可能链上了自己的节点,且不是所有机器都能在同一时刻同时在线执行投票的,需要有一个离线投票基址,且保证“最长链的最终一致性”。并且如果按照一个IP一票,很容易被分配IP地址的人控制大量IP,破坏公平。
(3)于是比特币作者参考了“哈希货币”的思路,让所有节点都去计算一个只能暴力破解的数学难题,谁的CPU算力高,谁就能最先遍历到,然后把区块入链,广播自己的链成为最长链。CPU是通用资源,不存在分配一说,因此不容易被大量集中控制。

2、有没有可能多数CPU被攻击者控制呢?

当然是可能的,甚至随时都可以,比如几大交易所达成协议,就超过了全网51%算力了。

不过这样做了之后:
(1)攻击者并不能得到全世界的比特币,因为比特币不是余额,不是数字也不是纸片,而是通过历史交易推出来的,历史存在的交易不可变更。
(2)攻击者可以把当前自己的钱进行多次消费。先给他人转账,在确认并且收到货物之后,发起51%攻击,让之前的“最长链”成为“弃链”,然后把给自己转账的节点的链选举成新最长链。–如果商家多次被这样空手套白狼,他还会接受比特币作为支付手段吗?
(3)攻击者可以挖空块,赚取工资。后面会提及,对于算数学题的节点,如果成功了,能够得到一些比特币激励,相当于银行发工资。–相当于打工了,和诚实节点做的事情没有区别。
(4)攻击者可以挖空块,并拒绝打包其他的合法交易到链中,让比特币交易瘫痪。– 这不是作死吗,世界就会抛弃比特币了。攻击者想要的是用比特币“等价交换”现实生活中的商品、货物、服务,不是为了花这么多CPU算力成本玩弄比特币系统。比特币的交易都是公开的,大家都能看到,如果发现这样的情况,也没有人会信任比特币的。

所以,当然是可能被多数控制的,但是收益并不高,人们会失去对比特币的信任。不过我觉得这也是比特币设计中问题最大的点,比特币并不是完美的系统,一旦不被承认,所有人的历史资本积累都成空,都变成一堆无用的数据,工作30年和工作0年存款都是0,和国家灭亡后货币变成纸片擦屁股一样。

3、有没有可能2台机器同时算出相同长度的最长链呢?

当然是可能的。比特币保证的是最终一致性,最终只会有1条。因为不是无时无刻这两台机器的算力都一模一样,总能分出先后的,比如某个计算机故障、某台计算机过热、某台计算机断电,各种各样的原因,不可能算力一直都实时一致的,因此不考虑。

4、比特币链会一直切换吗?

理论上是的,每条链都可能成为最长链,从而导致其他链被废弃,所以比特币链会在各个链之间来回切换。在中本聪实现的比特币中,通过设置合理的“区块生成速度”参数,对“链频繁切换”和“交易长时间等待被确认”做一些平衡。

5、比特币构造的数学难题——工作量证明

题目:求解一个随机数Nonce,使得在执行哈希之后,计算得到的哈希值,以N个0比特开头。

目前是没有算法的,随机性特别高,多个区块之间的Nonce并没有规律。只能从头开始遍历所有数字,代入计算,看是否得到的哈希值是否符合要求。谁的CPU频率高,转得快,谁就能先算出来先广播。而且要求的前缀0越多,难度会成指数级增加。

6、移动平均数法调整难度

随着计算机发展,CPU的频率肯定会越来越高(可以对比一下现在的CPU和2008年的CPU性能),区块生成的速度将会越来越快,为了稳定这个速度,就需要动态提高、减少新区块生成的难度。

移动平均数法是一个数学经典方法,比特币通过“历史的区块生成的时间”,用移动平均数法“预测”出下一个区块生成将会消耗多少时间。如果消耗的时间太长了,那么就降低难度;如果消耗的时间太短了,就增加难度。所谓增加难度,就是要求工作量证明中,哈希值以更多个0比特开头。

7、网上说的比特币分叉和比特币链切换有关吗?

无关。分叉主要是协议升级或变更导致产生了2条不同链,比特币链切换是为了保持“最长链”,虽然看起来都是产生了链条分开,但原因和目的不同。

七、网络

原文

Network

The steps to run the network are as follows:

  1. New transactions are broadcast to all nodes.
  2. Each node collects new transactions into a block.
  3. Each node works on finding a difficult proof-of-work for its block.
  4. When a node finds a proof-of-work, it broadcasts the block to all nodes.
  5. Nodes accept the block only if all transactions in it are valid and not already spent.
  6. Nodes express their acceptance of the block by working on creating the next block in the chain, using the hash of the accepted block as the previous hash.

Nodes always consider the longest chain to be the correct one and will keep working on extending it. If two nodes broadcast different versions of the next block simultaneously, some nodes may receive one or the other first. In that case, they work on the first one they received, but save the other branch in case it becomes longer. The tie will be broken when the next proofof-work is found and one branch becomes longer; the nodes that were working on the other branch will then switch to the longer one.

New transaction broadcasts do not necessarily need to reach all nodes. As long as they reach many nodes, they will get into a block before long. Block broadcasts are also tolerant of dropped messages. If a node does not receive a block, it will request it when it receives the next block and realizes it missed one.

翻译

网络

运行网络的步骤如下:

  1. 新交易向所有节点广播。
  2. 每个节点将新交易收集到一个区块。
  3. 每个节点为它的区块寻找工作量证明。
  4. 当一个节点找到了工作量证明,就向所有节点广播这个区块。
  5. 节点只有在区块内所有交易都是有效的且之前没有被支付的情况下接收这个区块。
  6. 节点通过使用这个区块的哈希值作为上一个哈希值在链中创建下一个区块的方式表示对这个区块的接受。

节点总是认为最长的链为正确的并持续致力于延长它。如果两个节点同时广播了不同的下一个区块,有些节点可能先收到其中一个而其他节点先收到另一个。这种情况,节点基于他们收到的第一个区块工作,但是也保存另一个分支以防它变为更长的链。当下一个工作量证明被找到后僵局就会被打破从而其中一个分支变得更长;在另一个分支上工作的节点将切换到更长的链上来。

新交易的广播不必到达所有的节点。只要到达一些节点,不久就会进入到一个区块。区块广播也是能容忍消息丢失的。如果一个节点没有收到某个区块,它将在收到下一个区块时发现它丢失了一个区块然后去请求这个区块。

八、激励

原文

By convention, the first transaction in a block is a special transaction that starts a new coin owned by the creator of the block. This adds an incentive for nodes to support the network, and provides a way to initially distribute coins into circulation, since there is no central authority to issue them. The steady addition of a constant of amount of new coins is analogous to gold miners expending resources to add gold to circulation. In our case, it is CPU time and electricity that is expended.

The incentive can also be funded with transaction fees. If the output value of a transaction is less than its input value, the difference is a transaction fee that is added to the incentive value of the block containing the transaction. Once a predetermined number of coins have entered circulation, the incentive can transition entirely to transaction fees and be completely inflation free.

The incentive may help encourage nodes to stay honest. If a greedy attacker is able to assemble more CPU power than all the honest nodes, he would have to choose between using it to defraud people by stealing back his payments, or using it to generate new coins. He ought to find it more profitable to play by the rules, such rules that favour him with more new coins than everyone else combined, than to undermine the system and the validity of his own wealth.

翻译

激励

我们约定,区块中的第一笔交易是区块创建者开启一枚属于他的新货币的特殊的交易。这就增加了对支持网络的节点的激励,并提供了一种分发货币到流通领域的方法,因为这里
没有中央机构来发行货币。新货币按固定量稳定地增加就像金矿矿工消耗资源并增加黄金到流通领域一样。对我们而言,消耗的是 CPU 时间和电力。

激励也可以由交易费充当。如果交易的输出值小于其输入值,差价就作为交易费被加到包含此交易的区块的激励中。一旦预定量的货币进入了流通领域,激励将变为只含有交易费,这样可以完全避免通货膨胀。

激励会有助于鼓励节点保持诚实。如果一个贪心的攻击者有能力聚集比所有诚实节点更多的 CPU 算力,他将面临是以骗回已付款的方式欺诈别人还是使用这些算力生成新货币的抉择。他将发现遵守规则比破坏系统和他自己财产的有效性更有利,因为这些规则准许他获得比所有其他人都多的新货币。

解析

1、为什么要有激励?

有很多好处:

  • 让节点有欲望去计算工作量证明来增长链。计算是要消耗CPU和电力的,如果没有奖励,谁也不会干,那比特币网络就废了,没有新区块生成意味着没有交易被确认,不能流通的货币和垃圾数据没区别。
  • 实现了发放货币的功能。工作量证明就是一份“银行投资基建”的工作,在经济体初期起着“发放货币”的功能,首先得有货币流出去,才能最后作为等价交换物在民间流通。

2、激励有哪些形式?

(1)生成新区块,则发放奖励。在比特币的实现中,实际上是“最开始发放50个,后面每4年减半,直至0”,这样可以控制发放的总量,避免了通货膨胀。

实际上这里还有个隐藏问题,由于比特币发放的总量有限,不会像银行一样“发多了停止,发少了多发”地动态调整,当某些已经拿到比特币的人,他硬盘坏了、数据丢了、人去世了,这个币就丢了,最后总量越来越少,甚至都不够人们用来等价交换了,就会产生通货紧缩(生产的商品太多,货币抢手供不应求)。不过对于比特币完全不用担心,因为比特币区别于纸币的一点是,“最小单位”可以被无限细分,也就是小数点后可以接很多位。此时,市场的商品过多,物品会互相竞争降价,1个比特币降价到0.5个比特币,虽然货币总量不变,但以前1个比特币的流通变为了2个0.5个比特币的流通,同样完成了货币作为“等价交换物”的功能。简直是动态调节小能手,而且不是人工干预的。

(2)交易产生的交易费。在货币总量发放达到预期之后,为了能继续激励这些节点去完成“工作量证明”,通过收取交易费来执行激励。

3、网上说的矿工是什么?

就是这些为了得到比特币激励的,去计算“工作量证明”的数学难题的机器。

4、攻击者选择“骗回自己付款”还是“生成新货币”?

前面已经提到过,由于比特币是历史交易累计,攻击者没法偷取别人的余额,只能让自己执行“双重支付”,空手套白狼来骗商家的货物。商家被骗多了,肯定就不支持比特币付款了。那这种收益还不如自己挖块赚取激励呢,如果挖块,所做的事情和诚实节点做的事情并没有区别。当然他还可以做一些破坏比特币的动作,比如拒绝其他的交易,消耗那么多CPU和电力就为了破坏比特币的交易,对他没有任何好处。

九、回收磁盘空间

原文

Reclaiming Disk Space

Once the latest transaction in a coin is buried under enough blocks, the spent transactions before it can be discarded to save disk space. To facilitate this without breaking the block’s hash, transactions are hashed in a Merkle Tree [7][2][5], with only the root included in the block’s hash. Old blocks can then be compacted by stubbing off branches of the tree. The interior hashes do not need to be stored.

reclaiming_disk_space.jpg

A block header with no transactions would be about 80 bytes. If we suppose blocks are generated every 10 minutes, 80 bytes * 6 * 24 * 365 = 4.2MB per year. With computer systems typically selling with 2GB of RAM as of 2008, and Moore’s Law predicting current growth of 1.2GB per year, storage should not be a problem even if the block headers must be kept in memory.

翻译

回收磁盘空间

一旦某个货币的最新交易已经被足够多的区块覆盖,这之前的支付交易就可以被丢弃以节省磁盘空间。为便于此而又不破坏区块的哈希值,交易将被哈希进默克尔树 [7][2][5],只
有根节点被纳入到区块的哈希值。老的区块可通过剪除树枝的方式被压缩。树枝内部的哈希不需要被保存。

reclaiming_disk_space_cn.jpg

每个不包含交易的区块头大约是 80 bytes。如果每 10 分钟生成一个区块,每年生成 80 bytes * 6 * 24 * 365 = 4.2 MB,2008 年在售的典型计算机有 2 GB 内存,并且摩尔定律预测目前每年内存增加 1.2 GB,所以就算区块头一定要存在内存里,存储也不是问题。

解析

1、最新交易已经被足够多的区块覆盖

(1)二叉默克尔树是从底向上计算的,两个子节点哈希,得到父节点的哈希值,直至根节点。
(2)覆盖指的是,后面链接了新的区块。所以只要足够多,基本不可能再因为“最长链”切换而被丢弃了。

2、交易将被哈希进默克尔树,只有根节点被纳入到区块的哈希值

hash_transactions.jpg

对比之前的设计,这里增加了一颗默克尔树,并且分出了一个称作“区块头”的元信息。
默克尔树的作用有2个:
(1)验证交易入链。对于刚确认不久的交易,可能商家需要做验证,证明交易已经入链,此时只需要查询到默克尔树,把交易放入默克尔树中验证哈希值即可,而不需要自己运行一个比特币网络节点。
(2)根节点作为交易哈希值。在货币转移时,本来是需要对“上一个哈希值、找到的随机数、区块内的所有交易”执行哈希的,现在默克尔树的根节点已经相当于对区块内所有交易执行了哈希,所以只需要“区块头”中的“上一个哈希值、找到的随机数、默克尔树根节点”执行哈希,就可以作为区块的哈希了。

十、简单支付验证(SPV)

原文

Simplified Payment Verification

It is possible to verify payments without running a full network node. A user only needs to keep a copy of the block headers of the longest proof-of-work chain, which he can get by querying network nodes until he’s convinced he has the longest chain, and obtain the Merkle branch linking the transaction to the block it’s timestamped in. He can’t check the transaction for himself, but by linking it to a place in the chain, he can see that a network node has accepted it, and blocks added after it further confirm the network has accepted it.

simplified_payment_verification.jpg

As such, the verification is reliable as long as honest nodes control the network, but is more vulnerable if the network is overpowered by an attacker. While network nodes can verify transactions for themselves, the simplified method can be fooled by an attacker’s fabricated transactions for as long as the attacker can continue to overpower the network. One strategy to protect against this would be to accept alerts from network nodes when they detect an invalid block, prompting the user’s software to download the full block and alerted transactions to confirm the inconsistency. Businesses that receive frequent payments will probably still want to run their own nodes for more independent security and quicker verification.

翻译

简单支付验证

不运行一个完整的网络节点也是可以进行支付验证的。用户只需拥有一个最长工作量证明链的区块头副本,他可以通过向其他网络节点查询以确认他拥有了最长的链,并获取链接交易到给交易打时间戳区块的默克尔分支。虽然他自己不能核实这个交易,但如果交易已经链接到到链中的某个位置,就说明一个网络节点已经接受了此交易,而其后追加的区块进一步确认网络已经接受了它。

simplified_payment_verification_cn.jpg

同样地,只要诚实节点控制着网络这种简化验证就是可靠的,如果网络被攻击者控制简化验证会变得比较脆弱。虽然网络节点可以验证他们自己的交易,但只要攻击者持续控制网络那么这种简化的方法就可能被攻击者的伪造交易欺骗。一种对策是接受其他网络节点发现一个无效区块时发出的警告,提醒用户软件下载整个区块和被警告的交易来检查一致性。为了更加独立的安全性以及更快的支付确认,收款频繁的公司可能仍需运行他们自己的节点。

解析

1、什么情况需要SPV?

用户不想或不能创建一个比特币节点接入比特币网络,但是又想验证这笔交易有没有充分入链(防止切链导致欺诈),就可以使用SPV。

2、SPV后面说的攻击是什么意思?

用户如果自己不接入比特币网络,为了获取“最长链的区块头副本”,需要找比特币节点查询,而如果查询的节点都是欺诈节点,可以返回一些构造的假信息,让你误以为已经入链了。所以作者建议多查几个不同节点,或者下载整个区块的完整信息,如果有条件,自己公司维护一些安全节点。

十一、合并和分割交易额

原文

Combining and Splitting Value

Although it would be possible to handle coins individually, it would be unwieldy to make a separate transaction for every cent in a transfer. To allow value to be split and combined, transactions contain multiple inputs and outputs. Normally there will be either a single input from a larger previous transaction or multiple inputs combining smaller amounts, and at most two outputs: one for the payment, and one returning the change, if any, back to the sender.

combining_and_splitting_value.jpg

It should be noted that fan-out, where a transaction depends on several transactions, and those transactions depend on many more, is not a problem here. There is never the need to extract a complete standalone copy of a transaction’s history.

翻译

合并和分割交易额

尽管单独处理每个货币是可行的,但将一次转账按每一分拆成多次交易是笨拙的。为允许交易额被分割和合并,交易将包含多个输入值和输出值。通常是一个从之前交易而得的较大输入值或多个较小输入值的组合,以及最多两个输出值:一个作为支付,另一个作为找零,如果有的话,退还给支付发送方。

combining_and_splitting_value_cn.jpg

注意这里的扇出,即一笔交易依赖数笔交易,这数笔交易又依赖更多的交易,在这里是不存在问题的。永远不会需要获取一笔交易历史的完整独立副本。

解析

举个实际的例子来解释。A收到B的3个比特币,又收到了C的7个比特币,一共拿到10个。此时要购买一个5个比特币的商品,当然可以1个1个地交易给商家,但这会产生大量的交易。更好的方式是,把3个比特币和7个比特币作为输入,然后把5个比特币给商家,另外5个比特币返回给自己(相当于支付给自己),完成这1笔交易。

所以这里,作者构造了“交易额”的概念,输入可以是1个较大的数值,是多笔较小数值的组合,输出只允许2个,一个支付给商家,一个作为找零支付给自己。A可能从很多地方通过交易得到了很多小额的比特币,A交易的对象可能又从很多地方拿到的比特币,要想从头完整梳理交易是很困难的,好在这里并不需要关心历史交易,只关心这次交易的“交易额”,历史交易被隐藏了起来。

十二、隐私

原文

Privacy

The traditional banking model achieves a level of privacy by limiting access to information to the parties involved and the trusted third party. The necessity to announce all transactions publicly precludes this method, but privacy can still be maintained by breaking the flow of information in another place: by keeping public keys anonymous. The public can see that someone is sending an amount to someone else, but without information linking the transaction to anyone. This is similar to the level of information released by stock exchanges, where the time and size of individual trades, the “tape”, is made public, but without telling who the parties were.

privacy.jpg

As an additional firewall, a new key pair should be used for each transaction to keep them from being linked to a common owner. Some linking is still unavoidable with multi-input transactions, which necessarily reveal that their inputs were owned by the same owner. The risk is that if the owner of a key is revealed, linking could reveal other transactions that belonged to the same owner.

翻译

隐私

传统的银行模型通过限制参与方和可信任第三方对信息的访问来达到一定级别的隐私。交易必须要公开发布就不能使用这个方法,但隐私仍可在其他地方通过阻断信息流的方式来保护:那就是保持公钥匿名。公众能看到有人正在发送一定量货币给其他人,但是不能将交易关联到某个人。这和证券交易所发布的信息级别类似,每笔交易的时间和交易量,即行情是公开的,但是不会显示交易双方是谁。

privacy_cn.jpg

作为额外的防火墙,对每笔交易使用新密钥对可以防止他们被关联到一个共同的拥有者。由于多输入值交易存在,有些关联仍不可避免,因为多输入值交易必然暴露其多个输入是属于同一个拥有者的。风险就在于如果一个密钥的拥有者被暴露,关联性将暴露其他属于同一个拥有者的交易。

解析

公钥作为“银行卡号”,私钥作为“银行卡密码”,任何人都能自己创建,不需要提供个人信息给类似“银行”的机构审批,因此是匿名的,公钥不会关联到个体。但由于交易可以有多个输入,如果一旦其中某个交易者信息被泄漏,其他交易者都有在现实生活中可能被推断出来。

总体而言,比银行卡隐私性高多了,好处是个人信息得到完美保护,坏处是洗钱、盗骗也更方便了。就好像如果抢劫的时候,抢劫的是支付宝,可以很容易根据收款账户抓到,但如果抢劫的是纸质货币,由于纸质货币也有类似的匿名性,除非抢劫的是银行的连号纸币,否则就很难抓。

十三、计算

原文

Calculations

We consider the scenario of an attacker trying to generate an alternate chain faster than the honest chain. Even if this is accomplished, it does not throw the system open to arbitrary changes, such as creating value out of thin air or taking money that never belonged to the attacker. Nodes are not going to accept an invalid transaction as payment, and honest nodes will never accept a block containing them. An attacker can only try to change one of his own transactions to take back money he recently spent.

The race between the honest chain and an attacker chain can be characterized as a Binomial Random Walk. The success event is the honest chain being extended by one block, increasing its lead by +1, and the failure event is the attacker’s chain being extended by one block, reducing the gap by -1.

The probability of an attacker catching up from a given deficit is analogous to a Gambler’s Ruin problem. Suppose a gambler with unlimited credit starts at a deficit and plays potentially an infinite number of trials to try to reach breakeven. We can calculate the probability he ever reaches breakeven, or that an attacker ever catches up with the honest chain, as follows [8]:

p = probability an honest node finds the next block
q = probability the attacker finds the next block
\(q_z\) = probability the attacker will ever catch up from z blocks behind

$$ q_z=\begin{cases} 1&\text{if } p\leq q\\ (q/p)^z&\text{if } p>q \end{cases} $$

Given our assumption that p > q, the probability drops exponentially as the number of blocks the attacker has to catch up with increases. With the odds against him, if he doesn't make a lucky lunge forward early on, his chances become vanishingly small as he falls further behind.

We now consider how long the recipient of a new transaction needs to wait before being sufficiently certain the sender can’t change the transaction. We assume the sender is an attacker who wants to make the recipient believe he paid him for a while, then switch it to pay back to himself after some time has passed. The receiver will be alerted when that happens, but the sender hopes it will be too late.

The receiver generates a new key pair and gives the public key to the sender shortly before signing. This prevents the sender from preparing a chain of blocks ahead of time by working on it continuously until he is lucky enough to get far enough ahead, then executing the transaction at
that moment. Once the transaction is sent, the dishonest sender starts working in secret on a parallel chain containing an alternate version of his transaction.

The recipient waits until the transaction has been added to a block and z blocks have been linked after it. He doesn’t know the exact amount of progress the attacker has made, but assuming the honest blocks took the average expected time per block, the attacker’s potential progress will be a Poisson distribution with expected value:

$$ \lambda=z\dfrac{q}{p} $$

To get the probability the attacker could still catch up now, we multiply the Poisson density for each amount of progress he could have made by the probability he could catch up from that point:

$$ \sum_{k=0}^{\infty} \dfrac{\lambda^k e^{-\lambda}}{k!} \begin{Bmatrix} (q/p)^{(z-k)}&\text{if } k\leq z\\ 1&\text{if } k\leq z \end{Bmatrix} $$

Rearranging to avoid summing the infinite tail of the distribution...

$$ 1-\sum_{k=0}^{z} \dfrac{\lambda^k e^{-\lambda}}{k!}(1-(q/p)^{(z-k)}) $$

Converting to C code...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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;
}
Running some results, we can see the probability drop off exponentially with z.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
Solving for P less than 0.1%...
1
2
3
4
5
6
7
8
9
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

翻译

计算

我们考虑一个攻击者试图生成一条比诚实链更快的替代链的情况。即使这个目标达到了,也不会使系统变得可以任意修改,比如凭空创建货币或拿走不属于他的钱。节点将不会接受无效的交易作为支付,而且诚实节点永远不会接受一个包含无效交易的区块。攻击者只可能改变他自己的某笔交易来拿回他不久前已经支出的钱。

诚实链与攻击者链之间的竞争可描述为二项随机漫步。成功事件是诚实节点被延长一个区块,两条链的差距加 1,失败事件是攻击者的链延长一个区块,两条链的差距减 1。

攻击者从某一落后位置赶上诚实链的概率类似于赌徒破产理论。设想一个拥有无限信用的赌徒从一定亏损开始,进行可能无限次的赌博试图达到盈亏平衡。我们可以计算他达到盈亏平衡,即一个攻击者赶上诚实链的概率,如下 [8]:

p = 诚实节点找到下一个区块的概率
q = 攻击者找到下一个区块的概率
\(q_z\) = 攻击者从落后 z 个区块赶上诚实链的概率

$$ q_z=\begin{cases} 1&\text{if } p\leq q\\ (q/p)^z&\text{if } p>q \end{cases} $$

我们假设 p > q,概率将随着攻击者需要赶上的区块数增加而呈指数下降。 由于形势对他不利,如果他没有在早期幸运地快速赶上,他落得越远赶上的机会就越渺茫。

我们现在考虑一个新交易的收款人要等多久才能确保付款人不能再改变这个交易。我们假设付款人是想让收款人相信他暂时已经付款,然后在一段时间后改变成支付回他自己。这时收款人会收到警告,但付款人希望警告已为时已晚。

收款人生成一个新密钥对并将公钥给付款人,这样付款人就无法提前对交易签名。这能防止付款人通过持续工作直到他足够幸运获得大幅领先的方式预先准备一条区块链,然后执行交易。一旦交易被发出,不诚实的付款人就开始秘密地在一条包含了他的替换版交易的平行链上工作。

收款人等到交易被加到区块中且其后追加了 z 个区块。他不知道攻击者确切的进度,但是假设诚实的区块按期望的平均时间生成,攻击者可能的进度将是一个泊松分布,其期望值为:

$$ \lambda=z\dfrac{q}{p} $$

为计算攻击者现在仍然能赶上的概率,我们给每个他可能达到的进度的泊松密度乘以他在那个进度能赶上诚实链的概率:

$$ \sum_{k=0}^{\infty} \dfrac{\lambda^k e^{-\lambda}}{k!} \begin{Bmatrix} (q/p)^{(z-k)}&\text{if } k\leq z\\ 1&\text{if } k\leq z \end{Bmatrix} $$

变换以避免对分布的无限尾部求和…

$$ 1-\sum_{k=0}^{z} \dfrac{\lambda^k e^{-\lambda}}{k!}(1-(q/p)^{(z-k)}) $$

转换成 C 语言代码..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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 呈指数下降。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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% 的解…

1
2
3
4
5
6
7
8
9
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

解析

1、为什么是二项随机漫步?

这里定义的基础是“诚实链和攻击链的节点数量差距”,要么是诚实链增加,要么是攻击链增加,和丢硬币的正面和反面一样,所以是二项随机漫步。并且两者概率的总和为1

2、赌徒破产

赌徒破产,简单说就是:

  • 如果赢的概率总是大于等于另一方(赌徒作弊),那么最终一定会把对方赢光。
  • 如果赢的概率小于另一方(赌徒对庄家),只要落后一次,后面能追赶上的概率难度呈指数倍增加
    在比特币这里,就是:
  • 如果攻击者掌握50%以上算力,那么最终一定会赶上并超过诚实链
  • 如果攻击者只掌握小于50%的算力,区块落后越多,难度指数倍增加

3、为什么是泊松分布

我们目前已经知道p=1-q,并且知道计算追上概率的赌徒破产公式,但并不知道p或者q的分布是怎样的,无法代入计算。

攻击者的进度应该符合泊松分布,理由是满足泊松分布的3个条件:
(1)事件都是独立发生的。
(2)事件发生的频率是稳定的。
(3)事件发生的概率是很小的,足够小的时间段内,事件发生的概率接近0。

先举个泊松分布例子:某商品每天出售3件,那么出售商品的概率就是一个泊松分布:
(1)出售事件通常是独立的,A购买或者B购买并没有关联。(不要去想A和B这种极端事件,考虑通常的情况)
(2)出售的频率是稳定的,平均每天3件。(不要去想大促折扣,考虑通常的情况)
(3)出售发生的概率是很小的。在足够小的时间段内,售出商品的概率是接近0的。
到商店的顾客数、一次足球赛的进球数、某医院婴儿的出生数、机器故障的概率,都是小概率、独立、稳定频率的事件,都符合泊松分布。

回到比特币,作者说“攻击者的进度应该符合泊松分布”,这里的事件就是“攻击者计算出下个块”,那么:
(1)攻击者计算每个块的随机数,都是独立事件,前后之间没有规律,只能暴力遍历。
(2)作者假设了“诚实的区块按期望的平均时间生成”,也就是前面所说的通过调整要求的哈希值的前缀0的个数,动态调节生成下个块难度,所以发生的频率是稳定的。
(3)攻击者先计算出下个块的概率是很小的,因为作者假设了p>q,攻击者掌握的算力是小于50%的。

所以,攻击者的进度应该符合泊松分布,我们能用泊松分布来代入公式计算了。作者在最后求解出,如果要让攻击者攻击成功的概率小于0.1,那么:

  • 当攻击者先找到下个块的概率为P=0.1时,至少需要攻击者落后z=5个区块
  • 当攻击者先找到下个块的概率为P=0.15时,至少需要攻击者落后z=8个区块

这也是为什么在实践中,确认交易成功的标准是,在自己交易所在区块后面,又链上了6个区块。6个区块之后,被攻击导致切链,从而导致交易失效的概率就很低很低了。

十四、总结

原文

Conclusion

We have proposed a system for electronic transactions without relying on trust. We started with the usual framework of coins made from digital signatures, which provides strong control of ownership, but is incomplete without a way to prevent double-spending. To solve this, we proposed a peer-to-peer network using proof-of-work to record a public history of transactions that quickly becomes computationally impractical for an attacker to change if honest nodes control a majority of CPU power. The network is robust in its unstructured simplicity. Nodes work all at once with little coordination. They do not need to be identified, since messages are not routed to any particular place and only need to be delivered on a best effort basis. Nodes can leave and rejoin the network at will, accepting the proof-of-work chain as proof of what happened while they were gone. They vote with their CPU power, expressing their acceptance of valid blocks by working on extending them and rejecting invalid blocks by refusing to work on them. Any needed rules and incentives can be enforced with this consensus mechanism.

翻译

总结

我们已经提出了一种不依赖信任的电子交易系统。我们从通用的数字签名货币体系开始,这体系提供了强有力的所有权控制,但由于缺乏防止双重支付的方法而不完善。为解决这个问题,我们提出一种使用工作量证明来记录公共交易历史的点对点网络,只要诚实节点控制了多数的 CPU 算力,对于对攻击者,交易历史将很快变得在计算上不可更改。网络因其结构简洁性而健壮。节点只需很少的协调就能同时工作。它们不需要被认证,因为信息不会被发送到某个特殊的位置,只需被尽力传播。节点可以随时离开和重新加入网络,只需接受最长的工作量证明链作为它们离开时发生事件的证据。节点使用 CPU 算力来投票,通过致力于延长有效区块来表达对其接受,通过拒绝在无效区块上工作来表达对其抵制。任何需要的规则和激励都可通过这个共识机制来加强。

解析

我们也来总结一下比特币。

亮点:
(1)达成共识在P2P网络是很难的,要求同时上线并投票,且根据IP投票容易被控制。比特币用了“计算一道数学难题”来用CPU投票,是个很厉害的设计。
(2)作者在数学上严谨地证明,在落后足够多区块后,攻击者攻击成功的概率是很低的,除非他掌握超过50%的CPU算力。而且即使掌握了也没有太大关系,攻击者做不了什么。
(3)比特币的匿名程度很高,任何人都可以生成公钥私钥加入比特币网络,而不需要提供个人身份信息。

缺点:
(1)虽然掌握50%CPU算力之后攻击者做不了什么,但由于攻击者从此开始可以作弊了,使得大家对比特币失去信任,从而重新转向其他等价交换物,比如黄金之类,让正常上班辛苦挣比特币的人存款归0。而且掌握50%CPU算力是很容易的,几大平台联合起来就可以做到。所以比特币的可靠程度并不比国家高,个人认为“比特币因为攻击而失去信任”甚至比“国家灭亡货币变废纸”的概率更高。
(2)保护个人信息的同时,也让洗钱、抢劫、骗取等犯罪行为难以受到约束。
(3)在发行之前,比特币创始人可以悄悄自己先多挖一些存着,然后再公开发行货币,创始人相当于不劳而获,其实是很不公平的。
(4)发行货币门槛太低,不需要创建一个国家,任何人都可以创建自己的比特币,只要有人接盘,有人相信你的故事,有人肯用真实的货物、商品、服务来交换你的这一串数字,这个就是货币。

最后来看一下真实的比特币区块长什么样子(我们甚至能找到第1个创世区块哦),图形化之后还是很炫酷的:https://www.blockchain.com/explorer/blocks/btc/770786

btc_block.png
btc_block_chain.jpg

比特币论文研读:论文原文分析

https://www.bananaoven.com/posts/32369/

作者

香蕉微波炉

发布于

2023-01-01

更新于

2023-01-01

许可协议