京东-优惠雷达
新人页面
精选商品
首月0月租体验,领12个月京东PLUS
自营热卖

《比特币:一种点对点电子现金系统》解读

冷月寒光 1年前   阅读数 340 0
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abcamus/article/details/83715004

摘要
为了去除现金系统对第三方金融机构的依赖(譬如银行),并且解决双花(double spending)的问题,引入了peer-to-peer network。在这样一个网络上,交易哈希被放入一个持续增长的链,这个链基于工作量证明生成,使得任何人不得篡改历史记录,除非再做一次工作量证明。最长的链不仅是发生的所有事件的见证,同时证明它来自于算力最强的节点。只要大部分的CPU算力是被善良节点(不会攻击网络)控制,这些节点就会不断的生成最长的链,并且抵制恶意的攻击。所有节点可以随时加入或者离开这个网络,只要接受最长的链这个事实不变的话。

一、引言

讲了基于第三方信用机构,不可避免的诈骗和篡改交易的情况。引入点对点分布式时间戳服务器,即blockchain,来防止双花。

二、交易

定义电子货币形式为一连串的数字签名。每一个货币拥有者对上一笔交易以及下一个货币拥有者进行hash签名,payee可以很容易的验证这笔交易是给自己的。
这样存在一个问题:怎么确定一笔交易没有被双花呢?即A即发了一笔给B,这笔钱同时也发给了C。只有公开所有的交易才能知道到底有没有double-spending,以及我们需要这样一个系统:所有参与者都认同唯一的历史记录,按照交易顺序排列。

三、时间戳服务器

构建基于block的链式结构,每个block的哈希基于上一个block的哈希和当前block中所有的item生成,这样的话,每一个block的哈希包含了之前所有的时间戳,每生成一个新的block,就是对之前所有时间戳的一次加强(保证唯一性)。

四、工作量证明

引入一种哈希算法,譬如SHA-256,带多个前导0,而且使得工作量随着前导0的数量呈现指数增长。把这样一种工作量证明的方法引入到前面的时间戳服务器中,只有当发现满足前导0数量时,block nonce值才会加一(证明当前block有效)。随着block的增长,如果要改变一个block,那就意味着要重新计算(碰撞)之后所有的block hash。

同时,工作量证明也解决了多数人表决的机制。假设一个IP一票,那么可以随意的伪造IP进行投票。Proof-of-work相当于一CPU一票。多数人的投票体现在了最长的chain当中。如果大多数的CPU是诚信节点的,那么最长的链将会是可靠的。

为了补偿硬件计算速度的增长,以及参与的节点数量的增加,block的难度会根据每小时生成block的数量进行调整,如果太快,难度就会增加。

五、网络

上述网络的运行方式如下:

新的交易被广播给所有节点。
每个节点收集新的交易进入一个block。
每个节点对各自的block做proof-of-work。
当一个节点证明了一个新的block,该block被广播给所有节点。
其他节点如果验证了新的block中的交易是有效并且没有出现过,那么接受新的block。
节点如果接受新的block,它将基于这个block(作为previous hash)继续生成新的block。
所有的节点都认当前最长的链,并且基于该链生成新的block。

如果两个节点同时广播了不同的block,一部分节点收到了第一个,而另外的收到了第二个,那么就形成了两条chain。在这种情况下,节点会保存晚收到的那个block,继续在先收到的block后面添加block。等到下一次PoW完成后,节点就会收到新的block,根据这个新的block就知道之前的哪个block位于最长的chain上面。在另一个branch上工作的节点就会重新切回到更长的chain上。值得一提的是:新的交易并不需要广播给所有的节点,只要它们到达足够多的节点,就会进入到新的block中。block的广播也不受消息丢失的影响。一旦一个节点没有成功收到block,当它收到下一个block的时候就知道自己已经错过了已有的block了。

六、激励

按照惯例,一个block中的第一笔交易创建了一个新的coin,用来奖励区块的创建者,相当于产生货币进行流通。同时,如果一笔交易的输入要比输出高的话,多余的部分作为交易费用支付给节点。在这种鼓励机制下,恶意节点与其消耗巨大的算力去破坏网络,不如做一些诚信的工作来的收益高。

七、对硬盘空间的利用

如果最新的一笔交易进入到了足够多的区块中,那么它之前的交易信息可以丢弃掉来节省硬盘空间。通过Merkle树来实现这种机制,同时保证区块的哈希值不变(交易位于叶子节点)。

在这里插入图片描述

