1.题目要求
1.1 要求 :打开 vault 来通过这一关!
题目代码:
1 | // SPDX-License-Identifier: MIT |
2. 分析
2.1 在区块链上使用或开发时,首先要记住的是,区块链中没有任何东西是私有的。即使您将变量声明为
private
或 ,也可以看到所有内容internal
2.2 状态变量存储在合约存储中,因为变量
password
是一个 32 字节的数据,它总是会填满整个槽,使得它在合约的第二个槽中的位置非常可预测,因为第二个状态变量定义。在这种情况下,我们可以很容易地使用web3.py
getstorageat()
上的功能,通过在第二个存储槽中查找来查看密码是什么。然后我们可以选择将其转换为文本以查看密码是什么。2.3 在浏览器控制台上执行 * await web3.eth.getStorageAt(contract.address,1) * 命令 获取password
然后在 关卡实例部署的合约上输入获取到的 password
3. 解题
3.1 获取关卡实例地址:0x3741430AB42C816Dbbe583001C9615049ad09e31
3.2 执行 *await web3.eth.getStorageAt(contract.address,1) * 得到password :0x412076657279207374726f6e67207365637265742070617373776f7264203a29
调用实例部署 的合约,并调用合约的 unlock() 函数:
3.3 对比调用 unlock() 函数之后locked 的值
3.4 提交案例并查看结果
3.5 成功!!!!