对话DFINITY官方工程师 :从技术底层解读互联网计算机如何引领Web3时代?

avatar
星球君
2年前
本文约16544字,阅读全文需要约21分钟
通往全新世界的道路要怎么走,“互联网计算机”给出了答案。

随着通讯和可视化移动终端设备的逐渐普及,人们簇拥于web3或元宇宙的概念。而对于通往全新世界的道路要怎么走?却没有很明晰的答案。DFINITY在5年的探索经验中,摸索出了“互联网计算机”的道路,它会成为一个行之有效的解决方案吗?

8月19日晚,DFINITY核心技术工程师Paul Liu做客Odaily星球日报“超话社区”,从技术底层为我们解读Dfinity。加入Dfinity之前,Paul在英特尔实验室(Intel Labs)的研究科学家岗位工作了7年。在英特尔实验室时期,他为X86架构构建了一个性能高度优化的Haskell编译器。Paul拥有耶鲁大学博士学位,师从Haskell编译器的发明者之一的Paul Hudak博士。Paul是Haskell研讨会和IFL成员,发表过大量学术论文。除了Paul的分享之外,社区小伙伴对DFINITY进行了激烈的讨论,文末附社区提问。

以下为AMA精华整理,enjoy~

Odaily星球日报:DFINITY 的定位是“Internet Computer 互联网计算机”,在物理层和互联网基础协议层面,与传统计算机网络相比,Internet Computer 会有哪些不同?

Paul Liu:首先我介绍一下 DFINITY。这是一个总部在瑞士的非盈利组织,所有的收入只能用于一个目的,就是参与研发和推动 Internet Computer 这个去中心化的开源网络项目。虽然这个项目是由 DFINITY 主导研发的,但自从上线那一天起,治理系统就已经启动了,而且网络的实际物理节点也是许多个第三方独立运营商自主运营。目前上线三个月,已经有 53 个运营商在 20 个数据中心部署了 209 个节点。

对话DFINITY官方工程师 :从技术底层解读互联网计算机如何引领Web3时代?

整个项目归属于治理代币的持有人,也就是整个社区。DFINITY 会作为主要的技术贡献者继续参与开发和推广整个平台,但我们只是贡献者之一。在上线短短三个多月的时间,已经有不少其它的社区团队参与进来。这个平台的发展离不开整个社区的贡献。进一步推动去中心化,是我们当下最主要的目标。

作为 Internet Computer 这个平台的创建者,DFINITY 的愿景是 blockchain singularity,也就是说所有能在互联网上面跑的应用,都应该用区块链的技术构建。

为了做到这一点,我们在 TCP/IP 层面之上,应用层面之下,添加了一层基于区块链共识技术的协议,我们把它叫做 Internet Computer Protocol (ICP)。这一套协议是通过在多个物理节点(计算机)之间交换数据,构建一个虚拟的子网。子网内部的节点对输入输出达成共识,相互验证计算结果,并可以和其它子网之间通讯。多个子网组合在一起共同构建出一个虚拟的计算机,容量可以随着子网的增加而增加,谁都可以在上面跑程序,访问其它人的程序,等等。

对话DFINITY官方工程师 :从技术底层解读互联网计算机如何引领Web3时代?

不过这听起来和我们现在的互联网好像也没什么差别,尤其是 micro service 的概念。那为什么现在的互联网不能叫做 Internet Computer 呢?这个差别就在于这一套 ICP 的协议。这个协议的目的是确保所有程序都被正确执行,它们的状态无法被篡改,当一个程序调用另一个程序时,它是可以信任这个调用会被正确执行的。目前的互联网因为缺少这一层协议,导致所有的程序都要自行解决可用性、可靠性以及相互之间的授权等等繁琐的问题,并因此带来各种不兼容和安全性上的包袱。

这里面的核心就是可信任计算,有个说法叫 trustless trust 我觉得很贴切,无需信任(局部)的信任(整体)。区块链从比特币开始到今天的发展,也应证了可信任计算的威力。但绝大部分应用还是集中在金融领域,而我们的目的是拓展到更广阔的互联网领域上去。为什么区块链上不可以直接跑网站?为什么验证区块链上的计算需要整个链的历史数据?只有正面解决这些问题,才能让区块链成为互联网的核心技术,而不仅仅是停留在记录和转账的层面。

Odaily星球日报:Internet Computer 提供了全新的程序构建范式,有自己的一套“行话”,可否简单介绍这些“行话”以及你认为对于开发者来说,最有用的基础设施有哪些?

Paul Liu:可以从几个不同的角度来聊一下。从终端用户来看,访问一个 Internet Computer 上的应用和访问一个普通网站基本上没有什么不同,使用者并不需要支付任何费用。这和使用传统云服务的时候,费用由项目方承担是同一个意思。其它大多数区块链都是要向使用者收取 gas 费用,需要预装钱包软件,门槛比较高。

运营一个应用的成本,包括计算和存储等,是以 Internet Computer 的原生代币 cycles 来衡量。cycles 的价格锚定 SDR,1SDR = 1 Trillion Cycles。SDR 的价格是国际货币基金组织设定的一篮子货币加权得来的,包括美元人民币等,相对稳定。

回到用户角度,他们不必在意 cycles 这个概念。但很多应用需要处理用户登录,为此 Internet Computer 上面也推出了一套匿名的身份管理系统,我们把它做 Internet Identity。这套系统完全是基于 web 标准,用户不需要安装钱包软件也能使用。所有这些都是为了降低用户使用的门槛,让区块链的应用能够真正走出去。Internet Identity 主要是为了解决一个身份在多个设备登录的问题。而且这个身份在不同的应用中,应用所拿到的代号是不一样的,这可以防止用户的行为被恶意跟踪。最后,Internet Identity 本身也是一个上层应用,在整个系统里也没有特殊的权限,其它应用可以选择用它也可以不用。我们现在也看到由其它的开发者开发的钱包和的身份认证系统,都可以选择,都是可行的。

最后,用户可能也有兴趣参与 Internet Computer 的治理。这是一个叫做 NNS 的神经元投票系统,算是我们的一个创新吧。它也是应用层面的,不过它有一个比较特殊的权限,那就是能够管理所有 Internet Computer 的子网和整个系统的方方面面,包括节点运行的代码,版本升级,创建新子网,接入新节点等等。要参与投票,首先需要持有 ICP 代币,锁定一定数量的 ICP 来得到一个神经元,投票的权重和锁仓数量,锁仓时长,以及神经元的年龄都相关。参与投票也会得到奖励,奖励的多少和投了赞成还是反对无关。还可以跟随其它神经元的决策,自动进行投票。总体这些设定上是为了让用户投票的行为和平台的长期利益挂钩,并奖励用户做出的贡献。

