DFINITY DeFi生态即将爆发!作为用户的我们需要注意什么?
文章来自于|DfinitySZ
投稿、转载请联系|DfinitySZ小助手
在Internet Computer创世纪活动发射时,因考虑到安全问题,设置了一个只允许白名单智能合约容器能够持有、转移ICP通证的限制,取消该限制的提案于11月25日被受理,这意味着Internet Computer的DeFi生态即将爆发。
因提案受理带来的繁荣背后,同样也拥有一定的风险存在:IC上运行的每一个智能合约容器都有一个允许修改其代码的控制器列表,这有利于开发者可在不需要重新部署容器的情况下,更新迭代Dapp。如果这个优势被有心人利用,对用户来说这是一种风险:使用控制器更改容器代码,窃取它收到的ICP通证。
我们需要注意什么?
作为一名生态用户我们应该注意分辨容器是否可信的?这个问题的分别有两个不同的维度答案:
1、相信容器会做它应该做的事情。
2、相信容器的行为不会应为意外改变。
源代码验证
相信容器会做它应该做的事情(源代码验证):
在Internet Computer上运行的每一个容器不管是通过哪种高级语言编写(Motoko、Rust),最后都会被编译为WebAssembly/WASM代码运行。
WebAssembly:简称wasm,是一种运行在现代网络浏览器中的新型代码,一种以安全有效的方式运行可移植程序的新技术,主要针对Web平台。
回到上述问题,我们如何确保容器应该会做它应该做的问题呢?
基于所有容器最后都会编译为WebAssembly代码运行,我们需要找到容器的源代码与该源代码生成的WebAssembly代码对比是否相同,但Internet Computer的隐私保密机制不允许直接访问容器内的WebAssembly/Wasm代码,只提供允许访问容器WASM代码的SHA-256哈希值的权限,这意味着我们需要将容器开发者提供的源代码编译为WASM代码,并将最后计算的哈希值与现有容器中运行的WASM代码的SHA-256哈希值进行对比,如果哈希值相同,则证明该容器运行的WASM代码与容器开发者提供的源代码相同。
访问当前IC上现有容器WASM代码的SHA-256哈希值步骤:
第一种方法:在电脑上安装dfx(教程参见下方链接),找到需要查询的容器Principal,假设容器Principal是mwrha-maaaa-aaaab-qabqq-cai情况下,在终端运行命令:
dfx canister --no-wallet --network ic info mwrha-maaaa-aaaab-qabqq-cai
得到下图容器信息
控制器为:
a3hwk-dyaaa-aaaab-qaa4a-cai
模块哈希为:
0xa359f8493cd7bb7529b7521997331bc6d7b5a8272d794a8069f1d3448e87168f
DFX安装教程:
https://smartcontracts.org/docs/quickstart/newcomers.html
第二种方法:在IC.Rocks上输入容器的Principal可查看包括SHA-256哈希值在内的详细信息。
容器Principal示例:mwrha-maaaa-aaaab-qabqq-cai
注解:以上将容器开发者提供的源代码编译为WASM代码过程简称为可重现的构建,容器开发者可以通过提供一个可重现的WASM代码构建脚本实现,以提高社区对容器Dapp的信任度和透明度。
如果您是一名Dapp开发者您可以通过提供可重现的构建或将容器集成Cover服务增加您Dapp的透明度和信任度。
可重现的构建:
https://smartcontracts.org/docs/developers-guide/tutorials/reproducible-builds.html
Cover源代码验证服务:【源代码验证】Cover如何为IC生态提高透明度和信任度
不可变容器
相信容器不会因为意外改变(不可变容器)
综上所述容器由控制器部署和管理,此功能使智能合约更接近传统软件:开发者可以根据Dapp需求更新迭代,而对于DeFi Dapp应用来说可变性是危险的。
在IC上拥有四种机制可以使容器拥有不可变性:
第一种:最简单的方法是通过移除控制器使容器变的不可变,我们可以通过使用dfx来验证容器的控制器列表,假设容器的Principal是mwrha-maaaa-aaaab-qabqq-cai的情况下,运行以下代码(下方命令多了一遍已用文字分割):
dfx canister --no-wallet --network ic info mwrha-maaaa-aaaab-qabqq-cai 分割 dfx canister --no-wallet --network ic info mwrha-maaaa-aaaab-qabqq-cai
如果返回的结果的控制器列表是空的,那么容器是不可变的。
第二种:通过将容器的控制器设为自身来实现不可变性(开发人员将控制器交给容器自身,自己放弃控制权),但是,在这种情况下,需要仔细检查容器是否可以通过某种方式(后门)提交升级请求,例如,通过发出重新安装的请求(一种用于升级Canisters的机制),这个检查过程中可以根据上述说到的源代码验证方式去审查。
第三种:将容器设置为黑洞容器,一旦将容器被设置为黑洞容器后,容器本身是不可变(不可升级)的,(容器将自己作为控制器),但允许第三方为黑洞容器充值Cycles来维持容器的运行。
验证黑洞容器的方式和上述源代码验证的方式一样,将开发者提供的黑洞容器源代码生成WASM代码的SHA-256哈希值与现有黑洞容器的SHA-256哈希值对比。
黑洞容器示例:
https://ic.rocks/principal/e3mmv-5qaaa-aaaah-aadma-cai
验证黑洞容器的示例步骤:
https://github.com/ninegua/ic-blackhole
第四种:SNS是一个去中心化Dapp治理系统,任何开发者都可以将容器控制器绑定SNS系统,当开发者想更新相关Dapp的容器时需要经过社区的投票。
DFINITY创始人概述SNS系统:DFINITY创始人概述SNS神经元系统全文
SNS神经元系统详情:深入探讨SNS系统如何为Dapp带来去中心化治理
必看周刊
生态精选
寻宝回顾
精彩活动
联系我们
t.me/DfinitySZ
dfisz.com
twitter.com/DfinitySZ
twitter.com/DfinitySZCN
reddit.com/user/DfinityShenZhen