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  }