区块链中的去中心化不仅仅是技术性的,而是技术和激励机制的结合。
去中心化是一个很普遍的问题,中心化和去中心化都有自己的优缺点。以邮件服务器为例,虽然任何一台机器只要运行了SMTP就可以收发邮件,也有个人运行的邮件服务器也即,它可以成为像互联网一样的一个P2P网络,但是中心化的邮件服务器仍然占主流。
虽然区块链的宣传口号就是“去中心化的、不可篡改的”,它的协议本身是去中心的,但是比特币交易中心是中心化的;而且矿池也出现中心化趋势。另外,比特币源码更新时也是依赖于开发者的,整个社区信赖开发者,因此,少数的开发者拥有极大的权限,这也是中心化的。
关于去中心化,有一个问题需要明确:去中心化的分布式的系统很容易出问题。缺少中心节点的统一管理,在分布式的系统中达成一致是一件不容易的事情。
譬如分布式系统专家,Leslie Lamport所说:
a distribured system is one in which the failure of a computer you
didn’t even know existed can render your own computer unusable.
分布式主要的好处就是可靠性,类似于淘宝这样的系统需要大量的备份机器,每份信息需要在多台机器上保存,所有的机器需要能够同步,也就是对最新状态达成一致。
一致性问题主要是来源于分布式网络中的诸如机器宕机或网络异常(包括消息的延迟、丢失、重复、乱序)的情况,以及如何在一个可能发生上述异常的分布式系统中,快速且正确地在系统内部对某个数据的值达成一致,并且保证不论发生以上任何异常,都不会破坏整个系统的一致性。分布式一致性的用处很广,在计算机科学中也已经研究了数十年。
然本文中的重点是区块链中的去中心化问题,也即比特币中的分布式共识(PoW,工作量证明),但是理解一些背景和历史,对于更深刻的认识和理解所面对的问题无疑是有帮助的。
为了形象地描述一致性问题,看一下Leslie Lamport对拜占庭问题以及对Paxos问题的描述——
为了让自己的算法有更好的讨论度(时间证明确实如他所愿了),Lamport设想出了一种场景:
拜占庭帝国想要进攻一个城市,为此派出了10个将军率领10支军队,这个城市足以抵御5支常规拜占庭军队的同时袭击。这10支军队不能集合在一起单点突破,必须在分开的包围状态下同时攻击,至少6支军队同时袭击才能攻下敌国。10支军队分散在敌国的四周,依靠通信兵相互通信来协商进攻意向及进攻时间。这里的问题是,对应于有的主机坏掉了,将军中可能会有叛徒,忠诚的将军希望达成命令的一致(比如约定某个时间一起进攻),但背叛的将军会通过发送错误的消息阻挠忠诚的将军达成命令上的一致。在这种状态下,拜占庭将军们能否找到一种分布式的协议来让他们能够远程协商,从而赢取战斗?
除此之外,Lamport提出了另一种模型中的对应算法Paxos算法。
因为大多数系统在同一局域网中,消息被篡改的情况较少;如果消息不完整,只需简单的校验,丢弃不完整的消息即可。因此,在一般的系统中,
可以假设所有消息都是完整的,没有被篡改的,并不需要使用拜占庭问题模型。在这种情况下需要什么样的算法呢?
Lamport在1990年提出了Paxos算法,并给出了理论证明。Paxos算法是基于消息传递且具有高效容错特性的一致性算法,目前公认的解决分布式一致性问题最有效的算法之一。Paxos广泛应用于Google 的 chubby、雅虎的Zookeeper,阿里还推出了Paxos底层库。Google公司Chubby锁的作者Mike Burrows评价说只有一种一致性算法,那就是Paxos。
类似于拜占庭将军问题,Lamport同样想出了一种场景来描述这种算法面对的问题和解决的过程:
在古希腊有一个Paxos小岛,岛上以议会的形式通过法令。议会中的议员通过信使传递消息,对应于网络不稳定(消息会延迟、重复投递甚至丢失)和机器可能宕机或者出故障,岛上的议员和信使都是兼职的,随时可能离开议会厅,并且信使可能重复投递消息。需要有一个协议,保证在这种情况下仍然能够正确的产生法令。
关于这个著名的算法有各种八卦,譬如,Lamport在《The Part-Time Parliament》这篇论文中压根没有说Paxos小岛是虚构出来的,而是煞有介事的说是考古工作者发现了Paxos议会事务的手稿,而且从问题的提出到算法的推演论证,通篇贯穿了对Paxos议会历史的描述。而在1990年第一次收到这篇大名鼎鼎的论文之后,ACM TOCS的评审们要求Lamport将所有Paxos相关的类比描述都去掉。Lamport大牛拒绝修改,并在一次会议上公开质疑”为什么搞基础理论的人一点幽默感都没有呢?”直到好几年后,另一位大牛Lampson觉得这个算法很重要并呼吁大家重新审视这篇论文,而FLP中的Lynch重写文章阐述这篇论文, 最终1998年ACM TOCS发表了这篇论文 【The Part-Time Parliament. ACM Transactions on Computer Systems 16, 2 (May 1998), 133-169】。Lamport也在2001年写了篇简化版本Paxos made Simple。
而在1998年ACM在发表The Part-Time Parliament时,评委们也难得地幽默了一下——
本文最近刚被从一个文件柜里发现,尽管这篇论文是很久之前提交的,但是主编认为还是值得发表的。但是由于作者目前在希腊小岛上考古, ACM TOCS联系不上这位考古学家, 所以任命我来发表这篇论文。作者貌似是个对计算机科学稍微有点兴趣的考古学家,尽管计算机科学家对他描述的Paxon岛上民主制度的故事没啥兴趣,但是这套制度对于在异步网络中实现分布式系统是很好的模型。建议阅读的时候直接看第四节(跳过前三节神话故事),或者最好先别看(你可能会看不懂),最好先去看看Lampson或者De Prisco对这篇论文的解释。
Lamport所提出的拜占庭将军问题也是比较符合区块链的模型。
对于去中心化,比特币区块链主要面临的五个问题:
谁维护交易账本?
谁能决定交易是否是有效的?
谁创建新的比特币?
谁决定系统变化的规则?
比特币如何获得交易的价值?
分布式共识协议的一个定义和描述:
有 n 个节点,每个节点都有输入值。有一些节点出故障或者是恶意的。分布式共识协议的特点是:
现在的问题是,Bob如何能确认,自己确实能够收到这个比特币,然后将Alice购买的物品发给她。
因为比特币是虚拟资产,Bob不可能实际上把币拿到手中;也没有银行这样的中心机构,确保从Alice的账户里减1个比特币,然后Bob的账户里增加1个比特币。在比特币网络这样的分布式网络中,一个比特币从Alice的钱包转移到Bob的钱包本质上就是让所有的人(节点)都接受并认同“Alice支付给Bob 1个比特币”这条消息。也就是要在网络中达到一个共识。
这个问题的难度在哪里?
问题是,对于网络中的每个节点,它们看到的交易不同,交易顺序不同,如何能达成共识?
有一个方法是这样的:每10分钟,网络中的每个节点从自己收到的交易中,挑出一些交易形成一个块,广播自己的新区块。每个节点都可以提出自己的意见,然后通过使用一些共识算法,所有的节点达成一致。
为什么比特币网络不使用当前有的分布式共识算法呢?
在比特币之前,有很多的分布式共识算法。但是,很多的分布式系统的共识算法做了很多的假设,而有些假设是很悲观的。之前的一些研究得出了一些不可能的结果(impossibility results),譬如FLP、拜占庭将军问题等,也就是说,在某些情况下,是不可能达成共识的。
在比特币网络中,它放弃了之前研究中的一些假设。现有的情况是,比特币网络中的共识算法在实际中确实工作得很好,但是理论上并没有得到充分的理解和证明。
比特币系统的特殊之处在于:
另一方面,在比特币网络中,节点是没有标识的,主要是因为没有一个中心节点来对每一个节点进行认证。在这种情况下,一方面,容易引起一种攻击叫做“sybil attack”;另一方面,缺少标识,不能使用类似“编号为ID的节点发出消息”这样的协议命令,缺少对网络的足够了解和控制。
关于"Sybil Attack"(女巫攻击),来自于一部小说(同名电影),其中女主具有16种人格。这种攻击主要是恶意节点创造出很多节点,对于P2P网络而言,拥有很多节点主要是用于冗余和备份,如果攻击者创造出很多节点,相当于控制了网络的一大部分,可以破坏冗余策略和备份策略。譬如说比较倒霉的,一份文件都备份在攻击者控制的机器上,那么攻击者就可以肆意篡改这份文件。Sybil Attack比较著名的一次攻击应该是2014年对Tor的匿名披露攻击。
在这些限制下,比特币网络实现的是隐含共识(implicit consensus):一个区块就是一个共识的过程,随机的节点可以提出新区块。即使提出新区块的节点是恶意的,提出时也没有显示的投票或者其他过程。建立共识的过程是隐式的,其它节点如果接受这个区块,就会延伸它;否则拒绝这个区块,则会无视它,并尝试建立新区块去取代它。
简化的比特币的共识算法过程如下:(这里没有讨论广播新区块信息的那些节点是如何选出的)
针对这个算法讨论一下,针对这个货币网络可能存在的攻击方法。
Alice有没有可能去其他用户的比特币呢?譬如Alice创建了一个区块,区块中她试图伪造一个交易“Bob发送10个比特币给Alice。”如果要让这个交易合法,那么Alice必须能够伪造Bob的签名,但是Alice如果没有Bob的私钥,那么Alice就不能伪造签名。所以,只要底层的密码学基础没有被破坏,Alice就不可能偷Bob的币。
如果Alice非常讨厌Bob,她不愿意为Bob提供服务,譬如在自己创建的区块中,Alice就会故意忽略掉Bob相关的交易。这个攻击的问题是,Alice并不能控制区块的产生。即使Alice在一个区块中忽略了Bob的交易,其他诚实的节点会在交易中包括Bob的交易。
假设Alice从Bob购买了一个软件,然后她广播了一条交易“Alice付给Bob一些比特币”。诚实的节点看到了这条交易,并且将交易包含在区块中。当Bob看到这条交易被包括进去的时候,Bob认为Alice已经支付了,所以将软件发送给了Alice。然后Alice开始准备攻击,她自己或者她控制的节点开始准备下一个区块,在这个区块中包含的消息是把Alice刚才付给Bob的币付给自己或者她控制的账号“Alice付给Alice一些比特币”。如果Alice能够给成功地将第二条支付信息包含在区块链中,那么第一条消息,将会被忽视,就像从来没有出现过一样。
下面是双重支付的示例图:
Alice可以构造一个新的交易,将支付给Bob的钱再支付给自己。如果她能控制后续区块的产生,那么付给Bob的交易会像从来没有存在过一样。
问题是,双重攻击能否成功,完全取决于区块链到底沿着那条链延续。诚实的节点会沿着最长的链创建自己的区块。所以答案就是,没有正确的答案。
在Alice创建了双重攻击的区块之后,对于其他的节点而言,两个分支具有一样的长度;而且两个块都是有效的,那么其他节点会选择哪个分支就决定了攻击成功与否。但是对于其他的节点而言,这两个交易的地位是完全相同的。我们认为Alice付给自己的交易是欺骗,那是因为我们知道Alice首先付给了Bob。但是,对于没有全局时间的网络而言,这两个交易是等价的。而且Alice还可以通过一些方法使得下一个区块沿着自己的分支延伸。
那么Bob如何应对这个问题呢?
如果Bob容易轻信,那么他可能在发现Alice发布了付币给自己的时候就同意将软件发给Alice,这个时候,称作Zero-Confirmation Transaction(零确认交易)。如果Bob有更多的保护自己的意识,他会等到Alice付钱给自己的交易被多次确认之后才将软件发给Alice。当交易被包含在区块中,称作一次确认;如果包含交易的区块之后又来了一个区块,称作2次确认。以此类推。
只要Bob等足够的时间,那么当他发现包含Alice付钱给自己的区块已经被遗弃的时候,他会放弃这次交易并且拒绝将软件发给Alice。一般而言,一个交易获得的确认越多,这个交易成为最终的系统的共识的概率越大。
在比特币系统中的一般做法是等6个确认。6是在等待时间和确认之间的一个折中取法。
综上,能够防止双重支付成功的原因,也即包括双重支付的区块不能最终包括在链中的原因是——我们假设大部分的节点是诚实的。
从密码学的角度,两个交易都是正确的。 所以,为了确认形成了共识,需要等待一段时间,确定最终区块链中到底包含了哪一个块。而且,随着区块的增加(确认数的增加),交易变无效的可能性是指数级降低的。因此,可以等待6个区块,也即差不多1个小时的时间,基本上不会再翻盘了。
在之前的过程中,我们多次做了假设,大部分的节点是诚实节点——诚实的节点会将自己收到的广播的交易打包,诚实的节点会沿着最长的分支扩展。但是,节点有没有必要保持诚实呢?或者说,能不能给节点激励,让节点维持诚实?
实际上,即使能够证明有的节点正在尝试进行双重支付攻击,因为节点没有标识,所以即使发现,也不能进行惩罚。所以,问题变成了,如果节点保持诚实,能不能获得奖励?同样的,因为如果节点没有身份标识,不可能寄支票给诚实的节点,所以,对诚实的形成区块的节点的奖励就是比特币。
在比特币网络中,共有两个激励方式。一种是Block reward(区块奖励),一种是transaction fees(交易费用)。也就是挖矿和手续费了。
区块奖励是这样的,任何创造出区块的节点可以在区块中包括一个特殊的交易——创造币的交易(coinbase),并且节点可以选择交易的接收地址。当然, 节点大概率把接收地址设置为自己。可以理解为这是对节点创造区块的奖励。
目前为止,创造一个区块的奖励是12.5个币,然后每210,000个区块这个数字会减半。按照生成区块的速度,差不多每四年,区块奖励会减半。
第一眼看来,这个好像没什么用处。因为,不管节点创造的是好的区块还是包括攻击交易的区块,他都能获得奖励。但是,这个奖励什么时候才有用呢?只有在他的区块被包括在长链中才行。因此,如果一个区块中包括无效的交易,这个区块相当于会被丢弃。所以,所有的节点都能尽力表现得诚实,这样,其他节点才会沿着他的区块继续添加新的区块。
同时,区块奖励也是唯一的创建新的比特币的方法。从下图可以看出,每四年比特币的区块奖励降低一半,比特币系统中币的总数设置在21,000,000。也即,总有一天,创建区块不会产生新的币(挖不出比特币了),而没有人愿意去创建区块。
那个时候,会不会产生欺诈呢?
交易费用。比特币中的第二个激励机制是交易费用。交易的创建者可以在创建交易时,输入大于输出,其中的差值就是交易费用。所以,即使当创建区块不会产生币的时候,交易费用会变得很重要。同时,对于交易者而言,如果希望自己的交易被快速地确认,毫无疑问地,在交易中包括多一点的费用是一个好的方法。
这时候,来理一下思路:
所有三个问题的答案实际上就是PoW(工作量证明)。基本思路就是,挑选节点的时候,要根据一种人们不能独占的资源来选择,譬如,算力,computer power。在PoW中,就是让节点进行竞争,算力最强能够胜出,也相当于是按照算力按比例进行选择。
从另一方面来讲,这对希望参与的节点设置了门槛,必须有足够的算力资源才能参与到区块的创建中。因此,即使有人想发动Sybil Attack,如果不能控制更多的算力,创建新的节点是没有用的。
比特币的工作证明就是hash puzzles。为了创建一个区块,节点需要能够找到一个数值,nonce,使得当计算哈希时,前一个hash,包含在区块中的交易,以及nonce这三者连接之后,它的哈希值小于某个target。
用公式写出来,长这样:
之前我们讲过hash具有的特点是puzzle friendliness,找到这个Nonce的唯一方法就是尝试各种值,直到运气好找到一个。
工作量证明的存在基本上实现了对随机性的要求,没有谁能够指定哪个节点可以产生下一个区块;同时,排除了Sybil Attack的可能,因为创建有竞争力的节点代价太高。
比特币中的hash计算有三个特点。
也正是因为工作量证明,保证了如果大部分的节点(以算力而不是个数)是诚实的,那么至少有50%的可能,下一个区块来自于诚实的节点。
最后,讨论一下51%攻击。
因为之前的假设一直是大部分的节点是诚实的,也就是至少51%的节点是诚实的。那万一攻击者控制了51%的节点呢?或者说,有一个超级强大的矿池,控制了51%的算力呢?
我们来思考一下,此时攻击者可能发起什么攻击。
攻击者可能偷别人的比特币吗?不能。除非能破解密码基础,否则不可能偷到别人的币。
如果攻击者想在区块中包括这个签名不正确的币,那么即使有51%的算力控制,也不可能推翻共识机制。即使攻击者创造出了最长的链,但是剩下的其他诚实节点会拒绝接受这条链,而会自己创造另一条链,也就是出现了分叉。
当攻击者想把偷来的币花出去时,接收方也会因为不选择攻击者创造的链而拒绝这个交易。
攻击者能不能进行DoS攻击?如果攻击者特别不喜欢Bob,那么确实有可能Bob的交易不会出现在所有的区块中。但是,Bob的交易可以被广播到网络中,所以,即使Bob确实是拒绝服务了,但是至少对于诚实节点而言,能够发现攻击发生了。
最后,能否进行双重支付等其他可以破坏区块链信任的攻击呢?在51%的算力控制下,确实有可能。但是那个时候,一旦人们发觉到比特币网络被人控制,而不再可信,那么人们会主动放弃比特币,那么比特币的价值会直接崩溃。而攻击者呢,考虑到控制51%算力的代价,出现这种情况就相当于所有的投资都会打水漂。
那么就出现了这样的情况:
控制了51%算力后,想要发动攻击是不划算的,因为此时已经付出了巨大的代价,那么此时只有一种理智的选择:继续维护整个比特币网络。
每个人都可以参与比特币协议,而且不需要现实世界的身份,只要创建一对公私钥对就行。而且可以创建任意多的公私钥。交易实际上就是在网络中广播的信息。比特币就是交易的输出。(比特币的最小单位是0.00000001,单位为1聪Satoshi)比特币网络的目标是将交易和新区块向全网广播,网络通过区块链和共识机制保障安全。当我们说交易包括在区块链中,实际上是这个交易获得了多次的确认。
比特币通过pow和激励机制,维持着整个分布式系统的正常运转,从而实现了去中心化。
原文链接:https://zhuanlan.zhihu.com/p/45078474