github.com/ava-labs/avalanchego@v1.11.11/vms/example/xsvm/execute/block.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package execute 5 6 import ( 7 "context" 8 "errors" 9 10 "github.com/ava-labs/avalanchego/database" 11 "github.com/ava-labs/avalanchego/snow" 12 "github.com/ava-labs/avalanchego/vms/example/xsvm/state" 13 14 smblock "github.com/ava-labs/avalanchego/snow/engine/snowman/block" 15 xsblock "github.com/ava-labs/avalanchego/vms/example/xsvm/block" 16 ) 17 18 var errNoTxs = errors.New("no transactions") 19 20 func Block( 21 ctx context.Context, 22 chainContext *snow.Context, 23 db database.KeyValueReaderWriterDeleter, 24 skipVerify bool, 25 blockContext *smblock.Context, 26 blk *xsblock.Stateless, 27 ) error { 28 if len(blk.Txs) == 0 { 29 return errNoTxs 30 } 31 32 for _, currentTx := range blk.Txs { 33 txID, err := currentTx.ID() 34 if err != nil { 35 return err 36 } 37 sender, err := currentTx.SenderID() 38 if err != nil { 39 return err 40 } 41 txExecutor := Tx{ 42 Context: ctx, 43 ChainContext: chainContext, 44 Database: db, 45 SkipVerify: skipVerify, 46 BlockContext: blockContext, 47 TxID: txID, 48 Sender: sender, 49 // TODO: populate fees 50 } 51 if err := currentTx.Unsigned.Visit(&txExecutor); err != nil { 52 return err 53 } 54 } 55 56 blkID, err := blk.ID() 57 if err != nil { 58 return err 59 } 60 61 if err := state.SetLastAccepted(db, blkID); err != nil { 62 return err 63 } 64 65 blkBytes, err := xsblock.Codec.Marshal(xsblock.CodecVersion, blk) 66 if err != nil { 67 return err 68 } 69 70 return state.AddBlock(db, blk.Height, blkID, blkBytes) 71 }