admin管理员组

文章数量:1544741

内容简介

2017年,是区块链爆发又冷静的一年。

如果你持续关注过区块链技术,这一年可能已经对没完没了的概念介绍、前景描绘、行业探讨和链圈新闻产生了审美疲劳。没错,区块链必须与行业紧密结合,它也有颠覆人类协作方式之洪荒巨力,但是说到底它还是一个技术活,是要写代码的,在咖啡厅里整天坐而论道是造不出金链子来的。

本期我们梳理了2017年区块链发展现状,从关键技术原理与实际应用出发,带你深入浅出探索区块链技术的方方面面。

本书内容
最小可行性区块链原理解析

文/ Ilya Grigorik

加密货币,特别是比特币,几乎从各个方面都得到了大量关注:规则、管理、税务、技术、产品创新等等,不胜枚举。“点对点(去中心化)电子现金系统”的概念颠覆了我们以前对货币和金融所持有的设想。

图1

即便如此,把数字货币方面搁到一边,还有一个可以说是更有趣更深远的创新,即底层的区块链技术。无论你对比特币或是它的山寨币衍生品有什么看法,作为一种货币和价值存储手段,它们背后的运作基础都来自于中本聪概括的区块链原理:

我们运用点对点网络提出了重复花费问题的解决方案。网络通过将交易散列到一个进行中的基于散列的工作量证明链,来对交易进行时间戳标记,并形成一个记录,这个记录只有在重做工作量证明的情况下才能被改变。最长的链不仅作为它所见证事件发生时序的证据,而且也证明它来自最大的 CPU 功率池……网络本身要求架构最小化。

区块链对任何“货币”都是不可知的。事实上,它可以适用于促成很多其他使用案例。因此,理解“最小可行区块链”背后的方法和原理是有好处的:

以下将从头开始解释为什么需要特定的部分(数字签名、工作量证明、交易区块),以及它们如何集合起来形成具有卓越性能的“最小可行区块链”。

用三式记账法保障交易安全

Alice 和 Bob 是集邮爱好者,偶尔会做做交易。如果双方都看到喜欢的东西,可以当场协商完成交换。换言之,这是个简单的以物易物的系统。

有一天 Bob 拿来一枚邮票,Alice 觉得她必须要收藏,但问题是 Bob 对 Alice 所提供的交换物不是特别感兴趣。Alice 沮丧不已,她继续和 Bob 协商,最后达成一致:他们做个单方交易,Bob 先把邮票给 Alice,Alice 承诺以后再偿还 Bob。

Bob 和 Alice 已经认识有一阵子了, 但是为了确保两个人都信守承诺(主要是 Alice),他们同意让朋友 Chuck 来对交易“进行公证”。

图2

他们把图2这个可以表明 Bob 给了 Alice 一枚“红色邮票”的交易收据做了三个副本(三方各持一份)。Bob 和 Alice 可以用收据来记录他们的交易, Chuck 存储副本作为交易证据。这个设定很简单,但其中有一些很重要的属性:

  1. Chuck 可以鉴定 Alice 和 Bob 两个人的真实性,以确保不会有人在他们不知情的情况下蓄意伪造交易。
  2. Chuck 账簿中的收据证明了交易发生。如果 Alice 声称交易从未发生,那么 Bob 可以去找 Chuck,用他的收据来证明 Alice 说谎。
  3. 如果 Chuck 的账簿中没有收据,就证明交易未发生过。Alice 和 Bob 都不能伪造交易。他们可以伪造交易收据,声称对方说谎,但同样的,他们可以去找 Chuck,查看他的账簿。
  4. Alice 和 Bob 都不能篡改当前的交易。如果任意一方篡改了交易,他们可以去 Chuck 那儿,用储存在 Chuck 账簿中的副本核实他们的副本。

以上操作就是“三式记账法”,操作简便,对参与双方都能提供很好的保障。但你也看到了它的缺点,对吧?我们对中间人寄予了很大的信任。如果 Chuck 决定和另一方串通,那么整个系统就土崩瓦解了。

用公钥基础设施(PKI)保障交易安全

Bob 不满于使用“可靠中间人”的不安全性,他决定研究一下,发现公钥密码可以免去使用中间人的需要!这里解释一下:

公钥密码,也叫做不对称密码,指的是一种密码算法,它需要两个单独的钥匙,一个是秘密的(私有的),另一个是公共的。尽管这个钥匙对应的两部分不同,但有数学联系。公钥用于对纯文本加密或者查验数字签名;私钥用于解密密码文本或者创建数字签名。

运用第三方(Chuck)的原本意图是要确认有三个属性:

  1. 验证真实性:不能有恶意的一方伪装成其他人。
  2. 不可否认性:事实发生后,参与方不能声称交易没有发生过。
  3. 完整性:事实发生后,不能再修改交易收据。


结果是,公钥密码可以满足以上所有要求。简单地说,工作流程如图3所示。

  1. Alice 和 Bob 分别生成一个固定的公钥-私钥对。
  2. Alice 和 Bob 公布出他们的公钥。
  3. Alice 以纯文本的形式写一个交易收据。
  4. Alice 用她的私钥对交易信息的纯文本进行加密。
  5. Alice 在密码文本上添加一个“由……签名”的纯文本备注。
  6. Alice 和 Bob 都储存相应的输出结果。

注意只有在多方参与的时候才需要第五步:如果你不知道是谁签署了信息,就不知道该用谁的公钥来解密,这个问题很快就会变得有关紧要。

这看起来像是没什么特别理由的大量工作,但我们还是来检验一下新收据的属性:

  • Bob 不知道 Alice 的私钥,但问题不大,因为他可以查询她的公钥(公钥是全世界共享的),然后用公钥来解密交易的密码文本。
  • Alice 并不是真的在给交易内容“加密”,而是通过使用她的私钥给她“签名”的交易编码:任何人都可以用她的公钥对密码文本进行解密,由于她是唯一拥有私钥的人,这个机制保证了只有她能生成交易的秘密文本。

Bob 或针对这个问题的任何其他人,如何获得 Alice 的公钥?有很多种方法来分发私钥——例如,Alice 公布在她的网站上。我们可以假定有这样的合适的机制。

因此,使用公钥基础设施(PKI)可以满足我们之前所有的要求:

  • Bob 可以用 Alice 的公钥通过解密密码文本来证明签名交易的真实性。
  • 只有 Alice 知道她的私钥,因此 Alice 不能否认交易的发生——她已经签名了。
  • 没有 Alice 的私钥,Bob 或任何其他人都不能伪造或修改交易。

  • 注意第二条,Alice 可以否认她是那个有争议的公钥——私钥对的真正所有者。
  • Alice 和 Bob 只储存了签名交易的副本,消除了对中间人的需要。“神奇”的公钥密码和双方以物易物系统完美匹配。

余额 = Σ(收据)

随着公钥基础设施到位,Bob 和 Alice 又完成了一些交易:Alice 从 Bob 处得到另一张邮票,Bob 从 Alice 那儿也挑了一张邮票。它们都按照与之前相同的步骤,生成签名交易并将它们附加到各自的分类账簿中。

记录是安全的,但有一个小问题:不清楚是否任何一方有未结余额。先前只有一个交易,很清楚是谁欠谁的(Alice 欠 Bob)以及欠了多少(一枚红色邮票),但是有多个交易以后,情况变得模糊起来。所有的邮票都是等值的吗?如果是,那么 Alice 有一个负余额。如果不是,那就谁也说不准了!为了解决这个问题,Alice 和 Bob 达成一致如下:

  1. 黄色邮票的价值是红色邮票的两倍。
  2. 蓝色邮票和红色邮票等值。

最后为了确保他们新协议的安全性,他们用交易的相对值更新了每个交易,重新生成了分类账簿。新的账簿看起来像图5那样。

图5

这样,计算最终余额现在变成了一个简单的事,循环访问所有的交易,将适当的借贷记录应用于各方。最终结果是 Alice 欠 Bob 2个“价值单位”。什么是“价值单位”? 它是由 Alice 和 Bob 都同意的任意交换媒介,另外,由于“价值单位”并不耳熟能详,Alice 和 Bob 同意将1个价值单位称为1个 chroma(复数形式:chroms)。

