以太坊,IPFS / Filecoin和BigchainDB之间是如何互补的呢?那么Golem,Polkadot或Interleger又是如何互补的呢? 我经常得到这样的问题。 所以,我决定写一篇文章,阐述我是如何通过第一原则框架来回答这些问题的。
最简单的答案是:从来就没有一个叫做“区块链”的神奇系统,能够神奇地完成所有事情。 而是现实中存在一些很好的计算构建区块可以一起创建高效的去中心化应用程序。 以太坊可以发挥作用,BigchainDB也可以发挥作用,还有更多区块链系统同样也可以。 让我们探讨一下这个问题...
背景
计算的核心元素是存储,计算和通信。大型机,PC,移动设备和云都以自己独特的方式展现出这些元素。 相应的也出现了专门的构建区块,以协调给定元素内的权衡。
例如,在存储元素中,我们同时拥有文件系统和数据库,其中文件系统用于存储具有目录和文件层次结构的存储blobs(BLOB,二进制大对象,例如MP3s),数据库用于存储像SQL [1]等具有查询接口的结构化元数据。 在中心化的云中,我们可能会使用Amazon S3进行Blob存储,MongoDB Atlas数据库和Amazon EC2进行处理。
本文重点介绍区块链架构概览:每个计算元素的区块,以及展示每个元素区块的一些系统示例。 对于每个区块,我将重点放在全面的阐述上。
区块链构建区块
下面是计算的三元素,以及相关的去中心化构建区块:
* 存储:代币存储,数据库,文件系统/blobs
* 处理:状态业务逻辑,无状态业务逻辑,高性能计算
* 通信:连接数据,价值和状态的网络
区块链底层架构概览:
如下图所示,区块链技术由下面的各个区块展示出来:
存储
基本计算元素存储有以下的构建块。
代币存储。 代币是价值的存储单位(例如资产、证券),无论是比特币,航空里程还是数字艺术版权。 代币存储系统上的主要操作是发行和传输代币(代币同时具有许多变体),同时防止双花等问题。
比特币和Zcash是两个著名的“纯粹运行”系统,其主要功能专注于代币。 以太坊恰好使用代币来服务于其成为世界电脑的使命。 这些都是代币作为运行网络基础设施内部激励的例子。
其他代币并不通过内部激励的方式来支撑一个网络,而是在较低级别的基础设施存储代币的高级别网络中作为激励的方式来支撑网络。 一个例子是运行在以太坊主网上的ERC20代币(比如Golem(GNT))。 另一个例子是Envoke的IP授权代币,在IPDB网络上运行。
最后,我给出一个列表来展示大多数区块链系统具有一个代币存储机制。
数据库。数据库专门存储结构化元数据,例如表(关系DB),文档存储(例如JSON文件),键值存储,时间序列或图表; 然后通过查询(例如SQL)的方式来快速检索该数据。
MongoDB和Cassandra这样的传统分布式(但是是中心化的)数据库通常会存储数百Terabyte,甚至是数百Petabytes的数据,吞吐量每秒可能超过100万次,就像这里一样。
诸如SQL的查询语言是具有深厚意义的,因为它们将实现(implementation)与规范(specification)分开,因此不受任何特定应用程序的约束。 SQL已经成为数十年的标准。这就是为什么同样的数据库系统也可以用于许多不同的行业。
换个角度来说:在没有任何特定应用程序的代码的情况,要将比特币推广应用到更多的应用程序,你不需要一路开发到其具有图灵完整性。 你只需要一个数据库。 其在简单性和规模上具有相应的优势。 但是在某些方面还是有很大的理由去实现图灵完整性。 我们在“去中心化处理”部分进一步讨论这点。
BigchainDB是去中心化数据库软件; 具体的来说其就是一个文件存储站。 建立在MongoDB(或RethinkDB)上,它继承了Mongo的查询和扩展。 但它也具有去中心化控制,防篡改和代币支持等区块链-y特征。 IPDB是BigchainDB的公共网络实例,其具有治理的功能。
同样在区块链领域中,我们可以将IOTA视为时间序列数据库,如果我们仔细一点看的话。
*文件系统/数据blob存储。 *这些都是存储大型文件(电影,mp3,大型数据集)的系统,它们有组织的存储在目录和文件的层次结构中。
IPFS和Tahoe-LAFS是将去中心化或中心化blob存储联合到一起的去中心化文件系统。 FileCoin,Storj,Sia和Tieron都做去中心化的blob存储。 好用的旧系统BitTorrent也是如此,尽管它采用了tit-for-tat的方案而不是代币。以太坊蜂群、Dat和Swarm-JS基本上两种方式都采用了。
处理
让我们来讨论下处理这个基本计算元素。
“智能合约”系统是以去中心化方式处理的系统的流行标签[2]。 这实际上包含了两个属性非常不同的子集:无状态(组合)业务逻辑和状态(顺序)业务逻辑。 无状态和有状态在复杂性、可验证性等方面产生了根本性的差异。第三个去中心化处理构建块是高性能计算(HPC)。
无状态(组合)业务逻辑。 这是在内部不保留状态的任意逻辑。 在电气工程方面,它可以被组合为组合数字逻辑电路。 该逻辑可以被表示为真值表,原理图或具有条件语句的代码(如果/然后,或,和,非语句的组合)。 由于它们没有状态,所以很容易验证大型无状态智能合约,因此建立大型验证/安全系统。 N个输入和一个输出需要O(2 ^ N)个计算来进行验证。
交换协议(ILP)包含纯粹用于指定组合电路的加密条件(CC)协议。 你应该对CC有所了解,因为它正在通过IETF成为一个互联网标准,并且因为ILP在中心化和去中心化支付网络(例如,超过75个使用Ripple的银行)中得到广泛采用。 CC在JavaScript,Python,Java等多方面具有独立的实现。 BigchainDB,Ripple等系统使用CC; 因此支持组合业务逻辑/智能合约。
由于状态逻辑是无状态逻辑的超集,因此支持状态逻辑的系统同时也支持无状态逻辑(虽然牺牲了额外的复杂性和可验证性挑战)。
状态(顺序)业务逻辑。 这是在内部保留状态的任意逻辑。 也就是说,它具有内存。 或者说它是至少具有一个反馈回路(以及一个时钟)的组合逻辑电路。 例如,微处理器具有一个根据发送给它的机器码指令进行更新的内部寄存器。 更一般地说,状态业务逻辑是一个图灵机,它接收一系列输入,并返回一系列输出。 显示这种特性(实际意义上的类似)的系统称为图灵完整系统[3]。
以太坊是最著名的能够表现出直接能在链上运行的状态业务逻辑/智能合约。 Lisk,RChain,DFINITY,EOS,Tezos,Fabric,Sawtooth等等许多其他的区块链同样也实现。 运行“just out there, somewhere”的代码是一个强大的概念,有很多用例。 这有助于解释为什么以太坊起飞了,为什么它的生态系统已经发展到它几乎是一个独立的平台,为什么在这个构建块中出现了如此多的竞争。
因为顺序逻辑是组合逻辑的一个超子集,所以这些系统也支持组合逻辑。
代码中出现的小错误可能会带来严重后果,就像DAO遇到黑客那样。正式验证可以帮助解决这个问题,就像它帮助芯片业一样。以太坊基金会正在致力于此问题。但它有规模限制。对于组合电路,可能的映射数为2 ^(输入数量)。对于顺序逻辑来说,如果变量都是布尔值的话,则内部状态数是2 ^(内部状态变量的数量)。例如,如果你有一个输量为3的组合电路,它将具有2³= 8个可能的状态来验证。但是如果它是一个32位寄存器的顺序电路,那么要完全验证你必须检查2³²= 42亿个状态。这限制了顺序电路的复杂性(如果你想信任它们)。 “建设的正确性”是信任状态智能合约的另一种方法,如Rchain使用rho演算那样。
如果你想要去中心化处理,对于许多用例来说,有一个更简单的方法:只需在浏览器或移动设备内部客户端进行处理,即运行JavaScript或Swift。在这里,你必须相信在客户端上运行的处理,但是如果在你手中的设备上运行的话,这是通常是可以接受的。我们认为这是“胖客户端”对于“胖协议”框架的可替代性。这种架构对于主流的Web开发人员来说很容易理解。例如,许多webapps全部需要的只是应用程序状态。要构建这个,你只需要JS + IPDB(使用js-bigchaindb-driver)。或者如果你的应用程序还需要Blob存储和支付的话,那就包括JSFS客户端版本的IPFS(ipfs.js)和以太坊(web3.js)。这里有一个例子:
高性能计算(HPC)。这是为了渲染、机器学习、电路仿真、天气预报、蛋白质折叠等方面的进行“重量”计算的处理过程。 这里的计算任务可能需要几个小时甚至几周的时间才能在一组计算机(CPU,GPU,甚至TPU)上运行完成。
我知道的有下列这些去中心化HPC的方法:
- Golem和iEx.ec将其作为去中心化超级计算机与相关应用程序的组合构成。
- Nyriad将其作为存储处理。 基本上,处理过程位于去中心化存储的旁边(Nyriad也有相应解决方案)。
- TrueBit允许第三方计算,但是会进行后期计算检查(当有可能发生问题的时候隐含地检查;当问题引起的时候明确地检查)。
- 有些人只是在VM或Docker容器上运行大量的计算,并将结果(最终的VM状态,或刚刚计算得出的结果)放入具有受限访问权限的blob存储中。 然后,他们使用例如标记读取权限的方式来销售对这些容器的访问权限。 这种方法要求更多的客户来验证结果,但好的一方面是,今天所有这些技术都是可能的。 当TrueBit成熟时,这些技术将很自然的与TrueBit相结合。
通信
在这个部分,我们将介绍第三个也是最重要的基础计算元素——通信。目前来说有多种方式来实现通信;我将专注于连接网络。它有三个层次:数据,值和状态。
数据。在60年代的时候我们得到了ARPAnet。其成功孵化出与NPL和CYCLADES相类似的网络。但同时一个新的问题出现了:这些网络之间没有交流。 Cerf和Kahn在70年代发明了TCP / IP协议来连接它们,以创建一个连接各个网络的网络,我们现在称之为互联网。 TCP / IP现在是连接网络的现行标准。 OSI是一套相互竞争的协议,但它长期以来都在衰退(尽管讽刺的是,它的模型已被证明是有用的)。因此,尽管它历史悠久,TCP / IP仍然是一个去中心化的构建块,用于连接数据网络。
值。 TCP / IP仅连接数据级别的网络。你可以双重花费数据包 - 将同一个数据包一次发送到多个目的地,而且它不在乎这样做的后果。那么又如何连接那些你可以发送价值的网络?例如,从比特币到以太坊,甚至是SWIFT支付网络比如Ripple的XRP网络。你只希望你的代币一次只能发送到一个目的地。连接网络的同时又防止双重花费的一种方法是使用交易所。但是传统意义上却显得相当笨重。但是,你可以通过使用加密托管的方式来剥离交易所的本质,并消除对可信任中介需求。Alice可以通过Malory向Bob汇款,在这里Malory正在经营投资,但不能花费(而且有一个时间限制,以至于Malory不能永远固定资产)。这就是Interleger Protocol(ILP)背后的本质。这是与双向钉(思维侧链)和状态通道相同的概念思想(想想Lighting和Raiden);但重点在于连接网络的价值是100%。除了ILP,还有增加了更多的复杂性的Cosmos,其带来更多的便利。
状态。 我们可以发展到超越连接价值网络的情况吗? 想象一下一台计算机病毒,其自己的比特币钱包可以从一个网络跳到另一个网络。 或者在Ethereum mainnet中的智能合约可以将其状态移动到另一个以太坊子网或另一个兼容网络? 或者为什么将AI DAO限制在一个网络中?
这就是Polkadot出现的时机,连接状态网络。 Aeternity也适用于价值网络与状态网络区间的某个中间点。
例子
我们现在已经回顾了计算的三元素(存储,处理,通信),每个元素的去中心化构建块和每个构建块中的示例项目。
人们开始构建显示组合的系统。 一般一次有两个块的组合,通常是IPFS + Ethereum或IPFS + IPDB。 但是甚至有人使用三个或更多的块来进行组合。 这里有几个前沿的例子:
- 正如这所示,Ujo使用IPFS | Swarm + IPDB + Ethereum进行去中心化音乐存储。 IPFS或Swarm用于文件系统和blob存储。 IPDB(使用BigchainDB)用于元数据存储和查询队列。 以太坊用于代币存储和状态业务逻辑。
- Innogy在供应链/ IoT应用程序中使用IPFS + IPDB + IOTA。 IPFS用于文件系统和Blob存储。 IPDB(使用BigchainDB)用于元数据存储和查询队列。 IOTA用于存储时间序列数据。
相关工作
这部分是区块链社区内的其他人创作的相关框架; 所有的这些人我都很荣幸与他们交流过。
Joel Monegro的“胖协议”框架强调每个构建块作为一个协议。我认为这是一个很酷的架构方式,尽管它限制了构建块通过网络协议进行交互。但还有另一种方法:区块可能只是一个“导入import”语句或库调用。
使用导入import的原因可能是(a)更低延迟:网络调用需要时间,这可能会伤害或毁灭可用性; (b)简单性:使用库(甚至嵌入式代码)通常比在网络上连接,支付代币等方式简单;和(c)更成熟:协议栈现在正在出现。我们有发展几十年年的Unix库,即使是Python和JS块也都可以追溯到15年以上。
Fred Ehrsam的“Dapp开发者堆栈”重点介绍了网络商业模式。虽然它也非常有用,但它并不旨在在给定的计算元素(例如文件系统与数据库)之间对块进行非常细致的区分。
BigchainDB白皮书(第一次发布与2016年2月)如图1给出了这个帖子堆栈的早期版本。为方便起见,下面就是:
它专注于处理,文件系统和数据库的构建块。它没有从“计算元素”的角度来构建,也没有区分去中心化处理的类型。我在这篇文章中写的是过去一年半以来我从这篇论文中的思考演变;我在谈话中不断更新我的思想认知,例如我5月22日在共识2017上的讲话,这与本文非常相似。 (我写这篇文章的一部分原因是我收到很多邀请让我把这些东西放到文章中:)
这张图像还强调了存在完全中心化(左)到完全去中心化(右)之间频谱。这有助于更新现有的软件系统,以便随着时间的推移更加去中心化,着重于更新去中心化用处最大的块。
Stephan Tual的“Web 3.0 Revisited”堆栈在精神上类似于这篇文章,尽管其专注点更在于以太坊。它试图通过制作将许多项目组合成相似构建块的地图,为社区提供了良好的服务。这个想法与我自己想法的相似度让我感到惊讶。然而,它服务应用程序层的区块(消息传递,存储,共识,治理等所用的块)实际上是混合了三种东西:应用程序,“what”和“how”。对我来说,块应该是“what”。所以,消息传递是一个应用程序(应该在应用程序级别);存储需要更加细致;共识是“how”的一部分(隐藏在一些块内);治理也是“如何”的一部分(因此也是隐藏的)。它也有作为一个单独的低级块的[网络]协议,虽然我认为那些是区块可以相互通信的可能方式之一,包括库调用。尽管如此,我认为这仍然是一个很好的文章和堆栈:)
Alexander Ruppert的“映射去中心化世界”大约有20个组织的分组,x轴给出了从基础设施层到应用层的四个高层次的组合,但以中间件和流动性作为中间层。这也是一件很棒的工作,我很高兴帮助Alex映射出来。它对核心基础设施的关注较少,更多地侧重于广泛的趋势;而这一切都是关于第一原则框架的核心基础设施。
未来
像Ujo这样的系统将许多块组合在一起,例如IPFS或Swarm(用于blob存储)+ 以太坊(用于代币业务和业务逻辑)+ IPDB&BigchainDB(用于提供具有快速查询的数据库),因此利用了所有这些系统的优势。
我希望随着人们更好地了解构建块的之间相关性,这种趋势将加速。 它也比将所有内容都整合成一个称为“区块链”的整体更有效率。
随着去中心化生态系统的演变,我期望这个堆栈不断发展。 AWS开始时只是一个服务:S3用于blob存储。 然后加工处理后得到:EC2。 它一直在发展前进;这里是完整的时间表。 AWS现在有超过50多个块; 尽管当然还有一小部分是最重要的。 以下是所有AWS服务的图片。
2017年6月15 aws.amazon.com提供服务的截图
我在去中心化领域设想了类似的事情。 作为第一次削减,我们可以想像每一个AWS块的去中心化版本。 然而,还是会存在差异,因为每个生态系统(云vs移动vs去中心化)都有其自己的特殊区块,例如用于去中心化的代币存储。 这将是一段有趣的旅程!
注释
[1]实际上你可以将进一步的层次结构放在这些构建块中。例如。数据库位于文件系统之上,文件系统位于原始数据(blob)存储上。分布式数据库涉及通信。例如,大多数现代数据库通过文件系统(如Ext4,XFS或GridFS)与底层存储器通信。本文中给出的框架是应用程序员的框架:文件系统的UX,数据库的UX等等。
[2]我从来没有真正意义上的喜欢标签“智能合约”。这个词在任何人工智能意义上都算不上很智能。且它们通常与任何法律意义上的“合约”无关。如果他们确实包括法律,他们通常会像Ricardian Contracts那样称述。“去中心化处理”这个标签及其包含的“去中心化的业务逻辑”更讲得通。然而,鉴于“智能合约”现在已经广泛使用,所以就这样。我有更好的事情要关注,而不是在标签这个话题上浪费时间:)
[3]我在这里说到“图灵完备”是在实际应用方面,而不是在理论纯粹意义上。理论意义是指:机器返回一串输出位作为输入位及其当前内部状态的函数;但是在无法永久运行或声称解决“机器停止运行”问题(停止问题)的意义上是实用的。