Solidity Layout of State Variables in Storage
static type
固定サイズの変数は位置 0 から始まる
32byte以下のitemは以下のルールに従って可能ならば一つのslotにpackされる
スロットの最初のitemはlower-order alignedで保存される
elementary typeはそれらを保存するのに必要なだけのbyteしか使わない
yudetamago.icon > dynamic-arrayのように要素数を保存するためのbyteなどを使わないということ?
elementary typeが現在のslotに収まらないときは次のslotになる
yudetamago.icon > 例: bytes15, bytes15, bytes15 みたいに並べると最後の bytes15 は32byteに収まらないので次のslotになるということ
structとarrayは新しいslotになる
ただしそのメンバーはこれらのルールに従ってpackされる
各type固有のルールなど
31byteまでのbytes, string
higher-order bytes (left aligned)
data
lowest
length * 2
32byte以上のbytes, string
先頭 p
length * 2 + 1
keccak256(p)
data
dynamic-array
先頭 p
要素数
keccak256(k . p)
value (kはkey)
yudetamago.icon > 実は keccak256(p) + k の可能性がある? nrryuya.icon > これが正しそうですね
mappingと異なりこうしているのは、効率性のため 参考 配列のサイズが大きすぎると、他のmapping型の変数を上書き出来てしまうかもしれない 参考 mapping
先頭 p
未使用
keccak256(k . p)
value (kはkey)
nrryuya.icon > 捕捉だよ
Vyperにおけるmapping
Dynamic Arrayに関しては同じ
mapping型に関しては、ハッシュする時の順番が違う
keccak256(k . p)ではなくkeccak256(p . k)
参考
rule #hashedLocation("Solidity", BASE, OFFSET OFFSETS) => #hashedLocation("Solidity", keccakIntList(OFFSET BASE), OFFSETS)