mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-19 19:30:44 +00:00
review feedback + fix endianness bug
This commit is contained in:
parent
8f215241a5
commit
97f80aa5d1
1 changed files with 26 additions and 17 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue