【Dfinity完整概述】一文带你读懂Dfinity的链上运行

图片

区块链的发展历史一共分为3分里程碑意义:2009年比特币点对点支付系统诞生—数字通证的区块链化,2015年以太坊智能合约带来的DeFi运动—智能合约的区块链化,2021年Dfinity无限区块链—所有的所有都在链上,本期文章带各位小伙伴一起探讨一条无限区块链是如何运作的。

图片

IC网络与传统区块链网络最大的不同在于网络架构,传统区块链网络采用阶梯式架构,而IC网络采用的是积木式架构:底部是专用硬件节点的独立数据中心,这些被托管的节点机器组成子网分片链,子网上承载着Canisters,这些Canisters是组成IC Dapp关键计算单元,IC网络中的一切都遵循区块链计算机ICP协议工作, 使IC网络独一无二的是由ID为tbd26子网上32个Canisters组成的一套算法治理系统(NNS)。

图片

NNS主要负责控制、配置、和管理网络:引入新的数据中心需要向NNS申请加入IC网络,NNS不仅是开放式治理系统,它还监督参与网络的权限,从某种意义上来说,它在IC网络上相当于是ICANN的角色。NNS不仅为那些想要运行BGP路由器的人分配自治编号,NNS还履行广泛的网络管理角色职责,包括监视节点机器和查找IC网络上的统计偏差。

图片

NNS在网络的代币经济学中也发挥着关键作用:NNS生成新的ICP通证来奖励运行的节点和在NNS内投票的神经元,NNS在IC网络中的主要作用是开放式Dao治理,和传统区块链网络治理架构(治理权只在少部分人受理,普通用户几乎没有参加治理的权限)最大的不同就是NNS向所有持有ICP代币神经元用户开放。

图片

要了解Dfinity,必须先了解子网的概念:子网是整个IC网络的基本构建区块基础部分,子网负责托管Canisters的不同子集,子网是通过将来自不同数据中心的节点机器以NNS控制的方式组合在一起创建,这些点机器遵循ICP协议协作,以便对称的复制与它们托管的软件Canisters相关的数据和计算。IC网络拥有多个子网分片链,每一个子网相当于一条链。

图片

NNS在构建子网时结合了独立数据中心的节点,ICP协议中的DFINITY开发的拜占庭容错技术和密码术来确保子网是防篡改和不可阻挡的。子网对用户和Canisters是透明的,用户和Canisters只需要知道Canisters的身份即可共享调用(更新调用和查询调用)。

这些透明度是互联网基本设计原则的延伸,在传统互联网上如果用户想要连接到某些软件,他们需要运行该软件机器的IP地址和侦听的TCP端口。而在IC链上,一个用户想要调用一个函数,他们只需要Canisters的身份(ID)和公开函数签名。与传统互联网创建无缝连接的方式相同,DFINITY为Dapp创建了一个无缝的世界,任何获得许可的Dapp都可以直接调用IC链上的其他Dapp(IC链的多元可组合性,无需繁琐的工程),这所有的一切皆发生在链上。

子网不仅对用户是透明的对Canisters来说也是透明的:NNS可以拆分和合并子网来保证整个网络的均衡负载(所有子网集)。在以下实例中虚拟子网ABC其中包含了11个Canisters,NNS提出拆分:子网ABC继续托管1-6 Canisters,生成新子网XYZ托管Canisters7-11,在拆分的过程中所有Canisters都不会出现中断服务。

图片

拆分子网示例

每个子网类型都为Canisters提供特定的属性和功能,如果Canisters托管在数据子网上,它可以处理调用,但不能调用其他Canisters,完成跨Canisters调用需要一个系统子网,如果你希望你的Canisters能够持有ICP代币余额发送到其他Canisters,你需要一个受托子网,处于某些原因,治理Canisters只能托管在受托子网上。

图片

子网调用详情

图片

不同子网容错能力

  

图片

在IC上运行的Dapp由形形色色的Canisters组成,它们各有不同:数据Canisters、计算Canisters等。它们在专用管理程序中运行,并通过公开指定的API相互交互,Canisters内部是WebAssembiy字节码,它可以在WebAssembly虚拟机和内存页面上运行,通常WebAssembly是通过编译Rust和Motoko语言来创建的。该字节码包含一个运行时,开发人员可以轻松的与API交互。

图片

注意:示例代码是伪代码

在IC链上,Canisters的共享调用分为两种:Canisters可以作为更新调用或者查询调用来调用,本质在于当函数被作为更新调用的时,更新调用对Canisters内存中的数据所做的任何更改都将被持久化,而如果将函数作为查询调用时,则它对内存所做的任何更改都将被丢弃。

更新调用会进行持久化更改,并且是防篡改的,ICP协议会将该子网中的每一个节点运行更新调用,调用会在全局调用顺序中运行,并且允许在完全确定性执行环境中并发执行(更新调用会在两秒完成),在以下实例中,是用户像Canisters中的DEX提交购买订单的更新调用请求。

