汪晓明对区块链、以太坊的思考

记录创业、生活的所思所感,探讨去中心化思想,推动区块链的发展。

我推出了《VIP区块链技术开发视频》和电子书《深入浅出以太坊》

区块链(33):最小可行区块链原理解析3

上一篇文章我们介绍了《区块链(32):最小可行区块链原理解析2》:http://wangxiaoming.com/blog/2017/01/09/minimum-viable-blockchain-2/

建立最小可行区块链

我们已经谈到了很多基础内容。在讨论区块链如何帮助我们构建安全的分布式账簿之前,我们来快速地扼要概述一下我们的网络设定,属性和待解决的挑战:

  1. Alice和Bob完成交易并记录在各自的分类账簿中。

    完成后,Bob有一个来自Alice的受公钥基础设施保障的借据。

  2. Bob和John完成一个交易,他将Alice的收据转移给John。Bob和John都更新了账簿,但是Alice对交易尚不知情……

    皆大欢喜的情景:John要求Alice偿还他的新借据;Alice得到Bob的公钥,核实了他的交易;如果交易有效,她向John支付所需金额。

    不太欢乐的情景:Bob用没有记录他和John交易的旧账簿与Katy创建了一个重复消费交易。然后Katy和John同时出现在Alice家却发现只有一个人能得到报偿。

由于分布式账簿的“弱一致性”,重复消费是有可能的:Alice和Katy都不知道John和Bob之间的交易,这就使Bob利用了不一致性为自己谋利。有解决办法吗?如果网络很小,所有参与者都是已知的,那么我们可以要求每个交易在被认定为有效前必须被网络“接受”:

  • 全体一致:每当交易发生时,双方联系所有其他参与者,告知他们交易的有关内容,等所有参与者“同意”后才能提交交易。因此,所有分类账簿同时更新,不可能发生重复消费。

  • 法定人数一致:提高网络的处理速度和可用性(即如果有人离线,仍然可以处理交易),我们可以将上述全体一致的情况放宽到法定人数一致(整个网络的50%)。

对于参与者已知且已核实的小型网络,以上任何一个策略都能立即解决问题。然而,两种策略都不能扩展应用于更大型的动态网络,因为在任何时间点都无法得知参与者的总数和他们的身份:

  1. 我们不知道要联系多少人来获得他们的同意。
  2. 我们不知道要联系谁来获得他们的同意。
  3. 我们不知道在与谁通话。

注意我们可以用任意通信手段来满足上述工作流程:当面,通过网络,信鸽通讯, 等等!

由于缺乏网络参与者的身份和对他们的全局认识,我们必须要放宽限制。虽然我们不能保证任意特定交易都有效,那并不能阻止我们对接受交易有效的可能性做出陈述:

  • 零确认交易:我们可以在不联系任何其他参与者的情况下接受交易。这是对交易付款方诚信的完全信任——相信他们不会重复消费。

  • N确认交易:我们可以联系网络中(已知)参与者的一部分子集,让他们验证我们的交易。 我们联系的节点越多,抓住企图欺诈我们的恶意方的可能性越大。

“N”的值多大为好?答案取决于要转移的金额以及你与对方的信任度和关系。如果金额很小,你可能愿意接受更高的风险级别,或者你会根据对另一方的了解程度来调整风险容忍度。或者,你会做些额外的工作,联系其他参与者验证你的交易。在任一情况下,处理交易速度(零确认是瞬时发生的),额外工作和交易无效的风险之间都存在一个折衷。

到目前为止一切顺利。不过,有个额外的并发问题我们必须考虑:我们的系统依赖于来自其他节点的交易确认,但是没有什么能阻止恶意用户按照所需生成尽可能多的伪造身份(回想一下,我们系统中的“身份”仅仅是个公钥—私钥对,随便就能生成)来满足 Katy的验收标准。

Bob是否要进行攻击是一个简单的经济学问题:如果收益高于成本,他就会考虑实行攻击。相反,如果Katy可以使运行攻击的成本高于交易的价值,那么她应该是安全的(除非Bob和她有私仇以及/或者愿意在交易上赔钱…..但这不在考虑范围内)。为了让问题更明确,我们做出如下假设:

  • Bob转移10个chroma给Katy。

  • 生成伪造身份和交易响应的成本是0.001chroma:维持电脑运行的能源成本,支付网络连接等。

