github.com/MetalBlockchain/metalgo@v1.11.9/vms/avm/block/parser.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package block
     5  
     6  import (
     7  	"errors"
     8  	"reflect"
     9  
    10  	"github.com/MetalBlockchain/metalgo/codec"
    11  	"github.com/MetalBlockchain/metalgo/utils/logging"
    12  	"github.com/MetalBlockchain/metalgo/utils/timer/mockable"
    13  	"github.com/MetalBlockchain/metalgo/vms/avm/fxs"
    14  	"github.com/MetalBlockchain/metalgo/vms/avm/txs"
    15  )
    16  
    17  // CodecVersion is the current default codec version
    18  const CodecVersion = txs.CodecVersion
    19  
    20  var _ Parser = (*parser)(nil)
    21  
    22  type Parser interface {
    23  	txs.Parser
    24  
    25  	ParseBlock(bytes []byte) (Block, error)
    26  	ParseGenesisBlock(bytes []byte) (Block, error)
    27  }
    28  
    29  type parser struct {
    30  	txs.Parser
    31  }
    32  
    33  func NewParser(fxs []fxs.Fx) (Parser, error) {
    34  	p, err := txs.NewParser(fxs)
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  	c := p.CodecRegistry()
    39  	gc := p.GenesisCodecRegistry()
    40  
    41  	err = errors.Join(
    42  		c.RegisterType(&StandardBlock{}),
    43  		gc.RegisterType(&StandardBlock{}),
    44  	)
    45  	return &parser{
    46  		Parser: p,
    47  	}, err
    48  }
    49  
    50  func NewCustomParser(
    51  	typeToFxIndex map[reflect.Type]int,
    52  	clock *mockable.Clock,
    53  	log logging.Logger,
    54  	fxs []fxs.Fx,
    55  ) (Parser, error) {
    56  	p, err := txs.NewCustomParser(typeToFxIndex, clock, log, fxs)
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  	c := p.CodecRegistry()
    61  	gc := p.GenesisCodecRegistry()
    62  
    63  	err = errors.Join(
    64  		c.RegisterType(&StandardBlock{}),
    65  		gc.RegisterType(&StandardBlock{}),
    66  	)
    67  	return &parser{
    68  		Parser: p,
    69  	}, err
    70  }
    71  
    72  func (p *parser) ParseBlock(bytes []byte) (Block, error) {
    73  	return parse(p.Codec(), bytes)
    74  }
    75  
    76  func (p *parser) ParseGenesisBlock(bytes []byte) (Block, error) {
    77  	return parse(p.GenesisCodec(), bytes)
    78  }
    79  
    80  func parse(cm codec.Manager, bytes []byte) (Block, error) {
    81  	var blk Block
    82  	if _, err := cm.Unmarshal(bytes, &blk); err != nil {
    83  		return nil, err
    84  	}
    85  	return blk, blk.initialize(bytes, cm)
    86  }