Skip to content

Commit f5e48a9

Browse files
fix(lib/trie): use MustBeHashed for V1 trie nodes with larger storage values (#3739)
1 parent 75ef976 commit f5e48a9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+578
-358
lines changed

dot/core/service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ func (s *Service) handleBlock(block *types.Block, state *rtstorage.TrieState) er
247247
}
248248

249249
logger.Debugf("imported block %s and stored state trie with root %s",
250-
block.Header.Hash(), state.MustRoot(trie.NoMaxInlineValueSize))
250+
block.Header.Hash(), state.MustRoot())
251251

252252
parentRuntimeInstance, err := s.blockState.GetRuntime(block.Header.ParentHash)
253253
if err != nil {

dot/core/service_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,6 @@ func generateExtrinsic(t *testing.T) (extrinsic, externalExtrinsic types.Extrins
126126
func Test_Service_StorageRoot(t *testing.T) {
127127
t.Parallel()
128128

129-
ts := rtstorage.NewTrieState(trie.NewEmptyTrie())
130-
131129
tests := []struct {
132130
name string
133131
service *Service
@@ -152,7 +150,7 @@ func Test_Service_StorageRoot(t *testing.T) {
152150
service: &Service{},
153151
exp: common.Hash{0x3, 0x17, 0xa, 0x2e, 0x75, 0x97, 0xb7, 0xb7, 0xe3, 0xd8, 0x4c, 0x5, 0x39, 0x1d, 0x13, 0x9a,
154152
0x62, 0xb1, 0x57, 0xe7, 0x87, 0x86, 0xd8, 0xc0, 0x82, 0xf2, 0x9d, 0xcf, 0x4c, 0x11, 0x13, 0x14},
155-
retTrieState: ts,
153+
retTrieState: rtstorage.NewTrieState(trie.NewEmptyTrie()),
156154
trieStateCall: true,
157155
stateVersion: 0,
158156
},
@@ -161,7 +159,7 @@ func Test_Service_StorageRoot(t *testing.T) {
161159
service: &Service{},
162160
exp: common.Hash{0x3, 0x17, 0xa, 0x2e, 0x75, 0x97, 0xb7, 0xb7, 0xe3, 0xd8, 0x4c, 0x5, 0x39, 0x1d, 0x13, 0x9a,
163161
0x62, 0xb1, 0x57, 0xe7, 0x87, 0x86, 0xd8, 0xc0, 0x82, 0xf2, 0x9d, 0xcf, 0x4c, 0x11, 0x13, 0x14},
164-
retTrieState: ts,
162+
retTrieState: rtstorage.NewTrieState(trie.NewEmptyTrie()),
165163
trieStateCall: true,
166164
stateVersion: 1,
167165
},
@@ -282,6 +280,7 @@ func Test_Service_handleCodeSubstitution(t *testing.T) {
282280
errWrapped: io.ErrUnexpectedEOF,
283281
},
284282
"store_code_substitution_block_hash_error": {
283+
trieState: rtstorage.NewTrieState(trie.NewEmptyTrie()),
285284
serviceBuilder: func(ctrl *gomock.Controller) *Service {
286285
storedRuntime := NewMockInstance(ctrl)
287286
storedRuntime.EXPECT().Keystore().Return(nil)
@@ -339,6 +338,7 @@ func Test_Service_handleCodeSubstitution(t *testing.T) {
339338
}
340339
},
341340
blockHash: common.Hash{0x01},
341+
trieState: rtstorage.NewTrieState(trie.NewEmptyTrie()),
342342
},
343343
}
344344

dot/import.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121

2222
// ImportState imports the state in the given files to the database with the given path.
2323
func ImportState(basepath, stateFP, headerFP string, stateTrieVersion trie.TrieLayout, firstSlot uint64) error {
24-
tr, err := newTrieFromPairs(stateFP)
24+
tr, err := newTrieFromPairs(stateFP, trie.V0)
2525
if err != nil {
2626
return err
2727
}
@@ -41,7 +41,7 @@ func ImportState(basepath, stateFP, headerFP string, stateTrieVersion trie.TrieL
4141
return srv.Import(header, tr, stateTrieVersion, firstSlot)
4242
}
4343

44-
func newTrieFromPairs(filename string) (*trie.Trie, error) {
44+
func newTrieFromPairs(filename string, version trie.TrieLayout) (*trie.Trie, error) {
4545
data, err := os.ReadFile(filepath.Clean(filename))
4646
if err != nil {
4747
return nil, err
@@ -62,7 +62,7 @@ func newTrieFromPairs(filename string) (*trie.Trie, error) {
6262
entries[pairArr[0].(string)] = pairArr[1].(string)
6363
}
6464

65-
tr, err := trie.LoadFromMap(entries)
65+
tr, err := trie.LoadFromMap(entries, version)
6666
if err != nil {
6767
return nil, err
6868
}

dot/import_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func Test_newTrieFromPairs(t *testing.T) {
5252
t.Run(tt.name, func(t *testing.T) {
5353
t.Parallel()
5454

55-
got, err := newTrieFromPairs(tt.filename)
55+
got, err := newTrieFromPairs(tt.filename, tt.stateVersion)
5656
if tt.err != nil {
5757
assert.EqualError(t, err, tt.err.Error())
5858
} else {

dot/node_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ func TestInitNode_LoadStorageRoot(t *testing.T) {
385385
node, err := NewNode(config, ks)
386386
require.NoError(t, err)
387387

388-
expected, err := trie.LoadFromMap(gen.GenesisFields().Raw["top"])
388+
expected, err := trie.LoadFromMap(gen.GenesisFields().Raw["top"], trie.V0)
389389
require.NoError(t, err)
390390

391391
expectedRoot, err := trie.V0.Hash(&expected) // Since we are using a runtime with state trie V0

dot/rpc/modules/childstate_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ func setupChildStateStorage(t *testing.T) (*ChildStateModule, common.Hash) {
255255
err = tr.SetChild([]byte(":child_storage_key"), childTr)
256256
require.NoError(t, err)
257257

258-
stateRoot, err := tr.Root(trie.NoMaxInlineValueSize)
258+
stateRoot, err := tr.Root()
259259
require.NoError(t, err)
260260

261261
bb, err := st.Block.BestBlock()

dot/rpc/modules/childstate_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func createTestTrieState(t *testing.T) (*trie.Trie, common.Hash) {
3535
err := tr.SetChild([]byte(":child_storage_key"), childTr)
3636
require.NoError(t, err)
3737

38-
stateRoot, err := tr.Root(trie.NoMaxInlineValueSize)
38+
stateRoot, err := tr.Root()
3939
require.NoError(t, err)
4040

4141
return tr.Trie(), stateRoot

dot/rpc/modules/dev_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func newBABEService(t *testing.T) *babe.Service {
5757

5858
bs, es := newState(t)
5959
tt := trie.NewEmptyTrie()
60-
rt := wazero_runtime.NewTestInstanceWithTrie(t, runtime.WESTEND_RUNTIME_v0929, tt)
60+
rt := wazero_runtime.NewTestInstance(t, runtime.WESTEND_RUNTIME_v0929, wazero_runtime.TestWithTrie(tt))
6161
bs.StoreRuntime(bs.GenesisHash(), rt)
6262
tt.Put(
6363
common.MustHexToBytes("0x886726f904d8372fdabb7707870c2fad"),

dot/rpc/modules/helpers_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func newWestendLocalGenesisWithTrieAndHeader(t *testing.T) (
3535
require.NoError(t, err)
3636

3737
parentHash := common.NewHash([]byte{0})
38-
stateRoot := genesisTrie.MustHash(trie.NoMaxInlineValueSize)
38+
stateRoot := genesisTrie.MustHash()
3939
extrinsicRoot := trie.EmptyHash
4040
const number = 0
4141
digest := types.NewDigest()

dot/rpc/modules/state_integration_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"github.com/ChainSafe/gossamer/dot/rpc/modules/mocks"
1818
"github.com/ChainSafe/gossamer/dot/types"
1919
"github.com/ChainSafe/gossamer/lib/common"
20-
"github.com/ChainSafe/gossamer/pkg/trie"
2120
"github.com/stretchr/testify/assert"
2221
"github.com/stretchr/testify/require"
2322
"go.uber.org/mock/gomock"
@@ -575,7 +574,7 @@ func setupStateModule(t *testing.T) (*StateModule, *common.Hash, *common.Hash) {
575574
err = ts.SetChildStorage([]byte(`:child1`), []byte(`:key1`), []byte(`:childValue1`))
576575
require.NoError(t, err)
577576

578-
sr1, err := ts.Root(trie.NoMaxInlineValueSize)
577+
sr1, err := ts.Root()
579578
require.NoError(t, err)
580579
err = chain.Storage.StoreTrie(ts, nil)
581580
require.NoError(t, err)

dot/rpc/modules/system_integration_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ func setupSystemModule(t *testing.T) *SystemModule {
330330
Header: types.Header{
331331
Number: 3,
332332
ParentHash: chain.Block.BestBlockHash(),
333-
StateRoot: ts.MustRoot(trie.NoMaxInlineValueSize),
333+
StateRoot: ts.MustRoot(),
334334
Digest: digest,
335335
},
336336
Body: types.Body{},
@@ -354,7 +354,7 @@ func setupSystemModule(t *testing.T) *SystemModule {
354354
func newCoreService(t *testing.T, srvc *state.Service) *core.Service {
355355
// setup service
356356
tt := trie.NewEmptyTrie()
357-
rt := wazero_runtime.NewTestInstanceWithTrie(t, runtime.WESTEND_RUNTIME_v0929, tt)
357+
rt := wazero_runtime.NewTestInstance(t, runtime.WESTEND_RUNTIME_v0929, wazero_runtime.TestWithTrie(tt))
358358
ks := keystore.NewGlobalKeystore()
359359
t.Cleanup(func() {
360360
rt.Stop()

dot/state/base_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ func TestTrie_StoreAndLoadFromDB(t *testing.T) {
2929
err := tt.WriteDirty(db)
3030
require.NoError(t, err)
3131

32-
encroot, err := tt.Hash(trie.NoMaxInlineValueSize)
32+
encroot, err := tt.Hash()
3333
require.NoError(t, err)
3434

35-
expected := tt.MustHash(trie.NoMaxInlineValueSize)
35+
expected := tt.MustHash()
3636

3737
tt = trie.NewEmptyTrie()
3838
err = tt.Load(db, encroot)
3939
require.NoError(t, err)
40-
require.Equal(t, expected, tt.MustHash(trie.NoMaxInlineValueSize))
40+
require.Equal(t, expected, tt.MustHash())
4141
}
4242

4343
func TestStoreAndLoadGenesisData(t *testing.T) {

dot/state/block.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,7 @@ func (bs *BlockState) HandleRuntimeChanges(newState *rtstorage.TrieState,
880880
return fmt.Errorf("failed to update code substituted block hash: %w", err)
881881
}
882882

883-
newVersion, err := parentRuntimeInstance.Version()
883+
newVersion, err := instance.Version()
884884
if err != nil {
885885
return err
886886
}

dot/state/helpers_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func newWestendDevGenesisWithTrieAndHeader(t *testing.T) (
102102
require.NoError(t, err)
103103

104104
parentHash := common.NewHash([]byte{0})
105-
stateRoot := genesisTrie.MustHash(trie.NoMaxInlineValueSize)
105+
stateRoot := genesisTrie.MustHash()
106106
extrinsicRoot := trie.EmptyHash
107107
const number = 0
108108
digest := types.NewDigest()

dot/state/service_integration_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func TestService_Initialise(t *testing.T) {
9090
require.NoError(t, err)
9191

9292
genesisHeaderPtr := types.NewHeader(common.NewHash([]byte{77}),
93-
genTrie.MustHash(trie.NoMaxInlineValueSize), trie.EmptyHash, 0, nil)
93+
genTrie.MustHash(), trie.EmptyHash, 0, nil)
9494

9595
err = state.Initialise(&genData, genesisHeaderPtr, genTrieCopy)
9696
require.NoError(t, err)
@@ -287,7 +287,7 @@ func TestService_PruneStorage(t *testing.T) {
287287
copiedTrie := trieState.Trie().DeepCopy()
288288

289289
var rootHash common.Hash
290-
rootHash, err = copiedTrie.Hash(trie.NoMaxInlineValueSize)
290+
rootHash, err = copiedTrie.Hash()
291291
require.NoError(t, err)
292292

293293
prunedArr = append(prunedArr, prunedBlock{hash: block.Header.StateRoot, dbKey: rootHash[:]})
@@ -400,7 +400,7 @@ func TestService_Import(t *testing.T) {
400400
require.NoError(t, err)
401401
header := &types.Header{
402402
Number: 77,
403-
StateRoot: tr.MustHash(trie.NoMaxInlineValueSize),
403+
StateRoot: tr.MustHash(),
404404
Digest: digest,
405405
}
406406

@@ -440,7 +440,7 @@ func generateBlockWithRandomTrie(t *testing.T, serv *Service,
440440
err = trieState.Put(key, value)
441441
require.NoError(t, err)
442442

443-
trieStateRoot, err := trieState.Root(trie.NoMaxInlineValueSize)
443+
trieStateRoot, err := trieState.Root()
444444
require.NoError(t, err)
445445

446446
if parent == nil {

dot/state/storage.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,7 @@ func NewStorageState(db database.Database, blockState *BlockState,
5959

6060
// StoreTrie stores the given trie in the StorageState and writes it to the database
6161
func (s *StorageState) StoreTrie(ts *rtstorage.TrieState, header *types.Header) error {
62-
root := ts.MustRoot(trie.NoMaxInlineValueSize)
63-
62+
root := ts.MustRoot()
6463
s.tries.softSet(root, ts.Trie())
6564

6665
if header != nil {
@@ -92,7 +91,7 @@ func (s *StorageState) TrieState(root *common.Hash) (*rtstorage.TrieState, error
9291
if root == nil {
9392
sr, err := s.blockState.BestBlockStateRoot()
9493
if err != nil {
95-
return nil, err
94+
return nil, fmt.Errorf("while getting best block state root: %w", err)
9695
}
9796
root = &sr
9897
}
@@ -102,11 +101,11 @@ func (s *StorageState) TrieState(root *common.Hash) (*rtstorage.TrieState, error
102101
var err error
103102
t, err = s.LoadFromDB(*root)
104103
if err != nil {
105-
return nil, err
104+
return nil, fmt.Errorf("while loading from database: %w", err)
106105
}
107106

108107
s.tries.softSet(*root, t)
109-
} else if t.MustHash(trie.NoMaxInlineValueSize) != *root {
108+
} else if t.MustHash() != *root {
110109
panic("trie does not have expected root")
111110
}
112111

@@ -125,7 +124,7 @@ func (s *StorageState) LoadFromDB(root common.Hash) (*trie.Trie, error) {
125124
return nil, err
126125
}
127126

128-
s.tries.softSet(t.MustHash(trie.NoMaxInlineValueSize), t)
127+
s.tries.softSet(t.MustHash(), t)
129128
return t, nil
130129
}
131130

dot/state/storage_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func TestStorage_StoreAndLoadTrie(t *testing.T) {
3535
ts, err := storage.TrieState(&trie.EmptyHash)
3636
require.NoError(t, err)
3737

38-
root, err := ts.Root(trie.NoMaxInlineValueSize)
38+
root, err := ts.Root()
3939
require.NoError(t, err)
4040
err = storage.StoreTrie(ts, nil)
4141
require.NoError(t, err)
@@ -59,7 +59,7 @@ func TestStorage_GetStorageByBlockHash(t *testing.T) {
5959
value := []byte("testvalue")
6060
ts.Put(key, value)
6161

62-
root, err := ts.Root(trie.NoMaxInlineValueSize)
62+
root, err := ts.Root()
6363
require.NoError(t, err)
6464
err = storage.StoreTrie(ts, nil)
6565
require.NoError(t, err)
@@ -91,7 +91,7 @@ func TestStorage_TrieState(t *testing.T) {
9191
require.NoError(t, err)
9292
ts.Put([]byte("noot"), []byte("washere"))
9393

94-
root, err := ts.Root(trie.NoMaxInlineValueSize)
94+
root, err := ts.Root()
9595
require.NoError(t, err)
9696
err = storage.StoreTrie(ts, nil)
9797
require.NoError(t, err)
@@ -102,7 +102,7 @@ func TestStorage_TrieState(t *testing.T) {
102102
storage.blockState.tries.delete(root)
103103
ts3, err := storage.TrieState(&root)
104104
require.NoError(t, err)
105-
require.Equal(t, ts.Trie().MustHash(trie.NoMaxInlineValueSize), ts3.Trie().MustHash(trie.NoMaxInlineValueSize))
105+
require.Equal(t, ts.Trie().MustHash(), ts3.Trie().MustHash())
106106
}
107107

108108
func TestStorage_LoadFromDB(t *testing.T) {
@@ -125,7 +125,7 @@ func TestStorage_LoadFromDB(t *testing.T) {
125125
ts.Put(kv.key, kv.value)
126126
}
127127

128-
root, err := ts.Root(trie.NoMaxInlineValueSize)
128+
root, err := ts.Root()
129129
require.NoError(t, err)
130130

131131
// Write trie to disk.
@@ -205,13 +205,13 @@ func TestGetStorageChildAndGetStorageFromChild(t *testing.T) {
205205

206206
trieState := runtime.NewTrieState(&genTrie)
207207

208-
header := types.NewHeader(blockState.GenesisHash(), trieState.MustRoot(trie.NoMaxInlineValueSize),
208+
header := types.NewHeader(blockState.GenesisHash(), trieState.MustRoot(),
209209
common.Hash{}, 1, types.NewDigest())
210210

211211
err = storage.StoreTrie(trieState, header)
212212
require.NoError(t, err)
213213

214-
rootHash, err := genTrie.Hash(trie.NoMaxInlineValueSize)
214+
rootHash, err := genTrie.Hash()
215215
require.NoError(t, err)
216216

217217
_, err = storage.GetStorageChild(&rootHash, []byte("keyToChild"))

dot/state/tries.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func (t *Tries) SetEmptyTrie() {
6060

6161
// SetTrie sets the trie at its root hash in the tries map.
6262
func (t *Tries) SetTrie(tr *trie.Trie) {
63-
t.softSet(tr.MustHash(trie.NoMaxInlineValueSize), tr)
63+
t.softSet(tr.MustHash(), tr)
6464
}
6565

6666
// softSet sets the given trie at the given root hash

dot/state/tries_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func Test_Tries_SetTrie(t *testing.T) {
5959

6060
expectedTries := &Tries{
6161
rootToTrie: map[common.Hash]*trie.Trie{
62-
tr.MustHash(trie.NoMaxInlineValueSize): tr,
62+
tr.MustHash(): tr,
6363
},
6464
triesGauge: triesGauge,
6565
setCounter: setCounter,

dot/sync/chain_sync.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"github.com/ChainSafe/gossamer/internal/database"
2525
"github.com/ChainSafe/gossamer/lib/common"
2626
"github.com/ChainSafe/gossamer/lib/common/variadic"
27-
"github.com/ChainSafe/gossamer/pkg/trie"
2827
)
2928

3029
var _ ChainSync = (*chainSync)(nil)
@@ -872,7 +871,7 @@ func (cs *chainSync) handleBlock(block *types.Block, announceImportedBlock bool)
872871
return err
873872
}
874873

875-
root := ts.MustRoot(trie.NoMaxInlineValueSize)
874+
root := ts.MustRoot()
876875
if !bytes.Equal(parent.StateRoot[:], root[:]) {
877876
panic("parent state root does not match snapshot state root")
878877
}

0 commit comments

Comments
 (0)