在 solidity 中解码构造函数参数

Decode constructor arguments in solidity

我在玩 Ethernaut Level 8。目标是获取私有密码状态变量并解锁合约。

我知道可以使用 await contract.unlock(await web3.eth.getStorageAt(contract.address, 1));,但我想找到解码合约创建输入数据的密码。 Here是合同。

我试过 await contract.unlock("f94b476063b6379a3c8b6c836efb8b3e10ede188") 但没用。

// 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;
    }
  }
}

如果合同被验证,可以转到 contract section,向下滚动到 合同创建代码 并读取最后 32 个字节(64 个字符字节码)在这种情况下是 0x412076657279207374726f6e67207365637265742070617373776f7264203a29.

it is 32 bytes because the password state variable is declared like this:

bytes32 private password;

解决挑战类型:

await contract.unlock("0x412076657279207374726f6e67207365637265742070617373776f7264203a29")