LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资讯 > PoolTogether-Pods审计

PoolTogether-Pods审计

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


PoolTogether是以太坊网络上一个协议让用户加入最小化信任,无损失的caipiao。Pods是一个新功能让用户能联合经营他们的caipiao票据和分享奖励。
在这之前已审计过主系统,PoolTogether团队又邀请我们复查和审计新的Pods功能。我们查看了代码,现在发布我们的结果。
已审计代码的提交版本号为8041b3dc72efd02b94d49fb37b9b308603af5ce,合约包含的范围有:
– ExchangeRateTracker,
– FixedPoint,
– ScheduledBalance,
– Pod
另外,我们复查了原系统的callRewarded 函数,这个函数需要支持Pods功能。
所有的外部代码和合约依赖关系都已文档化。
更新:所有的问题已被PoolTogether团队处理或接受,我们对缓解问题的分析假设pull请求都已被合并,但忽略对基础代码的任何其他潜在更改。

现在来展示我们的发现。

总结
总的来说,我们对团队的安全状况和基础代码的健康状况感到满意。和最初的审计一样,我们很高兴看到小巧的,封装好的函数和有良好文档的合约。我们仅担忧的是访问控制的缺乏。未限制谁加入pod可能会破坏功能的意愿(查看[N01脆弱的用例])

系统概况
我们原始的审计报告包含了主系统的描述。
Pods功能扩展了系统,在用户和特定池之间引入了一个可选的中间合约。中间合约代表用户汇聚用户的资产并充值它们到PoolTogether的系统中。作为交换,用户将获得新的ERC777代币形式获得Pod股份。
如果Pod合约赢得caipiao,它会更新在Pod代币和Pool代币之间的内部交换率。这将有效地分发奖励给Pod中所有的股份持有人。

严重风险
[C01]供应是可以控制的
当一名用户充值抵押品,总计的供应和他们个人的余额将在下次抽奖时被计划更新。然而,假如抵押品在下一轮前被提取,用户的个人余额会更新,但供应量却没有。
当供应被加固时,额外的Pod代币将被铸造出来不分配给任何用户。
后来,当pod赢得了caipiao,新的Pool代币讲均匀地分布在所有的Pod代币,甚至那些没有被分配的。这意味着用户将收到少于他们公平份额的奖励。
当提现一笔挂起的充值时可以考虑同时更新计划供应。一般地说,考虑抽离已计划的用户余额和供应交互,让他们在同一次调用被被更新。
更新:已在PR#2被修复。当提现一笔挂起的充值时,供应被更新。

高风险
[h01]充值使用操作者的抵押品
Pod合约的_deposit函数尝试从操作者拿取抵押品,但归因于from地址。
如果成功,这有效地从操作者转移资产到from地址。另外一方面,如果操作者没有足够的资产或Pod合约未被授权,operatorDeposit函数将回滚。任何这两个场景都是不可取的。
可以考虑更新transferFrom的参数去从from地址接收抵押品。
更新:已在PR#3修复。抵押品正确从from地址拿取。

中风险
[M01]未完善的ERC777功能
当用户充值资产到pod,他们将在当前抽奖后被计划收到Pod代币。概念上讲,当抽奖结束,他们将有足够的权限使用他们Pod代币的ERC777功能。实际上,一旦consolidateBalanceOf函数被调用,他们仅收到代币(在和Pod特定函数的任何后续状态改变交互时会发生)。
同时,send,transfer和transferForm函数不会记账新的代币。
可以考虑扩展那些调用consolidateBalanceOf的方法。另外,可以考虑制作一个consolidateBalanceOf的公共函数,让用户可以手动加固他们的代币。
更新:已在PR#4修复。Pod合约扩展了send,operatorSend,transfer和transferForm函数在调用相应的父方法前去调用相关联地址上的consolidateBalanceOf函数。

低风险
[L01]丢失返回值
clearConsolidated函数签名声明这个函数返回一个uint256的值,但没有返回任何东西。另外,它的返回值不会在唯一使用它的地方进行检查。
可以考虑从函数签名删除返回值。
更新:已在PR#5修复。返回值已从clearConsolidated函数签名删除。

[L02]误导性注释
一些代码注释应该更明确。
FixedPoint.sol的第85行:fixed point 18 number应该是fixed point 18 mantissa使之与基础代码中使用的约定保持一致。
ExchangeRateTracker.sol的第106和119行:词组in the past应该是at the specified timestamp。
Pod.sol的第80和91行:burned应该是redeemed。
Pod.sol的第113行:debited应该是credited。
更新:已在PR#6修复。注释已被恰当的更新。

[L03]难懂的代码
在有些情况下,数据结构会导致不必要且难懂的代码。特别是已计划的余额分别跟踪previousBalance和lastBalance。然而,前一个余额更新的唯一时间直接发生在余额加固后,并且只有在currentTimestamp位于lastTimestamp之后时才更新。在这种用例下,previousBalance将会增加0。这意味这它总是0.
这个事实并不明显,但它已隐含假定当已计划的余额被转成代币(因为所有的余额使用相同的交换率,不管它们是何时添加的)。虽然是正确的,但它使代码更难推理。
可以考虑简化已计划余额数据结构,通过它们的时间戳去记录单个的余额。
更新:已在PR#7修复。数据结构已按建议更新,ScheduledBalance和Pod合约已恰当地更新了。

注意&额外信息
[N01]脆弱用例
与简单地直接充值资产到Compound并获得小额固定的利息收益不同,PoolTogether系统的用户收到大量零星回报。
Pod允许用户在这个范围选择一个时间点,在这个点上,特定caipiao中奖的概率与Pod的大小成比例,但每个用户的中奖份额相应减少。
似乎这个功能的有用性取决于每个用户选择他们想要加入的pod的大小的能力,以及他们在收益范围中的位置。他们也可能加入特定参与者的pod.然而,访问控制的缺乏或锁定会破坏这个目标,因为由于其他用户的操作,给定用户可能会发现自己处于比预期大得多或小得多的pod中。
可以考虑引入访问控制或锁定的需求,或最少记录他们离开的原因。
更新:PoolTogether团队已经表明这是预期的行为,因为他们更喜欢在初始限制最小的情况下启动这个功能。

[N02]魔幻常量
当pod赢得caipiao,rewarded函数以200000gas薪资去执行。这个决定的原因在审计期间已经向我们解释过了,但是我们认为它也应该记录在合约里。可以考虑记录这个限制的原因,类似为啥选择200000这个特定值。
更新:已在PR#25修复,BasePool.callRewarded注释包含了薪资的解释。

[N03]重复代码
在ExchangeRateTracker合约中, currentExchangeRateMantissa函数可以通过调用currentExchangeRate函数简化。
同样,tokenToCollateralValue函数和collateralToTokenValue函数可以分别重用tokenToCollateralValueAt和collateralToTokenValueAt函数(也许就在一个小的重构后)
更新:已在PR#8部分修复。currentExchangeRateMantissa函数已删除,为了方便还是保留了转换函数。

[N04]重新初始化交易跟踪
ExchangeRateTracker数据结构能被重新初始,有效清理它的内容。
为了提高可预测性,可以考虑防止在初始化跟踪程序上调用初始化。如果需要,可以用reset函数来替代。
更新:已在PR#9修复。有一个检查可以保证初始化只能被调用一次。

[N05]不必要的加法
当计算未加固的余额,结果可以通过在期望值上加0来计算。可考虑直接设置结果,不用不必要加法。
更新:这个问题已废弃,因为处理[L03]难懂的代码时函数已删除。

[N06]排版错误
基础代码上有几个排版错误的地方:
* ExchangeRateTracker.sol的第25行:it's backing 应该为 its backing。
* ScheduledBalance.sol的第54-56行:deposit are consolidated 应该为 deposits are consolidated,last deposit self 应该为 last deposit in self。
* ScheduledBalance.sol的第123行:timeslot 应该为 timestamp。
* ScheduledBalance.sol的153行:give the current timestamp 应该为 given the current timestamp。
* Pods.sol的167行:half 应该为 behalf。
* Pods.sol的226行:users 应该为 user'self。
更新:已在PR#10修复。

结论
一个严重风险和一个高风险的问题被发现。一些修改已提议以遵循最佳实践和减少潜在的攻击面。

原文链接:https://blog.openzeppelin.com/pooltogether-pods-audit

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

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

—-

编译者/作者:DeFi传教士

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

LOADING...
LOADING...