上面这些看起来都是小事,但每一个参与者的余额都是分类账簿中所有收据的一个函数这一事实有重要的意义:任何人都可以计算大家的余额。不需要任何可靠的中间人,也不必对系统进行审计。任何人都可以遍历整个分类账簿,核实交易,计算出每一方的未结余额。

多方转移和验证

接下来,Bob 无意中发现 John 有一枚邮票,他实在很喜欢。他告诉 John 他和 Alice 在使用的安全分类账簿,并问他是否愿意做个交易,Bob 把 Alice 欠他的余额作为支付手段转移给 John——即 Bob 从 John 那儿获得邮票,Alice 之前欠 Bob 的金额将变成她欠 John 的。John 同意了,但现在他们有个问题:Bob 如何能以安全和可验证的方式把他的余额“转移”给 John?经过一番协商,他们想出一个巧妙的计划(如图6所示)。

图6

Bob 按照与之前相同的步骤创建了一个新交易,不过他先计算出他想要转移的加密交易的 SHA-256 校验和(一个唯一的指纹),然后将校验和嵌入新收据中“是什么”一栏。事实上,他在将之前与 Alice 的交易与新的转移收据链接起来,这样就把它的价值转移给了 John。

为了保持事物的简单性,我们假定所有的转移都会“消费掉”被转移交易的全部价值。要把这个系统扩展到使部分转移成为可能并不难,但此时没有必要考虑得那么复杂。

随着新交易到位,John 为了安全起见,做了一个加密分类账簿的副本(现在有三个副本)并运行了一些检查来验证它的完整性:

  1. John 提取了 Alice 和 Bob 的公钥,验证前三个交易的真实性。
  2. John 证实了 Bob 转移的是一个“有效”交易:
    • 待转移交易的地址是 Bob。
    • Bob 此前没有把这个交易转移给任何其他人。

如果所有检查都通过了,他们就完成交易,我们可以通过遍历分类账簿来计算新的余额:Bob 有一个净零数余额,Alice 有2个 chroma 的借额,John 有2个 chroma 的贷额(由 Alice 提供)。这样 John 现在就可以把他的新分类账簿拿给 Alice 并要求她支付,即使 Alice 没有出席交易,也没有问题:

  1. Alice 可以用 Bob 的公钥核实新转移交易的签名。
  2. Alice 可以核实转移的交易是对她和 Bob 一个有效交易的引用。

以上转移和验证过程是系统一个了不起的属性!注意要让它全部能工作,我们需要两个使能技术:一个是公钥基础设施的运用,使数字签名验证成为可能;另一个是收据账簿,使我们能够查看完整的交易记录以验证余额并链接先前的交易来进行转移。

John 和 Bob 对这个巧妙的解决办法很满意,然后两人分头回家:Bob 带着新邮票,John 有了新的分类账簿。表面上看一切完美,但是他们刚刚把自己暴露在了一个极具挑战性的安全问题之下……你发现了吗?

重复消费和分布式一致性

在与 John 完成交易后不久,Bob 意识到他们刚刚在他们的系统中引入了一个严重的漏洞,如果他迅速行动,就可以利用这个漏洞:Bob 和 John 都更新了他们的分类账簿来包括新的交易,但是 Alice 和其他任何人都不知道交易已经发生。结果是,没有什么能阻止 Bob 接近网络中的其他人,给他们展示旧的账簿副本,而旧的账簿副本里没有他和 John 的交易!如果 Bob 说服他们进行交易,就像他和 John 做的那样,他就可以“重复消费”同一个交易,想进行多少次都可以!

当然,一旦多人拿着新的分类帐簿要求 Alice 支付,欺诈行为将被检测到,但这已经无济于事了——Bob 已经带着战利品跑掉了!

只有两个参与者的时候,不可能受到双重消费攻击,因为要完成交易,你要验证并同时更新两个分类账簿,因此所有分类账簿始终保持同步。然而当我们再添加另外一个参与者时,我们就引入了各参与者之间账簿不完全和不一致的可能性,这就使双重消费成为可能。