如果Katy要求1001次确认,对于Bob来说实行攻击就没有(经济)意义了。反之,我们可以为每次确认增加一个工作量证明要求,将每次有效响应的成本从0.001chroma增加到1chroma:找到一个有效散列会占用CPU时间,转化为更高的能源费用。因此,Katy只要求11 次确认就可以达到同样效果的安全保障。

注意,Katy每次请求确认也会导致一些成本:她必须耗费努力来发出请求,然后验证响应。此外,如果生成确认和验证的成本是一对一的,那么Katy将承担与交易价值相等的总成本来验证交易……当然,这没有任何经济意义。

这就是为什么工作量证明的不对称很关键。Katy发送请求和验证响应只会产生很低的成本,但生成确认的一方需要花费大得多的努力来生成有效响应。

很好,问题解决了,对吧?在这个过程中,我们似乎……造成了另一个经济困境。我们的网络现在验证每个交易产生的成本与交易本身的价值相等甚至更高。虽然这是对恶意参与者的经济威慑,但合法参与者怎么会愿意为他人承担成本? 理性的参与者根本不会,这毫无意义。唉。

添加“区块”和交易费用激励

如果网络中的参与者必须承担成本来验证彼此的交易,那我们必须为他们提供经济激励。事实上,我们至少要抵消他们的成本,否则一个“空闲”参与者(任何没有提交自己交易的人)将会代表网络继续累积成本——这样是行不通的。还有一些我们需要解决的其他问题:

  1. 如果验证交易的成本等于或高于交易价值本身(为了制止恶意参与者),那么总交易价值是净零,或负数!例如,Bob把10个chroma转移给Katy; Katy又花了10个chroma来补偿其他节点来验证交易; Katy很伤心。

  2. Katy如何为确认进行支付?如果那是它自己的交易,就会有一个递归问题。

让我们从显而易见的问题开始:交易费用不能和交易本身的价值一样高。当然,Katy不必原封不动地把所有价值都用于确认交易(比如,她可以分配一半的价值用于确认),但这样又变成了一个利润问题:如果剩余利润(交易价值减去验证费)足够高,欺诈的动机仍然存在。相反,理想情况下,我们希望承担最低的交易费用,并仍然对恶意参与者有强大的威慑。有解决方案吗?

我们可以通过允许网络中的参与者一次性汇集和确认多个交易来激励他们,也就是对一个交易“区块”进行确认。这样做能让他们汇总交易费用,从而降低每个单独交易的验证成本。

一个区块仅仅是(一个或多个)有效交易的集合——把它想象成等同于物理分类账簿中的一个页面。反过来,每个区块包含对前一交易区块(上一页)的引用,整个分类账簿是区块的链接序列,也就是,区块链。想想上面的案例:

  1. Alice和Bob生成新交易并公布到网络上。

  2. Chris正在等着听新交易通知,每个交易通知包含发送方愿意支付于网络验证和确认交易的交易费用:

    1.直到有直接的经济激励(交易费用总额大于他的成本)来完成必要工作来验证未决交易,Chris对未确认的交易进行汇总。

    2.一旦过了这个门槛,Chris首先验证每个未决交易,方法是核实所有的输入都不是重复消费。

    3.所有交易都被核实后,Chris在未决列表上再添加一个交易(上图中用绿色标识),将所发布交易的费用额转移给他自己。

    4.Chris生成一个包含未决交易列表的区块,引用前一区块(使我们可以遍历区块并看到整个分类账簿),并执行工作量证明挑战,来生成符合网络既定规则的区块散列值,例如N个前导零的部分散列冲突。

    5.最后一旦Chris发现有效区块,他就分发给所有的其他参与者。

  3. Alice和Bob在等着监听新的区块公告,寻找他们在列表中的交易:

    1.Alice和Bob验证区块的完整性,也就是验证工作量证明和区块所包含的交易。

    2.如果区块有效,他们的交易在列表中,那么交易就被确认了! 我们在这里前进了一大步。以前我们的网络中只记录了一种类型——签名的交易。现在我们签名了交易和区块。前者由参与交易的个人生成,后者由有意通过验证和确认交易收费的各方生成。

另外请注意,上述方案需要系统中的最小交易量来维持个人创建区块的动机:交易越多,单个交易所需的费用越低。