谈了用户角度,那我们再从开发者角度来看一下。跑在 Internet Computer 上的应用程序,是封装在一个叫 canister 的轻量级容器里面。这个通常大家比较熟悉的 docker 容器的概念有点不太一样,canister 不仅仅是封装了代码,而且自动对容器的状态做持久化。可以简单理解为一个长期运行的操作系统进程,进程的状态包括内存和消息队列,都是自动保存了,不会因为开机关机而丢失。这意味着在 Internet Computer 上面已经剥离文件系统的概念,开发者不需要考虑读写文件和硬盘来保存数据,这是一个相当大的简化。

Canister 的代码是采用了 WebAssembly (Wasm) 的字节码,这个一个最新的轻量级虚拟机的技术。任何能够编译到 Wasm 的语言都可以作为开发语言。目前支持比较好的两种语言是 Rust 和 Motoko,但用 C 语言也是可以的。Motoko 是我们开发的编程语言,利用了一些 Internet Computer 的特性,附带自动内存管理,不像 Rust 和 C 那么底层,属于 Javascript, TypeScript 或者 Swift 这个抽象层次,上手比较容易。当然目前生态还在发展中,库函数还有待丰富。

另一个开发者需要了解的是 canister 之间的通信模式是异步的,属于 actor model。也就是每个 canister 都是自己的进程,和其它 canister 发消息来通信,也就是异步方法调用。一个 canister 内部消息队列的处理都是单线程,不需要考虑锁,每一个方法调用都是满足原子性的。熟悉 actor model 编程的很容易上手。

开发一个应用,通常 canister 容器是作为后端的,前端交互可以是在浏览器里,也可以是单独的 APP。之前也提到 Internet Computer 可以直接跑网站,这里就是说 canister 可以自行实现 http request 的接口,返回网页包括 Javascript 到用户的终端。前端后端可以一起打包成 canister 部署到 Internet Computer 上。前端开发我们有现成的库可以使用,Javascript 和 Rust 都有。前端需要调用后端代码的时候,直接做一个异步函数 await 调用就好了,底层都已由库函数实现。如果需要了解更多的话,这里面有一个接口和数据编码的格式,叫做 Candid,支持多个语言的实现。Canister 对外部的接口和数据类型,都是用 Candid 来描述的。

总的来看,开发者需要了解的都是围绕着 Canister 这个概念展开的。WebAssembly, Actor model, Orthogonal Persistence (自动持久化), Motoko, Candid。我还推荐了解一下 System API 也就是 Internet Computer 接口的标准 https://sdk.dfinity.org/docs/interface-spec/

这个资料很详细,涉及了整个系统的方方面面,而且我们做了不少形式化的努力,定义了接口的语义,方便开发者深入理解系统的行为。

如果是做系统层面的开发,比如共识协议,虚拟机,等等,那可以谈的就更多了,可以去看 DFINITY 官网上技术图书馆的视频系列 https://dfinity.org/technicals

Odaily星球日报:与传统的阿里云、腾讯云、 AWS等平台相比,Internet Computer 有什么不同? 它们也是公司自建的私有云服务,也是用的数据中心,异地备援,多节点运行的。

Paul Liu:目前的云服务平台,都是基于一个基础的假设,你必须依赖这个平台的提供者能够维护平台的安全性,保持网络联通,计算不间断,数据不丢失,等等。商业平台自身的利益和它所服务的用户之间的利益,虽然多数时候不冲突,但也不是完全一致的。有一个大家应该都比较熟悉的概念 Platform Risk,这里就不展开讲了。但最重要的一点,这些云平台基础设施提供商,都不希望自己成为 commodity (可替换的商品),都在各尽所能留存和锁住客户。

Internet Computer 首先是作为一个去中心的网络存在的。里面的节点都是由第三方运营,跑在不同的数据中心里。而真个网络的治理,是交给用户的,并不由节点运营商,或者是数据中心来主导。所以这里面并没有一个中心化的商业机构来做所有的决策。整个治理系统的设计,也是尽量从长远的角度出发,希望保持用户的利益和平台发展的一致性。这个平台是付费给节点运营商的,某一个节点到底是由张三还是李四来运行根本不影响,这是一个自由市场。所以对于 Internet Computer 而言,硬件和网络这些基础设施,已经成为了 commodity。

回顾整个 PC 行业的发展史,我们其实可以看到,基础设施(比如 PC 硬件)成为 commodity 是历史的必然规律,在云服务这里我相信也不会是一个例外。

可以说 Internet Computer 这样的计算平台,已经和硬件的基础设施建设剥离开了。这种商业模式,如果没有去中心化,如果没有区块链的技术,是没法想象的。但今天它已可以成为一个现实,这是时代进步的最好诠释。从比特币以太坊一路走来,有的人只是看到了币价炒作和旁氏骗局就对这个新兴事物持否定态度,其实时代的变革就在眼前。

除开利益方面的一致性,另一个方面用要更先进的技术来简化系统冗余,从而节省整个平台开销,也意味着为用户带来节省。前面我们也说了不少可信任计算的优势,其实这里面还要加上一个分布式的优势,和一个使用前沿的加密技术的优势。它们意味着很多传统的技术维护方面的工作,比如防火墙这种,基本上已经不再必要。一个客户要想使用好目前这些云平台,它必须要在运维上投入很多。而 Internet Computer 则能够节省很多这方面的成本。

对话DFINITY官方工程师 :从技术底层解读互联网计算机如何引领Web3时代?

第三点则是 tokenization, 也就是应用的代币化。这可以说是整个互联网应用发展的下一个趋势,不可阻挡。传统的云服务商也最多是提供和区块链之间的桥接组件,一整套做下来它的架构不可避免还是相当臃肿的。Internet Computer 既然能够直接跑网站,跑应用,作为原生区块链,做 tokenization 的整合是非常容易的。

Odaily星球日报:Internet Computer 上的每个智能合约都是“可扩展”的,具体说说协议的扩展在技术层面是如何运行的,目前有无扩展的案例?

