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  }