图片

示例:更新调用

而查询调用不会保留更改,并且运行此调用几乎不需要多少Cycles(几毫秒内完成),这是因为查询调用不会在子网上的所有节点运行。

图片

示例:查询调用

图片

IC链上最便捷的事情就是开发人员保存数据的方式,开发人员不必考虑持久化:他们只需编写代码,持久化就会自动发生,那因为互联网计算机保留了代码运行所在的内存页——正交持久化的发生在于Motoko语言中特定机制stable关键字变量值实现的自动持久化, 而在传统开发中普通变量需要通过SQL持久化到数据库。

图片

尽管Canisters中只要一个执行线程,但是默认情况下跨Canisters可以交错进行异步调用,(跨Canisters更新调用另外一个Canisters时可以不用等待返回结果,可在此期间继续发起更新调用请求)。

图片

相比之下,查询调用不会对内存进行持久更改,这允许任何特定的时间在Canisters有人任意数量的并发线程处理查询调用,这些查询调用针对记录在最后一个状态根中的内存快照运行。

注意:在Canisters通过指定的WebAssembly字节码来创建新的Canisters时,新的Canisters的内存页面是空白的,而当Canisters分叉自身时,会创建一个新生成的副本,该副本与内存的内存页面是相同的。

图片

目前因为WebAssembly限制,每个Canisters容量内存只能存储4GB的内存,基于用户数量承载,Dfinity采用的是多Canisters架构。每个额外的Cannisters都会增加整体更新和查询调用的吞吐量,但是却无法针对特定用户的内容拓展查询调用请求,所以还需要前端Canisters和后端Canisters。

图片

互联网计算机还提供一些有趣的功能:当用户连接到前端Canisters时,通过NNS允许将域名映射到多个前端Canisters,当用户希望解析域名时,互联网计算机会查看托管前端Canisters的所有子网中的副本节点总数,并返回最接近副本节点的IP地址,这导致用户在附近的副本节点上执行查询调用,这种边缘计算的好处包括减少固有的网络延迟并改善用户体验和无需内容分发网络。

以下是利用以上功能构建一个前端Canisters和后端数据Canisters通过Web浏览器加载数据Canisters个人资料图片实例过程:

图片

1、首先Web浏览器映射到一个前端Canisters,该Canisters在具有附近节点的子网上运行,然后Web浏览器将提交查询调用请求将图片检索到附近的节点。

图片

2、前端Canisters会向保存照片的数据Canisters发出跨Canisters查询调用请求。

图片

3、如果数据Canisters返回的查询调用涉及照片等静态内容,则可以将数据存储在缓存中,在这种情况下,运行前端Canisters查询调用的副本节点可以将查询调用返回结果输入到查询缓存中。

图片

4、当然查询调用缓存机制对前端Canisters代码是完全透明的,一旦用户调用的前端Canisters收集了有必要的信息,它就可以通过查询调用响应或HTTP端点返回内容。

图片

5、随着时间的推移,节点的查询缓存会累积静态内容并生成附近用户感兴趣的数据,从而为他们提供更快、更好的用户体验。通过这种方式,互联网计算机的边缘架构提供了内容分发网络的好处。

图片

对于更新调用来说:用户的内容和数据会进行序列化更新,以防止更新丢失等问题通常会通过散列用户名将用户名映射到特定前端Canisters来实现。

图片

1、一旦在Web浏览器或智能手机上运行的UX/UI确定哪个前端Canisters负责协作对某些内容和数据的更改,调用请求就可以通过向标准接口提交更新调用来修改该内容或数据。

图片

 2、以上前端Canisters通常会进行更多的跨Canisters更新调用以实现所需的更改(一个Dapp实现功能的时候可能需要跨多个Canisters完成更新调用,因为Dapp组成部分是由各多个Canisters组成)

图片

IC网络对比传统区块链上的区别在于五大层次体现:在结构层次来说IC没有采用与传统区块链网络单链的设计,而是采用分片链设计实现网络的高效运行:不同子网运行托管不同的类型的Canisters,它们通过公开指定的API进行交互实现Dapp的多元可组合性。在开发层次上的友好——正交持久化:开发者在Canisters的编程会自动在底层存储,并且可以直接调用,读写都是在Canisters中完成。在治理层次的去中心化:对所有用户开放治理权。在Dapp层次的完全去中心化:通过构建经典架构的前端Canisters和后端Canisters实现端对端的去中心化Dapp。在智能合约层次的扩容:Canisters通过分叉自身或者创建新的Canisters增加Dapp的吞吐量以及内存。

Dfinity深圳社区,专注于Dfinity生态技术发展交流与优质项目挖掘分析。

猜你喜欢

转载自blog.csdn.net/weixin_59030993/article/details/120654926