LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > dYdX Perpetual审计

dYdX Perpetual审计

2020-06-10 DeFi传教士 来源:区块链网络


Perpetual是dYdX的一种新型永续合约市场,可以让用户使用基于以太坊的原生代币作为抵押品去交易非以太坊相关基础资产的衍生物。

范围


合约
我们已审计代码的提交版本号为c5e2b0e58aaf532d2c8b1f658d1df2f6a3385318,在dydxprotocol/perpetual这个项目中。
所有合约在 contracts/protocol目录中,除了P10rders以外都已包含在内,还包含了contracts/protocol/v1/oracles目录的任何一个文件(这个是后来的提交创建的)。

价格预言机
Perpetual 使用第三方的价格预言机。这些价格预言机不在审计范围内(查看 安全假设 章节获取更多信息)。

原理设计
Perpetual实行激励机制,以推动用户的行为。例如在多头和空头之间有一个浮动利率,意在激励用户选择交易不受欢迎的一面,保持合约的价格与标的价格一致。对这些机制的博弈论分析超出了本次审计的范围。


安全假设

价格预言机
Perpetual需要价格预言机来报告那些以代币作为抵押品的资产价格。理解恶意或妥协的价格预言机有能力从使用的任何Perpetual市场盗取资产是非常重要的。此外,价格预言机未及时报告精准价格的行为(例如被Dos攻击)可能造成忠诚用户的损失。
我们不审计第三方的价格预言机。为达到本次审计的目的,我们假设这些预言机是诚实的,不妥协的,并能这样保持无限期地及时报告精准价格信息。

管理员
Perpetual有个拥有特权的管理员角色可以任意改变市场合约,设置市场参数,设置价格预言机,以及启动最终结算。管理员可以添加/删除全局操作者,这就有能力代表所有用户进行任意交易。这些特权可以让恶意或妥协的管理和全局操作者不被发现的从市场盗取资产。
为达到本次审计的目的,我们假设管理员和所有的全局操作者始终保持诚实和不妥协。

抵押代币的选择
稳定币成为了用于在Perpetual市场抵押的自然选择。一种最流行的稳定币,USDT能够从transfer或transferFrom的接收中提取手续费(查看USDT智能合约代码的131行)。虽然USDT在发文的时候并没有这么做,除非USDT智能合约的所有者能证明其所有权可以被销毁,否则它依然有能力这么做。接受审计的代码没有考虑这样的费用,如果这一费用被引出,可能会有异常行为。
为达到本次审计的目的,我们假设USDT被用作为Perpetual 市场的抵押代币,并且它不会在transfer或transferFrom过程中引出任何费用。

建议

以下是我们展示的发现和建议。

严重风险


高风险


中风险
不安全的透明代理模式
OpenZeppelin的AdminUpgradeabiltyProxy智能合约用于实现非结构化存储代理模式,方法是将 PerpetualProxy智能合约从前者继承,并将委托调用管理到PerpetualV1智能合约。
库中已实现的一种代理模型的功能是透明代理模型,它不允许代理的管理员去调用实现的智能合约,以阻止代理签名函数与实现的智能合约间的冲突。这是一个重要的安全功能。然而PerpetualProxy.sol中的_willFallback函数已经删除这个检查。
删除这个检查背后的动机是允许相同的地址可以同时成为PerpetualProxy智能合约和PerpetualV1智能合约的管理员。然而,这种便利带来了函数签名冲突的风险,可能使管理员无法访问实现的智能合约上的函数。
dYdX团队已意识到这个问题打算通过在部署任何新实现的合约前进行广泛的测试以降低这个风险,但是如果把这些担忧分开,就可以完全消除风险。这些担忧就是一个管理员负责升级代理,另一个管理员负责调用实现的智能合约上的访问控制函数。
可以考虑遵循原来的透明代理模式,通过删除PerpetualProxy智能合约并直接使用AdminUpgradeabilityProxy智能合约。另外,可以考虑定义一个新角色,一个不同于代理管理的角色,可以与那些带onlyAdmin修饰符的函数交互。
更新:未修改。开发团队回应,“我们有全面的测试去确保没有函数签名的冲突”。

低风险
缺失原生规范的文档字符串
虽然代码注释良好,容易理解,但基础代码中大部分公共和外部函数缺乏原生规范文档。这可能会阻碍一些审查者理解代码的含义,这不仅是评估安全也是评估正确性的基础。另外,文档字符串也可以提高可读性,便于维护。他们明确地说明函数的目的或意图可能出现故障的场景、允许调用它们的角色、返回的值和发出的事件。
可以考虑使用以太坊原生规范格式文档化合约公共API部分的所有函数(及它们的参数)。
更新:已通过PR#150和#168修复。

未使用最新稳定版本的OpenZeppelin智能合约
旧版的OpenZeppelin智能合约还在这个工程中使用。自从2.5.0版本已在最近发布,拥有诸如ReentrancyGuard智能合约的gas燃料优化提升,可以考虑提升这个库到最新的稳定版本。
更新:已通过PR#132修复。注意一个自定义的重入防护被使用以兼容可升级的代理模型。

注意
_verifyAccountsFinalBalances可以变得更容易验证
P1Trade.sol的第233-255行,被用于验证账号的抵押率是否恶化。代码工作正常,然而他的验证需要手工去检查当变量 initialBalance.margin, initialBalance.position, finalBalance.margin, 以及 finalBalance.position 的值为正值,负值,或者0时代码是否正常工作。有81组合在这些值中(3^4)。尽管很多组合可以快速排除,但仍需要消耗时间去验证代码的正确性。
可以考虑是否重构这个函数以方便验证。
更新:已通过PR#160修复。

注释中的错别字
有一少部分错别字在代码注释中。我们在这里列出。
* PerpetualProxy.sol第30行,conntract 应该为 contract。
* P1Trade.sol第225行,finalPosition 应该为 finalBalance.position。
* P1Trade.sol第244行,[0,+, -/+] 应该为 [0/+, -/+]。
可以考虑在部署到生产环境前修复这些错别字。
更新:已通过PR#131修复。

结论

没有严重或高风险问题被发现。提出一些小的建议提升工程的总体质量和健壮性。
总的来说我们发现代码非常整洁,有序,容易理解。

原文链接:https://blog.openzeppelin.com/dydx-perpetual-audit

最后提醒一下,市场有风险,本文只是个研究,不作为投资建议,请合理控制风险。

点赞就是对传教士最大的鼓励,谢谢支持。

—-

编译者/作者:DeFi传教士

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...