pull/462/merge
atomlab 2021-03-23 15:24:30 +05:30 committed by GitHub
commit 1bdd2d86c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 845 additions and 1 deletions

View File

@ -32,6 +32,7 @@ var amounts = []struct {
{big.NewInt(-12345), "-0.00012345", 8, "!"},
{big.NewInt(12345678), "0.123456789012", 8, "0.12345678"}, // test of truncation of too many decimal places
{big.NewInt(12345678), "0.0000000000000000000000000000000012345678", 1234, "!"}, // test of too big number decimal places
{big.NewInt(50006922782), "5000.6922782", 7, "!"},
}
func TestBaseParser_AmountToDecimalString(t *testing.T) {

View File

@ -0,0 +1,112 @@
package bcd
import (
"fmt"
"github.com/trezor/blockbook/bchain"
"github.com/trezor/blockbook/bchain/coins/btc"
"github.com/martinboehm/btcd/wire"
"github.com/martinboehm/btcutil/chaincfg"
)
const (
// MainnetMagic is mainnet network constant
MainnetMagic wire.BitcoinNet = 0xbddeb4d9
// TestnetMagic is testnet network constant
TestnetMagic wire.BitcoinNet = 0x0bcd2018
// RegtestMagic is regtest network constant
RegtestMagic wire.BitcoinNet = 0xfabfb5da
)
var (
// MainNetParams are parser parameters for mainnet
MainNetParams chaincfg.Params
// TestNetParams are parser parameters for testnet
TestNetParams chaincfg.Params
// RegtestParams are parser parameters for regtest
RegtestParams chaincfg.Params
)
func init() {
MainNetParams = chaincfg.MainNetParams
MainNetParams.Net = MainnetMagic
// Address encoding magics
MainNetParams.AddressMagicLen = 1
MainNetParams.PubKeyHashAddrID = []byte{0x00} // base58 prefix: 1
MainNetParams.ScriptHashAddrID = []byte{0x05} // base58 prefix: 3
MainNetParams.PrivateKeyID = []byte{128}
TestNetParams = chaincfg.TestNet3Params
TestNetParams.Net = TestnetMagic
// Address encoding magics
TestNetParams.AddressMagicLen = 1
TestNetParams.PubKeyHashAddrID = []byte{111}
TestNetParams.ScriptHashAddrID = []byte{196}
TestNetParams.PrivateKeyID = []byte{239}
RegtestParams = chaincfg.RegressionNetParams
RegtestParams.Net = RegtestMagic
}
// BdiamondParser handle
type BdiamondParser struct {
*btc.BitcoinParser
baseparser *bchain.BaseParser
}
func NewBdiamondParser(params *chaincfg.Params, c *btc.Configuration) *BdiamondParser {
p := &BdiamondParser{BitcoinParser: btc.NewBitcoinParser(params, c)}
p.AmountDecimalPoint = 7
return p
}
// GetChainParams contains network parameters for the main Bdiamond network,
// the regression test Bdiamond network, the test Bdiamond network and
// the simulation test Bdiamond network, in this order
func GetChainParams(chain string) *chaincfg.Params {
fmt.Println("GetChainParams. Chain:", chain)
fmt.Println("GetChainParams.IsRegistered MainNetParams:", chaincfg.IsRegistered(&MainNetParams))
if !chaincfg.IsRegistered(&MainNetParams) {
fmt.Println("GetChainParams chaincfg.Register(&MainNetParams)")
err := chaincfg.Register(&MainNetParams)
fmt.Println("GetChainParams err:", err)
if err == nil {
fmt.Println("GetChainParams chaincfg.Register(&TestNetParams)")
err = chaincfg.Register(&TestNetParams)
}
if err == nil {
fmt.Println("GetChainParams chaincfg.Register(&RegtestParams)")
err = chaincfg.Register(&RegtestParams)
}
if err != nil {
panic(err)
}
}
switch chain {
case "test":
fmt.Println("GetChainParams case chain: test")
return &TestNetParams
case "regtest":
fmt.Println("GetChainParams case chain: regtest")
return &RegtestParams
default:
fmt.Println("GetChainParams case chain: mainnet")
return &MainNetParams
}
}
// PackTx packs transaction to byte array using protobuf
func (p *BdiamondParser) PackTx(tx *bchain.Tx, height uint32, blockTime int64) ([]byte, error) {
fmt.Println("p.baseparser.PackTx")
return p.baseparser.PackTx(tx, height, blockTime)
}
// UnpackTx unpacks transaction from protobuf byte array
func (p *BdiamondParser) UnpackTx(buf []byte) (*bchain.Tx, uint32, error) {
fmt.Println("p.baseparser.UnpackTx")
return p.baseparser.UnpackTx(buf)
}

View File

@ -0,0 +1,235 @@
// +build unittest
package bcd
import (
"bytes"
"encoding/hex"
"fmt"
"math/big"
"os"
"reflect"
"testing"
"github.com/trezor/blockbook/bchain"
"github.com/trezor/blockbook/bchain/coins/btc"
"github.com/martinboehm/btcutil/chaincfg"
)
var (
testTx1, testTx2 bchain.Tx
testTxPacked1 = "0a2092e15e581f1df1f66fc4cda0b9ffe21af614417e9cdd98accbaa87f2c8cd42a412dd010c00000000000000000000000000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1503ec6d0904e66bb55e023043092906000000000000ffffffff0213a0814a000000001976a9143aaebaf2cac6975116ea6f48a4b82a331ab581b488ac0000000000000000266a24aa21a9ede8d2d526595d1dc32b5c07b921dd8b7366a6051603e20282b88abb40a82f4c7b012000000000000000000000000000000000000000000000000000000000000000000000000018e6d7d5f505200028ecdb2532340a2a303365633664303930346536366262353565303233303433303932393036303030303030303030303030180028ffffffff0f3a470a044a81a01310001a1976a9143aaebaf2cac6975116ea6f48a4b82a331ab581b488ac222231364d485762675a5a416b6e325176676155315431783979765762615575676142534000"
testTxPacked2 = "0a20b715206ffb15b02d8b55e826f62048accac8c4bc083c832d53fc40c044506ec812c101010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1b03ee6d09043d74b55e087102008138712300082f6666706f6f6c2f0000000002bd82814a0000000017a9148ba7c2aa02d973d7cf403604eee3ad7a98e0a535870000000000000000266a24aa21a9edba8f1b231c491442f6d23b9233c65ed26daa901e7350861fdcfc8d2f12fe02b3012000000000000000000000000000000000000000000000000000000000000000000000000018bde8d5f505200028eedb2532400a36303365653664303930343364373462353565303837313032303038313338373132333030303832663636363637303666366636633266180028feffffff0f3a450a044a8182bd10001a17a9148ba7c2aa02d973d7cf403604eee3ad7a98e0a53587222233455253705155647932535835726642514b634e6e484735544d666a753842786a514000"
)
func init() {
testTx1 = bchain.Tx{
Hex: "0c00000000000000000000000000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1503ec6d0904e66bb55e023043092906000000000000ffffffff0213a0814a000000001976a9143aaebaf2cac6975116ea6f48a4b82a331ab581b488ac0000000000000000266a24aa21a9ede8d2d526595d1dc32b5c07b921dd8b7366a6051603e20282b88abb40a82f4c7b0120000000000000000000000000000000000000000000000000000000000000000000000000",
Blocktime: 1588947942,
Time: 1588947942,
Txid: "92e15e581f1df1f66fc4cda0b9ffe21af614417e9cdd98accbaa87f2c8cd42a4",
LockTime: 0,
Vin: []bchain.Vin{
{
Coinbase: "03ec6d0904e66bb55e023043092906000000000000",
Sequence: 4294967295,
},
},
Vout: []bchain.Vout{
{
ValueSat: *big.NewInt(1250009107),
N: 0,
ScriptPubKey: bchain.ScriptPubKey{
Hex: "76a9143aaebaf2cac6975116ea6f48a4b82a331ab581b488ac",
Addresses: []string{
"16MHWbgZZAkn2QvgaU1T1x9yvWbaUugaBS",
},
},
},
},
}
testTx2 = bchain.Tx{
Hex: "010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1b03ee6d09043d74b55e087102008138712300082f6666706f6f6c2f0000000002bd82814a0000000017a9148ba7c2aa02d973d7cf403604eee3ad7a98e0a535870000000000000000266a24aa21a9edba8f1b231c491442f6d23b9233c65ed26daa901e7350861fdcfc8d2f12fe02b30120000000000000000000000000000000000000000000000000000000000000000000000000",
Blocktime: 1588950077,
Time: 1588950077,
Txid: "b715206ffb15b02d8b55e826f62048accac8c4bc083c832d53fc40c044506ec8",
LockTime: 0,
Vin: []bchain.Vin{
{
Coinbase: "03ee6d09043d74b55e087102008138712300082f6666706f6f6c2f",
Sequence: 4294967294,
},
},
Vout: []bchain.Vout{
{
ValueSat: *big.NewInt(1250001597),
N: 0,
ScriptPubKey: bchain.ScriptPubKey{
Hex: "a9148ba7c2aa02d973d7cf403604eee3ad7a98e0a53587",
Addresses: []string{
"3ERSpQUdy2SX5rfBQKcNnHG5TMfju8BxjQ",
},
},
},
},
}
}
func TestMain(m *testing.M) {
c := m.Run()
chaincfg.ResetParams()
os.Exit(c)
}
func TestGetAddrDesc(t *testing.T) {
type args struct {
tx bchain.Tx
parser *BdiamondParser
}
tests := []struct {
name string
args args
}{
{
name: "bcd-1",
args: args{
tx: testTx1,
parser: NewBdiamondParser(GetChainParams("main"), &btc.Configuration{}),
},
},
{
name: "bcd-2",
args: args{
tx: testTx2,
parser: NewBdiamondParser(GetChainParams("main"), &btc.Configuration{}),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
for n, vout := range tt.args.tx.Vout {
got1, err := tt.args.parser.GetAddrDescFromVout(&vout)
if err != nil {
t.Errorf("getAddrDescFromVout() error = %v, vout = %d", err, n)
return
}
got2, err := tt.args.parser.GetAddrDescFromAddress(vout.ScriptPubKey.Addresses[0])
if err != nil {
t.Errorf("getAddrDescFromAddress() error = %v, vout = %d", err, n)
return
}
if !bytes.Equal(got1, got2) {
t.Errorf("Address descriptors mismatch: got1 = %v, got2 = %v", got1, got2)
}
}
})
}
}
func TestPackTx(t *testing.T) {
type args struct {
tx bchain.Tx
height uint32
blockTime int64
parser *BdiamondParser
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{
name: "bcd-1",
args: args{
tx: testTx1,
height: 617964,
blockTime: 1588947942,
parser: NewBdiamondParser(GetChainParams("main"), &btc.Configuration{}),
},
want: testTxPacked1,
wantErr: false,
},
{
name: "bcd-2",
args: args{
tx: testTx2,
height: 617966,
blockTime: 1588950077,
parser: NewBdiamondParser(GetChainParams("main"), &btc.Configuration{}),
},
want: testTxPacked2,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime)
if (err != nil) != tt.wantErr {
t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr)
return
}
h := hex.EncodeToString(got)
fmt.Println("Encoded:", h)
if !reflect.DeepEqual(h, tt.want) {
t.Errorf("packTx() = %v, want %v", h, tt.want)
}
})
}
}
func TestUnpackTx(t *testing.T) {
type args struct {
packedTx string
parser *BdiamondParser
}
tests := []struct {
name string
args args
want *bchain.Tx
want1 uint32
wantErr bool
}{
{
name: "bcd-1",
args: args{
packedTx: testTxPacked1,
parser: NewBdiamondParser(GetChainParams("main"), &btc.Configuration{}),
},
want: &testTx1,
want1: 617964,
wantErr: false,
},
{
name: "bcd-2",
args: args{
packedTx: testTxPacked2,
parser: NewBdiamondParser(GetChainParams("main"), &btc.Configuration{}),
},
want: &testTx2,
want1: 617966,
wantErr: false,
},
}
for _, tt := range tests {
fmt.Println("DecodeString:")
t.Run(tt.name, func(t *testing.T) {
b, _ := hex.DecodeString(tt.args.packedTx)
got, got1, err := tt.args.parser.UnpackTx(b)
if (err != nil) != tt.wantErr {
t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("unpackTx() got = %v, want %v", got, tt.want)
}
if got1 != tt.want1 {
t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1)
}
})
}
}

View File

@ -0,0 +1,120 @@
package bcd
import (
"encoding/json"
"fmt"
"github.com/trezor/blockbook/bchain"
"github.com/trezor/blockbook/bchain/coins/btc"
"github.com/golang/glog"
"github.com/juju/errors"
)
// BdiamondRPC is an interface to JSON-RPC bitcoind service
type BdiamondRPC struct {
*btc.BitcoinRPC
}
// NewBdiamondRPC returns new BdiamondRPC instance
func NewBdiamondRPC(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) {
b, err := btc.NewBitcoinRPC(config, pushHandler)
if err != nil {
return nil, err
}
z := &BdiamondRPC{
BitcoinRPC: b.(*btc.BitcoinRPC),
}
fmt.Println("NewBdiamondRPC:", z)
z.RPCMarshaler = btc.JSONMarshalerV1{}
z.ChainConfig.SupportsEstimateFee = false
z.ChainConfig.SupportsEstimateSmartFee = true
return z, nil
}
// Initialize initializes BdiamondRPC instance
func (z *BdiamondRPC) Initialize() error {
ci, err := z.GetChainInfo()
if err != nil {
return err
}
chainName := ci.Chain
params := GetChainParams(chainName)
z.Parser = NewBdiamondParser(params, z.ChainConfig)
// parameters for getInfo request
if params.Net == MainnetMagic {
z.Testnet = false
z.Network = "livenet"
} else {
z.Testnet = true
z.Network = "testnet"
}
glog.Info("rpc: block chain ", params.Name)
return nil
}
// GetBlock returns block with given hash.
func (z *BdiamondRPC) GetBlock(hash string, height uint32) (*bchain.Block, error) {
var err error
if hash == "" && height > 0 {
hash, err = z.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 = z.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 := z.GetTransaction(txid)
if err != nil {
if err == bchain.ErrTxNotFound {
glog.Errorf("rpc: getblock: skipping transanction in block %s due error: %s", hash, err)
continue
}
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 (z *BdiamondRPC) GetTransactionForMempool(txid string) (*bchain.Tx, error) {
fmt.Println(txid)
return z.GetTransaction(txid)
}
// GetMempoolEntry returns mempool data for given transaction
func (z *BdiamondRPC) GetMempoolEntry(txid string) (*bchain.MempoolEntry, error) {
return nil, errors.New("GetMempoolEntry: not implemented")
}
func isErrBlockNotFound(err *bchain.RPCError) bool {
return err.Message == "Block not found" ||
err.Message == "Block height out of range"
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
00000060613e3c1bf5c2226ea4cb656ec065363dabb0c48692e7b8a6e4591acf07ae5920c013862e5f2d25dcb59c6fb75a35c1c825c278e4b19d41d3903d393ae43aa6467afcb45e8716011a19980b8a04010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1b03b16d09047afcb45e087a000081ef834700082f6666706f6f6c2f000000000246af814a0000000017a914a4128a837b458243608b7600bc7242025f53433b870000000000000000266a24aa21a9ed6641e1d65ef22d195229b9688e90850d4af24b3b18c6acceda8b905f326855b701200000000000000000000000000000000000000000000000000000000000000000000000000c0000000100000000000000000000000000000000000000000000000000000000000000014544d10db3370ae09c6198eef903331bdea75325315233352631e1b678089f3201000000fdfe0000483045022100f769a65e9348f01a6d91775eef02358ca2b05a6b6a080636c3b3e059da9d12fe022069ae27506886507dd64f3d57d173e2452b4b3b419f1b352e3fe76eb6eded5df601483045022100e5fa5eb12c5bec6d0627674b641fd400921cd28e0794ceb555635e8fee8eec7502201c43d55e35b0258d72b2091d66c92b436ef76700b059ecd75b6eef4c7df2ac79014c695221030a441679d848e66797e702a68440ea90454e38c408a5f7d1f2ea487b3fe5043b2102dc12600f6474bb1f6dd8bd6b6aa354927550e075572a5556bd37e664573c9e6c2103f152e6594c1cc326b427a9b27bdd5455997c19e1b17d1a6dbf8c164d2f1bb14453aeffffffff0200ca9a3b000000001976a914ac1f06bc2569bde318b868c4f51127153321f4d288ac2f3a6fbe0000000017a91464a8b4f2134519b60b1505daae380b87fa3b42f587000000000c000000c4739d36a2b8bae8fd5c06bd5852dff8167d0cf3de8d99c9481881546b791bda01e862481817973fc109a778c589c733eda99ddc635ed8827f1f2b60b32bb37507000000006a473044022008ac7b6da36d89463a7781f549fbd67234869ae03b96f28bd3496aeb25a7989402206b56cad99f1535946fd19377a343029c87c28f11b371085c2314aa48de38e46201210276af1141aeb567f9fc6124270a416fd5ee676349688221cf26d7c46354cb2b0efdffffff0280969800000000001976a9145c93bb00c5982eec9e461482bcbfb08f7750900888ac986c3bf60f0000001976a914e8f784cc5df9409bd403ca11c4785743c996cf1288ac8dfb07000c000000c4739d36a2b8bae8fd5c06bd5852dff8167d0cf3de8d99c9481881546b791bda014bce54f5c79ac996d40132e381850f5ae298f9b3a1b946cb27cdda15349342f9010000006a4730440220224fb057c15e8fe494ca6bf4df3e79885e9c19c8c4cd4ba5221df8a4dc73cd5702202bcc09e13de7131af7b4dcfe00338372bac75060dc6e5b88512f44d7f19b397e0121021997e69ae3b70d9491fc59e04ac198d975429ca27764f3215c72db77af59d4fbfdffffff0280778e06000000001976a9145c93bb00c5982eec9e461482bcbfb08f7750900888ac90e1acef0f0000001976a914ff0e2e567a840f413a17680de831731549c9e1f988ac3aff0700

View File

@ -0,0 +1 @@
0000006062021403101fdcdaacc4597831b7112ba10b09e162c90b010bac7088de1a581b2446d57b9157af59e2bb10ce0d837ddd1262d20597e5ffd3a192115886913dfc781db55e5048011ac85521b002010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1b03c16d0904781db55e082402008165824600082f6666706f6f6c2f00000000022681814a0000000017a9149420c392132aa6ffe15df878b74df596cf10321b870000000000000000266a24aa21a9edfd3b027025421a657fa094152ffa3f384017ad0b6f64c8196d6c1c322df7c14b01200000000000000000000000000000000000000000000000000000000000000000000000000c0000001b581ade8870ac0b010bc962e1090ba12b11b7317859c4acdadc1f100314026201f8254bad265a51c8a324073431bdacf56ed89e088fd17b67cf0b55c696331fed010000006b483045022100c26f4b8bb90ea693db8d9c7640b6facc009b88bafc4efdf193bf56d7e7ab11cc02206cc66cfbac4c490c778ea645c3229386bfc62497937bafeaedff424ce5c745b9012103f3f44c9e80e2cedc1a2909631a3adea8866ee32187f74d0912387359b0ff36a2ffffffff02ba5f36048d0000001976a914a520c86a08366941cd90d22e11ac1c7eefa2db3788acc09e20fc060000001976a91453708fec79ffa4d4c26528e6c303960f3938d4f788ac00000000

View File

@ -11,6 +11,7 @@ import (
"github.com/juju/errors"
"github.com/trezor/blockbook/bchain"
"github.com/trezor/blockbook/bchain/coins/bcd"
"github.com/trezor/blockbook/bchain/coins/bch"
"github.com/trezor/blockbook/bchain/coins/bellcoin"
"github.com/trezor/blockbook/bchain/coins/bitcore"
@ -71,6 +72,7 @@ func init() {
BlockChainFactories["Ethereum Testnet Goerli"] = eth.NewEthereumRPC
BlockChainFactories["Bcash"] = bch.NewBCashRPC
BlockChainFactories["Bcash Testnet"] = bch.NewBCashRPC
BlockChainFactories["Bdiamond"] = bcd.NewBdiamondRPC
BlockChainFactories["Bgold"] = btg.NewBGoldRPC
BlockChainFactories["Bgold Testnet"] = btg.NewBGoldRPC
BlockChainFactories["Dash"] = dash.NewDashRPC

View File

@ -7,7 +7,7 @@ RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y build-essential git wget pkg-config lxc-dev libzmq3-dev \
libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev \
liblz4-dev graphviz && \
liblz4-dev graphviz libx11-xcb1 && \
apt-get clean
ENV GOLANG_VERSION=go1.15.5.linux-amd64

View File

@ -0,0 +1,66 @@
{
"coin": {
"name": "Bdiamond",
"shortcut": "BCD",
"label": "Bitcoin Diamond",
"alias": "bdiamond"
},
"ports": {
"backend_rpc": 7116,
"backend_message_queue": 48390,
"blockbook_internal": 19090,
"blockbook_public": 19190
},
"ipc": {
"rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}",
"rpc_user": "rpc",
"rpc_pass": "rpc",
"rpc_timeout": 25,
"message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}"
},
"backend": {
"package_name": "backend-bdiamond",
"package_revision": "satoshilabs-1",
"system_user": "bdiamond",
"version": "1.3.0",
"binary_url": "https://github.com/eveybcd/BitcoinDiamond/releases/download/v1.3.0/bitcoindiamond-1.3.0-x86_64-linux-gnu.tar.gz",
"extract_command": "tar -C backend --strip 1 -xf",
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/bdiamondd -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/*.log",
"postinst_script_template": "",
"service_type": "forking",
"service_additional_params_template": "",
"protect_memory": true,
"mainnet": true,
"server_config_file": "bitcoin_like.conf",
"client_config_file": "bitcoin_like_client.conf",
"additional_params": {
"mempoolexpiry": 72
}
},
"blockbook": {
"package_name": "blockbook-bdiamond",
"system_user": "blockbook-bdiamond",
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
"explorer_url": "",
"additional_params": "",
"block_chain": {
"parse": true,
"subversion": "/bdiamond Core:1.3.0/",
"mempool_workers": 8,
"mempool_sub_workers": 2,
"block_addresses_to_keep": 300,
"xpub_magic": 50221772,
"slip44": 5,
"additional_params": {
"fiat_rates": "coingecko",
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"bdiamond\", \"periodSeconds\": 60}"
}
}
},
"meta": {
"package_maintainer": "IT Admin",
"package_maintainer_email": "it@satoshilabs.com"
}
}

116
tests/rpc/testdata/bdiamond.json vendored 100644
View File

@ -0,0 +1,116 @@
{
"blockHeight": 617970,
"blockHash": "98775a599f0db6c2262ef143d1166a1bcc5f2c43653fc02b700194413dae9ea9",
"blockTime": 1588954920,
"blockTxs": [
"9253e87edd902202ac00808be2cc06374167cccb6c058ae6a511837c916d69ee",
"634dab0599aeae845c361daaa8997bf04c448500ce52ecf2f8fdf11927550053",
"87e8a1867ff2be9ea19eb097b57c5aef222973dc8c4fc0ffacce78e80055f977",
"c16b81c551fc735f7732c2c0ff1ffb35edd7b8cd5ec3d833f8852d19efd8b1db",
"223147632124db2ee932fc6626260cb39f2b4c3a35fc1e7dcecab727c5c594f4"
],
"txDetails": {
"634dab0599aeae845c361daaa8997bf04c448500ce52ecf2f8fdf11927550053": {
"hex": "0c0000007062b732756f49557700bd8072c678a52c57650df3a6bf584fa39c450cfc2c0f0001014cc039d702dea795846b684e080c0ac95f3d8c217480d14356450465097fd844000000001716001484d4b4177263ee321c2e395f5289726fe266b106feffffff0298f4a9320000000017a9142f8aad4bafb2b0530ddf6b746f88c6d7fa0134d1870084d717000000001976a9148c843e386ee52f73303275fc5fef926b416fb30b88ac02483045022100e8c24cbee6134e412b9d819b68cdcfe0bcab7950ceb3dd3dffe2cb1ec207e12702203ce4734cfb611ebf2306ddc164afca6ee8e0df265cd28b8c2242e5a06afca83801210220839ad4d5fffca56b1d881df49998e03c84f5b3e3f8c617bc2ed91320c7772ff06d0900",
"txid": "634dab0599aeae845c361daaa8997bf04c448500ce52ecf2f8fdf11927550053",
"blocktime": 1588954920,
"time": 1588954920,
"locktime": 617968,
"version": 12,
"vin": [
{
"txid": "44d87f096504455643d18074218c3d5fc90a0c084e686b8495a7de02d739c04c",
"vout": 0,
"scriptSig": {
"asm": "001484d4b4177263ee321c2e395f5289726fe266b106",
"hex": "16001484d4b4177263ee321c2e395f5289726fe266b106"
},
"txinwitness": [
"3045022100e8c24cbee6134e412b9d819b68cdcfe0bcab7950ceb3dd3dffe2cb1ec207e12702203ce4734cfb611ebf2306ddc164afca6ee8e0df265cd28b8c2242e5a06afca83801",
"0220839ad4d5fffca56b1d881df49998e03c84f5b3e3f8c617bc2ed91320c7772f"
],
"sequence": 4294967294
}
],
"vout": [
{
"value": 84.9999,
"n": 0,
"scriptPubKey": {
"asm": "OP_HASH160 2f8aad4bafb2b0530ddf6b746f88c6d7fa0134d1 OP_EQUAL",
"hex": "a9142f8aad4bafb2b0530ddf6b746f88c6d7fa0134d187",
"reqSigs": 1,
"type": "scripthash",
"addresses": [
"362Pp15k6W5dUW9LXUSFqZTdb5kMXvYKK8"
]
}
},
{
"value": 40,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 8c843e386ee52f73303275fc5fef926b416fb30b OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9148c843e386ee52f73303275fc5fef926b416fb30b88ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1Doz2GLJfDtqWrGuPZM1Gd5JVxEN1x4Adt"
]
}
}
]
},
"87e8a1867ff2be9ea19eb097b57c5aef222973dc8c4fc0ffacce78e80055f977": {
"hex": "0c0000007062b732756f49557700bd8072c678a52c57650df3a6bf584fa39c450cfc2c0f0001010b923d3e4df6a5451cf93e56d8a35f19e77c5e3f085ab8f793acd54b8d4f6000000000001716001419a3e0b65e57595badded1682790d46b82e5f1aefeffffff0218a790410000000017a914a215ca928f14702f9e2f3130d04fcaa0dff2915a8780d1f008000000001976a914f585d5f64bf7688a797c634385ff2f62d15b8a3988ac02473044022064bcc33b7d6e0a75ce216ac0b5fee2e74cf8924ca657d4f8e401dc240578efec022060522b6cadc4bf311be11f7da3fc8e48974b9caf4b0437d9a5cc718785896cf3012103d64210d7f717efc1c68a748dd8230e8d82ace8f858f225325930fc02ee24d977f06d0900",
"txid": "87e8a1867ff2be9ea19eb097b57c5aef222973dc8c4fc0ffacce78e80055f977",
"blocktime": 1588954920,
"time": 1588954920,
"locktime": 617968,
"version": 12,
"vin": [
{
"txid": "00604f8d4bd5ac93f7b85a083f5e7ce7195fa3d8563ef91c45a5f64d3e3d920b",
"vout": 0,
"scriptSig": {
"asm": "001419a3e0b65e57595badded1682790d46b82e5f1ae",
"hex": "16001419a3e0b65e57595badded1682790d46b82e5f1ae"
},
"txinwitness": [
"3044022064bcc33b7d6e0a75ce216ac0b5fee2e74cf8924ca657d4f8e401dc240578efec022060522b6cadc4bf311be11f7da3fc8e48974b9caf4b0437d9a5cc718785896cf301",
"03d64210d7f717efc1c68a748dd8230e8d82ace8f858f225325930fc02ee24d977"
],
"sequence": 4294967294
}
],
"vout": [
{
"value": 109.9999,
"n": 0,
"scriptPubKey": {
"asm": "OP_HASH160 a215ca928f14702f9e2f3130d04fcaa0dff2915a OP_EQUAL",
"hex": "a914a215ca928f14702f9e2f3130d04fcaa0dff2915a87",
"reqSigs": 1,
"type": "scripthash",
"addresses": [
"3GU3Vhv8orSs6zgf5Hg6U1qSAhmzUUd2s9"
]
}
},
{
"value": 15,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 f585d5f64bf7688a797c634385ff2f62d15b8a39 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a914f585d5f64bf7688a797c634385ff2f62d15b8a3988ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1PPCt5Bdorc11tpmpPbapkrha1dtrPSCAi"
]
}
}
]
}
}
}

184
tests/sync/testdata/bdiamond.json vendored 100644
View File

@ -0,0 +1,184 @@
{
"connectBlocks": {
"syncRanges": [
{"lower": 399990, "upper": 400100}
],
"blocks": {
"400100": {
"height": 400100,
"hash": "0000000000000000025f17300a817ecfa9f6fd8849f63ff9faf97038d8ebe086",
"noTxs": 841,
"txDetails": [
{
"hex": "0100000001b69b18a634a3cb192bf9ac154a0dda235a314bd9be6fc90d52ad5b62523cbbfa010000006a4730440220455df92732c22be97a15765ab4995ab75d73112db986c65a950dee915e448f3b0220438bbd6c3edb2822dbcd8c073ae6636348ee5151687098896c18850bd5f765d80121028319e3efd014be95a681a3c4549e9ce951fa5ab1e32a11888c4e5c1bec9374a8ffffffff0280841e00000000001976a914fc41ddcfc5974024d38722691e0e72dfa85b4a9a88ac88d04700000000001976a914d36481ecfcedcddd0c9cecb40ad3744d4b19a0d888ac00000000",
"txid": "e68fa68c610f99f1d7ad9987518c1f2f91591e6a5371efb12c6cac93120c47c3",
"version": 1,
"vin": [
{
"txid": "fabb3c52625bad520dc96fbed94b315a23da0d4a15acf92b19cba334a6189bb6",
"vout": 1,
"scriptSig": {
"hex": "4730440220455df92732c22be97a15765ab4995ab75d73112db986c65a950dee915e448f3b0220438bbd6c3edb2822dbcd8c073ae6636348ee5151687098896c18850bd5f765d80121028319e3efd014be95a681a3c4549e9ce951fa5ab1e32a11888c4e5c1bec9374a8"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.2,
"n": 0,
"scriptPubKey": {
"hex": "76a914fc41ddcfc5974024d38722691e0e72dfa85b4a9a88ac"
}
},
{
"value": 0.470644,
"n": 1,
"scriptPubKey": {
"hex": "76a914d36481ecfcedcddd0c9cecb40ad3744d4b19a0d888ac"
}
}
],
"time": 1456471676,
"blocktime": 1456471676
},
{
"hex": "0100000006e7c3c64cc7fbf416a690644db544a93280ac294eb8a431fbb94ebeb0bad92bf3000000006a47304402202520752a9ff3a7dd6dcde4514242e2e760982a28208f4c585c2b2275ec1ae27702200cb92511e184d1e815fdfceba20d1185d33884de02a8a053ed7819f12124a4aa012103fbbaebfe5e4814c5cf4bf6f00085ff8dceeeccee740cfcd3af0e2bc020cdc79ffeffffff7c8c1d2edde2bfc1ae329c510ce08c14e69fef4a9275d3eada02a81924a175e9000000006b483045022100a7f72b7b47be84f7b3452dde9239e8796e4083b04936c35695008dd9ba8838f2022013678e70a598df5ee88ff7cb3e4750e2aaef8ca684810f7557e89b9fd4fa4f8c0121032b800d50521f7895d43a09f4ff4f2629eb9d9865eb24d7d731462914fd673562feffffff16315d55fb65f63ef5550616509fa76d5b055983ddaa4d7ec67d50e5ea64f377010000006b483045022100a082114b6034ae1837cbb1404453a02664f189a3965a1121f27af997aaf5464502202460787e7a6dd4203b30e27808da89a515d508422974b49806c4a55f1969d19201210335adde3de5c690e0a4adecf8dcc14726bb9ccd75abbb2e34dec6d2d916c69b36feffffffdc940b33d41b26b1db8e715e72dafc4a46bec7976285db12d6c7486052d0d71f000000006a47304402204bd5e12fbd1f80484d4f9366899a21dd613b2ba6b0068910c8a80f512f4201b0022014c88394125db89e1d2fb7fa1434c11cf4ccb20439dabb44bd6c4d45346ae6d1012103b347225eb15386095f01c96e5bc86d6a97912fd66d6a9d3147f0e9acf2f16466feffffff2914a261ac1ebd120ba62144afb525fd7711a20779275813d266db0a8eb878d1010000006a4730440220052fab5f58e83f2363617b263dc17caa37b711773a2ad9919518b231c0c004b202206c4a9a0501ac9b4486b57724a24811e4da9ecf987d3f9c5316f34b467ab404db01210288f87d233cedd56296ea968f7653c361981732b32ee1846f2c2a7305b0da8a54feffffff7a625cb3d58580d601233a1727f25f60fc1b356c897da56807b05f665d63bd93040000006a47304402200237de20202a6dc0323197e80a59b2d676e45cb4046cbef48bf54ac08cf4263c0220673530e2dc5b0eb90f6aec8aa384676c7b8d8b0fafcf3da7c3e0cdc42af1e76201210341be751799821c035bbcd0f100e4aa9ea6155c63b6b56e7a0bd58687f877c14dfeffffff0594961c00000000001976a91487a7cacaccb6e29c16a15db69b2718bb1a0402a588acb7000101000000001976a9141f336d2ace9b659594e10134f23b059b310c36df88ac913bf800000000001976a9149aeec07c2931cca137a2dd3a55fe0e9624d26c9788acf0faff00000000001976a9142122fc8cc2a6fcd0e57065941a30eebfe99c95fa88acddec3a01000000001976a91482b2927ddd63cbcb508750952baf4a2ca7166ac588acd91a0600",
"txid": "c04fabcc3b7ef460fb711f6731ab797056e21ee23f2babf80dc697e316ba7b28",
"version": 1,
"vin": [
{
"txid": "f32bd9bab0be4eb9fb31a4b84e29ac8032a944b54d6490a616f4fbc74cc6c3e7",
"vout": 0,
"scriptSig": {
"hex": "47304402202520752a9ff3a7dd6dcde4514242e2e760982a28208f4c585c2b2275ec1ae27702200cb92511e184d1e815fdfceba20d1185d33884de02a8a053ed7819f12124a4aa012103fbbaebfe5e4814c5cf4bf6f00085ff8dceeeccee740cfcd3af0e2bc020cdc79f"
},
"sequence": 4294967294
},
{
"txid": "e975a12419a802daead375924aef9fe6148ce00c519c32aec1bfe2dd2e1d8c7c",
"vout": 0,
"scriptSig": {
"hex": "483045022100a7f72b7b47be84f7b3452dde9239e8796e4083b04936c35695008dd9ba8838f2022013678e70a598df5ee88ff7cb3e4750e2aaef8ca684810f7557e89b9fd4fa4f8c0121032b800d50521f7895d43a09f4ff4f2629eb9d9865eb24d7d731462914fd673562"
},
"sequence": 4294967294
},
{
"txid": "77f364eae5507dc67e4daadd8359055b6da79f50160655f53ef665fb555d3116",
"vout": 1,
"scriptSig": {
"hex": "483045022100a082114b6034ae1837cbb1404453a02664f189a3965a1121f27af997aaf5464502202460787e7a6dd4203b30e27808da89a515d508422974b49806c4a55f1969d19201210335adde3de5c690e0a4adecf8dcc14726bb9ccd75abbb2e34dec6d2d916c69b36"
},
"sequence": 4294967294
},
{
"txid": "1fd7d0526048c7d612db856297c7be464afcda725e718edbb1261bd4330b94dc",
"vout": 0,
"scriptSig": {
"hex": "47304402204bd5e12fbd1f80484d4f9366899a21dd613b2ba6b0068910c8a80f512f4201b0022014c88394125db89e1d2fb7fa1434c11cf4ccb20439dabb44bd6c4d45346ae6d1012103b347225eb15386095f01c96e5bc86d6a97912fd66d6a9d3147f0e9acf2f16466"
},
"sequence": 4294967294
},
{
"txid": "d178b88e0adb66d21358277907a21177fd25b5af4421a60b12bd1eac61a21429",
"vout": 1,
"scriptSig": {
"hex": "4730440220052fab5f58e83f2363617b263dc17caa37b711773a2ad9919518b231c0c004b202206c4a9a0501ac9b4486b57724a24811e4da9ecf987d3f9c5316f34b467ab404db01210288f87d233cedd56296ea968f7653c361981732b32ee1846f2c2a7305b0da8a54"
},
"sequence": 4294967294
},
{
"txid": "93bd635d665fb00768a57d896c351bfc605ff227173a2301d68085d5b35c627a",
"vout": 4,
"scriptSig": {
"hex": "47304402200237de20202a6dc0323197e80a59b2d676e45cb4046cbef48bf54ac08cf4263c0220673530e2dc5b0eb90f6aec8aa384676c7b8d8b0fafcf3da7c3e0cdc42af1e76201210341be751799821c035bbcd0f100e4aa9ea6155c63b6b56e7a0bd58687f877c14d"
},
"sequence": 4294967294
}
],
"vout": [
{
"value": 0.1873556,
"n": 0,
"scriptPubKey": {
"hex": "76a91487a7cacaccb6e29c16a15db69b2718bb1a0402a588ac"
}
},
{
"value": 1.6842935,
"n": 1,
"scriptPubKey": {
"hex": "76a9141f336d2ace9b659594e10134f23b059b310c36df88ac"
}
},
{
"value": 1.6268177,
"n": 2,
"scriptPubKey": {
"hex": "76a9149aeec07c2931cca137a2dd3a55fe0e9624d26c9788ac"
}
},
{
"value": 1.677592,
"n": 3,
"scriptPubKey": {
"hex": "76a9142122fc8cc2a6fcd0e57065941a30eebfe99c95fa88ac"
}
},
{
"value": 2.0638941,
"n": 4,
"scriptPubKey": {
"hex": "76a91482b2927ddd63cbcb508750952baf4a2ca7166ac588ac"
}
}
],
"time": 1456471676,
"blocktime": 1456471676
}
]
}
}
},
"handleFork": {
"syncRanges": [
{"lower": 399990, "upper": 400100}
],
"fakeBlocks": {
"399991": {
"height": 399991,
"hash": "000000000000000005e8ae70f82b793f1f814e147813b147ffac808755c62c22"
},
"399992": {
"height": 399992,
"hash": "00000000000000000238510da1e9038a693f5ab503404a39dd9439ed95613692"
},
"399997": {
"height": 399997,
"hash": "00000000000000000287b0bab50e1522207204de6dca6c2adb38025f16cf16a4"
},
"400100": {
"height": 400100,
"hash": "000000000000000002cef46bbf24c646eb72867eceedee7f61c3c838b00c97dc"
}
},
"realBlocks": {
"399991": {
"height": 399991,
"hash": "00000000000000000120d6588297f21815db198e63da7e424769b79b5228c1f7"
},
"399992": {
"height": 399992,
"hash": "0000000000000000062547c530d119c86a1113addedc776d4c4477f13722ae0f"
},
"399997": {
"height": 399997,
"hash": "0000000000000000065020289f5928f227dc7e92c424824fbffaeb3597909c0c"
},
"400100": {
"height": 400100,
"hash": "0000000000000000025f17300a817ecfa9f6fd8849f63ff9faf97038d8ebe086"
}
}
}
}

View File

@ -17,6 +17,11 @@
"bgold": {
"sync": ["ConnectBlocksParallel", "ConnectBlocks", "HandleFork"]
},
"bdiamond": {
"rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync",
"EstimateSmartFee", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"],
"sync": ["ConnectBlocksParallel", "ConnectBlocks", "HandleFork"]
},
"bitcoin": {
"rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync",
"EstimateSmartFee", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"],