Implement Liquid blockbook

ethereum
Martin Boehm 2018-12-05 22:34:44 +01:00
parent 0110fd0cf2
commit 45e1e32e18
4 changed files with 107 additions and 26 deletions

View File

@ -11,6 +11,7 @@ import (
"blockbook/bchain/coins/eth"
"blockbook/bchain/coins/gamecredits"
"blockbook/bchain/coins/grs"
"blockbook/bchain/coins/liquid"
"blockbook/bchain/coins/litecoin"
"blockbook/bchain/coins/monacoin"
"blockbook/bchain/coins/myriad"

View File

@ -1,6 +1,7 @@
package liquid
import (
"blockbook/bchain"
"blockbook/bchain/coins/btc"
"github.com/btcsuite/btcd/wire"
@ -26,11 +27,15 @@ func init() {
// LiquidParser handle
type LiquidParser struct {
*btc.BitcoinParser
baseparser *bchain.BaseParser
}
// NewLiquidParser returns new LiquidParser instance
func NewLiquidParser(params *chaincfg.Params, c *btc.Configuration) *LiquidParser {
return &LiquidParser{BitcoinParser: btc.NewBitcoinParser(params, c)}
return &LiquidParser{
BitcoinParser: btc.NewBitcoinParser(params, c),
baseparser: &bchain.BaseParser{},
}
}
// GetChainParams contains network parameters for the main GameCredits network,
@ -47,3 +52,13 @@ func GetChainParams(chain string) *chaincfg.Params {
return &MainNetParams
}
}
// PackTx packs transaction to byte array using protobuf
func (p *LiquidParser) PackTx(tx *bchain.Tx, height uint32, blockTime int64) ([]byte, error) {
return p.baseparser.PackTx(tx, height, blockTime)
}
// UnpackTx unpacks transaction from protobuf byte array
func (p *LiquidParser) UnpackTx(buf []byte) (*bchain.Tx, uint32, error) {
return p.baseparser.UnpackTx(buf)
}

File diff suppressed because one or more lines are too long

View File

@ -6,6 +6,7 @@ import (
"encoding/json"
"github.com/golang/glog"
"github.com/juju/errors"
)
// LiquidRPC is an interface to JSON-RPC bitcoind service.
@ -13,8 +14,8 @@ type LiquidRPC struct {
*btc.BitcoinRPC
}
// NewLiquidParserRPC returns new LiquidRPC instance.
func NewLiquidParserRPC(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) {
// NewLiquidRPC returns new LiquidRPC instance.
func NewLiquidRPC(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) {
b, err := btc.NewBitcoinRPC(config, pushHandler)
if err != nil {
return nil, err
@ -24,7 +25,6 @@ func NewLiquidParserRPC(config json.RawMessage, pushHandler func(bchain.Notifica
b.(*btc.BitcoinRPC),
}
s.RPCMarshaler = btc.JSONMarshalerV2{}
s.ChainConfig.SupportsEstimateFee = false
return s, nil
}
@ -55,3 +55,54 @@ func (b *LiquidRPC) Initialize() error {
return nil
}
// GetBlock returns block with given hash.
func (b *LiquidRPC) GetBlock(hash string, height uint32) (*bchain.Block, error) {
var err error
if hash == "" {
hash, err = b.GetBlockHash(height)
if err != nil {
return nil, err
}
}
glog.V(1).Info("rpc: getblock (verbosity=1) ", hash)
res := btc.ResGetBlockThin{}
req := btc.CmdGetBlock{Method: "getblock"}
req.Params.BlockHash = hash
req.Params.Verbosity = 1
err = b.Call(&req, &res)
if err != nil {
return nil, errors.Annotatef(err, "hash %v", hash)
}
if res.Error != nil {
return nil, errors.Annotatef(res.Error, "hash %v", hash)
}
txs := make([]bchain.Tx, 0, len(res.Result.Txids))
for _, txid := range res.Result.Txids {
tx, err := b.GetTransaction(txid)
if err != nil {
return nil, err
}
txs = append(txs, *tx)
}
block := &bchain.Block{
BlockHeader: res.Result.BlockHeader,
Txs: txs,
}
return block, nil
}
// GetTransactionForMempool returns a transaction by the transaction ID.
// It could be optimized for mempool, i.e. without block time and confirmations
func (b *LiquidRPC) GetTransactionForMempool(txid string) (*bchain.Tx, error) {
return b.GetTransaction(txid)
}
// GetMempoolEntry returns mempool data for given transaction
func (b *LiquidRPC) GetMempoolEntry(txid string) (*bchain.MempoolEntry, error) {
return nil, errors.New("GetMempoolEntry: not implemented")
}