lendf.me 的事件发生,真的令 DeFi 界的朋友 (包含我) 心情受到很大的影响
但我不认为这是最后一次的安全事件,DeFi 的乐高在未来只会越来越复杂。
从年初的 bZx 事件、curve、312 MakerDao 到 uniswap/lendf.me 等,可以看见 DeFi 的乐高背后,所代表的是以太坊生态的网络效应,他不但代表着这些 DeFi 的智能合约可以灵活应用,一个串一个;另一方面也代表着以太坊上的 「 风险 」 也存在网络效应,今天对于合约发行方而言,可能在我自身的业务并没有问题,但其他串我合约的人可能因为应用的过程有逻辑上的思虑不周,而导致代码串接的过程产生bug,进而被攻击。
尤其是需要串接各种合约的平台方,更在安全问题上防不胜防,合约开发者也承受者巨大的压力。例如今天我们可以说,在闪电贷未曾出现以前,bZx 可能是不存在问题的,或者更精确来会说,他们在设计平台的初期根本没有想过要在未来防止闪电贷攻击来设计合约。
所以 DeFi 如果要防范黑客攻击,那么应该做的事情,是让底层系统具有韧性,去做的分担。
打个比方说,如果住在一座天天都有人在开垦的山边,其实大雨一来,即使你怎么防范,泥石流几乎是必然,我们能做的事情,是不要让所有的住户都住在一栋泥石流来了注定要被冲垮的大厦里。
但今天以太坊上的 DeFi 合约, 基本上会让同一种 ERC 代币都必须存在同一个合约中(当然可能最近看到的情况是合约自己设计和串接有问题),我们如果从这个角度去想,那么就可以发现,当所有的用户资产都存储在一个金库时,那么基本上我们可以预期的,是这个合约一旦哪里有漏洞,那么用户的资产被盗取几乎是必然,当然今天把所有池子放一起的情况也是 。
换个角度说,如果即使在某些服务里,用户还是能自己手握着自己在这个合约的金库钥匙,那么其实漏洞产生的系统性风险问题是不存在的,因为底层的平台已经做好防范,还是觉得问题放生的当下,大家其实都会把问题集中在服务提供的开发者,当然在此我承认开发团队其实存在疏失。但其实我总认为底层的平台设计能够在为上层的服务多多点心力,将资产发行的代码和资产所有权的分离是一个把「风险去中心化」的方法。
大家不妨想想,什么叫做灾难呢,今天小偷冲进了金库并不叫做灾难,小偷冲进了金库拿走所有的钱才是。所以如果今天金库里面没啥钱,那么小偷来了或许我们还可以请他喝杯茶呢。
这个时候我在想,Nervos 面对这种 DeFi 资产的高攻击性,似乎已经在基础上做了一些准备:
1,状态的去中心化
在 Nervos 上所有的资产都是在 Nervos 特化的 UTXO,也就是 Cell 之中,而并不像是以太坊的账户模型,因此资产基本上是所谓的一等公民,而不是像在以太坊上的 ERC Token 全部都被限制在单个个合约账户( EOA)。这时候如果代币本身产生漏洞,你们资产本身并不会受到影响,因为每个资产所有人都有自己资产的钥匙。想更详细的了解资产是一等公民这个特性,对于安全有什么帮助,你可以参看 Nervos 核心架构师 Jan 的这篇文章)
2,状态的确定性是风险的一道大锁
以太坊的定位是“世界计算机”,基本上就宣告着「用户的资产状态是任他人所宰割的」,因为任何的交易,在你上链前你根本没办法确定他长得是什么样子,但确定之后已经变成无法挽回的局面了,也就是说状态的产生和状态的验证是耦合的,这具有着很大的风险。今天 lendf.me 的事件,基本上就有点像是你把你的钱拿去当铺放贷,有个人拿假黄金来借钱,当铺直接拿假币给没有判断真假币能力的法院去判决,而且这法院还判定这些交易有效。
不觉得有问题吗?
但你回头看,在 CKB 的交易状态在上链前是可以看见的,是有确定性的,所以今天在 CKB 上,如果这个拿假黄金来借钱的混蛋又出现了,那么可能会出现的情况是这样,当铺发现他想借走所有当铺的钱,当铺可能会觉得奇怪,我今天的生意这么特别好,我还可以去检查一下交易是不是有问题,如果是,我可以选择不发上链,来防止悲剧发生。(当然实际执行我相信会涉及到使用体验的难题)。