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 }