哎,好吧,Alice宣布了一个新的交易,并收到一个Chris确认它的有效区块。有了一个确认,那其余的呢? 而且Chris(但愿)不是唯一一个受到激励来生成区块的参与者。如果其他人同时生成了另外一个区块,这两个区块哪个“有效”?事情开始变得有意思了……

竞争以赢取交易费用

通过验证交易区块来引入汇总费用的能力,它了不起的部分在于,为网络中的新参与者创造了一个角色,他们有直接的经济激励来保障网络。你现在可以通过验证交易赚取利润,可以盈利的地方,竞争就随之而来,这只会加强网络——一个良性循环和聪明的社会工程!

即便如此,验证交易的竞争动机又产生了另一个有趣的困境:我们如何在分布式网络中协调区块生成工作?简短的回答,你可能已经猜到了,我们不会去协调。我们在系统中再额外添加一些规则,看看它们如何解决这个问题:

  1. 允许任意数量的参与者参加(“竞赛”)创建有效区块。不需要协调。感兴趣的参与者反而会去找新的交易,决定是否想要以及何时想要尝试生成有效区块,领取交易费用。

  2. 生成有效区块时,立即广播到网络中。

    1.其他节点检验区块的有效性(检查每个交易和区块本身的有效性),如果有效,就将其添加到他们的分类账簿中,然后最终重新广播到网络中的其他节点。

    2.添加以后,新的区块成为分类账簿的“最高档”。如果同一个节点也在生成区块,那么他们需要中止之前的工作重新开始:他们现在需要更新对最新区块的引用,并且从最新区块中包含的未确认列表里删除所有交易。

    3.完成以上步骤后,开始创建新区块,希望他们第一个发现下一有效区块,这样他们能够领取交易费。

  3. …… 重复以上步骤直到宇宙热寂。

生成区块的所有参与者之间缺乏协调意味着网络中会有重复的工作,这也OK!虽然不能保证单个参与者获得特定区块,只要参与网络的预期价值(获得区块的概率乘以预期支出,减去成本)是正的,系统就可以自我维持。

注意,接下来要验证交易的节点之间没有一致性。每个参与者汇总自己的列表,运用不同策略来使预期收益最大化。此外,由于我们工作量证明函数(为区块SHA-256校验和找到一个部分散列冲突)的属性,增加获得区块概率的唯一方法是耗费更多的CPU周期。

还有一个需要应对的警告:两个节点可能会几乎同时发现一个有效区块,并开始在网络中传播——例如上表中的Kent和Chris。因此,一部分网络最终可能会接收Kent的区块作为最高区块,其余的会接受Chris的区块。现在怎么办?

解决链冲突

再次的,我们将采取一种不干涉的手段,让区块生成过程中的任意属性来解决冲突,虽然还有另外一个规则:如果检测到多个链,参与者应立即切换到最长的链,并在其顶部创建。我们来看看这在实践中如何工作:

  1. 一些节点会开始在Kent的区块上建立新区块,其他人在Chris的区块上建立。

  2. 在某一时刻,有人会发现新的区块,开始在网络中传播。

    1.其他节点接受新的区块时,与一个不同的最高区块合作的那部分网络将检测到现在有一个更长的链可替换,这意味着它们需要切换到更长的链上面——例如在上述案例中,和Chris区块合作的节点会停止工作,放弃Chris的区块,切换到更长的(Amy 和Kent的)链上。

    2.作为被丢弃区块的一部分但尚未被确认的任何交易都被放在未决列表中,重新开始这个过程。

可能的情况是,竞争状况会持续多个区块,但最终某个分支会超过另一个,网络的其余部分将收敛到同一个最长的链上。

很好,我们现在有了一个策略来解决网络中不同链之间的冲突。具体来说,网络通过将交易记录在链接的区块列表中来允诺交易的线性化。但至关重要的是,它没有允诺个别区块可以“保证”任意一个交易的状态。想想上面的案例:

  • Alice将她的交易发送到网络。

  • Chris生成一个确认她交易的有效区块。

但是链中有一个分叉,当稍后网络收敛在Kent的分支链上时,Chris的区块会被“移除”。因此,即使当Alice接收到一个有她交易的区块,她也不能确定这个区块将来不会被撤消!

没有哪个区块是“最后一个”

没有哪个区块是“最后一个”,永远不会有。 如果检测到更长的链,任何区块都可以被“撤消”。实际上,检测分叉相当快速,但总是存在出现替代链的可能。但是,我们唯一能说的是,特定区块在链中的位置“更深”,它被撤销的可能性就更小。因此,也没有哪个交易可以被视为“最终一个”,我们只能陈述它被撤销的概率。

  1. 0确认交易:不必等待任何包含交易的区块就可以进行交换。

  2. 1确认交易:最新的有效区块包含交易。

  3. N确认交易:有一个包含交易的有效区块,以及N-1个区块建立在那个有效区块上。

如果愿意接受风险,你可以总是选择采用0确认交易:没有交易费用,也不必等待确认,不过你要对对方抱有极大的信任。

但如果你想降低风险,就要等待一个或多个区块建立在你交易所在的区块上。你等的时间越长,在包含你交易的区块上建立的区块越多,出现一个撤销你交易的替代链的可能性越低。

”撤消”指的是参与者使网络接受一个替代交易,将资金转移到除你以外的其他帐户上的情形——例如,你完成交易,移交组件,获得收据,但攻击者接着会注入一个交易,把同样的资金“双重消费”到另一帐户。

为什么区块链的长度可以很好地代表交易“安全性”? 如果攻击者想要撤消一个特定交易,那么他需要建立一个链,链开始于列出交易区块的前一区块,然后建立一个由其他区块组成的、比网络当前所用链更长的链。因此,区块越深,通过创建新链来替换它所需要的计算量就越大。链条越长,运行攻击的代价就越昂贵。

在接受交易之前,你要等待多少个区块? 它没有一个明确的数字,答案取决于网络的特性(生成每个区块的时间,交易和区块的传播延时,网络大小等)以及交易本身:它的价值,你对另一方的了解,你的风险预测等。

(最小可行)区块链的属性

  1. 个体交易的安全受公钥基础设施保障。

    o 验证交易真实性:恶意方不能伪装成他人,代表他人签名交易。

    *交易真实性认证只与公钥—私钥对有关。不需要将密钥对与参与者其他数据链接的“强认证”。事实上,单个参与者可以生成和使用多个密钥对!从这一层面上看,网络允许匿名交易。

    o 不可否认性:事实发生后,参与方不能声称交易没有发生过。

    o 完整性:事实发生后,交易不能被修改。

  2. 交易一旦被创建,就被广播到点对点网络中。

    o 参与者形成一个网络,交易和区块在参与节点之中转播。不存在一个中央权威。

  3. 一个或多个交易聚集在“区块”上。

    o 一个区块可以验证一个或多个交易并领取交易费用。

    *这使得交易费用与每个交易的价值相比仍然是很低的。

    o 有效区块必须有有效的工作量证明解决方案。

    *有效的工作量输出很难生成,但验证起来很便宜。

    *工作量证明用于提高生成有效区块的成本,使运行对网络的攻击成本更高。

    o 任意节点都能用于生成有效区块,一旦有效区块生成,就被广播到网络中。

    *任意数量的节点都可以竞争生成区块链。没有协调。检测到分叉时,通过自动转换到最长的链来解决问题。

    o 每个区块有一个与前一有效区块之间的链接,使我们能够遍历网络中所有交易记录的完整历史。

  4. 节点们寻找新的交易通知,将它们并入分类账簿中。

    o 在区块中包含交易,作为交易“确认”,但这一事实本身不会将交易“最终化”。相反,我们以链的长度代表交易的“安全性”。每个参与者可以选择自己的风险承受水平,从0确认交易到等待任意数量的区块。

所有上述规则和基础设施的组合提供了一个去中心化、点对点的区块链,用于实现签名交易排序的分布式一致性。说得有点多,我知道,但它也为一个大难题提供了巧妙的解决方法。区块链的单个部分(会计,密码技术,网络,工作量证明)并不新颖,但所有这些部分结合起来形成的新属性很值得关注。

于2014年5月5日

本文翻译自W3C网络性能工作组联席主席 & 谷歌员工 Ilya Grigorik的大作《Minimum Viable Block Chain》。感谢朝夕团队Azure, Bob的翻译和校验。

这篇文章也收录在《程序员》杂志2017年1月的封面专题区块链中:http://geek.csdn.net/news/detail/132424