review feedback + fix endianness bug

This commit is contained in:
Guillaume Ballet 2026-03-04 18:13:56 +01:00
parent 8f215241a5
commit 97f80aa5d1
No known key found for this signature in database

View file

@ -50,18 +50,23 @@ func GetBinaryTreeKey(addr common.Address, key []byte) []byte {
return getBinaryTreeKey(addr, key, false) return getBinaryTreeKey(addr, key, false)
} }
func getBinaryTreeKey(addr common.Address, key []byte, overflow bool) []byte { func getBinaryTreeKey(addr common.Address, offset []byte, overflow bool) []byte {
hasher := sha256.New() hasher := sha256.New()
hasher.Write(zeroHash[:12]) hasher.Write(zeroHash[:12])
hasher.Write(addr[:]) hasher.Write(addr[:])
hasher.Write(key[:31]) // key is big endian, hashed value is little endian
for i := range offset[:31] {
hasher.Write([]byte{offset[30-i]})
}
if overflow { if overflow {
// Overflow detected when adding MAIN_STORAGE_OFFSET,
// reporting it in the shifter 32 byte value.
hasher.Write([]byte{1}) hasher.Write([]byte{1})
} else { } else {
hasher.Write([]byte{0}) hasher.Write([]byte{0})
} }
k := hasher.Sum(nil) k := hasher.Sum(nil)
k[31] = key[31] k[31] = offset[31]
return k return k
} }
@ -77,25 +82,29 @@ func GetBinaryTreeKeyCodeHash(addr common.Address) []byte {
return GetBinaryTreeKey(addr, k[:]) return GetBinaryTreeKey(addr, k[:])
} }
func GetBinaryTreeKeyStorageSlot(address common.Address, key []byte) []byte { func GetBinaryTreeKeyStorageSlot(address common.Address, slotnum []byte) []byte {
var k [32]byte var offset [32]byte
// Case when the key belongs to the account header // Case when the key belongs to the account header
if bytes.Equal(key[:31], zeroHash[:31]) && key[31] < 64 { if bytes.Equal(slotnum[:31], zeroHash[:31]) && slotnum[31] < 64 {
k[31] = 64 + key[31] offset[31] = 64 + slotnum[31]
return GetBinaryTreeKey(address, k[:]) return GetBinaryTreeKey(address, offset[:])
} }
// Set the main storage offset // Set the main storage offset offset = MAIN_STORAGE_OFFSET + slotnum
// note that the first 64 bytes of the main offset storage // * Note that MAIN_STORAGE_OFFSET is 1 << 248, so the number
// are unreachable, which is consistent with the spec and // can overflow into a 33rd byte, but since the value is
// what verkle does. // shifted by one byte in getBinaryTreeKey, this only takes
copy(k[:31], key[:31]) // note of the overflow, and the value will be added after
overflow := k[0] == 255 // the shift, in order to avoid allocating an extra byte.
k[0] += 1 // 1 << 248, handle overflow out of band // * Note that the first 64 bytes of the main offset storage
k[31] = key[31] // are unreachable, which is consistent with the spec.
// * Note that `slotnum` is big-endian
overflow := slotnum[0] == 255
copy(offset[:], slotnum)
offset[0] += 1 // 1 << 248, handle overflow out of band
return getBinaryTreeKey(address, k[:], overflow) return getBinaryTreeKey(address, offset[:], overflow)
} }
func GetBinaryTreeKeyCodeChunk(address common.Address, chunknr *uint256.Int) []byte { func GetBinaryTreeKeyCodeChunk(address common.Address, chunknr *uint256.Int) []byte {