Paul Liu:扩展性(Scalability)有好几个维度,一个是存储空间上的,一个是网络流量上的,还有一个是计算能力,单位时间能够处理多少事务。是否可扩展主要是看能否绕过已知的瓶颈。在一个公共平台上,我们还要考虑不同用户之间,不同应用之间,有限的资源如何分配的问题。

Internet Computer 在设计上主要的思路是 scale out,也就是遇到瓶颈时通过增添资源,创建新的子网来解决。这个和主流的 web 应用的思路基本上是一致的,当一个应用无法通过一个 canister 来处理所有用户请求的时候,合理的做法是在应用层面上使用多个 canister 各自处理一部分的用户请求。也就是说在设计应用的时候,需要考虑到这一点,至少要留出一个迁移到新架构的可能性。目前我知道 OpenChat 的设计是走多个 canister 的,DSCVR 也留有这样的余地,但目前还是集中在一个 canister。

从系统层面,通过 canister 扩容,可以超越目前 4G 内存的门槛。计算方面,也是从并发的指导思想出发,没有选择以太坊那种全局原子性的设计。所以不同 canister 处理各自的消息,都是在自己的线程里面,只要硬件负载容许,是不影响其它 canister 的性能的。至于网络方面,基本上带宽决定了扩展的上限,任何一个区块链都无法避免这个物理瓶颈,只能通过分片,对应到 Internet Computer 这里就是不同的子网。

当然系统层面也有各种各样的优化方案可以带来性能的提升,我们一直也在做这方面的工作,希望能够充分发挥硬件的性能。

Odaily星球日报:哪些类型的Dapp更适合搭载于其上?我们发现目前 Internet Computer 上的DeFi协议比较少,未来 Internet Computer 上Dapp的赛道都有哪些方向?

Paul Liu:DeFi 主要还是需要流动性来推动,出于安全考虑,目前尚未开放 canister 转账 ICP 的功能,这同时也限制了流动性。不过这个限制是暂时的,目前来看整个网络自从上线后,稳定性还是不错的,在适当的时机相信会通过 NNS 投票来解除这个限制。我相信已经有不少开发者都做好了准备,DeFi 应用的爆发只是时间问题。

我个人对目前 Internet Computer 上面的 social dapp 还是很看好的。这个赛道一旦有了 tokenization 的加持,会非常迅速成长,绝对不会逊于 DeFi 和 NFT 游戏这类的。其它区块链上也有一些社交属性的 dapp,但都受制于起步的门槛,毕竟正确使用钱包这一步,就已经难倒了很多用户了。在 Internet Computer 上面的 dapp,使用 Web 标准的技术,任意浏览器均可访问。

另外一个我看好的方向是面向个人用户和面向中小企业的应用。像项目管理,文件共享,创作者经济(podcast, vlog,网文等)这种,虽然目前互联网上已经都有比较成熟的解决方案了,但平台风险始终存在。前面也提到云服务的平台风险,相信大家对各种其它领域的巨头垄断都有一定的切身体会。现在去中心化的结构是一个新的可能,平台本身应该变成透明的存在,而不是盘踞在食物链的上游用霸王条款来吞噬用户的利益。

归根结底,哪个赛道有前途,取决它的应用能否快速汇集价值。这个价值,不是说你的项目锁仓有多少,因为这个量它随时都可以在变。而是说有你建立了多少和用户之间的联系,建立了多少和其它应用之间的联系,这种关联随着信任加深,随着用途增多,它会越来越有价值。代码可以粘贴,但这种关联是无法拷贝的。而如果运用得当,代币在一定程度上可以加速价值的聚集,但最终还是取决于项目本身的内在价值。

Odaily星球日报:Canister 作为 Webassembly 运行的容器,承载了 Dapp 链上运行的环境。最近关于Canister有哪些新进展?

Paul Liu:就在这周一,DFINITY 发布了开发路线图,欢迎社区的参与。https://dfinity.org/roadmap

其中和 canister 相关的的有:

· Stable memory 扩容

· Canister ECDSA 签名

· 应用 AMD SEV 保护数据隐私

扩容目前主要是针对 stable memory 也就是不受代码升级影响的内存管理。之前是受到 Wasm 虚拟机 4GB 的限制,不过现在已经可以放开,上限受制于子网的内存总量,目前大约在 300GB 左右吧。

ECDSA 阈值签名技术,简单讲就是让每个 canister 在不存储私钥的前提下,也能对数据做出签名,并且此签名可以通过公钥验证,每个 canister 都可以得到一个唯一的公钥。这个是和我们已经实现的 Chain Key 技术一脉相承的,它的应用也很广泛,比如 canister 可以直接发起一个比特币或者以太坊的交易并且签名。这意味着原来必须在私密环境下才能把私钥交给程序做的事情,现在可以放到一个去中心化的环境里来做。还可以应用在颁发 SSL 证书,DNS 定制域名等等方面。

使用 AMD SEV 的技术主要是为了在一定程度上保护 Canister 的数据隐私,这样就算是节点运营商也无法窥探用户数据。我们一直在做这方的准备,难度也比较大。好在目前节点所采用的硬件都已经支持 SEV 技术了,所以到时候希望是一个平稳的升级。

Odaily星球日报:“开放互联服务”可以实现永久性API,可以让开发者放心地构建依赖于其他服务提供的数据或功能,并且不会存在撤销的风险。“开放互联服务”如何部署到互联网计算机上?

Paul Liu:提供永久 API 最简单的做法是通过把 canister 控制者设定为空集,来让它的代码成为不可修改的。我个人也做了一个很简单的 canister,叫做 blackhole。它的主要目的是让其它 canister 可以把控制者设成 blackhole,这样不仅代码成为不可修改的了,blackhole 还提供额外的查询功能,比如查看账面 cycles 的余额,或者查看代码的哈希值。blackhole 本身的控制者被设成它自己,它的代码也是公开,很容易验证哈希值的正确性。如果有需要让自己的 canister 被其它人信任,把它的控制者设置成 blackhole 是一个简洁的方法。

对话DFINITY官方工程师 :从技术底层解读互联网计算机如何引领Web3时代?

但如果还需要保持代码升级功能的话,这就需要引入社区治理功能了。我们正在开发中的 Service Neuron System 可以让应用通过锁定代币创建神经元,然后进行投票,来管理应用的方方面面,包括代码升级。当然我们做的这套 SNS 系统还在开发中,尚无实例。而且它只是候选方案之一,社区现在已经项目有在这方面做其它的尝试,相信都会逐渐成熟起来。

