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
Share Dialog
Share Dialog

Subscribe to shaneson.eth

Subscribe to shaneson.eth
Hardhat的debug实在太不方便了。对于大型的协议开发在fork网络调试的时候,用console.log不仅慢,而且调试太不方便了。而Foundry的优点有:
工具包小巧,安装十分方便
直接使用solidity来编写测试代码
自带fuzz测试,符号执行工具(开发中)
Cheat code 功能
运行速度飞快,"开发-测试-调试" 流程十分顺畅
可以兼容hardhat 工程结构
其中,在我现在要做的聚合dex上。如果calldata这种数据要进行解析,非常需要用到cast这个小工具。所以,利用五一恶补Fountry框架。
curl -L https://foundry.paradigm.xyz | bash
foundryup
安装成功之后就可以使用 forge, cast 这两个命令行工具了,后期升级直接运行 foundryup 即可。
forge init foundry-demo
采用forge init来初始化工程。项目工程主要包括:src,lib和test目录。
lib 目录 项目使用的第三方库,如 ds-test, openzeppelin,solmate
src 目录 项目的主要业务代码。
test目录
项目的主要的测试逻辑。
部署的话,Foundry原生的方法有点难用。这边建议还是用hardhat来进行deploy。
forge test -m "testDouble()" -vvvv

模糊测试是对单元测试的补充,模糊测试可能会发现一些我们单元测试无法覆盖的一些边界条件。
forge test -m "testFuzzDouble()" -vvvv

Fork mainnet 测试可以直接使用主网上面已经部署好的合约,并结合cheat code 完成一些在本地环境很难完成的测试。一个简单的演示例子: 在使用ETH主网的WETH进行存款。
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
function balanceOf(address) external returns(uint256);
}
contract ContractTest is DSTest {
Vm vm = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
// weth 主网地址
IWETH weth = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
function setUp() public {
vm.label(address(weth), "weth");
}
function testWethDeposit() public {
address myAddress = vm.addr(1337);
vm.deal(myAddress, 10 ether);
vm.prank(myAddress);
weth.deposit{value: 1 ether}();
assertEq(weth.balanceOf(myAddress), 1 ether);
}
}

forge run ./src/test/Contract.t.sol -t FooTest --sig "testDouble()" --debu

Cheat code 是对EVM执行环境的开洞,可以在运行时改变EVM的状态,比如说当前区块时间,当前区块号,改变任意账号余额,代码等功能。这些功能在我们写测试代码的时候会非常方便。例如:defi 项目中根据区块号或者区块时间计算奖励的测试。
详情:
Hardhat的debug实在太不方便了。对于大型的协议开发在fork网络调试的时候,用console.log不仅慢,而且调试太不方便了。而Foundry的优点有:
工具包小巧,安装十分方便
直接使用solidity来编写测试代码
自带fuzz测试,符号执行工具(开发中)
Cheat code 功能
运行速度飞快,"开发-测试-调试" 流程十分顺畅
可以兼容hardhat 工程结构
其中,在我现在要做的聚合dex上。如果calldata这种数据要进行解析,非常需要用到cast这个小工具。所以,利用五一恶补Fountry框架。
curl -L https://foundry.paradigm.xyz | bash
foundryup
安装成功之后就可以使用 forge, cast 这两个命令行工具了,后期升级直接运行 foundryup 即可。
forge init foundry-demo
采用forge init来初始化工程。项目工程主要包括:src,lib和test目录。
lib 目录 项目使用的第三方库,如 ds-test, openzeppelin,solmate
src 目录 项目的主要业务代码。
test目录
项目的主要的测试逻辑。
部署的话,Foundry原生的方法有点难用。这边建议还是用hardhat来进行deploy。
forge test -m "testDouble()" -vvvv

模糊测试是对单元测试的补充,模糊测试可能会发现一些我们单元测试无法覆盖的一些边界条件。
forge test -m "testFuzzDouble()" -vvvv

Fork mainnet 测试可以直接使用主网上面已经部署好的合约,并结合cheat code 完成一些在本地环境很难完成的测试。一个简单的演示例子: 在使用ETH主网的WETH进行存款。
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
function balanceOf(address) external returns(uint256);
}
contract ContractTest is DSTest {
Vm vm = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
// weth 主网地址
IWETH weth = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
function setUp() public {
vm.label(address(weth), "weth");
}
function testWethDeposit() public {
address myAddress = vm.addr(1337);
vm.deal(myAddress, 10 ether);
vm.prank(myAddress);
weth.deposit{value: 1 ether}();
assertEq(weth.balanceOf(myAddress), 1 ether);
}
}

forge run ./src/test/Contract.t.sol -t FooTest --sig "testDouble()" --debu

Cheat code 是对EVM执行环境的开洞,可以在运行时改变EVM的状态,比如说当前区块时间,当前区块号,改变任意账号余额,代码等功能。这些功能在我们写测试代码的时候会非常方便。例如:defi 项目中根据区块号或者区块时间计算奖励的测试。
详情:
<100 subscribers
<100 subscribers
No activity yet