Fork me on GitHub

比特币论文2

之前假期里已经写过这篇论文,那是搬的csdn上的大佬,这里是自己的再译。

 

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

 

摘要:一个纯点对点的电子货币使得网络支付直接从一方传到另一方,而无需经过第三方的财政机构。数字签名解决了部分问题,但是如果仍需要一个可信的第三方来防止双花,那么其主要意义就消失了。我们提出一个点对点网络来解决双花问题。该网络为交易添加时间戳,以对交易取哈希值并将其放进一个基于哈希值的工作量证明的链中。最长链不仅证明了一系列事件的见证,还证明该链来自最大的cpu算力池。只要大部分cpu算力不被恶意攻击网络的人控制,那么正常算力就会产生最长链并且其速度远超小部分攻击者。该网络本身需要最小结构。交易信息尽力传播(?)用户节点可以任意加入或离开网络,接收最长的工作量证明链以确保他们离开网络期间发生的事是真实的。

 

一、介绍

网上交易大部分仅仅依赖财政机构作为受信第三方来处理电子支付。尽管这个第三方加入的系统对大部分交易很友好,它仍然存在基于信任模型的内在缺点。完全不可逆的交易是不可能的,因为财政机构不能避免调解争吵,调解的费用增加了交易花费,限制了最小的实际交易金额并且消除了小额交易的可能性,并且在没有能力为不可逆服务提供不可逆支付方面将会有更大成本。由于交易可逆转,商家和用户更加重视信用。商家必须警惕顾客,麻烦他们填写更多其他方面的信息。一些骗子在所难免,这些支付不确定性用现金即可避免,但是没有一个部门实现了不经过受信第三方的支付渠道。

我们需要的是一个基于密码证明而不仅仅是信任的电子支付系统,它将使得互信的双方直接交易而无需受信第三方。交易是算力不可逆转的,可以保护商家避免骗子,常规的托管商家能轻易实现保护卖家。在这篇论文,我们提出了一个使用点对点分布式时间戳服务器来产生按时间排序的交易的算力证明来解决双花问题。这个系统是安全的,只要诚实的节点比集体攻击者控制更多的算力。

 

 二、交易

我们定义一种电子货币作为数字签名链。每个用户将货币转给另一方,通过数字签名前一个交易的哈希值和下一个所有者的公钥,把他们写入该币的末尾。收款方验证签名来验证链的所有权。

 

 这个过程有个问题,收款人不能验证是否存在某个用户双花该币。通常的解决方法是引入一个受信的中央机构或铸币厂来检查每个交易是否存在双花。每次交易后,该币会被送到铸币厂然后 发行一个新币,只有铸币厂发行的币才是受信的不会双花。这个解决方案的问题依然是整个货币系统依靠企业来运营铸币厂,每笔交易仍需通过他们,就像银行一样。

我们需要一种方法来让收款人知道付款方是否将该币用于先前的交易(即是否双花)。因此,最早的交易是算数的,我们不在乎之后是否双花。确认交易是否存在的唯一方式是检查所有的交易。在铸币厂模型里,铸币厂检查所有的交易然后判断谁先发起。为了在没有第三方的前提下实现它,交易必须公开,我们需要一个系统让参与者就他们收到的交易历史达成共识。收款方需要证明在每个交易的时间点,大部分节点都同意自己是真正的收款人。

 

三、时间戳服务器

我们提出的解决方案由时间戳服务器开始。它对每一个区块取哈希值然后广播,例如报纸和Usenet帖子?时间戳证明在取得哈希值时区块的存在的。每个时间戳都包含前一个时间戳的哈希值,组成一条链,它增强了前一个时间戳。

 

 四、工作量证明(PoW)

为了在点对点基础上实现分布式时间戳,需要使用类似Adam Back的Hashcash的工作量证明机制,而不是报纸或Unsent。工作量证明寻找一个值,当其取哈希后,例如用SHA-256,哈希值以零开头。这个寻找的过程的平均工作量是该值位数的指数次方,而验证该值仅需执行一次哈希计算。

对于时间戳网络来说,我们实现工作量证明机制:通过递增一个随机值并对区块取哈希,直到获得满足要求的零位数。一旦CPU全力工作来使其满足PoW,在不重算的情况下无法改变区块(如果区块内交易发生变化,需要重新计算哈希值)。如果有其他的区块链在该区块后面,在改变该区块的同时需再次计算后面的区块。

 

 PoW同时解决了在多数决策问题中代表代表的问题(即尽量满足一人一票)。如果主体基于一个IP一票的话,那些有办法获得多个IP的人将破坏规则。PoW是一个CPU一票,主体决定自最长链,被投入了最多的PoW。如果大多数CPU算力被诚实节点控制,该链将长得最快且超过所有的竞争链。如果要修改一个以往的区块,攻击者需要重做PoW,包括该区块以及其后的所有区块,然后要赶上并超过诚实链才能完成区块的修改。稍后我们验证一个攻击者赶上诚实链的概率会呈指数级减小,随着增加后面的区块。

为了弥补硬件提升以及随时间运行节点的利益分化,PoW难度将会根据一个变化的平均值二改变,每小时出块数。如果出块速度太快,PoW难度将会提升。(根据全网算力调整PoW难度)

 

五、网络

运行网络的步骤如下:

1、新交易广播至所有节点

2、每个节点收集交易至一个区块

3、每个节点为区块计算PoW

4、如果一个节点找到PoW,将其广播至所有节点

5、所有节点接收区块,仅当该区块内的所有节点有效且不存在双花

6、节点如果承认这个区块有效,就会用该区块的哈希值计算该链的下一个区块

节点默认最长链为合法链并继续计算来扩展它。如果两个节点同时广播合法的下一个区块(不同版本的区块),不同节点先接收到的区块可能不同。在这种情况下,节点计算先接收到的区块,并保留另一个区块以防其成为最长链。这个平衡将被打破当下一个PoW被找到且一条分支变得更长,那些计算另一条分支的节点将转而计算长链。

新交易不必广播至每个节点。只要其被大多数节点接收,不久该交易就会被写进区块。区块广播容忍丢失信息。如果节点漏接收一个区块,该节点会重新请求当其接收下一个区块并意识到丢失时。

 

6、激励

根据惯例,区块中的第一个交易一般是出块奖励,会转给矿工。这样才会让矿工有挖矿的动力。这也是发行货币的方式,因为没有中央机构来发行。固定增加一些新币类似矿工消耗资源来挖到黄金并将其投入市场进行流通。区块链中该资源指花费的CPU和电力。

交易费也可用作激励。如果交易的输出金额小于输入,差值将作为交易费被添加至包含该交易的区块的激励中。一旦预定数量的币进入流通,激励可以完全转移至交易费且不会发生通货膨胀。

该激励可以鼓励节点保持诚实。如果攻击者收集的CPU算力超过诚实节点,他有两种“偷钱手段”:1、诈取他人将已经花出去的钱偷回(攻击者首先发出合法交易,获得交换物后,通过攻击区块链使得该交易所在链无效);2、产生新币(使得原先的出块奖励作废)。根据规则将会更有利可图,他获得新币将会比其他人联合起来还要多,而不会破坏系统和自己的财富。

 

7、取回磁盘空间

 一旦新交易被放入链中,在经过足够多的区块后,之前的交易可以删去来节省磁盘空间。为了在不破坏区块的哈希情况下实现,需要将交易取哈希存放在默克尔树中,只将树的根哈希存放在区块中。老区快可以通过删除树的分支来压缩空间。内部的哈希值并不需要存储。

 

 

 

 一个无交易的区块头大约是80字节。假设每10分钟出一个区块,80 * 6 * 24 * 365 = 4.2 MB  / 年 。08年计算机一般是2GB内存,根据摩尔定律以1.2GB的增速,就算区块头全放到内存里也不会有问题。

 

8、简易支付验证

