Skip to content

Commit 59c84d7

Browse files
Add ExecutedBlock type (ava-labs#1601)
1 parent 165a455 commit 59c84d7

File tree

16 files changed

+194
-146
lines changed

16 files changed

+194
-146
lines changed

api/indexer/tx_indexer.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ const (
2525
)
2626

2727
var (
28-
_ event.SubscriptionFactory[*chain.StatefulBlock] = (*subscriptionFactory)(nil)
29-
_ event.Subscription[*chain.StatefulBlock] = (*txDBIndexer)(nil)
28+
_ event.SubscriptionFactory[*chain.ExecutedBlock] = (*subscriptionFactory)(nil)
29+
_ event.Subscription[*chain.ExecutedBlock] = (*txDBIndexer)(nil)
3030
)
3131

3232
type Config struct {
@@ -47,7 +47,7 @@ func OptionFunc(v *vm.VM, config Config) error {
4747
if !config.Enabled {
4848
return nil
4949
}
50-
dbPath := filepath.Join(v.DataDir, "indexer", "db")
50+
dbPath := filepath.Join(v.DataDir, Namespace)
5151
db, _, err := pebble.New(dbPath, pebble.NewDefaultConfig())
5252
if err != nil {
5353
return err
@@ -77,26 +77,24 @@ type subscriptionFactory struct {
7777
indexer *txDBIndexer
7878
}
7979

80-
func (s *subscriptionFactory) New() (event.Subscription[*chain.StatefulBlock], error) {
80+
func (s *subscriptionFactory) New() (event.Subscription[*chain.ExecutedBlock], error) {
8181
return s.indexer, nil
8282
}
8383

8484
type txDBIndexer struct {
8585
db database.Database
8686
}
8787

88-
func (t *txDBIndexer) Accept(blk *chain.StatefulBlock) error {
88+
func (t *txDBIndexer) Accept(blk *chain.ExecutedBlock) error {
8989
batch := t.db.NewBatch()
9090
defer batch.Reset()
9191

92-
timestamp := blk.GetTimestamp()
93-
results := blk.Results()
94-
for j, tx := range blk.Txs {
95-
result := results[j]
92+
for j, tx := range blk.Block.Txs {
93+
result := blk.Results[j]
9694
if err := t.storeTransaction(
9795
batch,
9896
tx.ID(),
99-
timestamp,
97+
blk.Block.Tmstmp,
10098
result.Success,
10199
result.Units,
102100
result.Fee,

api/ws/client.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,11 @@ func (c *WebSocketClient) ListenBlock(
151151
) (*chain.StatelessBlock, []*chain.Result, fees.Dimensions, error) {
152152
select {
153153
case msg := <-c.pendingBlocks:
154-
return UnpackBlockMessage(msg, parser)
154+
executedBlock, err := chain.UnmarshalExecutedBlock(msg, parser)
155+
if err != nil {
156+
return nil, nil, fees.Dimensions{}, err
157+
}
158+
return executedBlock.Block, executedBlock.Results, executedBlock.UnitPrices, nil
155159
case <-c.readStopped:
156160
return nil, nil, fees.Dimensions{}, c.err
157161
case <-ctx.Done():

api/ws/packer.go

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,57 +11,13 @@ import (
1111
"github.com/ava-labs/hypersdk/chain"
1212
"github.com/ava-labs/hypersdk/codec"
1313
"github.com/ava-labs/hypersdk/consts"
14-
"github.com/ava-labs/hypersdk/fees"
1514
)
1615

1716
const (
1817
BlockMode byte = 0
1918
TxMode byte = 1
2019
)
2120

22-
func PackBlockMessage(b *chain.StatefulBlock) ([]byte, error) {
23-
results := b.Results()
24-
size := codec.BytesLen(b.Bytes()) + consts.IntLen + codec.CummSize(results) + fees.DimensionsLen
25-
p := codec.NewWriter(size, consts.MaxInt)
26-
p.PackBytes(b.Bytes())
27-
mresults, err := chain.MarshalResults(results)
28-
if err != nil {
29-
return nil, err
30-
}
31-
p.PackBytes(mresults)
32-
p.PackFixedBytes(b.FeeManager().UnitPrices().Bytes())
33-
return p.Bytes(), p.Err()
34-
}
35-
36-
func UnpackBlockMessage(
37-
msg []byte,
38-
parser chain.Parser,
39-
) (*chain.StatelessBlock, []*chain.Result, fees.Dimensions, error) {
40-
p := codec.NewReader(msg, consts.MaxInt)
41-
var blkMsg []byte
42-
p.UnpackBytes(-1, true, &blkMsg)
43-
blk, err := chain.UnmarshalBlock(blkMsg, parser)
44-
if err != nil {
45-
return nil, nil, fees.Dimensions{}, err
46-
}
47-
var resultsMsg []byte
48-
p.UnpackBytes(-1, true, &resultsMsg)
49-
results, err := chain.UnmarshalResults(resultsMsg)
50-
if err != nil {
51-
return nil, nil, fees.Dimensions{}, err
52-
}
53-
pricesMsg := make([]byte, fees.DimensionsLen)
54-
p.UnpackFixedBytes(fees.DimensionsLen, &pricesMsg)
55-
prices, err := fees.UnpackDimensions(pricesMsg)
56-
if err != nil {
57-
return nil, nil, fees.Dimensions{}, err
58-
}
59-
if !p.Empty() {
60-
return nil, nil, fees.Dimensions{}, chain.ErrInvalidObject
61-
}
62-
return blk, results, prices, p.Err()
63-
}
64-
6521
// Could be a better place for these methods
6622
// Packs an accepted block message
6723
func PackAcceptedTxMessage(txID ids.ID, result *chain.Result) ([]byte, error) {

api/ws/server.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ func OptionFunc(v *vm.VM, config Config) error {
7272
},
7373
}
7474

75-
blockSubscription := event.SubscriptionFuncFactory[*chain.StatefulBlock]{
76-
AcceptF: func(event *chain.StatefulBlock) error {
75+
blockSubscription := event.SubscriptionFuncFactory[*chain.ExecutedBlock]{
76+
AcceptF: func(event *chain.ExecutedBlock) error {
7777
return server.AcceptBlock(event)
7878
},
7979
}
@@ -195,9 +195,9 @@ func (w *WebSocketServer) setMinTx(t int64) error {
195195
return nil
196196
}
197197

198-
func (w *WebSocketServer) AcceptBlock(b *chain.StatefulBlock) error {
198+
func (w *WebSocketServer) AcceptBlock(b *chain.ExecutedBlock) error {
199199
if w.blockListeners.Len() > 0 {
200-
bytes, err := PackBlockMessage(b)
200+
bytes, err := b.Marshal()
201201
if err != nil {
202202
return err
203203
}
@@ -209,8 +209,8 @@ func (w *WebSocketServer) AcceptBlock(b *chain.StatefulBlock) error {
209209

210210
w.txL.Lock()
211211
defer w.txL.Unlock()
212-
results := b.Results()
213-
for i, tx := range b.Txs {
212+
results := b.Results
213+
for i, tx := range b.Block.Txs {
214214
txID := tx.ID()
215215
listeners, ok := w.txListeners[txID]
216216
if !ok {
@@ -227,7 +227,7 @@ func (w *WebSocketServer) AcceptBlock(b *chain.StatefulBlock) error {
227227
delete(w.txListeners, txID)
228228
// [expiringTxs] will be cleared eventually (does not support removal)
229229
}
230-
return w.setMinTx(b.Tmstmp)
230+
return w.setMinTx(b.Block.Tmstmp)
231231
}
232232

233233
func (w *WebSocketServer) MessageCallback() pubsub.Callback {

chain/block.go

Lines changed: 83 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ import (
2222

2323
"github.com/ava-labs/hypersdk/codec"
2424
"github.com/ava-labs/hypersdk/consts"
25-
"github.com/ava-labs/hypersdk/internal/fees"
25+
"github.com/ava-labs/hypersdk/fees"
2626
"github.com/ava-labs/hypersdk/internal/window"
2727
"github.com/ava-labs/hypersdk/internal/workers"
2828
"github.com/ava-labs/hypersdk/state"
2929
"github.com/ava-labs/hypersdk/utils"
30+
31+
internalfees "github.com/ava-labs/hypersdk/internal/fees"
3032
)
3133

3234
var (
@@ -164,7 +166,7 @@ type StatefulBlock struct {
164166
txsSet set.Set[ids.ID]
165167

166168
results []*Result
167-
feeManager *fees.Manager
169+
feeManager *internalfees.Manager
168170

169171
vm VM
170172
view merkledb.View
@@ -291,7 +293,7 @@ func (b *StatefulBlock) initializeBuilt(
291293
ctx context.Context,
292294
view merkledb.View,
293295
results []*Result,
294-
feeManager *fees.Manager,
296+
feeManager *internalfees.Manager,
295297
) error {
296298
_, span := b.vm.Tracer().Start(ctx, "StatefulBlock.initializeBuilt")
297299
defer span.End()
@@ -487,7 +489,7 @@ func (b *StatefulBlock) innerVerify(ctx context.Context, vctx VerifyContext) err
487489
if err != nil {
488490
return err
489491
}
490-
parentFeeManager := fees.NewManager(feeRaw)
492+
parentFeeManager := internalfees.NewManager(feeRaw)
491493
feeManager, err := parentFeeManager.ComputeNext(b.Tmstmp, r)
492494
if err != nil {
493495
return err
@@ -901,10 +903,86 @@ func (b *StatefulBlock) Results() []*Result {
901903
return b.results
902904
}
903905

904-
func (b *StatefulBlock) FeeManager() *fees.Manager {
906+
func (b *StatefulBlock) FeeManager() *internalfees.Manager {
905907
return b.feeManager
906908
}
907909

910+
type ExecutedBlock struct {
911+
BlockID ids.ID `json:"blockID"`
912+
Block *StatelessBlock `json:"block"`
913+
Results []*Result `json:"results"`
914+
UnitPrices fees.Dimensions `json:"unitPrices"`
915+
}
916+
917+
func NewExecutedBlockFromStateful(b *StatefulBlock) *ExecutedBlock {
918+
return &ExecutedBlock{
919+
BlockID: b.ID(),
920+
Block: b.StatelessBlock,
921+
Results: b.results,
922+
UnitPrices: b.feeManager.UnitPrices(),
923+
}
924+
}
925+
926+
func NewExecutedBlock(statelessBlock *StatelessBlock, results []*Result, unitPrices fees.Dimensions) (*ExecutedBlock, error) {
927+
blkID, err := statelessBlock.ID()
928+
if err != nil {
929+
return nil, err
930+
}
931+
return &ExecutedBlock{
932+
BlockID: blkID,
933+
Block: statelessBlock,
934+
Results: results,
935+
UnitPrices: unitPrices,
936+
}, nil
937+
}
938+
939+
func (b *ExecutedBlock) Marshal() ([]byte, error) {
940+
blockBytes, err := b.Block.Marshal()
941+
if err != nil {
942+
return nil, err
943+
}
944+
945+
size := codec.BytesLen(blockBytes) + codec.CummSize(b.Results) + fees.DimensionsLen
946+
writer := codec.NewWriter(size, consts.NetworkSizeLimit)
947+
948+
writer.PackBytes(blockBytes)
949+
resultBytes, err := MarshalResults(b.Results)
950+
if err != nil {
951+
return nil, err
952+
}
953+
writer.PackBytes(resultBytes)
954+
writer.PackFixedBytes(b.UnitPrices.Bytes())
955+
956+
return writer.Bytes(), writer.Err()
957+
}
958+
959+
func UnmarshalExecutedBlock(bytes []byte, parser Parser) (*ExecutedBlock, error) {
960+
reader := codec.NewReader(bytes, consts.NetworkSizeLimit)
961+
962+
var blkMsg []byte
963+
reader.UnpackBytes(-1, true, &blkMsg)
964+
blk, err := UnmarshalBlock(blkMsg, parser)
965+
if err != nil {
966+
return nil, err
967+
}
968+
var resultsMsg []byte
969+
reader.UnpackBytes(-1, true, &resultsMsg)
970+
results, err := UnmarshalResults(resultsMsg)
971+
if err != nil {
972+
return nil, err
973+
}
974+
unitPricesBytes := make([]byte, fees.DimensionsLen)
975+
reader.UnpackFixedBytes(fees.DimensionsLen, &unitPricesBytes)
976+
prices, err := fees.UnpackDimensions(unitPricesBytes)
977+
if err != nil {
978+
return nil, err
979+
}
980+
if !reader.Empty() {
981+
return nil, ErrInvalidObject
982+
}
983+
return NewExecutedBlock(blk, results, prices)
984+
}
985+
908986
type SyncableBlock struct {
909987
*StatefulBlock
910988
}

extension/externalsubscriber/client.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
pb "github.com/ava-labs/hypersdk/proto/pb/externalsubscriber"
1818
)
1919

20-
var _ event.Subscription[*chain.StatefulBlock] = (*ExternalSubscriberClient)(nil)
20+
var _ event.Subscription[*chain.ExecutedBlock] = (*ExternalSubscriberClient)(nil)
2121

2222
type ExternalSubscriberClient struct {
2323
conn *grpc.ClientConn
@@ -55,23 +55,18 @@ func NewExternalSubscriberClient(
5555
}, nil
5656
}
5757

58-
func (e *ExternalSubscriberClient) Accept(blk *chain.StatefulBlock) error {
58+
func (e *ExternalSubscriberClient) Accept(blk *chain.ExecutedBlock) error {
5959
blockBytes, err := blk.Marshal()
6060
if err != nil {
6161
return err
6262
}
63-
resultsMarshaled, err := chain.MarshalResults(blk.Results())
64-
if err != nil {
65-
return err
66-
}
6763

6864
req := &pb.BlockRequest{
6965
BlockData: blockBytes,
70-
Results: resultsMarshaled,
7166
}
7267
e.log.Debug("sending accepted block to server",
73-
zap.Stringer("blockID", blk.ID()),
74-
zap.Uint64("blockHeight", blk.Hght),
68+
zap.Stringer("blockID", blk.BlockID),
69+
zap.Uint64("blockHeight", blk.Block.Hght),
7570
)
7671
_, err = e.client.AcceptBlock(context.TODO(), req)
7772
return err

extension/externalsubscriber/option.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ func OptionFunc(v *vm.VM, config Config) error {
4242
return err
4343
}
4444

45-
blockSubscription := event.SubscriptionFuncFactory[*chain.StatefulBlock]{
46-
AcceptF: func(blk *chain.StatefulBlock) error {
45+
blockSubscription := event.SubscriptionFuncFactory[*chain.ExecutedBlock]{
46+
AcceptF: func(blk *chain.ExecutedBlock) error {
4747
return server.Accept(blk)
4848
},
4949
}

0 commit comments

Comments
 (0)