Skip to content

Commit cc30fb1

Browse files
committed
make root generation a function
1 parent 2e6fea7 commit cc30fb1

File tree

2 files changed

+53
-33
lines changed

2 files changed

+53
-33
lines changed

chain/block.go

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,12 @@ import (
99
"fmt"
1010
"time"
1111

12-
"github.com/ava-labs/avalanchego/database"
13-
"github.com/ava-labs/avalanchego/database/memdb"
1412
"github.com/ava-labs/avalanchego/ids"
1513
"github.com/ava-labs/avalanchego/snow/choices"
1614
"github.com/ava-labs/avalanchego/snow/consensus/snowman"
1715
"github.com/ava-labs/avalanchego/snow/engine/snowman/block"
1816
"github.com/ava-labs/avalanchego/snow/validators"
1917
"github.com/ava-labs/avalanchego/utils/set"
20-
"github.com/ava-labs/avalanchego/utils/units"
2118
"github.com/ava-labs/avalanchego/vms/platformvm/warp"
2219
"github.com/ava-labs/avalanchego/x/merkledb"
2320
"go.opentelemetry.io/otel/attribute"
@@ -296,43 +293,19 @@ func (b *StatelessBlock) initializeBuilt(
296293
}
297294

298295
// transaction hash generation
299-
db, err := merkledb.New(ctx, memdb.New(), merkledb.Config{
300-
BranchFactor: merkledb.BranchFactor16,
301-
HistoryLength: 100,
302-
EvictionBatchSize: units.MiB,
303-
IntermediateNodeCacheSize: units.MiB,
304-
ValueNodeCacheSize: units.MiB,
305-
Tracer: b.vm.Tracer(),
306-
})
307-
if err != nil {
308-
return err
309-
}
310-
// collect keys, values from transactions/results
311-
var ops []database.BatchOp
296+
var merkleItems [][]byte
312297
for _, tx := range b.Txs {
313-
key := utils.ToID(tx.Bytes())
314-
ops = append(ops, database.BatchOp{
315-
Key: key[:],
316-
Value: tx.Bytes(),
317-
})
298+
merkleItems = append(merkleItems, tx.Bytes())
318299
}
319300
for _, result := range b.results {
320-
key := utils.ToID(result.Output)
321-
ops = append(ops, database.BatchOp{
322-
Key: key[:],
323-
Value: result.Output,
324-
})
301+
merkleItems = append(merkleItems, result.Output)
325302
}
326-
view, err = db.NewView(ctx, merkledb.ViewChanges{BatchOps: ops})
327-
if err != nil {
328-
return err
329-
}
330-
view.CommitToDB(ctx)
331-
txsRoot, err := db.GetMerkleRoot(ctx)
303+
304+
root, _, err := utils.GenerateMerkleRoot(ctx, b.vm.Tracer(), merkleItems)
332305
if err != nil {
333306
return err
334307
}
335-
b.TxsRoot = txsRoot[:]
308+
b.TxsRoot = root
336309

337310
return nil
338311
}

utils/utils.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package utils
55

66
import (
7+
"context"
78
"fmt"
89
"math"
910
"net"
@@ -13,9 +14,14 @@ import (
1314
"strconv"
1415
"time"
1516

17+
"github.com/ava-labs/avalanchego/database"
18+
"github.com/ava-labs/avalanchego/database/memdb"
1619
"github.com/ava-labs/avalanchego/ids"
20+
"github.com/ava-labs/avalanchego/trace"
1721
"github.com/ava-labs/avalanchego/utils/hashing"
1822
"github.com/ava-labs/avalanchego/utils/perms"
23+
"github.com/ava-labs/avalanchego/utils/units"
24+
"github.com/ava-labs/avalanchego/x/merkledb"
1925
"github.com/ava-labs/hypersdk/consts"
2026
formatter "github.com/onsi/ginkgo/v2/formatter"
2127
)
@@ -116,3 +122,44 @@ func LoadBytes(filename string, expectedSize int) ([]byte, error) {
116122
}
117123
return bytes, nil
118124
}
125+
126+
// Generate merkle root for a set of items
127+
// this function does not take ownership of given bytes array
128+
func GenerateMerkleRoot(ctx context.Context, tracer trace.Tracer, merkleItems [][]byte) ([]byte, merkledb.MerkleDB, error) {
129+
var batchOps []database.BatchOp
130+
131+
for _, item := range merkleItems {
132+
key := ToID(item)
133+
batchOps = append(batchOps, database.BatchOp{
134+
Key: key[:],
135+
Value: item,
136+
})
137+
}
138+
139+
db, err := merkledb.New(ctx, memdb.New(), merkledb.Config{
140+
BranchFactor: merkledb.BranchFactor16,
141+
HistoryLength: 100,
142+
EvictionBatchSize: units.MiB,
143+
IntermediateNodeCacheSize: units.MiB,
144+
ValueNodeCacheSize: units.MiB,
145+
Tracer: tracer,
146+
})
147+
if err != nil {
148+
return nil, nil, err
149+
}
150+
151+
view, err := db.NewView(ctx, merkledb.ViewChanges{BatchOps: batchOps})
152+
if err != nil {
153+
return nil, nil, err
154+
}
155+
if err := view.CommitToDB(ctx); err != nil {
156+
return nil, nil, err
157+
}
158+
159+
root, err := db.GetMerkleRoot(ctx)
160+
if err != nil {
161+
return nil, nil, err
162+
}
163+
164+
return root[:], db, nil
165+
}

0 commit comments

Comments
 (0)