DeFi中的智能合约风险

金融是风险管理的艺术。资产和运营中都存在风险。资产具有价格,价格是其内在价值和综合风险的反映。我们不能不考虑其风险就无法评估资产。操作中的风险主要来自容易出错和易受攻击的人员。资产和操作风险的评估是金融的核心,无论是指基于传统资产的传统金融还是在本机加密货币资产上运行的崭新的去中心化金融(又名DeFi)。

损害控制是关键

加密货币资产的风险包括法规更改等外部风险,以及设计缺陷和实施错误等内部风险。在以太坊上,本机资产是ETH,非本机资产就是我们所谓的ERC代币,这是指符合ERC20标准及其同伴(例如ERC721和ERC777等)中任何一种的代币。原生资产的风险低于非本地资产的风险,因为后者可能会受到以太坊客户端错误和智能合约错误的影响。对于ERC令牌和DeFi,智能合约中的错误是最受关注的,因为作为系统的DeFi是一个复杂的网络,通过不同地方的不同开发人员创建的无穷智能合约将它们编织在一起。我们将由智能合约错误引起的风险称为智能合约风险。

许多研究工作都中心化在智能合约的漏洞上,我们发现了许多防御方法。如果您有兴趣,这是一个很好的调查。但是,众所周知,消除任何不平凡的智能合约(或任何程序)中的错误是不可能的。我们生活在一个充满通信错误和随机性的世界中,它们在每个步骤中都会导致“失真”:我们无法将思想转变为精确的规范,同样,我们也无法将规范转换为完美的实现。

如果这是残酷的现实,我们不仅应在我们的加密货币资产实现中考虑主动防御和被动防御,还应采用破坏控制方法,以在发生某些不良情况时将损失降到最低,以避免将蝴蝶变成黑天鹅。智能合约可以采用多种设计模式来进行损害控制,其中最重要的一种(我认为)是应用程序状态的去中心化,因为应用程序状态的中心化会放大由智能合约错误引起的破坏。让我更详细地解释我的意思。

ERC代币的风险

ERC令牌标准在界面上有所不同,但具有一些共同的功能。ERC令牌的基本模式是使用令牌合约来管理令牌分类帐,并且用户与令牌合约进行交互以发行,转移或刻录令牌。令牌分类帐的所有记录都存储在令牌合约中,而合约本身只是以太坊上的一个帐户。

例如,假设有一个ERC令牌“杯子”,爱丽丝有100个杯子,鲍勃有50个杯子。令牌分类帐是位于地址/帐户0x1234的以太坊智能合约。该令牌合约0x1234维护一个内部数据库,该数据股票储诸如“爱丽丝有100杯”和“鲍勃有50杯”之类的记录。当爱丽丝想将30杯转让给鲍勃时,她向合约0x1234发送了一条签名的消息,内容为“请转让30杯给鲍勃”,然后合约0x1234将验证消息确实来自爱丽丝并修改其内部数据库,更新“爱丽丝有70杯”和“鲍勃有80杯”的相关记录。

这里的问题是所有逻辑和状态都保留在单个合约0x1234中。爱丽丝(Alice)和鲍勃(Bob)无法直接访问他们自己的记录,因为这些记录由合约0x1234保管。该令牌的所有用户都与该合约进行交互,并且管理其令牌的唯一方法是通过向合约0x1234发送消息。

换句话说,令牌合约是一个中心点。任何系统中的中心点也是最有利可图的攻击点。中心点的任何问题都会影响所有用户,因为所有令牌/记录都由中心保留,并且每个人都必须与其交互。例如,由于整数溢出导致的“ transferFlaw ” /“ allowAnyone ”漏洞或由谨慎授权导致的“ ItchySwap ”漏洞,攻击者可以在所有者与合约没有任何交互的情况下窃取他人的令牌。借助“ ownerAnyone ”漏洞,攻击者可以控制令牌合约来锁定每个人的令牌。在所有这些示例中,一旦令牌合约被打破,每个人都会遇到麻烦。

ERC令牌是由令牌合约持有的,而不是由单个用户持有的,这与以太坊的以太坊等本地令牌非常不同。ETH余额的记录不是由任何智能合约存储的,而是由用户直接控制的。每个ETH所有者都有自己的帐户和余额记录。例如,如果在以太坊区块链上,爱丽丝有100 ETH,鲍勃有50 ETH,那么爱丽丝在自己的账户中记录为“ balance = 100”,鲍勃在自己的账户中记录为“ balance = 50”。爱丽丝的余额只能随着签名的存在而减少,而鲍勃的帐户也是如此。ETH所有权记录去中心化在多个帐户中,而不是中心化在单个帐户中。只要他们的私钥是安全的,没人能从他们那里窃取以太币。相反,

不同的固有风险使ERC代币和以太币成为两种不同的资产类别。在去中心化网络上运行的智能合约与去中心化网络不同。中心化问题是由ERC令牌再次在应用程序层上引入的,放大了任何智能合约错误的潜在损害,但是不幸的是,我们知道人类总是会犯错误。总是会有bug。网络/共识层的去中心化不能解决应用层上的中心化问题。

如何卸下风险放大器

中心化的观点出现在ERC代币中,因为它们的状态不是以太坊编程模型中的一等公民。状态是代码的附件,但不能直接引用和比较。将具有相同验证规则(例如,相同令牌的记录)的状态放入同一合约是很自然的,但是,此合约随后成为中心化的要点。这是以太坊编程模型的结果。

在CKB上,由于国家是一等公民,因此模式是相反的。状态是用户直接玩耍的对象,代码是状态的附件。我们可以自然地使用相同的验证规则对状态进行比较和分组,即使这些状态由不同的用户直接持有也是如此。

我们将CKB上的非原生令牌称为“用户定义令牌”或UDT。对于给定的UDT,资产定义(代码)和资产记录(状态)是分开的,并且不同用户(地址)的记录也是分开的。资产定义描述了令牌的逻辑,例如“发行上限为1M”或“鲍勃可以发行新令牌”,记录是诸如“爱丽丝有100个令牌”之类的信息。资产定义是由令牌开发者创建并存储在开发者拥有的单元(资产定义单元)中的合约,而记录则保留在用户的单元中,并且所有记录均使用相同的“类型”脚本。每个用户使用他/她自己的单元格来存储他/她自己的令牌记录。这些令牌记录共享资产定义单元定义的相同验证规则。通过这种结构,记录以去中心化的方式存储。

0D9QqUDb9hIopu6sc

如上图所示,Alice的令牌存储在Alice自己的单元中,并受她自己的锁定脚本保护,默认情况下为Secp256k1。即使资产定义中存在错误,攻击者也无法修改Alice的记录,因为这样做需要Alice的私钥。由于令牌直接由爱丽丝持有,因此攻击者无法绕开爱丽丝的锁。通过去中心化令牌的状态,可以控制资产定义中错误的破坏。

影响每个人的错误的可能性仍然存在:例如,资产定义中可能存在一个错误,该错误允许任何人发行比预期更多的令牌。UDT的好处是,首先,消除了大部分错误;其次,资产定义单元受到锁的保护,锁自然可以是令牌发行身份验证逻辑的一部分。使用协议提供的身份验证机制总是很容易的。授权与业务逻辑的这种分离是一种良好的工程实践,并且是CKB中的默认设置。UDT比ERC令牌更去中心化,因此UDT的智能合约风险低于ERC令牌,但仍高于原生令牌。

如果你有兴趣在UDT,有很多种 的讨论Nervos通话

安全的Nervos DAO

应用程序状态的去中心化也可以帮助DeFi应用程序设计。该Nervos DAO是CKB第一DEFI应用。这是一个智能合约,用户可以与CKB上的任何智能合约以相同的方式进行交互。Nervos DAO的一项功能是为CKByte持有人提供一种稀释对策。通过在Nervos DAO中存入资金,持有人可以获得成比例的次级奖励,这保证了其持有的资产仅受到硬性上限首次发行的影响,就像比特币一样。在撰写本文时,DAO中已经存储了超过10亿个CKByte,并且数量还在增加,这对于攻击者来说是一个非常有吸引力的合约。我们应该担心吗?

可能不是那么多,因为Nervos DAO中锁定的CKByte不在一个智能合约中合并在一起,而是由不同的用户持有当用户要向Nervos DAO进行存款时,他/她通过选择单元格(CKBytes的UTXO)来构造存款交易,并将其类型脚本引用设置为0x82d76d1b75fe2fd9a27dfbaa65a039221a380d76c926f378d3f81cf3e7e13f2e,该脚本指向Nervos DAO。这些单元格的锁定脚本保持不变。由于Nervos DAO类型的脚本与用户的锁定脚本是分离的,因此,攻击者永远无法在未经用户许可的情况下使用那些存放的CKByte。

要撤回已存入的CKByte,必须提供相应锁定脚本的见证人(签名)。此验证是由CKB网络而不是任何智能合约来保证的,没有解决方法。Nervos DAO脚本可以确保提款时的补偿计算正确,而不是持有资金。

对DeFi的影响

很难定量分析智能合约风险对DeFi的影响,但是我们可以从Nexus Mutual提供的保险产品中获得一些线索,该产品是“保险的去中心化替代品”。其第一个产品SmartContractCover允许用户购买任何智能合约的保险,因此,如果智能合约被黑客入侵,他/她将获得赔偿。SmartContractCover的权利金由市场决定,与承保期和承保金额成正比。根据这篇文章,如果您在Nuo上进行1000天DAI的90天保险,将花费6.41 DAI;而在Uniswap中进行365天1 ETH的保险,您将花费0.013 ETH。根据这些数字,我们可以得出估计的年度智能合约风险成本约为2%。

2%的成本是由智能合约风险引起的市场效率低下,因此,改进智能合约编程模型非常重要。不同的编程模型可以降低智能合约风险,并为我们带来更高效的DeFi市场。

感谢Haseeb QureshiCipher WangMatt Quinn和Christopher Heymann对这篇文章的反馈。

提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