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 }