Skip to content

Latest commit

 

History

History
65 lines (46 loc) · 2.52 KB

File metadata and controls

65 lines (46 loc) · 2.52 KB

Storage

contract FunWithStorage {
  struct Player {
        address playerId;
        uint256 score;
        uint256 level;
    }

  uin256 favoriteNumber;
  bool someBool;
  uint256[] myArray;
  uint256 constant NOT_IN_STORAGE = 123;
  mapping(address => uint256) balance;
  bytes32[3] private data;
  uint8 private flattening = 10;
  uint8 private denomination = 255;
  uint16 private awkwardness = uint16(block.timestamp);

  Player private thePlayer;

  uint64[] someDynamicArray;
}

favoriteNumber --> storage slot 0;

someBool --> storage slot 1;

myArray length --> storage slot 2;

myArray[2] --> storage slot keccak256(2) + 1. dynamic array’s elements are stored starting from keccak256(slot) where slot the location where the array's length is stored. (in this case 2).

NOT_IN_STORAGE --> not in storage, saved in the contract's bytecode due to "constant" keyword. Constant and Immutable keywords do not take a slot in storage.

balance(0x23d3957BE879aBa6ca925Ee4F072d1A8C4E8c890) --> keccak256(abi.encodePacked(key, p)) where key is the address in this case (0x23d3957BE879aBa6ca925Ee4F072d1A8C4E8c890); and p is the slot where the mapping itself is stored, in this case 3;

data --> fixed size array of 3 32bytes item, each take a storage slot; in this case they slots: 4, 5, 6.

flatenning + domination + awkardness --> storage slot 7; where flattening (uint8): 1 byte, value = 0x0A. denomination (uint8): 1 byte, value = 0xFF. awkwardness (uint16): 2 bytes, value = 0x3B60 (15200 in decimal). Remaining 28 bytes are or zeroes (padding).

playerId --> storage slot 8 uint256 score --> storage slot 9 ==> defining a struct in Solidity does not take up a storage slot space until it is declared

someDynamicArray --> at storage slot kecca256(10), we will have 4 uint64 concatenated from right to left

mapping(uint256 => mapping (address => bool)) s;

keccak256(abi.encodePacked(Key1, keccak256(abi.encodePacked(Key2, p)))

function doStuff() public {
uint256 newVar = favoriteNumber + 1;
uint256 otherVar = 7;
}

Variables in functions are saved in stack/memory and are only available for the duration of the function call.

Strings are treated as technically a dynamic sized array, so we need to precise the "memory" keyword.

Note: constant and immutable keywords restrict modificaction of a state variable (stored in "code" rather than storage). The difference is that constant variables can never be changed after compilation, while immutable variables can be set within the constructor.