github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/bchain/coins/namecoin/namecoinparser.go (about)

     1  package namecoin
     2  
     3  import (
     4  	"bytes"
     5  
     6  	"github.com/martinboehm/btcd/wire"
     7  	"github.com/martinboehm/btcutil/chaincfg"
     8  	"github.com/trezor/blockbook/bchain"
     9  	"github.com/trezor/blockbook/bchain/coins/btc"
    10  	"github.com/trezor/blockbook/bchain/coins/utils"
    11  )
    12  
    13  const (
    14  	// MainnetMagic is mainnet network constant
    15  	MainnetMagic wire.BitcoinNet = 0xfeb4bef9
    16  )
    17  
    18  var (
    19  	// MainNetParams are parser parameters for mainnet
    20  	MainNetParams chaincfg.Params
    21  )
    22  
    23  func init() {
    24  	MainNetParams = chaincfg.MainNetParams
    25  	MainNetParams.Net = MainnetMagic
    26  	MainNetParams.PubKeyHashAddrID = []byte{52}
    27  	MainNetParams.ScriptHashAddrID = []byte{13}
    28  }
    29  
    30  // NamecoinParser handle
    31  type NamecoinParser struct {
    32  	*btc.BitcoinLikeParser
    33  }
    34  
    35  // NewNamecoinParser returns new NamecoinParser instance
    36  func NewNamecoinParser(params *chaincfg.Params, c *btc.Configuration) *NamecoinParser {
    37  	p := &NamecoinParser{BitcoinLikeParser: btc.NewBitcoinLikeParser(params, c)}
    38  	p.VSizeSupport = true
    39  	return p
    40  }
    41  
    42  // GetChainParams contains network parameters for the main Namecoin network,
    43  // and the test Namecoin network
    44  func GetChainParams(chain string) *chaincfg.Params {
    45  	if !chaincfg.IsRegistered(&MainNetParams) {
    46  		err := chaincfg.Register(&MainNetParams)
    47  		if err != nil {
    48  			panic(err)
    49  		}
    50  	}
    51  	switch chain {
    52  	default:
    53  		return &MainNetParams
    54  	}
    55  }
    56  
    57  // ParseBlock parses raw block to our Block struct
    58  // it has special handling for Auxpow blocks that cannot be parsed by standard btc wire parser
    59  func (p *NamecoinParser) ParseBlock(b []byte) (*bchain.Block, error) {
    60  	r := bytes.NewReader(b)
    61  	w := wire.MsgBlock{}
    62  	h := wire.BlockHeader{}
    63  	err := h.Deserialize(r)
    64  	if err != nil {
    65  		return nil, err
    66  	}
    67  	if (h.Version & utils.VersionAuxpow) != 0 {
    68  		if err = utils.SkipAuxpow(r); err != nil {
    69  			return nil, err
    70  		}
    71  	}
    72  
    73  	err = utils.DecodeTransactions(r, 0, wire.WitnessEncoding, &w)
    74  	if err != nil {
    75  		return nil, err
    76  	}
    77  
    78  	txs := make([]bchain.Tx, len(w.Transactions))
    79  	for ti, t := range w.Transactions {
    80  		txs[ti] = p.TxFromMsgTx(t, false)
    81  	}
    82  
    83  	return &bchain.Block{
    84  		BlockHeader: bchain.BlockHeader{
    85  			Size: len(b),
    86  			Time: h.Timestamp.Unix(),
    87  		},
    88  		Txs: txs,
    89  	}, nil
    90  }