1. 主页
  2. 文档
  3. Ethernaut 题库闯关
  4. #8 — Vault

#8 — Vault

Ethernaut挑战 #8:金库

本挑战的目标是能够猜出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的状态变量。但实际上,我们有两种不同的方式来做到这一点。

  1. 可以通过查看Etherscan或Tenderly上的部署数据来重新构建密钥
  2. 可以在部署后在一个区块后分叉网络,并使用[Foundry的作弊代码](https://book.getfoundry.sh/
这篇文章对您有用吗?

我们要如何帮助您?