如图所示,如果Tx0-2已经在新的block中了,那么可以减掉Tx0-2的哈希。右图因为还有一笔Tx3,Hash3要保留,同时也要保留Hash2来计算Hash23。

一个空的block header大约占80个字节,假设10分钟产生一个新的区块,每年就是80bytes624*365 = 4.2MB每年。现在计算机的内存容量,普遍在4GB,就算全部放进内存也是不成问题的。

八、简单的支付验证

如果要验证一笔交易的话,用户并不需要完整的运行一遍节点,而只需要拿到最长链中各block的header信息即可。通过往前追溯自己的交易信息即可确认是否被接受。对于交易频繁的商业机构,还是要运行自己的节点用来在网络被攻击(伪造了block)的情况下快速验证交易。

九、价值的组合和分割

一次交易可以有多个输入和两个输出,输入指明该次交易的金钱来源(之前的tx),一个输出指支付的钱,另一个输出则是找零。

十、隐私

网络上的交易只能看到公钥,并不能和具体的个体对应上(匿名机制),就跟股票市场只看到交易是一样的。

十一、计算

假设有一个攻击者,它尝试比诚信节点更快的生成chain。假设它要给自己赚钱,那么就要构造一笔合法的交易(需要交易发起方的签名),如果是非法的,其他节点并不会认同生成的block。一个攻击者能做的也仅仅是修改掉自己之前的交易,把钱给拿回来。

诚信链和攻击者之间的竞争可以用Binomial Random Walk(二叉树随机漫步)来描述。一次成功的事件表示诚信链条涨了一个block,使得两者差距加1;一次失败的事件表示攻击者的chain涨了一个block,使得两者差距减1。那么攻击者追上诚信链条的概率类比于赌徒破产问题(Gambler’s Ruin Problem)。假设一个赌徒拥有无限的信用,可以赌无数次来达到收支平衡。计算收支平衡的概率如下:

p = b l o c k p=诚信节点发现下一个block
q = b l o c k q = b l o c k q = b l o c k q=攻击者发现下一个block q = 攻击者发现下一个blockq=攻击者发现下一个block
q z = z b l o c k q_z = 攻击者在落后z个block的情况下追上的概率
q z = { 1 i f   p q z = ( q p ) z i f   p > q q_z = \begin{cases} 1 &if\ p\le q \\ z = (\frac{q}{p})^z &if\ p \gt q \end{cases}

假设 p > q p>q ,攻击者追上诚信链条的概率随着攻击者落后的block数量呈指数递减。除非攻击者在网络初期发动攻击,否则随着chain的不断增长,攻击成功的概率非常渺茫。

考虑一笔交易的接收者需要多久可以确认发起方无法篡改交易的问题。假设现在交易发起方是攻击者,它想要迷惑接收方一段时间,然后在把交易对象换成自己,来达到空手套白狼的目的。

在接收方收到正常交易后,攻击者立刻开始在一条平行的chain上工作,假设某个时刻,接收方已经发现有z个block跟在了正常交易的后面,那么攻击者还要赶上诚信链条的概率计算如下:

攻击者新生产的block数量服从泊松分布。

λ = z q p \lambda = z\frac{q}{p}

那么攻击者追上的概率为:

在这里插入图片描述

计算结果如下:

在这里插入图片描述

如果要使得攻击者追上的概率小于0.1%

在这里插入图片描述

十二、结论

就是非常简洁明了的解决了双重支付的问题,网络结构简单,而且节点可以随之离开或者加入。这个框架包含了一个P2P电子货币系统所需要的所有规则和激励措施。

阅读更多
(function(){ function setArticleH(btnReadmore,posi){ var winH = $(window).height(); var articleBox = $("div.article_content"); var artH = articleBox.height(); if(artH > winH*posi){ articleBox.css({ 'height':winH*posi+'px', 'overflow':'hidden' }) btnReadmore.click(function(){ if(typeof window.localStorage === "object" && typeof window.csdn.anonymousUserLimit === "object"){ if(!window.csdn.anonymousUserLimit.judgment()){ window.csdn.anonymousUserLimit.Jumplogin(); return false; }else if(!currentUserName){ window.csdn.anonymousUserLimit.updata(); } } articleBox.removeAttr("style"); $(this).parent().remove(); }) }else{ btnReadmore.parent().remove(); } } var btnReadmore = $("#btn-readmore"); if(btnReadmore.length>0){ if(currentUserName){ setArticleH(btnReadmore,3); }else{ setArticleH(btnReadmore,1.2); } } })()
注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: