0xmonaco CTF 体验心得
由开发人员、艺术家和设计师组成的集体 MatchBoxDAO 宣布推出 MatchBox Arena。该团队将其称为“Web3 公司的世界杯”,并表示游戏锦标赛旨在找出哪家公司拥有最好的技术团队。首先,可以代表公司和世界顶级的crypto公司(uniswap,polygon,ledger,chainlink。。。)同台竞技真的是一个非常荣幸的事情。所以我牺牲了宝贵的春节假期,就一直在打这个比赛。 这次CTF是一个用solidity操控汽车的算法比赛(终于遇到我非常感兴趣的地方了)介绍这本质上来说是一次博弈实验,而不是一次简单的代码hackthon。更像是一个社会实验,涉及纯技术方面、经济激励、效用优化模式和理性的压力测试。对于每一个参赛者,你需要实现自己的Car合约,特别是takeyourturn这个函数。对于每一轮你都需要做出决策,具体有五种决策: 1)加速(ACCELERATE) 2)炮弹(SHELL) 3)超级炮弹(SUPER_SHELL) 4)香蕉(BANANA) 5)盾(SHIELD) 有点像跑跑卡丁车?是的。。每一种决策都会耗费掉你的金额,你的金额总量是17500。而...

成长 -- 随笔(2)
深夜陷入了沉思,回顾了一下自己的成长历程。距离上一次的成长随笔已经过去7个月了~~ https://mirror.xyz/0xaaE7a1AD2764626d09a233a9bC06C38b413637cf/By3P_3NiIriKGObdbWlFo0mDdwFDY1v9VFbjaUMmObU 既然是随笔,我觉得格式什么的,就随意了~~ 这段时间我学了啥呢~~ Uniswap V2, V3; 精通Curve ( 3 Pool, Meta Pool, Compond Pool, AAVE Pool) ~~~ Balancer V2, Kyber, Bancor ; AAVE, Clipper, DODO, Mstable, Saddle, Shell, Wombat ~~~ DODO, DODO V2, Fraxswap ~~ 对我来说,能力提升最大的是打CTF。比赛的过程,纠错发现bug的攻防真的很能提升一个人的合约能力~~~ 最开心的是,认识了组内Andrew和Jimmy两位Crypto科学家~~ 最感激的是,Melvin带着我做项目,耐心和孜孜不倦地引导我去激发自己的潜能~~...
成长 -- 随笔
我完全不敢想象自己的成长速度。 1个月前,我还在和慢雾的群上问curve的合约代码的语言是的时候。余弦大佬回了我是vyper。我现在已经可以把vyper语言看懂了, 并且对于原理也掌握了。 把curve代码看了一下一遍,其实也发现不过如此。白皮书,其实也没这么深奥。跟当年打ACM的那种级别比,还是差得有点远。 Hardhat也越来越熟悉了。当时那个编写测试用例还要问XD的那个毛头小子,已经成长了好多。 我觉得我现在完全可以独立撑起一个商业项目,唯一卡住的地方可能是JS还是不太熟悉。基本功能是OK的,但是遇到一些比较少见的bug。估计,要问人。 对于以前的我来说,3,4天吃透一个主流Defi协议,我真的想都不敢想。如果只是调研,我觉得我还是勉强可以一试。 这种成长的速度我只能用指数级别来形容。我看了一下一个月前的自己,觉得好菜。 我很希望我一个月之后,再回头看现在的我,也是觉得现在的我很菜~~ end
0xmonaco CTF 体验心得
由开发人员、艺术家和设计师组成的集体 MatchBoxDAO 宣布推出 MatchBox Arena。该团队将其称为“Web3 公司的世界杯”,并表示游戏锦标赛旨在找出哪家公司拥有最好的技术团队。首先,可以代表公司和世界顶级的crypto公司(uniswap,polygon,ledger,chainlink。。。)同台竞技真的是一个非常荣幸的事情。所以我牺牲了宝贵的春节假期,就一直在打这个比赛。 这次CTF是一个用solidity操控汽车的算法比赛(终于遇到我非常感兴趣的地方了)介绍这本质上来说是一次博弈实验,而不是一次简单的代码hackthon。更像是一个社会实验,涉及纯技术方面、经济激励、效用优化模式和理性的压力测试。对于每一个参赛者,你需要实现自己的Car合约,特别是takeyourturn这个函数。对于每一轮你都需要做出决策,具体有五种决策: 1)加速(ACCELERATE) 2)炮弹(SHELL) 3)超级炮弹(SUPER_SHELL) 4)香蕉(BANANA) 5)盾(SHIELD) 有点像跑跑卡丁车?是的。。每一种决策都会耗费掉你的金额,你的金额总量是17500。而...

成长 -- 随笔(2)
深夜陷入了沉思,回顾了一下自己的成长历程。距离上一次的成长随笔已经过去7个月了~~ https://mirror.xyz/0xaaE7a1AD2764626d09a233a9bC06C38b413637cf/By3P_3NiIriKGObdbWlFo0mDdwFDY1v9VFbjaUMmObU 既然是随笔,我觉得格式什么的,就随意了~~ 这段时间我学了啥呢~~ Uniswap V2, V3; 精通Curve ( 3 Pool, Meta Pool, Compond Pool, AAVE Pool) ~~~ Balancer V2, Kyber, Bancor ; AAVE, Clipper, DODO, Mstable, Saddle, Shell, Wombat ~~~ DODO, DODO V2, Fraxswap ~~ 对我来说,能力提升最大的是打CTF。比赛的过程,纠错发现bug的攻防真的很能提升一个人的合约能力~~~ 最开心的是,认识了组内Andrew和Jimmy两位Crypto科学家~~ 最感激的是,Melvin带着我做项目,耐心和孜孜不倦地引导我去激发自己的潜能~~...
成长 -- 随笔
我完全不敢想象自己的成长速度。 1个月前,我还在和慢雾的群上问curve的合约代码的语言是的时候。余弦大佬回了我是vyper。我现在已经可以把vyper语言看懂了, 并且对于原理也掌握了。 把curve代码看了一下一遍,其实也发现不过如此。白皮书,其实也没这么深奥。跟当年打ACM的那种级别比,还是差得有点远。 Hardhat也越来越熟悉了。当时那个编写测试用例还要问XD的那个毛头小子,已经成长了好多。 我觉得我现在完全可以独立撑起一个商业项目,唯一卡住的地方可能是JS还是不太熟悉。基本功能是OK的,但是遇到一些比较少见的bug。估计,要问人。 对于以前的我来说,3,4天吃透一个主流Defi协议,我真的想都不敢想。如果只是调研,我觉得我还是勉强可以一试。 这种成长的速度我只能用指数级别来形容。我看了一下一个月前的自己,觉得好菜。 我很希望我一个月之后,再回头看现在的我,也是觉得现在的我很菜~~ end

Subscribe to shaneson.eth

Subscribe to shaneson.eth
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
去中心化的报价服务如果突然遭受异常值攻击,抵押物出现了非常高的价格。假如协议此时接受了该报价,从而进行大量借出。攻击者会把所以基于借贷的协议发起攻击,从而盗取里面锁定的全部资产。
所有基于借贷的defi协议都要做好完备的策略来应对这个问题,特别是注意到预言机是不可靠的。不能完全依赖。接下来以Compound的预言机模块为例,介绍如何编写预言机来防范这个问题。核心
【主要报价】先拿chainlink。
【备用报价】再拿uniswap。
如果主要报价和备用报价都失效了,就系统报警。最好禁用所有的功能。
Compound的价格主要从chainlink获取,但是其协议本身是有一个validator合约用于校验获取的价格是否准确。

校验调用者是否有权限来验证数据准确性
转换新价格的精度为保留6位小数(价格标准,包括咱们的EXO)
从univ2获取一个dex的加权价格
判断是否启用故障倒换,如果有则从univ2获取价格并更新价格
如果没有,判断chainlink和dex的价格是否相似(5%)并更新价格
UniswapV2 使用的价格预言机称为 TWAP(Time-Weighted Average Price) ,即**时间加权平均价格。**Compound就是使用该机制获取Dex的价格,简单来说就是会记录一个累加价格,但是该价格具有延迟性,所以被操控的概率很低,提高了安全性。
加权价格 =(新的时间累加价格 - 上次的时间累加价格)/ 所过区块时间
TWAP 的原理比较简单,首先,在 UniswapV2Pair 合约中,会存储两个变量 price0CumulativeLast 和 price1CumulativeLast ,在 _update() 函数中会更新这两个变量,其相关代码如下:

price0CumulativeLast 和 price1CumulativeLast 分别记录了 token0 和 token1 的累计价格。所谓累计价格,其代表的是整个合约历史中每一秒的 Uniswap 价格总和 。且只会在每个区块第一笔交易时执行累加计算,累加的值不是当前区块的第一笔交易的价格,而是在这之前的最后一笔交易的价格,所以至少也是上个区块的价格。取自之前区块的价格,可以大大提高操控价格的成本,所以自然也提高了安全性。 PERIOD 指定为了 24 小时,说明这个示例计算 TWAP 的固定时间窗口为 24 小时,即每隔 24 小时才更新一次价格。该示例也只保存一个交易对的价格,即 token0-token1 的价格。price0Average 和 price1Average 分别就是 token0 和 token1 的 TWAP 价格。比如,token0 为 WETH,token1 为 USDC,那 price0Average 就是 WETH 对 USDC 的价格,而 price1Average 则是 USDC 对 WETH 的价格。 update() 函数就是更新 TWAP 价格的函数,这一般需要链下程序的定时任务来触发,按照这个示例的话,就是链下的定时任务需要每隔 24 小时就定时触发调用 update() 函数。 update() 函数的实现逻辑也和上面所述的公式一致:
读取出当前最新的累计价格和当前的时间戳;
计算出当前时间和上一次更新价格时的时间差 timeElapsed,要求该时间差需要达 24 小时;
根据公式 TWAP = (priceCumulative - priceCumulativeLast) / timeElapsed 计算得到最新的 TWAP,即 priceAverage ;
更新 priceCumulativeLast 和 blockTimestampLast 为当前最新的累计价格和时间戳。 不过,有一点需要注意,因为 priceCumulative 本身计算存储时是做了左移 112 位 的操作的,所以计算所得的 priceAverage 也是左移了 112 位的。 consult() 函数则可查询出用 TWAP 价格计算可兑换的数量。比如,token0 为 WETH,token1 为 USDC,假设 WETH 的价格为 3000 USDC,查询 consult() 时,若传入的参数 token 为 token0 的地址,amountIn 为 2,那输出的 amountOut 则为 3000 * 2 = 6000,可理解为若支付 2 WETH,就可根据价格换算成 6000 USDC。
假如,chainlink和uniswap获取的报价都失效了,那么就发出警警报。
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
去中心化的报价服务如果突然遭受异常值攻击,抵押物出现了非常高的价格。假如协议此时接受了该报价,从而进行大量借出。攻击者会把所以基于借贷的协议发起攻击,从而盗取里面锁定的全部资产。
所有基于借贷的defi协议都要做好完备的策略来应对这个问题,特别是注意到预言机是不可靠的。不能完全依赖。接下来以Compound的预言机模块为例,介绍如何编写预言机来防范这个问题。核心
【主要报价】先拿chainlink。
【备用报价】再拿uniswap。
如果主要报价和备用报价都失效了,就系统报警。最好禁用所有的功能。
Compound的价格主要从chainlink获取,但是其协议本身是有一个validator合约用于校验获取的价格是否准确。

校验调用者是否有权限来验证数据准确性
转换新价格的精度为保留6位小数(价格标准,包括咱们的EXO)
从univ2获取一个dex的加权价格
判断是否启用故障倒换,如果有则从univ2获取价格并更新价格
如果没有,判断chainlink和dex的价格是否相似(5%)并更新价格
UniswapV2 使用的价格预言机称为 TWAP(Time-Weighted Average Price) ,即**时间加权平均价格。**Compound就是使用该机制获取Dex的价格,简单来说就是会记录一个累加价格,但是该价格具有延迟性,所以被操控的概率很低,提高了安全性。
加权价格 =(新的时间累加价格 - 上次的时间累加价格)/ 所过区块时间
TWAP 的原理比较简单,首先,在 UniswapV2Pair 合约中,会存储两个变量 price0CumulativeLast 和 price1CumulativeLast ,在 _update() 函数中会更新这两个变量,其相关代码如下:

price0CumulativeLast 和 price1CumulativeLast 分别记录了 token0 和 token1 的累计价格。所谓累计价格,其代表的是整个合约历史中每一秒的 Uniswap 价格总和 。且只会在每个区块第一笔交易时执行累加计算,累加的值不是当前区块的第一笔交易的价格,而是在这之前的最后一笔交易的价格,所以至少也是上个区块的价格。取自之前区块的价格,可以大大提高操控价格的成本,所以自然也提高了安全性。 PERIOD 指定为了 24 小时,说明这个示例计算 TWAP 的固定时间窗口为 24 小时,即每隔 24 小时才更新一次价格。该示例也只保存一个交易对的价格,即 token0-token1 的价格。price0Average 和 price1Average 分别就是 token0 和 token1 的 TWAP 价格。比如,token0 为 WETH,token1 为 USDC,那 price0Average 就是 WETH 对 USDC 的价格,而 price1Average 则是 USDC 对 WETH 的价格。 update() 函数就是更新 TWAP 价格的函数,这一般需要链下程序的定时任务来触发,按照这个示例的话,就是链下的定时任务需要每隔 24 小时就定时触发调用 update() 函数。 update() 函数的实现逻辑也和上面所述的公式一致:
读取出当前最新的累计价格和当前的时间戳;
计算出当前时间和上一次更新价格时的时间差 timeElapsed,要求该时间差需要达 24 小时;
根据公式 TWAP = (priceCumulative - priceCumulativeLast) / timeElapsed 计算得到最新的 TWAP,即 priceAverage ;
更新 priceCumulativeLast 和 blockTimestampLast 为当前最新的累计价格和时间戳。 不过,有一点需要注意,因为 priceCumulative 本身计算存储时是做了左移 112 位 的操作的,所以计算所得的 priceAverage 也是左移了 112 位的。 consult() 函数则可查询出用 TWAP 价格计算可兑换的数量。比如,token0 为 WETH,token1 为 USDC,假设 WETH 的价格为 3000 USDC,查询 consult() 时,若传入的参数 token 为 token0 的地址,amountIn 为 2,那输出的 amountOut 则为 3000 * 2 = 6000,可理解为若支付 2 WETH,就可根据价格换算成 6000 USDC。
假如,chainlink和uniswap获取的报价都失效了,那么就发出警警报。
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
不要不要不要完全信任任何一个第三方报价,一定要做完备性检查!!
No activity yet