Odaily星球日报:安全性是计算机的重要议题,Internet Computer 运用哪些机制来替代类似防火墙等功能?在防篡改上,DFINITY与其他区块链底层相比有哪些特点?

Paul Liu:防火墙的一个主要功能是防止黑客入侵系统,取得内网权限,从而达到盗取或者篡改数据的目的。首先,这个内网外网权限的划分,就很有问题。它相当脆弱,因为一旦被攻破,内网所有默认的权限都被暴露在攻击者面前了。所以我们看到不少公司已经抛弃了这种做法,改成给每个服务设置权限,使用统一身份管理的技术来对用户授权。

与之对应的则是 Internet Computer 上面的身份管理。一个公钥对应一个用户的身份,然后每个 canister 都能够获得调用者的身份。这个身份是无法被第三方篡改的,无论是用户调用 canister 还是 canister 之间的调用。之所以能够做到这一点,是因为这种调用必须通过共识协议,尤其是跨子网的调用,在发起方和回应方都要通过共识协议,经过验证才会被认可与执行。而要快速高效地认证任意子网签名的有效性,就必须用到我们研发的 chain key 的技术。它能够在保证阈值签名公钥不变的同时,支持动态的节点连入和移出。这一点其它区块链目前都无法做到,所以在验证交易这方面 Internet Computer 目前是领先的,它的子网之间基本上不需要同步数据(除了必需的各子网公钥和节点公钥)。

想在 Internet Computer 上面篡改数据,仅仅攻破一个节点的权限是不够的。必须要能够控制一个子网的2/3以上的节点数才能做到。所以子网的安全性在一定程度上取决于节点数量。而且通过节点的不定期轮换,也能进一步加强这方面的安全性。就算是一个子网被攻破,它也无法假冒其它子网的身份,所以损失的范围也是可控的。

保障数据真实可靠不被篡改是一方面,对数据隐私的保障则是另一方面。大多数区块链都是公开数据,所以也谈不上什么隐私保护。真正的隐私保护可以通过应用层面来实现,用同态加密这样的技术,但目前效率不够。所以我们目前的计划是应用 AMD SEV 技术,在硬件层面加密。但整个 Internet Computer 的安全性并不依赖于硬件,有 SEV 的保障是一个加分项。

Odaily星球日报:DFINITY 的名号其实早在6年前就已经打响了,虽然主网上线的过程比较慢,但我们可以看到DFINITY 团队是真的想做一些颠覆性的东西,共识也是十分强大的。从“以太坊的姐妹链”到“世界级互联网计算机“的转变受到了哪些因素的影响?

Paul Liu:World Computer 的口号是以太坊最先提出来的,也激励了很多人,虽然现在它更多的是在 数DeFi 和数字资产方向发力。“世界级互联网计算机”方向也一直是 DFINITY 努力的目标,并不是融资以后才更改的路线。起初由于团队条件的限制,只是在 BLS 和共识协议方面有明确的创新,所以开始第一步是打算先从这方面入手,推出一个链再逐步迭代。但后来我们意识到,不解决跨子网通信的问题,那我们将永远停留在“又一个区块链”的窠臼中,难以创新。也正是因为团队的坚持,才有了在 chain key 方面的突破,解决了跨子网验证的难题,实现了 scalability 的承诺。

回头来看,其实我们只要不断地问自己一个问题:为什么去中心化的区块链不可以跑网站?首先要解决一个效率问题,就是访问网站是需要毫秒级的响应的,怎么能做到?我们的答案是把只读的查询和状态的修改分开,那么99%的网络流量都是只读的,是可以做到毫秒级响应的。修改状态我们也通过共识协议方面的创新做到两到三秒之内的响应。效率达到了,那如何验证内容的正确性?如何让普通的浏览器也能做到?那就必须精简验证的所需要的条件。能不能抛弃历史区块,仅仅通过一个公钥?用 BLS 公钥的话,怎么解决节点动态变化的问题?怎么解决中心化域名和 SSL 证书的问题?访问流量增多的话,如何扩容?扩容的瓶颈和边界在哪里?扩容的需求和同步合约调用的方式冲突了怎么办?

只要你不停地追问下去,不停地寻找答案,相信一个切实可行的方案会逐步浮现出来。这也是 DFINITY 过去几年坚持在做的事情。

Odaily星球日报:以太坊刚完成EIP-1559升级,迈出了通缩的第一步,代币价格也逐渐走高。你认为对于去中心化基础设施来说,代币的表现给支持者激励更大还是技术上的颠覆性更重要?怎么做到两者的相对平衡?

Paul Liu:我是这样看的,代币的短期表现取决于市场参与者的信心与预期,长期表现还是要回归平台的价值本身。以太坊的技术可以说是经历了时间的检验,尽管有各种不足之处,还是得到了加密货币整个市场的认可。至于通缩还是通胀,各有弊端,我是不太能够认同 BTC maximalist 那套说辞的。DeFi 在流动性和激励方面的创新也是非常精彩,不过放长来看,多数项目其实并没有增加价值,更多的是一场数字的游戏。短期通过代币价格的提升得到的用户,也可能因为价格回落,或者另一个项目的崛起而流失用户。

技术的创新,也很容易被竞争对手拷贝过去。不过我们从整体来看,这些创新是一直推动整个行业向前的。落到单个项目上,到底能否因为纯粹技术创新而获益,还真不好说。业内都在说生态建设,生态项目在一个平台上到底能有多少保障,尤其是初创平台,怎么能说服开发者来投入,不是一件容易的事情。

我觉得最值得努力的方向就是把尽力圈子扩大,从支付转账,到 DeFi,到 NFT 和 游戏,就是一个不断开疆扩土的进程。在这个大趋势下,尽力把区块链技术拓展到更广泛的领域中去,比如让原生网站跑在区块链上这种目标。用技术的创新和代币的激励,一起来获取新的用户,才能繁荣生态,提升价值。

Odaily星球日报:很多人认为 Internet Computer 是 web3应用的主要阵地。每条公链或多或少都有自己对于web3的见解和技术实现路径,如波卡、以太。DFINITY对于通往web3之路的见解和未来规划/Roadmap是怎样的?

