github.com/aychain/blockbook@v0.1.1-0.20181121092459-6d1fc7e07c5b/bchain/coins/myriad/myriadparser.go (about) 1 package myriad 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 = 0xee7645af 15 ) 16 17 var ( 18 MainNetParams chaincfg.Params 19 ) 20 21 func init() { 22 MainNetParams = chaincfg.MainNetParams 23 MainNetParams.Net = MainnetMagic 24 25 MainNetParams.Bech32HRPSegwit = "my" 26 27 MainNetParams.PubKeyHashAddrID = []byte{50} // 0x32 - starts with M 28 MainNetParams.ScriptHashAddrID = []byte{9} // 0x09 - starts with 4 29 MainNetParams.PrivateKeyID = []byte{178} // 0xB2 30 31 MainNetParams.HDCoinType = 90 32 } 33 34 // MyriadParser handle 35 type MyriadParser struct { 36 *btc.BitcoinParser 37 } 38 39 // NewMyriadParser returns new MyriadParser instance 40 func NewMyriadParser(params *chaincfg.Params, c *btc.Configuration) *MyriadParser { 41 return &MyriadParser{BitcoinParser: btc.NewBitcoinParser(params, c)} 42 } 43 44 // GetChainParams contains network parameters for the main Myriad network 45 func GetChainParams(chain string) *chaincfg.Params { 46 if !chaincfg.IsRegistered(&MainNetParams) { 47 err := chaincfg.Register(&MainNetParams) 48 if err != nil { 49 panic(err) 50 } 51 } 52 switch chain { 53 default: 54 return &MainNetParams 55 } 56 } 57 58 // ParseBlock parses raw block to our Block struct 59 // it has special handling for Auxpow blocks that cannot be parsed by standard btc wire parser 60 func (p *MyriadParser) ParseBlock(b []byte) (*bchain.Block, error) { 61 r := bytes.NewReader(b) 62 w := wire.MsgBlock{} 63 h := wire.BlockHeader{} 64 err := h.Deserialize(r) 65 if err != nil { 66 return nil, err 67 } 68 if (h.Version & utils.VersionAuxpow) != 0 { 69 if err = utils.SkipAuxpow(r); err != nil { 70 return nil, err 71 } 72 } 73 74 err = utils.DecodeTransactions(r, 0, wire.WitnessEncoding, &w) 75 if err != nil { 76 return nil, err 77 } 78 79 txs := make([]bchain.Tx, len(w.Transactions)) 80 for ti, t := range w.Transactions { 81 txs[ti] = p.TxFromMsgTx(t, false) 82 } 83 84 return &bchain.Block{ 85 BlockHeader: bchain.BlockHeader{ 86 Size: len(b), 87 Time: h.Timestamp.Unix(), 88 }, 89 Txs: txs, 90 }, nil 91 }