EAVE

谢晗剑:DeFi 智能合约风险与 Nervos DAO 对策

原文标题:《DeFi 中的智能合约危险》 作者:谢晗剑(Jan Xie),Nervos 首席架构师,秘猿科技首席执行官,前以太坊中心研制团队成员

金融是危险办理的艺术。不管财物自身仍是操作进程都或许存在危险。财物具有价格,而价格是其内涵价值和归纳危险的反映。对财物进行评价时,对危险的评价也必不可少。操作危险首要来自于易犯错且可被收购的「人」。因而,不管是关于依据传统财物的传统金融,仍是关于运转在原生加密财物上的新式去中心化金融(又叫 DeFi)来说,对财物和操作危险的评价都是金融的中心。

谢晗剑:DeFi 智能合约危险与 Nervos DAO 对策

加密财物的危险既包含方针改变等外部危险,也包含规划缺点和施行过错等内部危险。在以太坊上,原生代币便是 ETH,而非原生代币便是咱们所谓的 ERC token。ERC token 是指契合 ERC20 规范及其衍生规范(例如 ERC721 和 ERC777 等)中任何一种的 token。原生财物的危险会低于非原生财物的危险,因为后者除了遭到以太坊客户端缝隙的影响外,还会遭到智能合约缝隙的影响。关于 ERC token 和 DeFi,智能合约中的缝隙是最受重视的,因为 DeFi 作为一个体系,是由来自国际各地的不同的开发者们创立的许多智能合约交错在一起的杂乱网络。咱们把由智能合约缝隙引起的危险称为智能合约危险。

针对智能合约的缝隙,人们做了许多研讨,咱们也发现了许多防护的办法。假如您有爱好,这儿有一份不错的调查报告 1。可是,众所周知,找到并修正一切较重要的智能合约(或许一切程序)中的缝隙是不或许的。咱们生活在一个充溢通讯过错和随机(改变)的国际中,每一步都或许会导致「失真」:咱们无法将头脑中的主意写成准确的说明书,同样地,咱们也无法将这份说明书毫无瑕疵地呈现出来。

假如这便是严酷的实际,那么咱们在加密财物的完成中,不只需考虑到自动防护和被迫防护,一起还应该考虑到危险操控,这样当一些欠好的状况发作时,能够将丢失降到最低,防止一个细小的过错终究演变为黑天鹅工作。智能合约能够经过多种规划方法来完成危险操控,最重要的一种(我以为)是运用程序状况的去中心化,因为运用程序状况的中心化会扩大由智能合约缝隙形成的损坏。我将在接下来的文章中进一步说明这一点。

ERC token 的几种规范从表面上看或许有所不同,但都具有一些一起的特征。ERC token 的基本方法是运用 token 合约来办理 token 帐本,用户经过与 token 合约的交互来完成发行、搬运或毁掉 token。token 账本的一切记载都存储在 token 合约中,而合约自身则仅仅以太坊上的一个账户。

例如,假设有一种 ERC token 叫 「cup」,Alice 具有 100 个 cup,Bob 具有 50 个 cup。该 token 的帐本坐落地址 / 帐户为 0x1234 的以太坊智能合约上。这个 token 合约 0x1234 会维护一个内部数据库,并在其间贮存比方 「Alice 具有 100 个 cup」 和 「Bob 具有 50 个 cup」之类的记载。当 Alice 想转 30 个 cup 给 Bob 时,她就向合约 0x1234 发送了一条带有签名的音讯,内容为 「请转 30 个 cup 给 Bob」,然后合约 0x1234 将会验证该音讯是否的确来自于 Alice,然后修正其内部数据库,更新为 「Alice 具有 70 个 cup」 和 「Bob 具有 80 个 cup」 的相关记载。

这儿存在的问题是,一切的逻辑和状况都保存在这一个合约 0x1234 中。Alice 和 Bob 无法直接拜访他们自己的记载,因为这些记载由合约 0x1234 保管。持有该 token 的一切用户都需求与该合约进行交互,而办理其 token 的仅有办法便是经过向合约 0x1234 发送音讯。