不需要全部网络节点就可以验证支付。用户仅需保留最长PoW链的区块头副本,可以请求全网节点直到确认自己收到最长链,得到有用户交易的默克尔分支的区块。用户不能自行验证交易,可以将其放入链中,如果其他节点接收它并在其区块后面添加新区块,则默认该交易已被全网节点所接受。

 

 因此,只要诚实节点控制网络,这个验证机制就是可靠的。相反若被攻击者控制就显得不可靠。因为网络节点可以自己验证交易,如果攻击者持续控制网络,他捏造的交易就会使得验证机制毫无用处。一个抵制这种情况的方法是,当节点检测到无效区块时会收到警告,题型用户软件下载全区块和被警告交易来验证不一致。收款频繁的企业仍会运行自己的节点为了确保独立和安全以及快速验证。

 

9、合并和分割币值

尽管可以单独处理币,但每分比特币都要分开交易会显得很麻烦。为了使币值合并或分割,交易可以包含多个输入和输出。通常情况下,输入一般有两种,一是前一个交易的大额输入,二是多个小额输入之和;而输出至多两个,收款方和用于找零的己方地址(如果不重新转给自己的话,会导致输入大于输出的部分全都作为交易费转给矿工)。

要知道每笔交易都依赖于前几次交易,而其又依赖于之前,这并不是问题。没必要找出所有的交易历史。

 

10、隐私

 传统的银行模型通过限制接触第三方获得信息来保护隐私。区块链中必须公开所有交易信息,因此这种方法显然不可行,但可以用另一种阻断信息流通的方式来保护隐私,使公钥匿名。用户与他人作交易是公开的,但是无法确定该用户的具体身份。这类似于证券交易,个人交易的时间和规模都是公开的,但无法得知具体身份。

 

 

 作为附加的防火墙,不同的交易应使用不同的密钥(即更换钱包地址),防止被发现是同一个用户。但有一些多重输入的交易仍无法避免身份被揭露,那些输入的地址很可能是同一个用户。该风险即当一个地址指向具体用户时,其余附加地址也被牵连指向该用户。

 

11、计算

我们考虑该场景,攻击者试图产生一条链超过最长链。即使他确实做到了,也不会使系统随意改变,例如凭空创造新币或是从别人那里偷钱。节点不会接收无效的支付交易,而且诚实节点也不会接受。攻击者只能将自己最近花出去的钱拿回来(即在原来该笔交易的区块前产生分叉,使得该区块作废)。

诚实链和攻击链之间的竞赛可以描述为二项随机过程。成功事件是诚实链延长一区块,领先加一;失败事件是攻击链延长一区块,差距减一。

攻击者追上差距的可能几乎不可能(是十赌九输的问题)。假设有无限信用的赌徒从赤字开始无限尝试弥补损失。可以计算该可能性,即攻击者追上诚实链的概率如下:

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指数级下降:

 

(攻击者出块概率为0.3时(掌握全网30%算力?),在落后50个区块时,追上的概率是0.0000006)。

 

 当概率小于0.1%时:

 

 

( 若要使攻击者回滚的概率小于0.1%,当其出块概率为0.45时,需等待交易后已添加340个区块)。

 

12、总结

我们提出了一个不需要受信方的电子交易系统。从以数字签名为基础的货币常用框架开始,为币的所有权提供了保证,但是不能解决双花问题。因此我们提供了使用PoW来记录交易历史的点对点网络,如果诚实节点掌握大部分算力的话,攻击者要改变交易历史是不切实际的。该网络强健之处在于它非结构化的简洁性。节点仅需极少量沟通也能协同工作,也不需要实名制,因为信息无需传送到特定的地方,只需尽力广播而已。节点可以随意加入离开网络,接受PoW链上的内容。以CPU算力投票,接受有效区块并在其后挖矿,拒绝无效区块并舍弃该分支。任何所需规则和激励都可以用共识机制来实施。

 

posted @ 2020-12-06 09:12  Faded828x  阅读(234)  评论(0编辑  收藏  举报