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