Ethernaut题库闯关连载第8篇题解。
今天这篇是Ethernaut 题库闯关连载的第8篇,难度等级:中等。
Ethernaut 题库闯关我已经整理为一个专栏了, 欢迎大家订阅专栏。
本挑战的目标是能够猜出Vault
的密码并解锁合约。
Vault 合约源代码如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Vault {
bool public locked;
bytes32 private password;
constructor(bytes32 _password) public {
locked = true;
password = _password;
}
function unlock(bytes32 _password) public {
if (password == _password) {
locked = false;
}
}
}
在查看解题思路之前,可以自己先想一想,停一下,这样才有更大的提高。
该合约相当简单和简短,我们有两个状态变量
bool public locked
检查金库是否被锁定bytes32 private password
是我们需要猜测的解锁密码。有一个constructor(bytes32 _password)
函数,它将
locked
变量设置为 true
。password
变量设置为输入参数_password
的值。之后,有一个unlock(bytes32 _password)
函数,它只是检查byte32输入是否与存储的password
值匹配,如匹配则解锁Vault
。
当你在区块链上使用或开发时,你必须记住的第一件事是,在区块链上,没有什么是真正私有的。即使你把一个变量声明为 private
或 internal
,一切都可以被看到。你通过阅读"SWC-136: Unencrypted Private Data On-Chain"来了解更多关于这个概念。
我这么说是因为合约的所有者会认为我不可能直接读取一个private
的状态变量。但实际上,我们有两种不同的方式来做到这一点。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!