diff --git a/bchain/baseparser_test.go b/bchain/baseparser_test.go index adbbab2a..426ad9e5 100644 --- a/bchain/baseparser_test.go +++ b/bchain/baseparser_test.go @@ -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) { diff --git a/bchain/coins/bcd/bdiamondparser.go b/bchain/coins/bcd/bdiamondparser.go new file mode 100644 index 00000000..bc6b6422 --- /dev/null +++ b/bchain/coins/bcd/bdiamondparser.go @@ -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) +} diff --git a/bchain/coins/bcd/bdiamondparser_test.go b/bchain/coins/bcd/bdiamondparser_test.go new file mode 100644 index 00000000..3cc8b412 --- /dev/null +++ b/bchain/coins/bcd/bdiamondparser_test.go @@ -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) + } + }) + } +} diff --git a/bchain/coins/bcd/bdiamondrpc.go b/bchain/coins/bcd/bdiamondrpc.go new file mode 100644 index 00000000..b5830c10 --- /dev/null +++ b/bchain/coins/bcd/bdiamondrpc.go @@ -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" +} diff --git a/bchain/coins/bcd/testdata/block_dump. 617881 b/bchain/coins/bcd/testdata/block_dump. 617881 new file mode 100644 index 00000000..59dd4434 --- /dev/null +++ b/bchain/coins/bcd/testdata/block_dump. 617881 @@ -0,0 +1 @@ +00000060a9bd8bb749d1fff8b01adab437a42271cf0203ffb671fa863b3a32de467167d40b9d14ec9d1f600b018ced2e945a00ee16d47237f896070f4c78e3aedf0fd31ec7b8b45e8716011a4671b9a605010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff6403996d092cfabe6d6d000000000000000000000000000000000000000000000000000000000000000000000000f09f988a184d696e656420627920333776667336616f6d6a79797977770000000000000000000000000000000000000000000000000000bcc408000233ef814a000000001976a91449403cff60a7770706ea9ee4c925a277cdd8223388ac00000000000000002f6a24aa21a9ed8ccda8fda0d754df6969f0ad681f8f42ac0d084742a763c070a8a117df30645c080000000000000000012000000000000000000000000000000000000000000000000000000000000000001e5cd83c0c000000d4677146de323a3b86fa71b6ff0302cf7122a437b4da1ab0f8ffd149b78bbda901f8d2d33eeb3956ac99a57e4bfa540cdc9599fad709a6a02709ebf08889a3284a000000006a473044022017f33c778da3a315021c2809062430c04d28498bbb4cc2e4fecda670953397d602202df7bc0f38693340b476891eafcde79206a546ee20c822c0b743ae5663643a1001210203f10832695e130e1340162aa89d2b8162b68769a7e3d804ba42598032969d7bffffffff02a0860100000000001976a914a2a3eb00a2f8cb77da54887776c744af2eb1eabc88ac80860300000000001976a91402d8b186fad2fea8364b061688e112c0b663b60c88ac000000000c000000010000000000000000000000000000000000000000000000000000000000000003025104a4e5a78dccf015a571120ca49698e2f56267400b4ffea9fd29c3a436cc01000000fc0047304402207d8c9048d6c548c9d798a7d42a31b6868752913381ed34a7df5b48032289a1ac022045ad72afc6b2de862014310cf0feed6e4cc8bdd92c15a91d883a394cafb563d30147304402205a3b912d3e10888eed66b20c8f9a07fdc6b360f4d387fc344463023bda571f0b022017e78a12ebf57fd62ed7f39c3cee943818e03e3cbce362e5c4bc283643f1774d014c69522103ccb86214bce90fc9311f5c0518e48526249c1931360371ec68408d6c391b57362102e4bf3561c4e10e4a07d6f8056172f2388f318a19c6b36a95bd986c2d2d178c8621039103b28cf157e1175b220ade16cf4311b986f8d5818c2b6904345d88d0c8420d53aeffffffff9da733a5349eacb0423b28e8837facd9459025ef924f0609a18129799ec06edc01000000fdfd0000473044022069985c0f9252c5f920dc859e6605050f824bfde9b7b51e7d28f26dc690757c4902200d0c70c23102a7409c32921e410b51412ec27cfd0a1ecdbfebf3d299cc7abdaa0148304502210083a90cef5bd5b3b6e8964a49836ac5dec2a165bc2a1b85133c9ab13cc5e0e02902204aa7ffdb72b51c4419a272ba62fc57a76df186d6cfb126c092446f9a8c5f6d60014c69522103cb1b9197835a388a4f3bb6a75f237eca15f2924470c46c514e668fa20789b6da210316ce129fcf250d08ea491415d358e1fddcda79a0dce9566d72701711bc222b29210346f912353b68566afe34ef8ac2305bad93fab73d0e00ccb07345e867cd1e172b53aeffffffff1ced129d6c5e7b4e7536a1f560659b7e181108cd94a894423b8ca831c89a2add01000000fdfd00004830450221009089bcab71ce79545b6020f65096ea81e9b62c6f30b1f6dbb6e391da0e875b3c022039cd04eb644ee9c3c4e05e73da2b2df17fda29a16e9cfb10f6dcebe39d7cb0d30147304402203c1b60113273cc40aa3ba58dbe927298bdb97d2ea79c04628b7ac5f13b25c04e02206c1d633df5ed267761c6c37b74b94e9df8ed3343e6b8c4aee049ce3df2d13843014c69522103c7c2ba5dc18f5789a84de661e1f5c7acb8e1a70845f1fbc1302f00a0a3e20f3b210328291f2f5424bb277420ca3a8e4fc722ecd010e4b67704c87e3bd691e54da4e82102fb76b7542e4f9d121041f29a3c3f36eeca6d5a8e1fe4d8fdda8ce1388a40a5e753aeffffffff0390f701920c00000017a914001377fb8f8cd95df6e66c5982260aae20363c838700346e08000000001976a914c84b0c892dabc6026cbe3add38ced698061f01d188ac7f94daac0100000017a914bfd0be848edd98c20ffb51e2c2bbe9b892af8f3187000000000c000000a9bd8bb749d1fff8b01adab437a42271cf0203ffb671fa863b3a32de467167d404660a789f15cbb9d5cf8aa25ba7f74b8c605e0fd616279e556d75cbcdb76eb4c2010000006b483045022100ade9d958d4fb82de9603d6c54ec2579929233938ec726004a0bd290c7581c776022016718b89fa3fcd744735021e4442d73059a894b2fadf7f431dc3f2b91d4fb74e012102de2f5432d84d8a3d820aa4dbcd60da921496d70c58ef6e2eb43855487c37dc67feffffff01d503eb8f62c69cdf69601cdf9fcdeeafd701bd9c9c6f8074baad5dcf96da30010000006a47304402206a8a20b8189974af9bc053c3fbe487be5ac947460c55ce8ccf8e576c1ea5527302200ce676c44debcfa47559dccd9e6cab5b2336624da798ef9a03bcfa81f71f59200121038846699f35528efb03b4415e3c52116eeb4cc69c40ff842fbe0a06aa2a84e9d0feffffffd79bebb5f9aff6d67d96f7709abafe4e927fec943da55e419e124cfb28b4f6f4000000006b483045022100de297350ba32936fb69c663987a0dadf433ce51aa5299f7d6bd684b86cd6d08302203aeafe641c9497f76df3594dc8a4575124ff859a09da52a0f39baf68cee25636012102b51def02a0df29047bf49e6a3f36e7fc8d7bed3790aaea90e72edbc2c23061a7feffffffd79bebb5f9aff6d67d96f7709abafe4e927fec943da55e419e124cfb28b4f6f4010000006a473044022007255ff3a3326ae418ad020c9c0e28bb83bf4007784208194aa699580b1c68640220179fea6006ee93c540380e6227397eb6b52ae0f781760a5936f58c908328defe0121035b9938b23741ef73e9bd123e82763bf1639e22ba1224c9dbfaad0e7510d73d78feffffff02c00cbc05030000001976a914a57ec6d33d1c1699862eaad10761c2808cd5c14388ac781dad00000000001976a914901dcf07c8780e19803c5196598a7989801addca88ac986d09000c000000a9bd8bb749d1fff8b01adab437a42271cf0203ffb671fa863b3a32de467167d400010221ebbd928f51bf28e336c4c512643c6cb6914e040afa04975f545390739100df000000006a47304402205523c3fcc19ea5c61d4f8d4e138337bb953b9314ff7c5b8f71a9b1bb90243e7b02207671593b277906f049f4fe0840cee73980831a9330d7e75ac8e3dc5a5e629d4f0121037ac92b055f2f495e0264383b05b2c683e3b9bd995571586d5730daa64145dc7dfeffffff206af04fa38349c1c5120219a99f213316ff725d8fc1d8820c38cdb90156410e010000001716001483246729a1f0e21a8aa65bf337b55efa36803db3feffffff037d241749000000001976a914707aa9a3fdc91ac3812bf24386cd707eeb55ea2b88acb424250b0000000017a914a6588382198bd3e0c916e6511c0b466bc48efc5a87b2504a03000000001976a914e054813a560702cd87ac103cff5254e7a750078688ac000247304402206d067934842e26e47c302b06b60692fa6a5c32db56795d6bd847a7aac3c5bf9102206fccd9d7aad270e56cd464fc9a5df09456ab8a9c02884b703de575de92deee61012102913cde2672c47a6d745840f81265e7b1ec8d7daee477c71ebeb831b079957303986d0900 \ No newline at end of file diff --git a/bchain/coins/bcd/testdata/block_dump. 617905 b/bchain/coins/bcd/testdata/block_dump. 617905 new file mode 100644 index 00000000..43f37334 --- /dev/null +++ b/bchain/coins/bcd/testdata/block_dump. 617905 @@ -0,0 +1 @@ +00000060613e3c1bf5c2226ea4cb656ec065363dabb0c48692e7b8a6e4591acf07ae5920c013862e5f2d25dcb59c6fb75a35c1c825c278e4b19d41d3903d393ae43aa6467afcb45e8716011a19980b8a04010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1b03b16d09047afcb45e087a000081ef834700082f6666706f6f6c2f000000000246af814a0000000017a914a4128a837b458243608b7600bc7242025f53433b870000000000000000266a24aa21a9ed6641e1d65ef22d195229b9688e90850d4af24b3b18c6acceda8b905f326855b701200000000000000000000000000000000000000000000000000000000000000000000000000c0000000100000000000000000000000000000000000000000000000000000000000000014544d10db3370ae09c6198eef903331bdea75325315233352631e1b678089f3201000000fdfe0000483045022100f769a65e9348f01a6d91775eef02358ca2b05a6b6a080636c3b3e059da9d12fe022069ae27506886507dd64f3d57d173e2452b4b3b419f1b352e3fe76eb6eded5df601483045022100e5fa5eb12c5bec6d0627674b641fd400921cd28e0794ceb555635e8fee8eec7502201c43d55e35b0258d72b2091d66c92b436ef76700b059ecd75b6eef4c7df2ac79014c695221030a441679d848e66797e702a68440ea90454e38c408a5f7d1f2ea487b3fe5043b2102dc12600f6474bb1f6dd8bd6b6aa354927550e075572a5556bd37e664573c9e6c2103f152e6594c1cc326b427a9b27bdd5455997c19e1b17d1a6dbf8c164d2f1bb14453aeffffffff0200ca9a3b000000001976a914ac1f06bc2569bde318b868c4f51127153321f4d288ac2f3a6fbe0000000017a91464a8b4f2134519b60b1505daae380b87fa3b42f587000000000c000000c4739d36a2b8bae8fd5c06bd5852dff8167d0cf3de8d99c9481881546b791bda01e862481817973fc109a778c589c733eda99ddc635ed8827f1f2b60b32bb37507000000006a473044022008ac7b6da36d89463a7781f549fbd67234869ae03b96f28bd3496aeb25a7989402206b56cad99f1535946fd19377a343029c87c28f11b371085c2314aa48de38e46201210276af1141aeb567f9fc6124270a416fd5ee676349688221cf26d7c46354cb2b0efdffffff0280969800000000001976a9145c93bb00c5982eec9e461482bcbfb08f7750900888ac986c3bf60f0000001976a914e8f784cc5df9409bd403ca11c4785743c996cf1288ac8dfb07000c000000c4739d36a2b8bae8fd5c06bd5852dff8167d0cf3de8d99c9481881546b791bda014bce54f5c79ac996d40132e381850f5ae298f9b3a1b946cb27cdda15349342f9010000006a4730440220224fb057c15e8fe494ca6bf4df3e79885e9c19c8c4cd4ba5221df8a4dc73cd5702202bcc09e13de7131af7b4dcfe00338372bac75060dc6e5b88512f44d7f19b397e0121021997e69ae3b70d9491fc59e04ac198d975429ca27764f3215c72db77af59d4fbfdffffff0280778e06000000001976a9145c93bb00c5982eec9e461482bcbfb08f7750900888ac90e1acef0f0000001976a914ff0e2e567a840f413a17680de831731549c9e1f988ac3aff0700 \ No newline at end of file diff --git a/bchain/coins/bcd/testdata/block_dump. 617921 b/bchain/coins/bcd/testdata/block_dump. 617921 new file mode 100644 index 00000000..297d2283 --- /dev/null +++ b/bchain/coins/bcd/testdata/block_dump. 617921 @@ -0,0 +1 @@ +0000006062021403101fdcdaacc4597831b7112ba10b09e162c90b010bac7088de1a581b2446d57b9157af59e2bb10ce0d837ddd1262d20597e5ffd3a192115886913dfc781db55e5048011ac85521b002010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1b03c16d0904781db55e082402008165824600082f6666706f6f6c2f00000000022681814a0000000017a9149420c392132aa6ffe15df878b74df596cf10321b870000000000000000266a24aa21a9edfd3b027025421a657fa094152ffa3f384017ad0b6f64c8196d6c1c322df7c14b01200000000000000000000000000000000000000000000000000000000000000000000000000c0000001b581ade8870ac0b010bc962e1090ba12b11b7317859c4acdadc1f100314026201f8254bad265a51c8a324073431bdacf56ed89e088fd17b67cf0b55c696331fed010000006b483045022100c26f4b8bb90ea693db8d9c7640b6facc009b88bafc4efdf193bf56d7e7ab11cc02206cc66cfbac4c490c778ea645c3229386bfc62497937bafeaedff424ce5c745b9012103f3f44c9e80e2cedc1a2909631a3adea8866ee32187f74d0912387359b0ff36a2ffffffff02ba5f36048d0000001976a914a520c86a08366941cd90d22e11ac1c7eefa2db3788acc09e20fc060000001976a91453708fec79ffa4d4c26528e6c303960f3938d4f788ac00000000 \ No newline at end of file diff --git a/bchain/coins/blockchain.go b/bchain/coins/blockchain.go index 38cae788..d1ac6a16 100644 --- a/bchain/coins/blockchain.go +++ b/bchain/coins/blockchain.go @@ -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 diff --git a/build/docker/bin/Dockerfile b/build/docker/bin/Dockerfile index c182c66f..01e84fc4 100644 --- a/build/docker/bin/Dockerfile +++ b/build/docker/bin/Dockerfile @@ -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 diff --git a/configs/coins/bdiamond.json b/configs/coins/bdiamond.json new file mode 100644 index 00000000..ebf7c19d --- /dev/null +++ b/configs/coins/bdiamond.json @@ -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" + } +} diff --git a/tests/rpc/testdata/bdiamond.json b/tests/rpc/testdata/bdiamond.json new file mode 100644 index 00000000..16d74f89 --- /dev/null +++ b/tests/rpc/testdata/bdiamond.json @@ -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" + ] + } + } + ] + } + } +} diff --git a/tests/sync/testdata/bdiamond.json b/tests/sync/testdata/bdiamond.json new file mode 100644 index 00000000..703d32db --- /dev/null +++ b/tests/sync/testdata/bdiamond.json @@ -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" + } + } + } +} diff --git a/tests/tests.json b/tests/tests.json index 41f85155..3ec776d1 100644 --- a/tests/tests.json +++ b/tests/tests.json @@ -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"],