Skip to content

Commit 7aa5ea7

Browse files
committed
No Merkle value computation in function
- Update comment that all Merkle values are expected to be set - Panic if merkle value is not set - Avoid leaving the map in a bad state
1 parent 6561b9c commit 7aa5ea7

File tree

3 files changed

+23
-60
lines changed

3 files changed

+23
-60
lines changed

dot/state/offline_pruner.go

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

124-
err = tr.PopulateMerkleValues(tr.RootNode(), merkleValues)
125-
if err != nil {
126-
return fmt.Errorf("populating Merkle values from trie: %w", err)
127-
}
124+
trie.PopulateMerkleValues(tr.RootNode(), merkleValues)
128125

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

lib/trie/database.go

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

188-
// PopulateMerkleValues writes the Merkle value of each children of the node given
189-
// as keys to the map merkleValues.
190-
func (t *Trie) PopulateMerkleValues(n *Node,
191-
merkleValues map[string]struct{}) (err error) {
188+
// PopulateMerkleValues writes the Merkle values of the node given and of
189+
// all its descendant nodes as keys to the map merkleValues.
190+
// It is assumed the node and its descendant nodes have their Merkle value already
191+
// computed.
192+
func PopulateMerkleValues(n *Node, merkleValues map[string]struct{}) {
192193
if n == nil {
193-
return nil
194+
return
194195
}
195196

196-
merkleValue := n.MerkleValue
197-
if len(merkleValue) == 0 {
198-
// Compute and cache node Merkle value if it is absent.
199-
if n == t.root {
200-
merkleValue, err = n.CalculateRootMerkleValue()
201-
if err != nil {
202-
return fmt.Errorf("calculating Merkle value for root node: %w", err)
203-
}
204-
} else {
205-
merkleValue, err = n.CalculateMerkleValue()
206-
if err != nil {
207-
return fmt.Errorf("calculating Merkle value for node: %w", err)
208-
}
209-
}
197+
if len(n.MerkleValue) == 0 {
198+
panic(fmt.Sprintf("node with key 0x%x has no Merkle value computed", n.Key))
210199
}
211200

212-
merkleValues[string(merkleValue)] = struct{}{}
201+
merkleValues[string(n.MerkleValue)] = struct{}{}
213202

214203
if n.Kind() == node.Leaf {
215-
return nil
204+
return
216205
}
217206

218207
branch := n
219208
for _, child := range branch.Children {
220-
err = t.PopulateMerkleValues(child, merkleValues)
221-
if err != nil {
222-
// Note: do not wrap error since this is recursive.
223-
return err
224-
}
209+
PopulateMerkleValues(child, merkleValues)
225210
}
226-
227-
return nil
228211
}
229212

230213
// GetFromDB retrieves a value at the given key from the trie using the database.

lib/trie/database_test.go

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -161,44 +161,25 @@ func Test_Trie_WriteDirty_ClearPrefix(t *testing.T) {
161161
func Test_PopulateMerkleValues(t *testing.T) {
162162
t.Parallel()
163163

164-
someNode := &Node{Key: []byte{1}, SubValue: []byte{2}}
165-
166164
testCases := map[string]struct {
167-
trie *Trie
168165
node *Node
169166
merkleValues map[string]struct{}
170-
errSentinel error
171-
errMessage string
167+
panicValue interface{}
172168
}{
173169
"nil node": {
174-
trie: &Trie{},
175170
merkleValues: map[string]struct{}{},
176171
},
177172
"leaf node": {
178-
trie: &Trie{},
179173
node: &Node{MerkleValue: []byte("a")},
180174
merkleValues: map[string]struct{}{
181175
"a": {},
182176
},
183177
},
184178
"leaf node without Merkle value": {
185-
trie: &Trie{},
186-
node: &Node{Key: []byte{1}, SubValue: []byte{2}},
187-
merkleValues: map[string]struct{}{
188-
"A\x01\x04\x02": {},
189-
},
190-
},
191-
"root leaf node without Merkle value": {
192-
trie: &Trie{
193-
root: someNode,
194-
},
195-
node: someNode,
196-
merkleValues: map[string]struct{}{
197-
"`Qm\v\xb6\xe1\xbb\xfb\x12\x93\xf1\xb2v\xea\x95\x05\xe9\xf4\xa4\xe7ُb\r\x05\x11^\v\x85'J\xe1": {},
198-
},
179+
node: &Node{Key: []byte{1}, SubValue: []byte{2}},
180+
panicValue: "node with key 0x01 has no Merkle value computed",
199181
},
200182
"branch node": {
201-
trie: &Trie{},
202183
node: &Node{
203184
MerkleValue: []byte("a"),
204185
Children: padRightChildren([]*Node{
@@ -211,7 +192,6 @@ func Test_PopulateMerkleValues(t *testing.T) {
211192
},
212193
},
213194
"nested branch node": {
214-
trie: &Trie{},
215195
node: &Node{
216196
MerkleValue: []byte("a"),
217197
Children: padRightChildren([]*Node{
@@ -240,12 +220,15 @@ func Test_PopulateMerkleValues(t *testing.T) {
240220

241221
merkleValues := make(map[string]struct{})
242222

243-
err := testCase.trie.PopulateMerkleValues(testCase.node, merkleValues)
244-
245-
assert.ErrorIs(t, err, testCase.errSentinel)
246-
if testCase.errSentinel != nil {
247-
assert.EqualError(t, err, testCase.errMessage)
223+
if testCase.panicValue != nil {
224+
assert.PanicsWithValue(t, testCase.panicValue, func() {
225+
PopulateMerkleValues(testCase.node, merkleValues)
226+
})
227+
return
248228
}
229+
230+
PopulateMerkleValues(testCase.node, merkleValues)
231+
249232
assert.Equal(t, testCase.merkleValues, merkleValues)
250233
})
251234
}

0 commit comments

Comments
 (0)