撰文:blockpunk

5 月 27 号,ICP League 联合社区开发者举办了第一期的开发者电话会,探讨了 DFINITY 的全体架构,并聊到了 DFINITY 最重要的原子性问题。

本期亮点:

  • ETH 是状况更新机器,DFINITY 是音讯与恳求的处理机器;

  • DFINITY 架构上是一种多子网结构,而且没有总线 / 主链 / 中继链 / 信标链的结构;

  • DFINITY 底层为 actor 编程模型,容器(即智能合约)间相互调用是异步操作,需求相互等候,子网间的调用也是异步的;

  • DFINITY 损失了一部分原子性,这对 DeFi 的开发者来说是一个应战,学习传统互联网对业务的处理方法会有所协助。

DFINITY 网络怎么组成?

在我之前的文章《「代码即服务」:DFINITY 互联网核算机的架构解析》里我曾介绍过 DFINITY 的全体架构,在主网上线阅读了中心代码后,咱们得以更具体的窥视其内部结构。

解析 DFINITY 网络架构、原子性与编程范式

DFINITY 基于区块链核算协议 ICP 运转,采用了分层结构,从底层到顶层依次为:数据中心、节点、子网、软件容器。

解析 DFINITY 网络架构、原子性与编程范式

DFINITY 的最底层是保管专用硬件的独立数据中心,这些数据中心运转在全球各地,现在全球现已有 53 个数据中心,年底将超过 500 个。数据中心对硬件与网络状况的要求较高,硬件也具有特殊要求,需求大量 RAM 而无需硬盘。数据中心想要进入 DFINITY 网络,需求获得去中心化管理体系 NNS 的投票许可,而这种投票往往产生在需求扩容时。

解析 DFINITY 网络架构、原子性与编程范式

数据中心的机器运转 DFINITY 节点程序,这个程序会依据功能虚拟化出一系列核算资源标准化的节点,这些节点会组成 DFINITY 的区块链,处理核算、达到共同、出块并同区块。

这些节点随机地(跨多个数据中心)被 NNS 结合到一同,构成一个个子网。子网数量也不是固定的,而是随着网络的资源运用情况动态地增加、合并。这个子网类似于 ETH2.0 中的分片,或者是平行链,一个节点组只能组成一个子网,每一个子网内部都运转着自己的共同。子网的出块速度为一秒一个区块,且不同的子网同步并行出块。

而在不同的子网上承载着「容器」,容器中运转着业务逻辑。能够把容器看作智能合约的升级版别,容器也具有内存,现在上限为 4G,能够存储业务相关数据,也能够寄存前端资源。

与从传统区块链的架构不同

ETH 是一台同步的状况更新机器,由买卖触发智能合约,对状况进行共同;而 DFINITY 是一台异步的音讯处理机,容器一起进行音讯的接收、核算、回来,对音讯的处理顺序共同。容器间不会同享状况,只会经过通讯来处理业务。

ETH 2.0、波卡、Layer2 其实都归于分层架构,这种架构仍然存在着瓶颈,无法无限扩容,并不是终极计划。即便咱们能够把不同的运用分配在不同的 layer2/ 平行链 / 分片上扩展功能,但 layer2 间 / 片间 / 平行链间的通讯仍然要经过总线,而总线本身的功能上限决议了体系的功能上线,是确定的。

但与分片 / 多链架构不同的是,DFINITY 没有总线 / 主链 / 中继链 / 信标链的规划,子网之间是完全对等的,任意两个子网都能经过自己的链签名业务,经过业务直接交互,而不需求经过某个上层调度链,因而子网的数量不是固定,能够按需无上限增加,从而终究完结无限扩容。

解析 DFINITY 网络架构、原子性与编程范式

原子性问题

全部即 actor,DFINITY 运用的编程模型与传统区块链有必定差异,反而与传统互联网的 akka 类似。

DFINITY 中的智能合约(即容器)之间的交互也与以太坊不同,DFINITY 的智能合约内部是向存在一个唯一线程,但是容器之间的交互是经过发送异步音讯进行,因而容器间能够进行异步操作。假如一个容器向另一个容器发送恳求后,需求等候另一个容器的处理结果,才干进行下一步操作。

DFINITY 中存在许多个对等的子网,智能合约会随机的布置上子网。对于布置合约的开发者与运用合约的用户来说,他们并不知道这个合约运转在哪一个子网中,由于片间通讯是无感的。在同一个子网的两个容器的交互,与在不同子网上两个容器的交互,在延迟、安全性、杂乱度上都没有不同,因而无法感知到子网之间的不同。这也是异步音讯体系的好处。

解析 DFINITY 网络架构、原子性与编程范式

这样 DFINITY 获得了近乎无限的扩容才干,大大提升了通用核算才干。但这也导致了合约间的交互失去了原子性,而在以太坊上运用原子性特点完结了许多共同的服务,比方 DeFi 的闪电贷清算机制。

在失去了原子性后,开发者面对着新的应战,特别是在完结 DeFi 运用上,假如仍然依照过去以太坊上的编程范式,这导致买卖失利后状况无法恢复的问题。

比方,假如在 DFINITY 上完结了规划多个容器交互的杂乱运用,比方一个假贷运用,需求与安稳币、借出代币、流动性凭证三个合约交互,三个合约都成功调用才干完结假贷。但假如强行在 DFINITY 完结以太坊范式的调用,假如其中两个合约成功,而最后一个调用没有响应,那么假贷买卖会失利,而且前两个合约的状况却现已完结,就会卡住,而不会退回去。表现在用户这边,就是钱现已质押上去,代币现已扣走,却无法完结假贷,也没有收到退款。

探究新的编程范式

显然想要在 DFINITY 确保安全性地完结杂乱运用,咱们需求探究新的范式。

终究共同性与确定性在传统互联网的分布式架构下有一些处理计划,这是值得咱们学习的。DFINITY 上的智能合约需求重视的是数据的终究共同性,从写入和读取入手。

首先当咱们需求很强安全性确保时,可能把整个一切的逻辑放在一个容器里面。主要在一个容器中,一切的买卖都是原子性的,这儿确保了业务与数据两个层面的共同性。但这种方法面对着扩容的噩梦,显然是偷闲的做法。

传统互联网其实重视的是数据库中数据的共同性,而在 DFINITY 中其实分为两个部分:一个是业务层面的,这部分是能够经过更新合约改变的,咱们其实不太需求确保这儿的原子性;而还有一部分是数据层面的,也就是进入正交持久性的数据,落盘的数据,这才是咱们需求确保共同性与原子性的地方。

在 DFINITY 中有运用了名为 stable 的变量类型来界说落盘的数据,这其实类似于传统的数据库,现在也有多个团队在做 DFINITY 的数据库引擎,有了这个底层落盘数据的共同性与原子性,上层的业务的安全性就依托数据来确保共同性。

假如是学习本来分布式业务的概念,咱们有四种方法完结这个才干:

  • tcc 两头业务提交,这是现在银行转账运用的机制,在买卖产生时咱们先直接更新数据库的 stable 的终究共同数据,等我们都确认清楚后,再去提交。

  • saga 的业务处理机制,首先树立一个业务协调程序,当某个容器需求发起一次跨合约的调用时能够向业务协调程序请求一个 ID,并经过这个 ID 向业务的终结程序汇报,最后我们都提交成功后,再进行全体的提交。

  • 运用业务观察者模式,对 stable 的状况进行包装,每逢产生状况的更新操作时,观察者都去记载更新前后的两个值,假如发现某一个业务失利,观察者会就运用之前的值回滚操作。

关于容器数据扩容

DFINITY 的优势在于大规模高功能的去中心化数据库存取,DFINITY 的程序以容器为单位运转,容器中会存储业务相关的数据库,且容器之间不会同享状况数据。而现在 DFINITY 容器存储上限是 4G,假如一个业务容器的 4G 存满之后,容器就需求面对扩容的问题,该怎么处理?

现在 DFINITY 能答应容器在存储与带宽等资源即将耗尽时,主动 Fork 出一个新容器进行扩容。新的容器中只保存了最近的状况数据,会丢掉前史。两个容器间仍然经过异步调用来完结交互。

一起,在规划容器时,需求把各种等级的数据分开寄存。举个比如,假如直接在 DFINITY 上树立一个钱包容器,买卖记载的数据量会比用户地址的数据大许多。假如这时候把这两类数据放入一个容器,就会影响后续的扩容才干。

因而咱们需求把对终究共同性要求相同的数据放在一同。比方在将钱包的余额与地址放在一同,而买卖记载就能够经过分片寄存在不同的容器中。从而完结体系的主动弹性扩容。

视野开拓

与18世纪的经济相比,今天的经济所依靠的要是企人和企业的专业化分工,并通过广泛的贸易网进行协作。专业化程度的不断加深使得特定职业工人的劳动生产率获得提高,并利用其产出交换到所需商品,这使西方经济获得了迅速的增长。-《经济学(第十九版)》

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注