换句话说,token 合约是一切的中心。任何体系的中心都是进犯者最有利可图的进犯目标。中心的任何问题都会影响一切用户,因为一切 token/ 记载都由中心保管,而且每个人都必须与之交互。比方,因为整数溢出导致的 「transferFlaw[2]」 / 「allowAnyone[3]」 缝隙,或由不谨慎的授权导致的 「ItchySwap[4]」 缝隙,进犯者能够在一切者并未与合约交互的状况下,盗取别人的 token。经过 「ownerAnyone[5]」 缝隙,进犯者能够经过操控 token 合约来确定一切人的 token。在这些比方中,一旦 token 合约被损坏,每个人都将陷入困境。

ERC token 是由 token 合约而非个人用户持有的,这与以太坊的原生 token ETH 有很大的不同。ETH 的余额并不是由任何智能合约存储的,而是由用户直接操控。每个 ETH 一切者都具有自己的帐户和余额记载。例如,假如在以太坊主链上,Alice 有 100 个 ETH,Bob 有 50 个 ETH,那么 Alice 在自己的账户中记载为「余额 = 100」,Bob 在自己的账户中记载为「余额 = 50」。Alice 的余额只会跟着带有她签名的转出而削减,Bob 的帐户也是如此。ETH 的一切权记载涣散在多个帐户中,而非会集在单个帐户中。只需他们的私钥是安全的,就没人能从他们那里盗取 ETH。相反,ERC token 的进犯规模则更大,因为进犯者完全能够测验损坏 token 合约,这比损坏协议自身要简单的多。

不同的内生危险使得 ERC token 和 ETH 成为两种不同类型的财物。在去中心化网络上运转的智能合约与去中心化网络是不同的。中心化的问题是因为 ERC token 在运用层而引起的,这会扩大智能合约缝隙的潜在损害,不幸的是,咱们知道人类总是会犯过错,所以总是会有缝隙。网络 / 一致层的去中心化无法处理运用层的中心化问题。

中心化的现象呈现在 ERC 系列的 token 中,是因为它们的状况并非是以太坊编程模型中的一等公民(first-class citizen)[6]。在以太坊中,状况是代码的附件,不能直接引证和比较。当然将具有相同验证规矩(比方,相同 token 的记载)的状况放在同一个合约中是很天然的工作,可是,这就会导致该合约在某种程度上变成中心化的合约。这便是在以太坊编程模型中呈现的成果。

可是在 CKB 上,因为状况是一等公民,因而正好相反。状况是用户能够直接把玩的目标,而代码仅仅状况的附件。咱们能够天然地将运用相同验证规矩的状况进行比较和分组,即便这些状况由不同的用户直接持有。

在 CKB 上,咱们将非原生代币称为 「用户自界说 token」 或许是 UDT。关于给定的 UDT,财物界说(代码)和财物记载(状况)是分隔的,不同用户的记载(地址)也是分隔的。财物界说描绘了 token 的逻辑,比方」发行上限是 1 百万「或许」Bob 能够发行新的 token「,而财物记载则为」Alice 具有 100 个 token「之类的信息。

财物界说是一个合约,由 token 发行者创立,并存储在发行者所具有的 Cell 中(财物界说 Cell,Asset Definition Cell),而财物记载则保存在用户自己的 cell 中,而且一切的财物记载均运用相同的「类型脚本」(type script)。

每个用户都运用他 / 她自己的 Cell 来存储他 / 她自己的 token 记载。 这些 token 记载同享财物界说 Cell 中界说的相同验证规矩。经过这种结构,财物记载都以去中心化的方法存储着。

谢晗剑:DeFi 智能合约危险与 Nervos DAO 对策

如上图所示,Alice 持有的 token 存储在 Alice 自己的 cell 中,而且(这个 cell)由她自己的「锁脚本」(lock script)维护着,现在默许选用的是 Secp256k1。即便财物界说存在问题,进犯者也无法修正 Alice 的财物记载,因为这样做需求 Alice 的私钥。因为 token 是由 Alice 直接持有的,因而进犯者无法绕开 Alice 设定的锁。经过 token 状况的去中心化,咱们能够有用操控由财物界说的缝隙所形成的丢失。

可是这儿依然有或许存在影响每个人(财物)的缝隙:比方,财物界说中或许存在一个缝隙,这个缝隙答应任何人发行比预期更多的 token。UDT 的优点是,首要,消除了大部分的缝隙;其次,财物界说 Cell 遭到锁(脚本)的维护,该锁(脚本)天然也能够是 token 发行中身份验证逻辑的一部分。经过协议设置身份验证机制是十分简单的。这种关于授权和事务逻辑的解耦是一种十分棒的工程实践,也是 CKB 中默许的做法。UDT 会比 ERC token 有更好的去中心化特点,因而 UDT 的智能合约危险峻低于 ERC token,当然仍是高于原生代币。

假如您也对 UDT 感爱好,在 Nervos Talk 上现已有了一些评论 [7],欢迎参加。

运用程序状况的去中心化也有助于 DeFi 程序的规划。Nervos DAO[8] 是 CKB 上第一个 DeFi 运用。它是一个智能合约,用户能够用相同的方法与 CKB 上恣意一个智能合约进行交互。Nervos DAO 的其间一个功用是为 CKByte 的持有者供给一个抗(二级发行)稀释的对策。经过将 CKByte 存入 Nervos DAO,CKByte 持有者将取得相应的二级发行奖赏,这确保了他们持有 CKByte 的占比只会遭到根底发行硬顶的影响,就像比特币相同。在编撰本文时,DAO 中现已存入了超越 10 亿个 CKByte[9],而且这一数字还在不断上升,这不便是进犯者苦苦寻觅的进犯目标吗?对此,咱们需求忧虑吗?

大可不必!因为 Nervos DAO 中确定的 CKByte 并没有汇聚在同一个智能合约内,它依然由不同的用户持有!当用户想要将 CKByte 存入 Nervos DAO 时,他 / 她经过挑选 cell (CKByte 的 UTXO 模型),然后将这些 cell 的 type script 的引证设置为 0x82d76d1b75fe2fd9a27dfbaa65a039221a380d76c926f378d3f81cf3e7e13f2e,这串数字会指向 Nervos DAO 脚本 [10]。这些 cell 的 lock script 将坚持不变。因为 Nervos DAO 的 type script 和 lock script 是别离的,因而进犯者在没有用户答应的状况下,永久不或许运用这些存储中的 CKByte。

假如要提取已确定的 CKByte,则必需要供给 lock script 对应的证明(签名)。这个验证进程不是经过任何智能合约,而是由 CKB 网络来确保的,而且没有其他代替计划。这儿,Nervos DAO 的脚本是为了确保用户退出 DAO 时,能够经过核算得到正确的补偿,而并非是为了持有(用户的)资金。

现在很难定量分析智能合约危险关于 DeFi 的影响,可是咱们能够从 Nexus Mutual[11] 供给的稳妥产品中获取一些头绪,这是一种去中心化的代替稳妥。它的第一个产品 SmartContractCover[12] 能够让用户购买任何一个智能合约的稳妥,这样一来,假如该智能合约被黑客进犯,那么用户就能够取得对应的补偿。Smartcontractcover 的保费由商场决议,并与稳妥期限和保额呈正相关。依据此文 [13],Nuo 中 1000 个 DAI 对应 90 天的稳妥费用为 6.41 个 DAI,而 Uniswap 中 1 个 ETH 对应 365 天的稳妥费用为 0.013 个 ETH。依据这些数据,咱们能够大致估量出,现在智能合约的年化危险本钱约为 2%。

这 2% 的本钱是因为智能合约危险所导致的商场功率低下而引起的,因而改善智能合约编程模型就显得反常重要。 一个不同的编程模型能够下降智能合约的危险,并为咱们带来一个更高效的 DeFi 商场。

感谢 Haseeb Qureshi,Cipher Wang 和 Christopher Heymann 对本文提出的反应定见。

来历链接:medium.com