在计算机科学语言中,双方分类账簿具有“强一致性”,超过两方的分类账簿则需要某种形式的分布式一致性以解决双重消费的问题。

这个问题最简单的可能的解决方案是要求分类账簿中列出的各方都必须在每个新交易发生时都在场,以便每个人可以同时更新他们的账簿。这个策略对小型的群组有效,但不能扩展到有大量参与者的情况。

分布式一致性网络的要求

我们来设想一下,我们想要将分类账簿扩展到全世界所有集邮者,这样任何人都可以用一种安全的方式交易他们喜欢的邮票。显然,由于地理位置,时区和其他限制,要求每个参与者在每个交易登记的时候都在场是不可能实现的。我们能建立一个不需要每个人都在场批准的系统吗?

  1. 地理位置算不上一个真正的问题:我们可以把交流转移到线上。

  2. 时区问题可以通过软件解决,我们不需要每个人手动更新分类账簿。相反,我们可以建立一个软件,它能在每个参与者的计算机上运行并代表他们自动接收、批准以及向分类账簿添加交易。

事实上,我们可以建立一个点对点(P2P)网络,负责分发新的交易并获得每个人的批准! 但很可惜,说起来容易做起来难。例如,虽然 P2P 网络可以解决我们的地理位置和时区问题,但试想即便只有一个参与者离线,会出现什么情况? 我们是不是要阻止所有交易,直到他们再次上线?

注意,“如何”构建 P2P 网络本身就是一个庞大的课题,构建这样一个网络的底层机制也远超出我们讨论的范围……我们把它作为一个练习留给读者。

原来分布式一致性的问题在计算机科学中已经被深入研究过,并且已经提出了一些有希望成功的解决方案。例如,两阶段提交(2PC)和 Paxos 都使这样一种机制成为可能,即我们只需要参与者的大多数法定人数(50%以上)接受就能安全地提交新的交易:只要大多数人已经接受交易,就能保证群组中剩下的人最终汇合在同一个交易历史。

即便如此,单单有 2PC 或 Paxos 是不够的。比如,在每天都有新参与者加入而其他人不预先通知就消失的情况下,2PC 或 Paxos 如何知道我们 P2P 集邮者网络中的参与者总数?如果有一个先前的参与者离线,他们是临时还是永久离线? 相似地,还有另一个我们必须考虑的更具挑战性的“Sybil 攻击”:没有办法阻止一个恶意参与者创建许多档案,以在我们的 P2P 网络中获取不公平的投票权份额。

如果系统中的参与者数量是固定的,并且已经验证他们的身份真实有效(也就是说,这是一个可信网络),那么 2PC 和 Paxos 都会工作得很好。但我们不断变化的集邮者 P2P 网络并不是这样的情况。我们走进死胡同了吗? 嗯,并不尽然……

这个问题有个明显的解决方案是从问题陈述中消除“分布的”部分。我们可以不建立一个 P2P 分布式系统,而是建立一个所有集邮者的全局注册表,记录他们的帐户信息,对他们进行验证并(尝试)确保没人能通过创建多个身份作弊,最重要的是,保证有一个共享的分类账簿副本!具体来说,我们可以建立一个网站,这些交易在网站上进行,网站将在它的集中式数据库里记录所有的交易,以此确保交易的完整性和正确排序。

以上是一个实用的解决方案,但我们得承认,它不尽如人意,因为它迫使我们失去了分类账簿系统点对点的性质。它将所有的信任置于一个单一的集中式系统,这就带来了一组全新的问题:什么是系统的正常运行时间,安全性和冗余;谁来维护系统,他们维护系统的动因是什么;谁有管理访问权限等等。集中式带来了它自己的一系列挑战。

让我们回顾一下在 P2P 设计中遇到的一些问题:

  1. 确保每个参与者始终保持更新状态(强一致性系统)会产生很高的协调成本,影响可用性。如果单个点不可达,整个系统都无法提交新交易。
  2. 在实践中,我们不知道 P2P 网络的全局状态:参与者人数,个体是暂时离线还是决定离开网络等。
  3. 假设我们可以解决

本文标签: 区块深入浅出