Skip to content

Commit fe47417

Browse files
committed
move root generation func to merkle package, tx root by items of [txID + result]
1 parent 49502d4 commit fe47417

File tree

3 files changed

+61
-53
lines changed

3 files changed

+61
-53
lines changed

chain/block.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
"github.com/ava-labs/hypersdk/codec"
2525
"github.com/ava-labs/hypersdk/consts"
26+
"github.com/ava-labs/hypersdk/merkle"
2627
"github.com/ava-labs/hypersdk/state"
2728
"github.com/ava-labs/hypersdk/utils"
2829
"github.com/ava-labs/hypersdk/window"
@@ -293,16 +294,17 @@ func (b *StatelessBlock) initializeBuilt(
293294
}
294295

295296
// transaction hash generation
296-
merkleItems := make([][]byte, 0, len(b.Txs)+len(b.results))
297-
for _, tx := range b.Txs {
298-
merkleItems = append(merkleItems, tx.Bytes())
299-
}
300-
for _, result := range b.results {
301-
merkleItems = append(merkleItems, result.Output)
297+
// [len(b.Txs)] should be equal to [b.results]
298+
merkleItems := make([][]byte, 0, len(b.Txs))
299+
for i := 0; i < len(b.Txs); i++ {
300+
txID := b.Txs[i].ID()
301+
resultOutput := b.results[i].Output
302+
// [txID + resultOutput]
303+
merkleItems = append(merkleItems, append(txID[:], resultOutput...))
302304
}
303305

304306
// consume bytes to avoid extra copying
305-
root, _, err := utils.GenerateMerkleRoot(ctx, b.vm.Tracer(), merkleItems, true)
307+
root, _, err := merkle.GenerateMerkleRoot(ctx, b.vm.Tracer(), merkleItems, true)
306308
if err != nil {
307309
return err
308310
}

merkle/merkle.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package merkle
2+
3+
import (
4+
"context"
5+
6+
"github.com/ava-labs/avalanchego/database"
7+
"github.com/ava-labs/avalanchego/database/memdb"
8+
"github.com/ava-labs/avalanchego/trace"
9+
"github.com/ava-labs/avalanchego/utils/units"
10+
"github.com/ava-labs/avalanchego/x/merkledb"
11+
"github.com/ava-labs/hypersdk/utils"
12+
)
13+
14+
// Generate merkle root for a set of items
15+
func GenerateMerkleRoot(ctx context.Context, tracer trace.Tracer, merkleItems [][]byte, consumeBytes bool) ([]byte, merkledb.MerkleDB, error) {
16+
batchOps := make([]database.BatchOp, 0, len(merkleItems))
17+
18+
for _, item := range merkleItems {
19+
key := utils.ToID(item)
20+
batchOps = append(batchOps, database.BatchOp{
21+
Key: key[:],
22+
Value: item,
23+
})
24+
}
25+
26+
db, err := merkledb.New(ctx, memdb.New(), merkledb.Config{
27+
BranchFactor: merkledb.BranchFactor16,
28+
HistoryLength: 100,
29+
EvictionBatchSize: units.MiB,
30+
IntermediateNodeCacheSize: units.MiB,
31+
ValueNodeCacheSize: units.MiB,
32+
Tracer: tracer,
33+
})
34+
if err != nil {
35+
return nil, nil, err
36+
}
37+
38+
view, err := db.NewView(ctx, merkledb.ViewChanges{BatchOps: batchOps, ConsumeBytes: consumeBytes})
39+
if err != nil {
40+
return nil, nil, err
41+
}
42+
if err := view.CommitToDB(ctx); err != nil {
43+
return nil, nil, err
44+
}
45+
46+
root, err := db.GetMerkleRoot(ctx)
47+
if err != nil {
48+
return nil, nil, err
49+
}
50+
51+
return root[:], db, nil
52+
}

utils/utils.go

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

66
import (
7-
"context"
87
"fmt"
98
"math"
109
"net"
@@ -14,14 +13,9 @@ import (
1413
"strconv"
1514
"time"
1615

17-
"github.com/ava-labs/avalanchego/database"
18-
"github.com/ava-labs/avalanchego/database/memdb"
1916
"github.com/ava-labs/avalanchego/ids"
20-
"github.com/ava-labs/avalanchego/trace"
2117
"github.com/ava-labs/avalanchego/utils/hashing"
2218
"github.com/ava-labs/avalanchego/utils/perms"
23-
"github.com/ava-labs/avalanchego/utils/units"
24-
"github.com/ava-labs/avalanchego/x/merkledb"
2519
"github.com/ava-labs/hypersdk/consts"
2620
formatter "github.com/onsi/ginkgo/v2/formatter"
2721
)
@@ -122,43 +116,3 @@ func LoadBytes(filename string, expectedSize int) ([]byte, error) {
122116
}
123117
return bytes, nil
124118
}
125-
126-
// Generate merkle root for a set of items
127-
func GenerateMerkleRoot(ctx context.Context, tracer trace.Tracer, merkleItems [][]byte, consumeBytes bool) ([]byte, merkledb.MerkleDB, error) {
128-
batchOps := make([]database.BatchOp, 0, len(merkleItems))
129-
130-
for _, item := range merkleItems {
131-
key := ToID(item)
132-
batchOps = append(batchOps, database.BatchOp{
133-
Key: key[:],
134-
Value: item,
135-
})
136-
}
137-
138-
db, err := merkledb.New(ctx, memdb.New(), merkledb.Config{
139-
BranchFactor: merkledb.BranchFactor16,
140-
HistoryLength: 100,
141-
EvictionBatchSize: units.MiB,
142-
IntermediateNodeCacheSize: units.MiB,
143-
ValueNodeCacheSize: units.MiB,
144-
Tracer: tracer,
145-
})
146-
if err != nil {
147-
return nil, nil, err
148-
}
149-
150-
view, err := db.NewView(ctx, merkledb.ViewChanges{BatchOps: batchOps, ConsumeBytes: consumeBytes})
151-
if err != nil {
152-
return nil, nil, err
153-
}
154-
if err := view.CommitToDB(ctx); err != nil {
155-
return nil, nil, err
156-
}
157-
158-
root, err := db.GetMerkleRoot(ctx)
159-
if err != nil {
160-
return nil, nil, err
161-
}
162-
163-
return root[:], db, nil
164-
}

0 commit comments

Comments
 (0)