-
Notifications
You must be signed in to change notification settings - Fork 0
/
OnChainData.sol
64 lines (53 loc) · 1.82 KB
/
OnChainData.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
contract Foo {
// slot 0
uint256 public n = 0;
// slot 1
address public owner = msg.sender;
bool public flag = true;
uint16 public m = 1;
// slot 2
bytes32 private password; // the goal of the attacker is to retrieve this value, despite it being private
// constants do not use storage
uint256 public constant THREE = 3;
// slot 3, 4, 5 (one for each array element)
bytes32[3] public data;
struct User {
uint256 id;
bytes32 password;
}
// slot 6 stores the length of the array
// array elements are stored starting from slot hash(6)
// slot where array element is stored = keccak256(slot)) + (index * elementSize)
// where slot = 6 and elementSize = 2 (1 (uint) + 1 (bytes32))
User[] private users;
// slot 7: empty
// the entries for the mapping are stored at: hash(key, slot)
// where slot = 7, key = map key
mapping(uint256 => User) private idToUser;
constructor(bytes32 _password) {
password = _password;
}
function addUser(bytes32 _password) public {
User memory user = User({ id: users.length, password: _password });
users.push(user);
idToUser[user.id] = user;
}
function getArrayLocation(
uint256 slot,
uint256 index,
uint256 elementSize
) public pure returns (uint256) {
return
// array elements are stored starting from slot hash(slot)) + offset
uint256(keccak256(abi.encodePacked(slot))) + (index * elementSize);
}
function getMapLocation(
uint256 slot,
uint256 key
) public pure returns (uint256) {
// an entry of a mapping is stored at: hash(key, slot)
return uint256(keccak256(abi.encodePacked(key, slot)));
}
}