trie: polish the code

This commit is contained in:
Gary Rong 2024-07-12 16:10:29 +08:00
parent 2ed07c7ae8
commit 9d6877b26e
2 changed files with 14 additions and 24 deletions

View file

@ -202,58 +202,48 @@ func (t *VerkleTrie) DeleteAccount(addr common.Address) error {
// RollBackAccount removes the account info + code from the tree, unlike DeleteAccount
// that will overwrite it with 0s. The first 64 storage slots are also removed.
func (t *VerkleTrie) RollBackAccount(addr common.Address) error {
evaluatedAddr := t.cache.Get(addr.Bytes())
codesizekey := utils.CodeSizeKeyWithEvaluatedAddress(evaluatedAddr)
codesizeBytes, err := t.root.Get(codesizekey, t.nodeResolver)
var (
evaluatedAddr = t.cache.Get(addr.Bytes())
codeSizeKey = utils.CodeSizeKeyWithEvaluatedAddress(evaluatedAddr)
)
codeSizeBytes, err := t.root.Get(codeSizeKey, t.nodeResolver)
if err != nil {
return fmt.Errorf("rollback: error finding code size: %w", err)
}
codesize := binary.LittleEndian.Uint64(codesizeBytes)
codeSize := binary.LittleEndian.Uint64(codeSizeBytes)
// Delete the account header + first 64 slots + first 128 code chunks
key := common.CopyBytes(codeSizeKey)
for i := 0; i < verkle.NodeWidth; i++ {
codesizekey[31] = byte(i)
key[31] = byte(i)
// this is a workaround to avoid deleting nil leaves, the lib needs to be
// fixed to be able to handle that
v, err := t.root.Get(codesizekey, t.nodeResolver)
v, err := t.root.Get(key, t.nodeResolver)
if err != nil {
return fmt.Errorf("error rolling back account header: %w", err)
}
if len(v) == 0 {
continue
}
_, err = t.root.Delete(codesizekey, t.nodeResolver)
_, err = t.root.Delete(key, t.nodeResolver)
if err != nil {
return fmt.Errorf("error rolling back account header: %w", err)
}
}
var root *verkle.InternalNode
switch r := t.root.(type) {
case *verkle.InternalNode:
root = r
default:
return errInvalidRootType
}
// Delete all further code
var key []byte
for i, chunknr := uint64(32*128), uint64(128); i < codesize; i, chunknr = i+32, chunknr+1 {
for i, chunknr := uint64(32*128), uint64(128); i < codeSize; i, chunknr = i+32, chunknr+1 {
// evaluate group key at the start of a new group
groupOffset := (chunknr + 128) % 256
if groupOffset == 0 {
key = utils.CodeChunkKeyWithEvaluatedAddress(evaluatedAddr, uint256.NewInt(chunknr))
}
key[31] = byte(groupOffset)
_, err = root.Delete(key[:], t.nodeResolver)
_, err = t.root.Delete(key[:], t.nodeResolver)
if err != nil {
return fmt.Errorf("RollbackContractCode (addr=%x) error: %w", addr[:], err)
return fmt.Errorf("error deleting code chunk (addr=%x) error: %w", addr[:], err)
}
}
return nil
}

View file

@ -104,7 +104,6 @@ func TestVerkleRollBack(t *testing.T) {
t.Fatalf("Failed to update account, %v", err)
}
}
// create more than 128 chunks of code
code := make([]byte, 129*32)
for i := 0; i < len(code); i += 2 {
@ -113,6 +112,7 @@ func TestVerkleRollBack(t *testing.T) {
}
hash := crypto.Keccak256Hash(code)
if err := tr.UpdateContractCode(addr, hash, code); err != nil {
t.Fatalf("Failed to update contract, %v", err)
}
}