From 3518be8c8b1d3fb56af1a391e9bc83d1d97c7b58 Mon Sep 17 00:00:00 2001 From: Daniel Liu <139250065@qq.com> Date: Mon, 26 Jan 2026 20:34:50 +0800 Subject: [PATCH] core/state: move slot RLP encoding into the MPT implementation #27000 (#1162) Continuing with a series of PRs to make the Trie interface more generic, this PR moves the RLP encoding of storage slots inside the StateTrie and light.Trie implementations, as other types of tries don't use RLP. Co-authored-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com> --- core/state/state_object.go | 14 ++++---------- trie/secure_trie.go | 10 ++++++++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/state/state_object.go b/core/state/state_object.go index 2b7eeb7b66..335e3099bf 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -185,20 +185,14 @@ func (s *stateObject) GetCommittedState(key common.Hash) common.Hash { s.db.setError(err) return common.Hash{} } - enc, err := tr.GetStorage(s.address, key.Bytes()) + val, err := tr.GetStorage(s.address, key.Bytes()) s.db.StorageReads += time.Since(start) if err != nil { s.db.setError(err) return common.Hash{} } var value common.Hash - if len(enc) > 0 { - _, content, _, err := rlp.Split(enc) - if err != nil { - s.db.setError(err) - } - value.SetBytes(content) - } + value.SetBytes(val) s.originStorage[key] = value return value } @@ -267,9 +261,9 @@ func (s *stateObject) updateTrie() (Trie, error) { } s.db.StorageDeleted += 1 } else { + trimmedVal := common.TrimLeftZeroes(value[:]) // Encoding []byte cannot fail, ok to ignore the error. - v, _ := rlp.EncodeToBytes(common.TrimLeftZeroes(value[:])) - if err := tr.UpdateStorage(s.address, key[:], v); err != nil { + if err := tr.UpdateStorage(s.address, key[:], trimmedVal); err != nil { s.db.setError(err) return nil, err } diff --git a/trie/secure_trie.go b/trie/secure_trie.go index f8e9585f2c..bb14a812a6 100644 --- a/trie/secure_trie.go +++ b/trie/secure_trie.go @@ -86,7 +86,12 @@ func (t *StateTrie) MustGet(key []byte) []byte { // If the specified storage slot is not in the trie, nil will be returned. // If a trie node is not found in the database, a MissingNodeError is returned. func (t *StateTrie) GetStorage(_ common.Address, key []byte) ([]byte, error) { - return t.trie.Get(t.hashKey(key)) + enc, err := t.trie.Get(t.hashKey(key)) + if err != nil || len(enc) == 0 { + return nil, err + } + _, content, _, err := rlp.Split(enc) + return content, err } // GetAccount attempts to retrieve an account with provided account address. @@ -148,7 +153,8 @@ func (t *StateTrie) MustUpdate(key, value []byte) { // If a node is not found in the database, a MissingNodeError is returned. func (t *StateTrie) UpdateStorage(_ common.Address, key, value []byte) error { hk := t.hashKey(key) - err := t.trie.Update(hk, value) + v, _ := rlp.EncodeToBytes(value) + err := t.trie.Update(hk, v) if err != nil { return err }