Ethernaut题库闯关连载第12篇题解
今天这篇是Ethernaut 题库闯关连载的第12篇,难度等级:难。 Ethernaut 题库闯关我已经整理为一个专栏了, 欢迎大家订阅专栏。
本次挑战的合约(Privacy合约)很小心地使用私有变量去保护其存储的敏感数据。我们需要猜测出私有数据,并unlock
这个合约, 合约的源码如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Privacy {
bool public locked = true;
uint256 public ID = block.timestamp;
uint8 private flattening = 10;
uint8 private denomination = 255;
uint16 private awkwardness = uint16(now);
bytes32[3] private data;
constructor(bytes32[3] memory _data) public {
data = _data;
}
function unlock(bytes16 _key) public {
require(_key == bytes16(data[2]));
locked = false;
}
/*
A bunch of super advanced solidity algorithms...
,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`
.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,
*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^ ,---/V\
`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*. ~|__(o.o)
^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*' UU UU
*/
}
本次挑战和第 8 关:Vault 有相似点,可以先复习一个第 8 关,在来挑战。 这一关要求我们了解:
了解存储的原理
了解参数解析的原理
了解类型转换的原理
提示: 记住Metamask只是一种工具,如果它出现了问题,请使用其他工具。高级游戏可能涉及到使用remix,或你自己的web3提供者。
合约本身很简单,有许多状态变量,一个constructor(构造函数)
和一个unlock(解锁)
函数。
我们只对两个变量感兴趣,其他状态变量是无用的:
bool public locked
,初始化为真,必须设置为假才能赢得挑战。bytes32[3]private data
是存储密钥的变量。我们需要找出data[2]
的值来解决这个挑战。
我们可以看到所有其他的变量只是作为 "存储填充",以达到我们想要读取的内容(data[2]
)来解决挑战。
constructor(bytes32[3] memory _data)
只是初始化了data
变量的值。然后函数unlock(bytes16 _key)
,简单地检查传递的byte16 _key
输入是否与data[2]
的值匹配。如果比较结果返回 true
,我们就已经解锁合约并通过了挑战。
我们需要掌握三个概念,才能解决这个挑战。private
变量是真正的私有吗?data[2]
从bytes32
向下转换到bytes16
)。
我们先来了解一下私有变量及状态变量布局当你使用或在区块链上开发时,你必须记住的第一件事是,在区块链上没有什么是隐私的。即使你把一个变量声明为 private
或 internal
,一切都可以被看到...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!