美文网首页
【漫游区块链】比特币白皮书阅读笔记

【漫游区块链】比特币白皮书阅读笔记

作者: 圣巢小骑士 | 来源:发表于2020-01-20 00:10 被阅读0次

    author: Satoshi Nakamoto
    本文是基于阅读论文《Bitcoin: A Peer-to-Peer Electronic Cash System》的笔记,糅合了部分个人的理解,同时参考了网上对这篇论文的中文翻译。如有错漏,敬请指正。

    摘要

    解决什么问题? 目前的金融交易需要一个可信的第三方做交易信用的背书,而这个第三方的存在会导致交易成本升高。

    怎么解决? 构建一个peer-to-peer的网络。这个网络会把交易传到一个存在的链中,通过工作量证明机制(proof-of-work),在链上形成一个交易记录。这个交易记录无法被篡改。

    为什么能解决? 交易记录来自于一个很大的CPU计算池,而这个计算池的CPU拥有者很难进行合谋,因此可以防止篡改或者被入侵。

    简介

    现在的电子交易机制存在一些弱点。

    • 现在的网络交易是基于第三方金融机构的交易
    • 不可能存在完全不可逆的交易,因为金融机构经常需要处理交易纠纷
    • 处理交易纠纷的时候会产生交易费用,因此不适合小额、频繁的交易
    • 而且由于不存在不可逆的交易(即,交易可能可逆),交易会对信用的要求比较高。由此会产生收集对方信用信息的成本。

    所以,现在需要的电子交易系统,应该是一个建立在证据而非信任之上的系统。让交易在不需要第三方机构的前提下完成。

    交易过程

    数字签名链(Digital Signature Chain)

    假设A 和 B 要进行交易,A要把比特币传递给B。

    A先用B的公钥(Public Key)对之前的交易数据块进行散列(Hash),然后用自己的私钥(Private Key)进行签名,于是B得到了比特币。作为证明,在比特币的交易数据块最后,加上了刚才所说的Hash数据以及A的签名。以此类推,B可以以同样的方法将coin转让给下一位。

    整个过程比较像支票的背书交易,不过加上了密码学的原理,不会让随便一个陌生人知道交易的具体内容。一个比特币的数据块就相当于之前背书转让的记录,然后当你要再次转让时,需要将B的名字写在背书上,然后签上自己A的名字,最后完成交易。

    数字签名链

    双重支付问题(double-spending problem)。

    什么叫双重支付?

    比如A有一个比特币,但是他和两个买家交易。如果记录比特币的文件是存在A的本地,那么A就可以把这个文件复制一下,然后分别给两个买家,那么就会出现“一个比特币但是同时交易了两次”的问题。

    区块链系统如何解决双重支付问题?

    “确保一项交易不存在的唯一方法是知道之前所有的交易”(The only way to confirm the absence of a transaction is to be aware of all transactions.)在比特币系统中,通过以下几点实现:

    • 不引入第三方机构
    • 所有交易公开发布
    • 需要所有参与者对交易顺序的单一历史共同认可

    也就是说,交易者需要取得全网多数节点的认可,认可其为当前时间最先收到款项的交易。

    时间戳服务器(TimeStamp Server)

    有很多的项目,这些项目被包含在一个区块(block)里面,这些区块是经过哈希加密的。时间戳服务器就是把这些哈希值戳上时间戳(timestamp),然后在网络上向全体发布。

    如果时间戳通过某个算法得到了这个哈希值,就能确认某个数据在某个时间点是存在的。而且,每一个时间戳都包含了上一个时间戳的哈希值,之后延续并增强这个哈希值。

    时间戳服务器

    工作量证明(Proof-of-Work)

    谁来代表大多数?

    由于区块链是一个去中心化的系统,有众多的参与者参与记录数据,如果使用“一人一票”(“一IP一票”,one-IP-address-one-vote)的方式,那么如果有人有能力获得众多IP,那么就可以垄断大多数票权,成为比特币系统的“中心”,那么会赋予这个“中心”过多权利(比如他可以承认一笔不存在的交易,等等),与比特币的“去中心化”思想背道而驰。

    前面讲过,比特币系统中的交易,需要得到全网多数节点的认可。那么,工作量证明,是为了解决“谁来代表大多数人”的问题。

    工作量证明的原理

    当数据被哈希加密后,哈希值的开头会是一个0字节的数字,而工作量会随着这个数字的增长而呈指数增长。

    在比特币的时间戳网络中,在每个区块中会有一个随机数。找到这个随机数会需要一定的工作量,因此我们把这个随机数叫做工作量证明。当网络中有节点找到了这个工作量证明,就会向全网广播,这时候这个区块就无法被更改了。(除非重做这个区块,同时由于所有的区块都是链接在一起的的,改变一个区块就相当于要改变后面的所有区块)

    工作量证明

    工作量证明如何解决问题?

    与之前提出的“一IP一票”不同的是,工作量证明实行的实际上是“一CPU一票”的制度。前面提到过,区块链网络中,下一个区块一定是接着上一个区块形成的,那么链条的长度就可以代表工作量的多少(工作量越多,形成的链条越长)。

    如果大多数的CPU算力都被诚实的节点控制(也就是说,如果大多数的算力并非被某个人垄断),那么这条诚实链就会增长的最快。如果想要在诚实链上修改某个数据,那么需要重做这个数据区块和之后所有区块的工作量。与此同时,在他重做之前数据的时候,这条诚实链还在继续增长,那么这个想要篡改数据的人还需要赶上并超过诚实链,成为最长的那个链,然后成为“大多数代表”,才能完成他这次篡改工作。这项工作明显是难以实现的,这就是为什么在区块链中没有人能够篡改数据。

    因此,区块链用最长的链条,也就是最大的工作量,来代表大多数决策。

    网络中的节点会认为最长的那条链是正确的,因此大家都会致力于延长这条最长的链(因为如果你自己新建了一条链,而大家不接受,又何必呢?)

    算力改变问题如何解决?由于随着时间推移,计算机的运算速度会越来越快,或者有更多的计算机算力会加入这个网络,如果一直不改变工作量要求,可能某一天区块的形成速度会太快。为了平衡每个时期的收益,工作量证明的难度会不断改变。区块生成的越快,找到下一个区块需要的工作量越大。

    网络

    区块链网络的运行步骤:

    1. 一场新的交易发生,并向所有的节点广播
    2. 每个节点收集到了这个交易,并记录在区块中
    3. 每个节点开始寻找这个节点的工作量证明
    4. 有一个节点找到了工作量证明,他就把区块向其他所有节点广播
    5. 节点检查这个区块,如果所有交易都是有效的,并且不是重复支付的,那么就接受这个区块
    6. 当区块被接受,那么所有的节点马上开始构建下一个区块。下一个区块会把这个已接受的区块当做新区块的上一个哈希值,代表接受了这个区块。

    (步骤4)如果同时找到了工作量证明怎么办? 如果有两个节点同时广播了两个不同的区块(假如他们同时发现了这个工作量证明),那么网络中的结点会基于他们最先收到的那个区块开始进行检查(步骤5),同时他们会保存另一个区块的数据。在这两个新的区块中,如果有一个先发现了工作量证明,那么这个区块所在的链将会变成最长的链,所有在较短链上工作的人都会转换到长链那边去。

    (步骤1)如果交易广播没被所有节点接收怎么办? 新交易的广播不需要被所有节点接收到,而只需要被大多数节点接收就可以进入区块。

    (步骤4)如果有节点没接收到区块广播怎么办? 如果有个节点没有接收到区块的广播,他就会一直请求,直到他接受到之后某一个区块的广播,此时他也可以知道他之前错过了几个区块。

    激励

    如何激励人加入区块链? 维护区块链是需要成本的——CPU的运算力和电力都是消耗品。为了激励人们贡献自己的电脑算力和电费,来维护区块链的网络,区块链将产生一种“币”作为奖励。同时,区块也会将在该区块中产生的交易费用奖励给人们。

    “币”是怎么怎么激励的? 在每个区块中的第一个交易将创建一个新的“币”,这个币将会奖励给创建这个区块的人。(注意:只奖励给创建者),此外,这个人还会获得在这个区块中的所有交易产生的交易费用(同样是以“币”结算的)。如果

    由于是“赢家通吃”(winner-takes-all)的激励系统,成为区块的创建者会是一个十分有利可图的成功。这样的激励系统可以刺激更多的人贡献电脑算力,去寻找工作量证明,目的是成为区块的创建者。

    货币政策? 整个区块链系统的货币总量是确定的,而且由于每次交易都会有部分的金额作为交易费用支付,这样的系统可以避免通货膨胀。

    回收磁盘空间

    当经年累月产生了过多的交易时,存储这些数据将对区块链中电脑磁盘空间造成影响。想要删除过时的数据,同时保留区块的哈希值,区块链可以使用Merkle树的方法记录交易。这样区块的根节点需要被包含,而过去的节点则可以被剪枝。

    回收磁盘空间

    简化交易验证

    在简化的交易验证下,用户可以用区块链验证一笔交易,而不需要完整的区块链。

    不运行一个完整的网络节点,如何进行交易验证?用户只需拥有最长链的区块头副本。通过链的某个位置,他可以看到其他网络节点已经接受了这个数据,并且也可以从之后增加的区块中了解到这个交易已经被接受了。

    如果区块链网络是由诚实节点掌控的,那么上面提到的这个交易验证过程将会是有效的。但是如果有恶意的攻击者掌握了网络,就会产生问题。为了解决这个问题,区块链规定,如果有节点发现无效区块时要发出警告,要求用户下载完整的区块。

    合并和分割交易额

    如果遇到小额支付怎么验证?如果将每个过于小额的支付都作为一次“交易”来验证的话,将会浪费区块链太多的算力(如果为了验证交易消耗的电力还不如交易额多,那么这会浪费资源)。

    因此,一个交易可能只包含一笔较大额的支付,也可能包含很多笔小额的支付。同时会包含两个输出,一个是交易,另一个是送回给支付者的找零。

    隐私保护

    传统的银行数据库中,银行会通过限制登陆数据库的权限来保护用户的隐私。但是,由于区块链需要将交易广播给所有的节点,因此这样的方式不再有效。区块链保护隐私的方法为“公钥匿名”。

    公钥匿名如何保护隐私? 公众可以看到“有人正在传递一定数量的币给另一个人”,但是不能确定具体的对象。

    隐私保护的另一层保险,就是每个交易会产生另外的一对密钥,这样就没有人能够通过密钥值的关联来把交易关联到某一个人身上。但是仍然存在问题,那就是多个输入值的交易就会暴露他的拥有者。而且如果一个密钥的拥有者被暴露,与他关联的另一个拥有者也会被暴露。

    计算

    作者通过数学计算,证明:如果有个攻击者想要生成一条比诚实链更长的区块链来替代,那么这个概率会随着之后区块的增加而指数减少,说明想要替代诚实链是困难的行为。而且,这样的行为只能做到让攻击者改写自己的某笔交易。

    由于进行这样的攻击行为需要付出的成本(垄断性的算力,垄断性的电费,很低的成功概率...)与他的收益将不成正比,因此这样的攻击行为将很难发生。这个攻击者会发现,比起违反规则,不如遵守规则(也就是寻找新的区块)更加有利可图。作者从博弈论的角度证明了这个系统的稳定性。


    参考文献

    [1]Bitcoin: A Peer-to-Peer Electronic Cash System
    [2]比特币:一种点对点电子货币系统(中文版)
    [3] MYCRYPTOPEDIA, Double-Spending Explained(Bisade Asolo)

    相关文章

      网友评论

          本文标题:【漫游区块链】比特币白皮书阅读笔记

          本文链接:https://www.haomeiwen.com/subject/qqpdzctx.html