github.com/aychain/blockbook@v0.1.1-0.20181121092459-6d1fc7e07c5b/bchain/coins/dogecoin/dogecoinparser.go (about)

     1  package dogecoin
     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 = 0xc0c0c0c0
    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{30}
    25  	MainNetParams.ScriptHashAddrID = []byte{22}
    26  }
    27  
    28  // DogecoinParser handle
    29  type DogecoinParser struct {
    30  	*btc.BitcoinParser
    31  }
    32  
    33  // NewDogecoinParser returns new DogecoinParser instance
    34  func NewDogecoinParser(params *chaincfg.Params, c *btc.Configuration) *DogecoinParser {
    35  	return &DogecoinParser{BitcoinParser: btc.NewBitcoinParser(params, c)}
    36  }
    37  
    38  // GetChainParams contains network parameters for the main Dogecoin network,
    39  // and the test Dogecoin 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 *DogecoinParser) 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  }