Paul Liu:DFINITY 的宗旨是抛开一切不必要的包袱,向 Blockchain Singularity 的目的地进发。Internet Computer 这个项目还有许多未能完善的地方,离完全实现这个目标还有一定的距离,我们希望更多的人能加入进来,一起推进平台本身的技术进步和构建更丰富多彩的上层项目,来赢得客户。每个的公链侧重点不太一样,我们相信一切能用区块链构建的,最终一定会用区块链实现。所以也并不排斥结合其它公链的技术,比如我们周一发布的路线图中,有和以太坊、比特币的深度整合项目,对双方而言都是一个完美的互补。这会进一步激发资产跨链的流动与融合,简化应用架构,抛弃云服务这种中心化的包袱,从而提升应用整体的安全性和强壮性。跑网站是重要的一步,但它只是 Internet Computer 的第一步。我相信当下 Internet Computer 所打下的基础,一定会在未来成为 Blockchain Singularity 这个宏伟拼图的一部分。

来自社区的提问

Q1: 请问下Canister Signature是什么?Canister用于签名的私钥存放在哪里?另外,Canister里是否支持类似以太坊智能合约的Event机制,可以通过订阅来获取某个update call是否是caller根据返回值获取?最后,普通Canister什么时候可以处理ICP代币?

回答:Canister Signature 是指用子网的公钥给 canister 的计算结果(或者合约状态)做签名。目前我们使用的是 BLS 阈值签名,它有一个很好的特性就是公钥和签名的唯一性,是其它聚合签名的技术不具备的(BLS也可以做聚合签名,我们在协议当中也使用了)。阈值签名,简单讲就是各个不同的节点,它们有各自的私钥对计算结果签名,一旦集齐了达到限定数量(阈值)的签名,则可以得出一个唯一的阈值签名,用一个公钥即可验证,所以这个公钥被当作是子网的公钥。这里是没有一个相对应的子网私钥的,节点的私钥是各存各的,都不一样。一个子网上可以跑很多 canister,用 merkle tree 的方法,很容易得到指向其中一个 canister 计算结果的路径,所以可以把子网的签名加上这个路径看作是 Canister 对某条数据的签名。

Canister signature 一定程度上相当于 event log 或者收据。因为我们不要求节点保留所有的历史区块,单独为了 event log 做这些也没有很大意义。毕竟通过 query call 和 certified var 也能实现这样的功能,并且更强大。

Canister处理ICP代币在技术上早就不是问题,是因为安全的考量才没有放开权限。随着系统的稳定我们的信心也增强不少,所以如果没有意外,估计近期就会通过社区投票来决定。

Q2:我发现DFINITY的开发者比较喜欢开发社交应用,请问DFINITY为什么适用于开发社交应用或者开发者为什么喜欢在DFINITY开发社交应用?

回答:我的理解,价值的聚集,首先是来自人的聚集。所以一旦一个区块链平台可以直接把人聚集起来,一定会有这样社交类的项目诞生。但现在的 Web 环境下想要做出一个社交类的爆款相当不易,所以这些项目一定会去尝试不同的玩法。tokenization 代币化还没有固定的套路,我也很期待看到这里面的创新。

Q3:开发中有个担心,举个例子A容器调用B容器, B容器调用C容器,如果在C容器更新了状态,正常返回值给B容器之后,B容器挂了,此次A容器也会失败但是,C容器的状态已经变更了,有没有推荐的方案解决类似的原子性问题?

回答:以太坊的原子性设计是一旦调用栈上的一个合约发生状态回滚,所有的合约都必须状态回滚。这意味着有一个全局锁,在处理一条用户事务会锁住所有相关的合约,直到它全部处理完成,在此期间被锁住的合约不能处理任何其它事务。这样的设计虽然开发者编程方便,但是先天缺陷是性能无法扩展。所以我们在最初设计 canister 的模型时就摒弃了这种做法。

如果需要这方面的组合性,传统数据库已经有很成熟的解决方案了,比如两步提交 (two-phase commit) 。这在完全可以在应用层面商议一个标准经由 canister 接口实现,不一定需要在系统层面支持。

系统设计上总是要做一定的取舍,有时候添加限制比较好,有时候提供选择比较好。我们的看法是单个方法调用符合原子性是一个比较合适的粒度,没有必要强制整个调用栈一起做原子化。

Q4:我是一名正在互联网计算机上构建应用的开发者。我想问后端何时可以进行外部http/https调用?此外,由于每个容器4GB的限制,我必须实现我的分布式存储系统,那么BigMap什么时候发布或有其他更好的可扩展文件存储方式吗?

回答:对外部进行 http/https 调用可以分开看,一个是读,一个是写。前者需要预言机(oracle),后者如果对方满足 ren-entrancy 则完全是可行的。

Q5:stoic钱包助记词不能导入plug钱包,问了一下stoic开发者,说是加密算法选择的不同。同时我看官方的钱包助记词更不一样,这个后续会有统一的标准吗?能够实现像以太坊那样的一个助记词多个钱包导入吗?

回答:的确会造成一个不通用的问题,所以短期内只能提醒用户标注一下哪个助记词是哪家的。长期来看,希望社区能够协商达成一个通用标准。

Q6:Internet Computer数据中心的维护门槛能降多低,IC有考虑像Skycoin的网络那样设计自己的底层通信网络硬件,以防止ISP商在ip协议层卡壳?

回答:硬件方面现在没有涉猎。先把充分发挥已有的硬件的技能再说。

Q7:我是个币圈小白,觉得DFINITY生态上的钱包太难用,后期会改变吗?

回答:我的理解是现在各个设备使用浏览器的支持比较好,但是手机上App的支持有一定难度,这需要进一步的研发工作。在中国使用安卓手机的用户,如果上面不能安装Google Play服务的话,会导致无法使用WebAuthn,这也需要一个合适的解决方案,我们正在调研。

Q8:以太坊上的DAPP可以直接转到IC上用吗?

回答:好像Solidity可以编译到Wasm了,但编程模式不太一样(比如原子性的粒度),而且需要支持的系统接口也不一样,所以还需要做一定的工作才能支持。

Q9:问一个共识的问题,子网中共识属于PoS吗?子网节点共识中作恶的话,是否有惩罚机制呢?

回答:是PoS,目前没有要求节点质押代币。因为是准入机制,节点不可以匿名,所以相关的惩罚机制比较容易实现。节点需要定期领代币作为工资,目前的惩罚机制是从中扣除。

