@@ -69,13 +69,11 @@ proc mergePayloadImpl[LeafType, T](
6969
7070 template resetKeys () =
7171 # Reset cached hashes of touched verticies
72- for i in 2 .. vids.len:
72+ for i in 1 .. vids.len:
7373 db.layersResKey ((root, vids[^ i]), vtxs[^ i])
7474
7575 while pos < path.len:
7676 # Clear existing merkle keys along the traversal path
77- vids.add cur
78- vtxs.add vtx
7977 var psuffix = path.slice (pos)
8078 let n = psuffix.sharedPrefixLen (vtx.pfx)
8179 case vtx.vType
@@ -87,13 +85,15 @@ proc mergePayloadImpl[LeafType, T](
8785 when payload is AristoAccount :
8886 if AccLeafRef (vtx).account == payload:
8987 return err (MergeNoAction )
90- let leafVtx = db.layersPutLeaf ((root, cur), psuffix, payload)
88+ let leafVtx = db.layersPutDup ((root, cur), AccLeafRef (vtx))
89+ leafVtx.account = payload
9190 leafVtx.stoID = AccLeafRef (vtx).stoID
9291
9392 else :
9493 if StoLeafRef (vtx).stoData == payload:
9594 return err (MergeNoAction )
96- let leafVtx = db.layersPutLeaf ((root, cur), psuffix, payload)
95+ let leafVtx = db.layersPutDup ((root, cur), StoLeafRef (vtx))
96+ leafVtx.stoData = payload
9797 (leafVtx, nil , nil )
9898 else :
9999 # Turn leaf into a branch (or extension) then insert the two leaves
@@ -141,6 +141,8 @@ proc mergePayloadImpl[LeafType, T](
141141 next = BranchRef (vtx).bVid (nibble)
142142
143143 if next.isValid:
144+ vids.add cur
145+ vtxs.add vtx
144146 cur = next
145147 psuffix = psuffix.slice (n + 1 )
146148 pos += n + 1
@@ -153,11 +155,10 @@ proc mergePayloadImpl[LeafType, T](
153155 # There's no vertex at the branch point - insert the payload as a new
154156 # leaf and update the existing branch
155157
156- let brDup = vtx.dup ()
157- let local = BranchRef (brDup).setUsed (nibble, true )
158- db.layersPutVtx ((root, cur), brDup)
159-
160- let leafVtx = db.layersPutLeaf ((root, local), psuffix.slice (n + 1 ), payload)
158+ let
159+ brDup = db.layersPutDup ((root, cur), BranchRef (vtx))
160+ local = BranchRef (brDup).setUsed (nibble, true )
161+ leafVtx = db.layersPutLeaf ((root, local), psuffix.slice (n + 1 ), payload)
161162
162163 resetKeys ()
163164 return ok ((leafVtx, nil , nil ))
@@ -238,7 +239,8 @@ proc mergeStorageData*(
238239 return err (MergeStoAccMissing )
239240
240241 let
241- stoID = AccLeafRef (accHike.legs[^ 1 ].wp.vtx).stoID
242+ accVtx = AccLeafRef (accHike.legs[^ 1 ].wp.vtx)
243+ stoID = accVtx.stoID
242244
243245 # Provide new storage ID when needed
244246 useID =
@@ -270,9 +272,8 @@ proc mergeStorageData*(
270272
271273 if not stoID.isValid:
272274 # Make sure that there is an account that refers to that storage trie
273- let leaf = AccLeafRef ( accHike.legs[^ 1 ].wp.vtx).dup # Dup on modify
275+ let leaf = db. layersPutDup (( STATE_ROOT_VID , accHike.legs[^ 1 ].wp.vid), accVtx) # Dup on modify
274276 leaf.stoID = useID
275- db.layersPutVtx ((STATE_ROOT_VID , accHike.legs[^ 1 ].wp.vid), leaf)
276277
277278 ok ()
278279
0 commit comments