Skip to content

Commit dbf36e7

Browse files
committed
Always ignore inlined nodes
1 parent c13b3cd commit dbf36e7

File tree

3 files changed

+57
-32
lines changed

3 files changed

+57
-32
lines changed

dot/state/offline_pruner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (p *OfflinePruner) SetBloomFilter() (err error) {
121121
return err
122122
}
123123

124-
trie.PopulateMerkleValues(tr.RootNode(), merkleValues)
124+
trie.PopulateNodeHashes(tr.RootNode(), merkleValues)
125125

126126
// get parent header of current block
127127
header, err = p.blockState.GetHeader(header.ParentHash)

lib/trie/database.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,28 +185,33 @@ func (t *Trie) loadNode(db Database, n *Node) error {
185185
return nil
186186
}
187187

188-
// PopulateMerkleValues writes the Merkle values of the node given and of
189-
// all its descendant nodes as keys to the merkleValues map.
188+
// PopulateNodeHashes writes the node hash values of the node given and of
189+
// all its descendant nodes as keys to the nodeHashes map.
190190
// It is assumed the node and its descendant nodes have their Merkle value already
191191
// computed.
192-
func PopulateMerkleValues(n *Node, merkleValues map[string]struct{}) {
192+
func PopulateNodeHashes(n *Node, nodeHashes map[string]struct{}) {
193193
if n == nil {
194194
return
195195
}
196196

197-
if len(n.MerkleValue) == 0 {
197+
switch {
198+
case len(n.MerkleValue) == 0:
198199
panic(fmt.Sprintf("node with key 0x%x has no Merkle value computed", n.Key))
200+
case len(n.MerkleValue) < 32:
201+
// Inlined node where its Merkle value is its
202+
// encoding and not the encoding hash digest.
203+
return
199204
}
200205

201-
merkleValues[string(n.MerkleValue)] = struct{}{}
206+
nodeHashes[string(n.MerkleValue)] = struct{}{}
202207

203208
if n.Kind() == node.Leaf {
204209
return
205210
}
206211

207212
branch := n
208213
for _, child := range branch.Children {
209-
PopulateMerkleValues(child, merkleValues)
214+
PopulateNodeHashes(child, nodeHashes)
210215
}
211216
}
212217

lib/trie/database_test.go

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -158,57 +158,77 @@ func Test_Trie_WriteDirty_ClearPrefix(t *testing.T) {
158158
assert.Equal(t, trie.String(), trieFromDB.String())
159159
}
160160

161-
func Test_PopulateMerkleValues(t *testing.T) {
161+
func Test_PopulateNodeHashes(t *testing.T) {
162162
t.Parallel()
163163

164+
const (
165+
merkleValue32Zeroes = "00000000000000000000000000000000"
166+
merkleValue32Ones = "11111111111111111111111111111111"
167+
merkleValue32Twos = "22222222222222222222222222222222"
168+
merkleValue32Threes = "33333333333333333333333333333333"
169+
)
170+
164171
testCases := map[string]struct {
165-
node *Node
166-
merkleValues map[string]struct{}
167-
panicValue interface{}
172+
node *Node
173+
nodeHashes map[string]struct{}
174+
panicValue interface{}
168175
}{
169176
"nil node": {
170-
merkleValues: map[string]struct{}{},
177+
nodeHashes: map[string]struct{}{},
178+
},
179+
"inlined leaf node": {
180+
node: &Node{MerkleValue: []byte("a")},
181+
nodeHashes: map[string]struct{}{},
171182
},
172183
"leaf node": {
173-
node: &Node{MerkleValue: []byte("a")},
174-
merkleValues: map[string]struct{}{
175-
"a": {},
184+
node: &Node{MerkleValue: []byte(merkleValue32Zeroes)},
185+
nodeHashes: map[string]struct{}{
186+
merkleValue32Zeroes: {},
176187
},
177188
},
178189
"leaf node without Merkle value": {
179190
node: &Node{Key: []byte{1}, SubValue: []byte{2}},
180191
panicValue: "node with key 0x01 has no Merkle value computed",
181192
},
182-
"branch node": {
193+
"inlined branch node": {
183194
node: &Node{
184195
MerkleValue: []byte("a"),
185196
Children: padRightChildren([]*Node{
186197
{MerkleValue: []byte("b")},
187198
}),
188199
},
189-
merkleValues: map[string]struct{}{
190-
"a": {},
191-
"b": {},
200+
nodeHashes: map[string]struct{}{},
201+
},
202+
"branch node": {
203+
node: &Node{
204+
MerkleValue: []byte(merkleValue32Zeroes),
205+
Children: padRightChildren([]*Node{
206+
{MerkleValue: []byte(merkleValue32Ones)},
207+
}),
208+
},
209+
nodeHashes: map[string]struct{}{
210+
merkleValue32Zeroes: {},
211+
merkleValue32Ones: {},
192212
},
193213
},
194214
"nested branch node": {
195215
node: &Node{
196-
MerkleValue: []byte("a"),
216+
MerkleValue: []byte(merkleValue32Zeroes),
197217
Children: padRightChildren([]*Node{
198-
{MerkleValue: []byte("b")},
218+
{MerkleValue: []byte(merkleValue32Ones)},
199219
{
200-
MerkleValue: []byte("c"),
220+
MerkleValue: []byte(merkleValue32Twos),
201221
Children: padRightChildren([]*Node{
202-
{MerkleValue: []byte("d")},
222+
{MerkleValue: []byte(merkleValue32Threes)},
203223
}),
204224
},
205225
}),
206226
},
207-
merkleValues: map[string]struct{}{
208-
"a": {},
209-
"b": {},
210-
"c": {},
211-
"d": {},
227+
nodeHashes: map[string]struct{}{
228+
merkleValue32Zeroes: {},
229+
merkleValue32Ones: {},
230+
merkleValue32Twos: {},
231+
merkleValue32Threes: {},
212232
},
213233
},
214234
}
@@ -218,18 +238,18 @@ func Test_PopulateMerkleValues(t *testing.T) {
218238
t.Run(name, func(t *testing.T) {
219239
t.Parallel()
220240

221-
merkleValues := make(map[string]struct{})
241+
nodeHashes := make(map[string]struct{})
222242

223243
if testCase.panicValue != nil {
224244
assert.PanicsWithValue(t, testCase.panicValue, func() {
225-
PopulateMerkleValues(testCase.node, merkleValues)
245+
PopulateNodeHashes(testCase.node, nodeHashes)
226246
})
227247
return
228248
}
229249

230-
PopulateMerkleValues(testCase.node, merkleValues)
250+
PopulateNodeHashes(testCase.node, nodeHashes)
231251

232-
assert.Equal(t, testCase.merkleValues, merkleValues)
252+
assert.Equal(t, testCase.nodeHashes, nodeHashes)
233253
})
234254
}
235255
}

0 commit comments

Comments
 (0)