Q10:ICP有硬件钱包吗?

回答:硬件钱包支持Ledger,马上就会推出。

Q11:DFINITY的设计架构给我的第一印象就是非常复杂,对于一个区块链应用项目来说,general的理解,过于复杂也就意味更多风险的可能,更不用说对于一个要突破当前圈内形态,目标是互联网圈的公链了。而对于这个行业,安全是最不能牺牲的一角,所以请问您如何看待DFINITY的不可能三角问题?

回答:IC底层系统的确比较复杂。我想对于开发者而言,在系统上层开发应用反而是化简了的。

“所谓不可能的三角是一个伪命题”,这是我们的创始人 Dominics Williams 的答案,我有一点认同。下次有机会可以再展开讨论。

开发者的需求

Q1:现在标准还非常混乱,导致不同开发者做的东西无法互通。目前 DFINITY 准备如何推行标准,获得共识?

回答:标准的推行需要社区的积极参与,甚至需要社区出现领导者来带头推动。我们已经就许多热点问题在社区里展开讨论 https://forum.dfinity.org/c/roadmap/29/l/top

Q2:DFINITY 现在的治理运行的怎么样?如何通过治理来推进对技术标准的共识?

回答:目前治理内容包括更改网络配置,添加节点子网,以及升级方面,都已经是投票通过立d即自动执行了。但对于推进技术标准,还应该做更多前的前期准备工作,让更多的人知道并参与讨论,才能合理地进行治理。这方面做的还不够,接下来会使我们工作的一个重心。

Q3:目前 DFINITY 对未来发展路线的决策是通过治理吗?

回答:DFINITY 发布的发展路线只是一家之言,有些计划提出后社区也有不少负面的反馈,所以还有改进的空间,如果社区主流持反对意见,也是无法通过投票的,所以我们也不会浪费精力去研发。有不少发展计划,其实是社区要求的,我们也觉得合理,就放在路线图里了,毕竟我们有一定的开发实力能够完成。但期望所有的发展计划全部由我们完成也不现实。代码都是开源的,有能力的都能参与开发。尤其是应用层方面,比如像 bigmap 这样的,完全可以由其它团队领头进行开发。

Q4:目前有成熟的代币或 NFT 的标准嘛?开发者无标准可以参考,该如何开始?

回答:代币标准(FT 和 NFT)目前社区正在讨论,希望更多的开发者能参与进来发表意见,相信不久就能有很好的方案出台。

Q5:dfinity更适合做什么类型的应用呢?特别是早期,有什么值得关注的地方?能不能给我们开发者提供一些思路?

回答:前面已经提到了

生态

Q1:现在 NFT 非常火爆,而 DFINITY 上最近也产出了 NFT 项目,在短短几天时间内 Toniq Labs 推出的 NFT 平台就获得了 40w 美金的交易量。DFINITY 上的 NFT 有什么优势呢?有什么不同于传统 NFT 的能力?能带来什么新的玩法?

回答:Internet Computer 上做 NFT 的一个优势是它不仅仅是一个独特唯一的哈希值,可以通过代码赋予它对应的功能,让 NFT“活”起来,毕竟直接可编程,而且 web 界面是全面打通的。NFT 之间还可以建立联系,可以互相组合,玩法非常多样,充分发挥想象力吧!

Q2:DFINITY 在架构上与 ETH 系列有很大的差别,这导致上面的 DeFi 缺少原子性,也影响了组合性,这该如何解决呢?

回答:以太坊的原子性设计是一旦调用栈上的一个合约发生状态回滚,所有的合约都必须状态回滚。这意味着有一个全局锁,在处理一条用户事务会锁住所有相关的合约,直到它全部处理完成,在此期间被锁住的合约不能处理任何其它事务。这样的设计虽然开发者编程方便,但是先天缺陷是性能无法扩展。所以我们在最初设计 canister 的模型时就摒弃了这种做法。

如果需要这方面的组合性,传统数据库已经有很成熟的解决方案了,比如两步提交 (two-phase commit) 。这在完全可以在应用层面商议一个标准经由 canister 接口实现,不一定需要在系统层面支持。

系统设计上总是要做一定的取舍,有时候添加限制比较好,有时候提供选择比较好。我们的看法是单个方法调用符合原子性是一个比较合适的粒度,没有必要强制整个调用栈一起做原子化。

Q3:DFINITY 上的 DeFi 该如何做?会与传统的 DeFi 有什么大的区别吗?

回答:Internet Computer 的账号模式不太一样。用户没有统一的系统层面的帐号来记录代币信息。每个 Canister 可以自行管理用户,而账目数字都是记录在 canister 状态里面的,所以如果需要保持所有历史转账记录的话,需要做一些额外的工作。

Internet Computer 用于治理的 ICP 代币,其实也就是一个 canister 实现的,除了能转换为 cycles 用于运行 canister 之外,并没有什么特殊的系统支持。它的实现也可以作为一个例子供开发者参考。

DeFi 目前来看有几类,一个是交易所,一个是借贷,还可能再加上一个稳定币。在我看来,最佳方式是通过 SNS 社区治理来配置参数和升级代码,可以更快速地迭代并有效地降低风险。而且前端完全上链,能够做到真正的去中心化。

另外一个方向,就是通过 Canister 的 ECDSA 签名控制其它链上的资产,直接调用其它链上的合约。这个相当强大,相信会让跨链资产的流动更迅捷更安全,估计会诞生新鲜的玩法。

Q4:DFINITY 新的技术特性下,会诞生出独特机制的 DeFi 吗?比如 CeFi 体验的 DeFi?或者配合社交的 SociFi?

回答:对,CeFi 体验的 DeFi 已经有社区项目在做了,完全可行。

Q5:DFINITY 上为什么目前有这么多社交类型的生态,distirkt、openchat、bunchd、cancan,社交媒体将如何在 DFINITY 上发挥价值?这会是去中心化世界下一个大趋势吗?

回答:我的理解,价值的聚集,首先是来自人的聚集。所以一旦一个区块链平台可以直接把人聚集起来,一定会有这样社交类的项目诞生。但现在的 Web 环境下想要做出一个社交类的爆款相当不易,所以这些项目一定会去尝试不同的玩法。tokenization 代币化还没有固定的套路,我也很期待看到这里面的创新。

开发工具

Q1:推荐使用哪种语言开发?Rust 和 Motoko 两种语言有什么样的优劣?

回答:Rust 生态成熟,现成可用的库相当丰富,但是语言比较底层,上手有一定难度。目前用 Rust 开发 canister 方面的文档比较缺乏,如果是 Rust 新手的话,我不太建议。

Motoko 有自动内存管理,上手比较容易,编译器质量也比较高,但是生态不足,库不够丰富,经常需要自己搭梯子。

我个人的选择是 motoko,因为工作中写 Rust 写太多,比较讨厌它的一些缺点,当然这不是一个特别好的理由。

Q2:DFINITY 什么时候能上线附带 ICP 代币测试网络呢?开发者需要这样一个环境。

回答:Internet Computer SDK 自带的 replica 软件就是一个本地的测试网络,可以在一台机子上运行,然后团队都能连到上面协作开发。

至于一个更大规模的公共测试网络,目前我们没有精力来维护,似乎也不是特别必要,因为直接在 Internet Computer 公网上部署测试其实花费也很低。当然也欢迎到论坛上把这个要求作为正式的提案提出来,说不定社区可以出台一个方案运行一个这样的公共测试网。

Q3:Motoko 目前缺少很多库,导致复杂逻辑很难表达,官方在这部分有什么计划?这部分还在开发吗?

回答:欢迎提出这方面的具体要求,更欢迎开发者使用 motoko 的包管理工具 vessel,并提交开源的库。有一些开发者已经在这样做了,我们这边肯定也会持续开发,但总体来讲还是需要社区共同努力。

Q4:官方有计划 Rust 工具链吗?例如各种脚手架,持久存储(类似Motoko的stable var)。这里有大量的开发者需求,目前 Rust 被局限了。

回答:目前 Rust 工具链有 cdk 和 agent-rs,文档和功能都比较欠缺,我们也在努力改进。NNS 子网上的几个 canister 都是 rust 实现的,可以作为例子参考。

Q5:什么时候对其他语言如 solidy、c++、go 进行支持呢?会开发这些sdk吗?

回答:好像 solidity 可以编译到 Wasm 了,但编程模式不太一样(比如原子性的粒度),而且需要支持的系统接口也不一样,所以还需要做一定的工作才能支持。

C/C++ 肯定是可以的编译到 Wasm,目前缺乏系统 API 的头文件,但实际上并不难写,有一些开源的简单例子。

Go 编译到 Wasm 好像还不太成熟,所以难度会大一点。

如果要开发支持这些语言的 SDK,所需要的资料都已开源(主要资料就是 Interface Spec),非常欢迎社区的团队申请开发基金来做这样的项目。

关于 gas

Q1:在互联网计算机里每执行一步都要消耗cycle吗?如何减缓开发者的 gas 负担?

回答:是的,计算、存储,安装都需要消耗 cycles。开发者可以申请免费的 cycles 来启动项目 https://faucet.dfinity.org/

Q2:而且如果是开发者支付 gas,如何低抵御恶意的攻击者使用垃圾交易耗尽cycles?

回答:可以通过实现 canister_inspect_message 这个方法来回避恶意的攻击。这个方法本身不消耗 cycles

Q3:如何减缓开发者的 gas 负担?

回答:cycles 本身价格稳定,而且目前的实际使用情况表明,执行计算的消耗相当廉价。开发者可以申请免费的 cycles 来启动项目 https://faucet.dfinity.org/

Q4:官方有什么 gas 资助计划吗?

关于存储

Q1:现在官方对关系型数据库的开发进度如何?bigmap/bigsearch 什么时候能推出来?

回答:bigmap 在路线图上,可以前往论坛参与讨论

Q2:未来对于容器扩容的技术规划是什么?目前一个canister只有4g不够用,需要扩容,将采用哪种方式?什么时候能用上?

回答:扩容计划在路线图上,可以前往论坛参与讨论

Q3:DFINITY 会把 wasm 虚拟机扩充到 64位吗?

回答:相关技术成熟之后应该是没问题的

Q4:在 DFINITY 上我们看到了像 IC Drive 这类个人云盘项目,但容器 4G 的容量显然是远远不够的,DFINITY 未来如何解决大规模存储的问题?

回答:大规模存储肯定是需要分片的,也就是分开到多个 canister,可以参考 bigmap 项目

Q5:DFINITY 推出特定类型的存储子网吗?

回答:欢迎社区的提案

钱包与身份

Q1:目前的官方的互联网身份因为使用了 WebAuthn ,导致大部分用户都很难使用,制造了门槛,官方如何把 II 变得更易用?

回答:首先 II 不是必须的,它是一个可选项。我自己做的 App 就没有用它。

其次,我的理解是现在各个设备使用浏览器的支持比较好,但是手机上 App 的支持有一定难度,这需要进一步的研发工作

在中国使用安卓手机的用户,如果上面不能安装 Google Play 服务的话,会导致无法使用 WebAuthn,这也需要一个合适的解决方案,我们正在调研

Q2:为什么 DFINITY 的中身份认证的方式那么复杂,为什么同一个人要给不同的容器分配不同的 ID?

回答:没有统一的系统层面的帐号用于身份认证,一个公钥直接对应一个身份。如果需要管理不同设备登录,则需要在应用层面来解决这个问题。II 是一个方案,但它不是必须的,它是一个可选项。我自己做的 App 就没有用它。II 给同一用户在不同的容器分配不同的ID,是出于隐私保护的考量。

另外也有其它的开发者做了跟传统区块链更接近的钱包插件,也是不错的选择。

Q3:DFINITY 的 Principal ID 与 Account ID 的设计很复杂,cycles 与 ICP 同一个人的接受地址都不相同,这对开发者与用户都产生了很大的困扰,如何解决这个问题?官方未来会推出相关工具吗?

回答:一个公钥直接对应一个身份,想要在不同的 canister 里面使用同一身份的话,那么需要用同一个公钥。这显然也是可行的,只不过 II 选择了保护隐私的做法。

允许不同的应用选择自己的身份认证和账号管理模式,显然有好处也有坏处。最直接的坏处是,如果用户习惯了其它区块链上那种全局地址的做法,可能在这里就不太适应。但我们看看在现实生活中,你在每家银行开的账号也可能是不同的格式,你在币安和火币的地址也并不相同,所以这种做法也不能说完全行不通吧。

Q4:目前 DFINITY 上的网页与插件钱包已经有三四个了,但是他们每一个使用的加密算法与生成路径都不近相同,该如何解决这个问题?

回答:的确会造成一个不通用的问题,所以短期内只能提醒用户标注一下哪个助记词是哪家的。长期来看,希望社区能够协商达成一个通用标准。

Q5:移动端钱包什么时候可以推出呢?

回答:这个没有包括在我们路线图里,我们首要的目标还是支持 Web 和浏览器。不过已经有其它团队已经在做这个了。

未来发展分享

Q1:DFINITY 上容器的访问链接会因为 ic0.app 后缀被封而导致其无法访问吗?如何避免这个问题?

回答:不同域名都可以解析到 Internet Computer 上面的容器地址。比如 fleek 就运营了自己的域名接入到 Internet Computer,它的后缀是 ic.fleek.co

在 Canister ECDSA 签名实现之后,会在域名上有更灵活的支持。

Q2:DFINITY 上的 dapp 对外提供的地址能否自定义?DNS可以替代吗?dom好像在推特火说过好几次,开发进度如何了?

回答:是的,这个叫 vanity URL 也在公布的路线图里。它的前提是 Canister ECDSA 签名,所以开发工作正在进行中。

Q3:节点更多,节点要求更低、匿名性更好的 Badlands 未来会运行吗?这部分的进展如何了?

回答:目前只是一个提案,社区反对的意见也比较多,希望继续讨论。

Q4:未来不同的子网会衍生出特定类型吗?比如演化出分层,存储子网,逻辑子网、代币子网、系统子网?

回答:是可行的,欢迎社区提案,大家一起讨论。

Q5:关于 dom 提过的 DFINITY 与 ETH 通过 chainkey 直接交互是什么回事?什么时候开发者可以使用上?

回答:英文的解释见 https://dfinity.org/howitworks/direct-integration-with-bitcoin

其它问题

Q1:请问DFINITY区块链的TPS是多少?适合部署DeFi和NFT应用吗?

回答:TPS 不是一个很有意义的比较,因为对 transaction 没有准确的定义,一条 transaction 的大小可以是几十个字节,也可以是 MB 甚至 GB。它做的事情可以只是加减账本数字,也可以是读写 GB 的内存。

如果我们仅仅考虑 transaction 是签名过用于执行的消息,那在 Internet Computer 上面这包括用户发来的消息和子网之间发送的消息。目前 IC 上面对用户发来的消息做了人为的限制,大约是 350/s,主要目的是防止 DoS 攻击。随着平台稳定,会逐步提高这个上限。

从整体来看,IC 处理的 TPS 没有天花板,因为它随着用户需求增加,可以随时添加新的子网。

Q2:Internet Computer相比较传统的服务器使用成本上有何不同,同时数据上传和下载上成本如何?Internet Computer数据中心的维护门槛能降多低?

回答:目前的成本很低 https://sdk.dfinity.org/docs/developers-guide/computation-and-storage-costs.html

Q3:子网节点共识中作恶的话,是否有惩罚机制?

回答:目前的惩罚机制是扣除节点运营商所得的奖励。通常我们会要求一个运营商参与多个子网,所以一个节点作恶会影响它整体的收益,这样作恶的成本就上去了。

Q4:有没有canister_inspect_message的例子,我打算用这规避DDOS的问题?

回答:目前只支持 Rust。例子如下:

    use ic_cdk_macros::*;

    #[query]

    fn hello() {

        ic_cdk::print(Hello World!);

    }

    #[link(wasm_import_module = ic0)]

    extern C {

      pub fn accept_message() -> ();

    }

    #[export_name = canister_inspect_message]

    fn canister_inspect_message() {

       unsafe { accept_message(); }

    }

Q4:DFINITY采用的是数据中心的组织方式,但是相比其他一些项目,采用节点分散的组织形式,是不是并没有做到充分的去中心化?那么这样会不会导致中心作恶?技术团队在这个问题上是如何规划或者解决的?

回答:准确的说,数据中心并不参与运营,通常是节点提供商把自己的服务器托管在数据中心参与运营。节点提供商必须经过 KYC,除了增加作恶成本,还可以更好地根据地域、所属数据中心以及利益方来在不同子网之间分配资源,做到更大程度的去中心化。相比比特币和以太坊目前的矿池结构,IC的做法反而不会导致中心作恶,因为是网络结构是通过 NNS 统一分配的,不是节点自己决定的。

Q5:除了social app/企业应用方向,您还看好哪一个方向的发展?对标一下互联网?

回答:前面回答了

Q6:以太坊上的DAPP可以直接转到DFINITY上用吗?一键登录是否会扩展到其他生态?你们怎么解决流动性问题 和以太的生态有啥不同?

回答:ECDSA 的阈值签名可以打通和以太坊生态的整合。

Internet Identity 登录符合 OAuth 的标准,完全可以用到其它链或者任何其它网站上面。

通过和比特币、以太坊的整合,肯定会增加跨链资产的流动性。

以太坊的生态目前跨链都需要通过中心化的桥接组件,并不能实现双向自由调用,影响了跨链应用的可组合性。IC 的整合方式会改变这一点

Q7:刚公布的Roadmap里,最激动人心的比特币和DFINITY的直接集成而无需bridge,它们都用ECDSA椭圆曲线,我对阈值签名还没完全理解透。 high level来说,Dfinity的合约如何做UTXO的签名呢?能具体说一下来讲比特币网络的私钥在哪个Cainster环节用到?

回答:比特币的区块会直接上载到 IC 上,所以查看 UTXO 的记录很容易。

ECDSA 阈值签名并不没有私钥,是通过每个参与子网的节点各自保存自己的 secret share 来做到的,这也是为什么阈值签名更安全,因为私钥并不上链,满足隐私性。

Canister 可以直接发起对任何数据的签名,和普通的异步调用没有差别。

更多精彩内容,欢迎各位加入星球电报社区

星球电报频道:https://t.me/Odaily_News

星球电报社区:https://t.me/Odaily_CyptoPunk

DFINITY中国官方的联系邮箱:china@dfinity.org,大家有问题需求合作等欢迎联系此邮箱。

原创文章,作者:星球君。转载/内容合作/寻求报道请联系 report@odaily.email;违规转载法律必究。

ODAILY提醒,请广大读者树立正确的货币观念和投资理念,理性看待区块链,切实提高风险意识;对发现的违法犯罪线索,可积极向有关部门举报反映。

推荐阅读
星球精选