From 7847f7c2adf4f1a06c2b0858fad62990d1b710e5 Mon Sep 17 00:00:00 2001 From: nhaus12 <48998067+nhaus12@users.noreply.github.com> Date: Thu, 12 Aug 2021 22:22:05 +0200 Subject: [PATCH] feat: Dogecoin testnet support (#650) * feat: Dogecoin testnet address/script parsing * test: Dogecoin testnet address/script parsing * test: Dogecoin testnet transaction packing/unpacking * test: Dogecoin testnet block parsing * chore: Dogecoin testnet config file * test: Dogecoin testnet integration rpc (initial) * fix: run backend as REST * fix: Dogecoin testnet in BlockChainFactories * test: Dogecoin testnet integration sync * docs: Dogecoin testnet port numbers --- bchain/coins/blockchain.go | 1 + bchain/coins/dogecoin/dogecoinparser.go | 12 + bchain/coins/dogecoin/dogecoinparser_test.go | 450 ++++++++++++++++++ .../testdata/block_dump_testnet.1234580 | 1 + .../testdata/block_dump_testnet.158100 | 1 + .../testdata/block_dump_testnet.3274642 | 1 + .../testdata/block_dump_testnet.99999 | 1 + configs/coins/dogecoin_testnet.json | 70 +++ docs/ports.md | 1 + tests/rpc/testdata/dogecoin_testnet.json | 59 +++ tests/sync/testdata/dogecoin_testnet.json | 155 ++++++ tests/tests.json | 4 + 12 files changed, 756 insertions(+) create mode 100644 bchain/coins/dogecoin/testdata/block_dump_testnet.1234580 create mode 100644 bchain/coins/dogecoin/testdata/block_dump_testnet.158100 create mode 100644 bchain/coins/dogecoin/testdata/block_dump_testnet.3274642 create mode 100644 bchain/coins/dogecoin/testdata/block_dump_testnet.99999 create mode 100644 configs/coins/dogecoin_testnet.json create mode 100644 tests/rpc/testdata/dogecoin_testnet.json create mode 100644 tests/sync/testdata/dogecoin_testnet.json diff --git a/bchain/coins/blockchain.go b/bchain/coins/blockchain.go index 824d3c63..cb0ae316 100644 --- a/bchain/coins/blockchain.go +++ b/bchain/coins/blockchain.go @@ -84,6 +84,7 @@ func init() { BlockChainFactories["Litecoin"] = litecoin.NewLitecoinRPC BlockChainFactories["Litecoin Testnet"] = litecoin.NewLitecoinRPC BlockChainFactories["Dogecoin"] = dogecoin.NewDogecoinRPC + BlockChainFactories["Dogecoin Testnet"] = dogecoin.NewDogecoinRPC BlockChainFactories["Vertcoin"] = vertcoin.NewVertcoinRPC BlockChainFactories["Vertcoin Testnet"] = vertcoin.NewVertcoinRPC BlockChainFactories["Namecoin"] = namecoin.NewNamecoinRPC diff --git a/bchain/coins/dogecoin/dogecoinparser.go b/bchain/coins/dogecoin/dogecoinparser.go index e771581b..ed4a59e7 100644 --- a/bchain/coins/dogecoin/dogecoinparser.go +++ b/bchain/coins/dogecoin/dogecoinparser.go @@ -13,11 +13,13 @@ import ( // magic numbers const ( MainnetMagic wire.BitcoinNet = 0xc0c0c0c0 + TestnetMagic wire.BitcoinNet = 0xfcc1b7dc // See https://github.com/dogecoin/dogecoin/blob/f80bfe9068ac1a0619d48dad0d268894d926941e/qa/rpc-tests/test_framework/mininode.py#L1620 ) // chain parameters var ( MainNetParams chaincfg.Params + TestNetParams chaincfg.Params ) func init() { @@ -25,6 +27,11 @@ func init() { MainNetParams.Net = MainnetMagic MainNetParams.PubKeyHashAddrID = []byte{30} MainNetParams.ScriptHashAddrID = []byte{22} + + TestNetParams = chaincfg.TestNet3Params + TestNetParams.Net = TestnetMagic + TestNetParams.PubKeyHashAddrID = []byte{113} // See https://github.com/dogecoin/dogecoin/blob/f80bfe9068ac1a0619d48dad0d268894d926941e/contrib/testgen/gen_base58_test_vectors.py#L23 + TestNetParams.ScriptHashAddrID = []byte{196} // See https://github.com/dogecoin/dogecoin/blob/f80bfe9068ac1a0619d48dad0d268894d926941e/contrib/testgen/gen_base58_test_vectors.py#L24 } // DogecoinParser handle @@ -42,11 +49,16 @@ func NewDogecoinParser(params *chaincfg.Params, c *btc.Configuration) *DogecoinP func GetChainParams(chain string) *chaincfg.Params { if !chaincfg.IsRegistered(&MainNetParams) { err := chaincfg.Register(&MainNetParams) + if err == nil { + err = chaincfg.Register(&TestNetParams) + } if err != nil { panic(err) } } switch chain { + case "test": + return &TestNetParams default: return &MainNetParams } diff --git a/bchain/coins/dogecoin/dogecoinparser_test.go b/bchain/coins/dogecoin/dogecoinparser_test.go index eb45a1e0..0217143f 100644 --- a/bchain/coins/dogecoin/dogecoinparser_test.go +++ b/bchain/coins/dogecoin/dogecoinparser_test.go @@ -82,6 +82,70 @@ func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { } } +func Test_GetAddrDescFromAddress_Testnet(t *testing.T) { + type args struct { + address string + } + tests := []struct { + name string + args args + want string + wantErr bool + }{ + { + name: "P2PKH1", + args: args{address: "neYNjrnowpYrbS4QanPngXBi6MQcX6FsWV"}, + want: "76a9147183fdc10d664551d151922f95e58ab548d8ad2688ac", + wantErr: false, + }, + { + name: "P2PKH2", + args: args{address: "nYrWFiv3zz5MewmN6ZJUpEfLQwz63Ptf1i"}, + want: "76a9143320ff38bc2d44e404cc3f0b36202f3a4897e05088ac", + wantErr: false, + }, + { + name: "P2PKH3", + args: args{address: "nbn2EWCDp2xcb7jTxhcXytLKZuctY8xXiB"}, + want: "76a914533051d74f660325166fd342250f99fd366214ec88ac", + wantErr: false, + }, + { + name: "P2SH1", + args: args{address: "2MyChfh5WfqzDTyFibZq2uSF3WcYFE1G5te"}, + want: "a91441569cc9dbdc08a99d20079bfd12071a2bdbf8e987", + wantErr: false, + }, + { + name: "P2SH2", + args: args{address: "2NCnuCgdAAQHQvSQVw9eJA8UfbffupFLaYm"}, + want: "a914d66804cbba3b9035f2447b5454699f657dd3275087", + wantErr: false, + }, + { + name: "P2SH3", + args: args{address: "2N2ju8ukjDQbJRB4ptNtekDzYNiqSQHARvd"}, + want: "a9146825756d503c3a81659409636d6e6c40755fcdcf87", + wantErr: false, + }, + } + parser := NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := parser.GetAddrDescFromAddress(tt.args.address) + if (err != nil) != tt.wantErr { + t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) + return + } + h := hex.EncodeToString(got) + if !reflect.DeepEqual(h, tt.want) { + t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.want) + } + }) + } +} + func Test_GetAddressesFromAddrDesc_Mainnet(t *testing.T) { type args struct { script string @@ -157,12 +221,107 @@ func Test_GetAddressesFromAddrDesc_Mainnet(t *testing.T) { } } +func Test_GetAddressesFromAddrDesc_Testnet(t *testing.T) { + type args struct { + script string + } + tests := []struct { + name string + args args + want []string + want2 bool + wantErr bool + }{ + { + name: "P2PKH1", + args: args{script: "76a9147183fdc10d664551d151922f95e58ab548d8ad2688ac"}, + want: []string{"neYNjrnowpYrbS4QanPngXBi6MQcX6FsWV"}, + want2: true, + wantErr: false, + }, + { + name: "P2PKH2", + args: args{script: "76a9143320ff38bc2d44e404cc3f0b36202f3a4897e05088ac"}, + want: []string{"nYrWFiv3zz5MewmN6ZJUpEfLQwz63Ptf1i"}, + want2: true, + wantErr: false, + }, + { + name: "P2PKH3", + args: args{script: "76a914533051d74f660325166fd342250f99fd366214ec88ac"}, + want: []string{"nbn2EWCDp2xcb7jTxhcXytLKZuctY8xXiB"}, + want2: true, + wantErr: false, + }, + { + name: "P2SH1", + args: args{script: "a91441569cc9dbdc08a99d20079bfd12071a2bdbf8e987"}, + want: []string{"2MyChfh5WfqzDTyFibZq2uSF3WcYFE1G5te"}, + want2: true, + wantErr: false, + }, + { + name: "P2SH2", + args: args{script: "a914d66804cbba3b9035f2447b5454699f657dd3275087"}, + want: []string{"2NCnuCgdAAQHQvSQVw9eJA8UfbffupFLaYm"}, + want2: true, + wantErr: false, + }, + { + name: "P2SH3", + args: args{script: "a9146825756d503c3a81659409636d6e6c40755fcdcf87"}, + want: []string{"2N2ju8ukjDQbJRB4ptNtekDzYNiqSQHARvd"}, + want2: true, + wantErr: false, + }, + { + name: "OP_RETURN ascii", + args: args{script: "6a0c48656c6c6f20746865726521"}, + want: []string{"OP_RETURN (Hello there!)"}, + want2: false, + wantErr: false, + }, + { + name: "OP_RETURN hex", + args: args{script: "6a072020f1686f6a20"}, + want: []string{"OP_RETURN 2020f1686f6a20"}, + want2: false, + wantErr: false, + }, + } + + parser := NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + b, _ := hex.DecodeString(tt.args.script) + got, got2, err := parser.GetAddressesFromAddrDesc(b) + if (err != nil) != tt.wantErr { + t.Errorf("GetAddressesFromAddrDesc() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want) + } + if !reflect.DeepEqual(got2, tt.want2) { + t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2) + } + }) + } +} + var ( testTx1 bchain.Tx testTxPacked1 = "00030e6d8ba8d7aa2001000000016b3c0c53267964120acf7f7e72217e3f463e52ce622f89659f6a6bb8e69a4d91000000006c493046022100a96454237e3a020994534583e28c04757881374bceac89f933ea9ff00b4db259022100fbb757ff7ea4f02c4e42556b2834c61eba1f1af605db089d836a0614d90a3b46012103cebdde6d1046e285df4f48497bc50dc20a4a258ca5b7308cb0a929c9fdadcd9dffffffff0217e823ca7f0200001976a914eef21768a546590993e313c7f3dfadf6a6efa1e888acaddf4cba010000001976a914e0fee2ea29dd9c6c759d8341bd0da4c4f738cced88ac00000000" testTx2 bchain.Tx testTxPacked2 = "0001193a8ba8d7835601000000016d0211b5656f1b8c2ac002445638e247082090ffc5d5fa7c38b445b84a2c2054000000006b4830450221008856f2f620df278c0fc6a5d5e2d50451c0a65a75aaf7a4a9cbfcac3918b5536802203dc685a784d49e2a95eb72763ad62f02094af78507c57b0a3c3f1d8a60f74db6012102db814cd43df584804fde1949365a6309714e342aef0794dc58385d7e413444cdffffffff0237daa2ee0a4715001976a9149355c01ed20057eac9fe0bbf8b07d87e62fe712d88ac8008389e7e8d03001976a9145b4f2511c94e4fcaa8f8835b2458f8cb6542ca7688ac00000000" + + testTx1_Testnet bchain.Tx + testTxPacked1_Testnet = "0030d40b8c8bc4d552010000000104207e905afaf6facfafe7f63cac0afaab07c36b8aab34d5a6b6402859cfbb3b010000006b483045022100daf5631310f5f8ffa4b6a5e9151e3eefbc797ab67ee52e78621526d32694705b02206c038bd527397d3d6f01cd72011a61b58f5d8b74c2d067274d09a8f70f436d330121031d716677bfa840265c32f02b1ff519e59b2d76fcc1753c59516d6891058e6826ffffffff0256b54009000000001976a914e56f55dbb600c10e1f4f6d5da38eea5e664504cf88ac220d5871030000001976a914e8600a08d053bcd41bc316be574efbba6e126d3088ac00000000" + + testTx2_Testnet bchain.Tx + testTxPacked2_Testnet = "0030d4068c8bc4c770010000000342dd48439e8fe54b161be919bd9a34e887fa88ca38b1200fc26f4edffc3e69950000000069463043021f48a06f76e53665563090919d01dab845039d7ca4050ea00d65dd6542f2e219022024ae5e8806d737c80e83aa969dd549afbf675a94582889b61a630c0a328969870121036a0a9600ef07072a55fdd770fe4c6e4a138ce3c409eb4328f37fb3066d12e598feffffff9883d80ffa7af541808640940b2a7fb69c8ad817ef51049cdf9ee09731460a12010000006a47304402201d6a14b9a2f275a64edfa447e13347e53023bc192de577a0f7fa5309f26d987b0220386ba58a20032395c8c773cc9be405251b9f5d47182f3be5055dbe01ce0894650121038548fe799340b63c4e05e1edee6a36c5a2b82abec4efecc60bef0205969fb9befeffffffd7d88db648983248f58adb62a428baad726e9d6f40a9dfbf8181c7cd013d2dad000000006b483045022100880a8e9c9fdf43ef8f8c2e6817327d6cee89f12e47d77eb6e470a1b2d99b695d0220755911c3ec6d6704c34d8fd447875c9dbaf37c83a2079352be827c558e1b3f3b012103ddd9ebd38c8891b2ee56b17a155367edcc251fc7aca30130523c834d94fd04d2feffffff021ed9092c000000001976a91433bc558a159810fe4353b09b38b270a74a02621f88ac29ebe9a50000000017a914d0e87f2ab081c1c00e3dca9b653d654889ddb7148705d43000" ) func init() { @@ -245,6 +404,102 @@ func init() { }, }, } + + testTx1_Testnet = bchain.Tx{ + Hex: "010000000104207e905afaf6facfafe7f63cac0afaab07c36b8aab34d5a6b6402859cfbb3b010000006b483045022100daf5631310f5f8ffa4b6a5e9151e3eefbc797ab67ee52e78621526d32694705b02206c038bd527397d3d6f01cd72011a61b58f5d8b74c2d067274d09a8f70f436d330121031d716677bfa840265c32f02b1ff519e59b2d76fcc1753c59516d6891058e6826ffffffff0256b54009000000001976a914e56f55dbb600c10e1f4f6d5da38eea5e664504cf88ac220d5871030000001976a914e8600a08d053bcd41bc316be574efbba6e126d3088ac00000000", + Blocktime: 1622709609, + Txid: "43cfbc6db77a8e9aad25913c2298da81421e513e216420b8af2562e744a030c9", + LockTime: 0, + Version: 1, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100daf5631310f5f8ffa4b6a5e9151e3eefbc797ab67ee52e78621526d32694705b02206c038bd527397d3d6f01cd72011a61b58f5d8b74c2d067274d09a8f70f436d330121031d716677bfa840265c32f02b1ff519e59b2d76fcc1753c59516d6891058e6826", + }, + Txid: "3bbbcf592840b6a6d534ab8a6bc307abfa0aac3cf6e7afcffaf6fa5a907e2004", + Vout: 1, + Sequence: 4294967295, + }, + }, + Vout: []bchain.Vout{ + { + ValueSat: *big.NewInt(155235670), + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914e56f55dbb600c10e1f4f6d5da38eea5e664504cf88ac", + Addresses: []string{ + "nq7JNvDtsGxB7wRjqc6DQ7JRzzXtHT2ETD", + }, + }, + }, + { + ValueSat: *big.NewInt(14786497826), + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914e8600a08d053bcd41bc316be574efbba6e126d3088ac", + Addresses: []string{ + "nqNr5hLREhQTjx4DA4TfJfeFR9YjMQXrxn", + }, + }, + }, + }, + } + + testTx2_Testnet = bchain.Tx{ + Hex: "010000000342dd48439e8fe54b161be919bd9a34e887fa88ca38b1200fc26f4edffc3e69950000000069463043021f48a06f76e53665563090919d01dab845039d7ca4050ea00d65dd6542f2e219022024ae5e8806d737c80e83aa969dd549afbf675a94582889b61a630c0a328969870121036a0a9600ef07072a55fdd770fe4c6e4a138ce3c409eb4328f37fb3066d12e598feffffff9883d80ffa7af541808640940b2a7fb69c8ad817ef51049cdf9ee09731460a12010000006a47304402201d6a14b9a2f275a64edfa447e13347e53023bc192de577a0f7fa5309f26d987b0220386ba58a20032395c8c773cc9be405251b9f5d47182f3be5055dbe01ce0894650121038548fe799340b63c4e05e1edee6a36c5a2b82abec4efecc60bef0205969fb9befeffffffd7d88db648983248f58adb62a428baad726e9d6f40a9dfbf8181c7cd013d2dad000000006b483045022100880a8e9c9fdf43ef8f8c2e6817327d6cee89f12e47d77eb6e470a1b2d99b695d0220755911c3ec6d6704c34d8fd447875c9dbaf37c83a2079352be827c558e1b3f3b012103ddd9ebd38c8891b2ee56b17a155367edcc251fc7aca30130523c834d94fd04d2feffffff021ed9092c000000001976a91433bc558a159810fe4353b09b38b270a74a02621f88ac29ebe9a50000000017a914d0e87f2ab081c1c00e3dca9b653d654889ddb7148705d43000", + Blocktime: 1622708728, + Txid: "91e2f3a9dde1e2da53f29c73033084b3d1a3b0c0ba6737d6418cfa9cad62be3c", + LockTime: 3200005, + Version: 1, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "463043021f48a06f76e53665563090919d01dab845039d7ca4050ea00d65dd6542f2e219022024ae5e8806d737c80e83aa969dd549afbf675a94582889b61a630c0a328969870121036a0a9600ef07072a55fdd770fe4c6e4a138ce3c409eb4328f37fb3066d12e598", + }, + Txid: "95693efcdf4e6fc20f20b138ca88fa87e8349abd19e91b164be58f9e4348dd42", + Vout: 0, + Sequence: 4294967294, // Locktime is enabled for this transaction; see BIP-125 + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "47304402201d6a14b9a2f275a64edfa447e13347e53023bc192de577a0f7fa5309f26d987b0220386ba58a20032395c8c773cc9be405251b9f5d47182f3be5055dbe01ce0894650121038548fe799340b63c4e05e1edee6a36c5a2b82abec4efecc60bef0205969fb9be", + }, + Txid: "120a463197e09edf9c0451ef17d88a9cb67f2a0b9440868041f57afa0fd88398", + Vout: 1, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "483045022100880a8e9c9fdf43ef8f8c2e6817327d6cee89f12e47d77eb6e470a1b2d99b695d0220755911c3ec6d6704c34d8fd447875c9dbaf37c83a2079352be827c558e1b3f3b012103ddd9ebd38c8891b2ee56b17a155367edcc251fc7aca30130523c834d94fd04d2", + }, + Txid: "ad2d3d01cdc78181bfdfa9406f9d6e72adba28a462db8af548329848b68dd8d7", + Vout: 0, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + ValueSat: *big.NewInt(738842910), + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a91433bc558a159810fe4353b09b38b270a74a02621f88ac", + Addresses: []string{ + "nYuiLjsDCVCBwZ3XhNv3qiiDiwmtQRLNhY", + }, + }, + }, + { + ValueSat: *big.NewInt(2783570729), + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "a914d0e87f2ab081c1c00e3dca9b653d654889ddb71487", + Addresses: []string{ + "2NCHq4LmqvjB9mqrHMWNUjfDs2FdsmJah6b", + }, + }, + }, + }, + } } func Test_PackTx(t *testing.T) { @@ -298,6 +553,57 @@ func Test_PackTx(t *testing.T) { } } +func Test_PackTx_Testnet(t *testing.T) { + type args struct { + tx bchain.Tx + height uint32 + blockTime int64 + parser *DogecoinParser + } + tests := []struct { + name string + args args + want string + wantErr bool + }{ + { + name: "dogecoin-testnet-1", + args: args{ + tx: testTx1_Testnet, + height: 3200011, + blockTime: 1622709609, + parser: NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}), + }, + want: testTxPacked1_Testnet, + wantErr: false, + }, + { + name: "dogecoin-testnet-2", + args: args{ + tx: testTx2_Testnet, + height: 3200006, + blockTime: 1622708728, + parser: NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}), + }, + want: testTxPacked2_Testnet, + 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) + if !reflect.DeepEqual(h, tt.want) { + t.Errorf("packTx() = %v, want %v", h, tt.want) + } + }) + } +} + func Test_UnpackTx(t *testing.T) { type args struct { packedTx string @@ -349,6 +655,57 @@ func Test_UnpackTx(t *testing.T) { } } +func Test_UnpackTx_Testnet(t *testing.T) { + type args struct { + packedTx string + parser *DogecoinParser + } + tests := []struct { + name string + args args + want *bchain.Tx + want1 uint32 + wantErr bool + }{ + { + name: "dogecoin-testnet-1", + args: args{ + packedTx: testTxPacked1_Testnet, + parser: NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}), + }, + want: &testTx1_Testnet, + want1: 3200011, + wantErr: false, + }, + { + name: "dogecoin-testnet-2", + args: args{ + packedTx: testTxPacked2_Testnet, + parser: NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}), + }, + want: &testTx2_Testnet, + want1: 3200006, + wantErr: false, + }, + } + for _, tt := range tests { + 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) + } + }) + } +} + type testBlock struct { size int time int64 @@ -507,3 +864,96 @@ func TestParseBlock(t *testing.T) { } } } + +var testParseBlockTxs_Testnet = map[int]testBlock{ + // block without auxpow + 99999: { + size: 789, + time: 1401525639, + txs: []string{ + "a4006895a14f5eb8796c784e6845d6aaea57b87325ccd066e900dc53aa8bf6a4", + "63c8d9dff87bf56804748e33c6c69f66d4930c4403b01cfd9a9d520fb91e4e17", + "3fa993ca67bcd2b2dec15c61b7fc2947e268ebe71bcf77dc00236c99c15eaa72", + }, + }, + // 1st block with auxpow – see https://github.com/dogecoin/dogecoin/releases/tag/v1.8.0-beta-1 + 158100: { + size: 227, + time: 1407217902, + txs: []string{ + "f09d8c02cd8a3da1af2a9722860fc58c593ffb3b6c51ffe09f978c89744561a7", + }, + }, + // random block with auxpow + 1234580: { + size: 850, + time: 1521801579, + txs: []string{ + "b16bd42a4718fa8db2f88fd7f5d268582af1b9cfd378600ba4e615708d7550cf", + "2786caddf5c090be0554fe39511299b5daf5644024e80643c70c6573465252f1", + "423f4c0efa75a521a29c21100b90d4f6bdbafeb0778657154cedb638b9c3b439", + }, + }, + // recent block + 3274642: { + size: 847, + time: 1627931191, + txs: []string{ + "aefc849cd9522e6d93a0ef4c2647dec96386756f02238bb05507407a589fb9a9", + "877a2b2bf1f5b52e4893866aff3d573c49e22666662a510b0ff313bdf10e76b3", + "8c9130974b68a81c652f3b43c6d352b892d920fe498d1f2fb566c1155169f443", + "7fee19b12f19f426bc3e90b36d0149917695bcc4c57a07f0efebbdd30820a079", + }, + }, +} + +func helperLoadBlock_Testnet(t *testing.T, height int) []byte { + name := fmt.Sprintf("block_dump_testnet.%d", height) + path := filepath.Join("testdata", name) + + d, err := ioutil.ReadFile(path) + if err != nil { + t.Fatal(err) + } + + d = bytes.TrimSpace(d) + + b := make([]byte, hex.DecodedLen(len(d))) + _, err = hex.Decode(b, d) + if err != nil { + t.Fatal(err) + } + + return b +} + +func TestParseBlock_Testnet(t *testing.T) { + p := NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}) + + for height, tb := range testParseBlockTxs_Testnet { + b := helperLoadBlock_Testnet(t, height) + + blk, err := p.ParseBlock(b) + if err != nil { + t.Fatal(err) + } + + if blk.Size != tb.size { + t.Errorf("ParseBlock() block size: got %d, want %d", blk.Size, tb.size) + } + + if blk.Time != tb.time { + t.Errorf("ParseBlock() block time: got %d, want %d", blk.Time, tb.time) + } + + if len(blk.Txs) != len(tb.txs) { + t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(tb.txs)) + } + + for ti, tx := range tb.txs { + if blk.Txs[ti].Txid != tx { + t.Errorf("ParseBlock() transaction %d: got %s, want %s", ti, blk.Txs[ti].Txid, tx) + } + } + } +} diff --git a/bchain/coins/dogecoin/testdata/block_dump_testnet.1234580 b/bchain/coins/dogecoin/testdata/block_dump_testnet.1234580 new file mode 100644 index 00000000..ce050ec0 --- /dev/null +++ b/bchain/coins/dogecoin/testdata/block_dump_testnet.1234580 @@ -0,0 +1 @@ +03006200560b52800fe10f45142aee16377dc241cb76b447bafac9306ef6cab77ca1cc02568951efc02537bf5ba1eae8fe2f95af5b2248bf608f4e0b3582a9f8bd6346716bd9b45affff0f1e53c70e000301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff060394d6120103ffffffff0100d290e0e8000000232102fa293664fc4065b29664cafbf9c8639e32581a2385d29e3faf469eb7052ba47eac000000000100000001183be0d233276119160589c28feec31aa83cc2d933b96dc89f5e92669f51ff2901000000da00473044022036a000c0eea2e8c8682fa16bab07d523b4e26645635be54d328caf58e4b60d70022022b5f609e4593f86d244d76bda4f94ced3d32afeb7e2eed12c628e8c6f2c191b01483045022100e71355cdf6b5c22faedbc523bc6908e0fb689ca74ff72268bdadfdd210b58f2302204737733c92a54239ddb95ba1841771d70685a86d9f4cbe305d0050a2efdaf0d40147522103e3b553f7042c2f1d6af0182228135af1f817fb8e95f69f44093b0f0d216113a6210204d99f36750fe059e4b7128ba96482711b6c643ddcc25b15110325d5b28069eb52aeffffffff0200c2eb0b000000001976a9144d7c60f7ef28b638177d0ecc4909b69541573b4788ac006cedc78850000017a914ca07e851b2779d99dc7cd0345f70748e80c3aed8870000000001000000016f2ff9946d169b5bf70b88b6b31b4f49ef170f727f49d9b608d962269039bfe700000000da00483045022100d658cf8d45719462c3e33c996ada2bfcb9b7269987d2058c0e8aed7ef5a6721f02200ec61714951e4893aac6dd8819261cc701eacd296c61559c48951227792d2e730147304402203c0d99432c0637f614f1505bd9d996000afcc4df013286e24c6923015fa9e49e022031913f15620d7d992897882a856699be3e66b04c90b3dde7d33ccdc7b001f5d00147522103858c48d6fd45ddfed1dc5ce1b47e0eec36a87012a0865ac0fdca7a6a149184592102d8ad02f257f4cf3b68609babc56e9cd6cdde7f5e415ab1e8c839e1e0378a608b52aeffffffff020065cd1d0000000017a9145cf863be1eb54e7501235d16c4fbe378e38a3c75870084d7170000000017a9142587c36cfa4558cce983c4981e8da1357cac51608700000000 \ No newline at end of file diff --git a/bchain/coins/dogecoin/testdata/block_dump_testnet.158100 b/bchain/coins/dogecoin/testdata/block_dump_testnet.158100 new file mode 100644 index 00000000..f625973a --- /dev/null +++ b/bchain/coins/dogecoin/testdata/block_dump_testnet.158100 @@ -0,0 +1 @@ +02006200e93bd6199a1ebfe82f89f9da53dc97c7978c3ba7f06603e9866c94b69d746756a7614574898c979fe0ff516c3bfb3f598cc50f8622972aafa13d8acd028c9df0ee70e053b2cf051e0013bc5f0102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff3d039469022cfabe6d6d06a27e6dd0e80eb6cf85f715521e481ad071f1e6d38157f32e68a6ea74ef15d20100000000000000010000000000000000000000000000000100901ec4bc1600001976a914dac6a0f3388893ba8bbc8427dbcabec174beb11488ac00000000 \ No newline at end of file diff --git a/bchain/coins/dogecoin/testdata/block_dump_testnet.3274642 b/bchain/coins/dogecoin/testdata/block_dump_testnet.3274642 new file mode 100644 index 00000000..76e109d5 --- /dev/null +++ b/bchain/coins/dogecoin/testdata/block_dump_testnet.3274642 @@ -0,0 +1 @@ +04006200869dca31955ea74aa30247ad00005e0cbd369e005f01fd49bfb6a644fc08ca955f2f13db46ecd9bd845de66989b78ae6814f14a8260a084f35df137d8b2faf1237420861ffff0f1e000143690401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff040392f731ffffffff0100b386e6e80000001976a9141551b84892e83048b77f814e9f0a84f42f775aad88ac000000000100000001c2cb22ad1ba98eec3ad4505eb0156fc07e9c56e8c8d414b3dfbfb345c1ea96a6010000006b483045022100a0f412c599482edc6408f2a0e6b0980962bdf2a2cd77e9423d3c82c1ce59de0802203c7465d11f8e91f354753b76abe13dd577f61663414f51eedb102e6529043c4e0121034ca2b96ac17517cb9267e13aaf41396f1a9e31395a18ed18a61e77dda6e11c59feffffff0200e40b54020000001976a914409657eb218741347b0801447c18c7ce489194e188ac00729ab8da0000001976a914d22a150165ef64631021c90706fd4dfd36567cdd88ac91f73100010000000156dc28fd53369a67adf07ab1d3dc5ecbde6c17ffa698a40954008338ac0b8900010000006a47304402206106636d75879f48376cab6946512ff9c451295680bc1a26c711be1c1f75dda0022059b669c1034021395cec946bd5856c43e9a2c23092e3ca1d67e7d71845ad8d2801210261074181a79ab56af65b4257486d0c71d2b3cab92c70b63d9c502a4df5295508feffffff0200497556a90000001976a914205ddbfd8710a4a452b8cf34e4d4710b6c05e66b88ac00e40b54020000001976a914409657eb218741347b0801447c18c7ce489194e188ac37f73100010000000109c798a31c52f748912318a3e0ccc445e0f9d1901f6ad46533f22f7df92d9a6a010000006b4830450221008c0873e5e4ec79e2a3939a090235e224fa334547af08ef1a3c26ff27a092afcf02204c408c77fb057ccfe78a2223393c6bd31f49d1cce6387000f3d03e64d6b333240121020715b41d4b010ff3fcb1d5190ef65c583fdd39274b7cb9bfa80bbcc8a0c5b4bcffffffff020065cd1d000000001976a914adb327a539d42a245920819c44e2da1638ecd6cd88ac00180d8f000000001976a91477686c9ba39bf1c557f7ea2462d6f2fd6cb1fa8888ac00000000 \ No newline at end of file diff --git a/bchain/coins/dogecoin/testdata/block_dump_testnet.99999 b/bchain/coins/dogecoin/testdata/block_dump_testnet.99999 new file mode 100644 index 00000000..0f5f0a05 --- /dev/null +++ b/bchain/coins/dogecoin/testdata/block_dump_testnet.99999 @@ -0,0 +1 @@ +02000000ef0109d480fd25f6d1e92d3557cd00e648ed6542d0a95798d114626633a78538da163af2d78b5e7d2f3462bfb1872eb3f54b3fbaa5a3afc9f974a49ca0f9338e8795895387880d1e0004563e0301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0b039f8601062f503253482fffffffff04510422b74c1500001976a9141baddeaea6dbdf929281a6c154f677858947e9ef88ac40c2e6301c3a00001976a914a49c481ffaada228e66d956db84dd59bc1a4431d88ac6fdbfb31cc000000434104ffd03de44a6e11b9917f3a29f9443283d9871c9d743ef30d5eddcd37094b64d1b3d8090496b53256786bf5c82932ec23c3b74d9f05a6f95a8b5529352656664bac00000000000000002a6a28676964ca2e3dc86c44ea5d375982a07b1c79c0316f648bbf9c6ae9e6657b14890000000000000000000000000100000001642932e2b3dad0daa6df49bfa968f49c08879b87fea4d13669f7564bbe153d94010000006b483045022100c893ee249241ae4ca3654ed9d2d2be8d3f12804fc7436767b208b37b22d1b5590220772e8b1568bb5196792047cc0666adae16e97524f67f4026fd27df339e0e6ec401210387690b37eecf988835a0a9c992943f499041b06cd46c51ff32a3c9b766cdbee2ffffffff0200e87648170000001976a91432fa715655094175dd3b9b83ed7aa731f0df6d8288ac009c39fb7c1803001976a914eb980913d844960b1c57cb923fc6f7d82b62887e88ac000000000100000001174e1eb90f529d9afd1cb003440c93d4669fc6c6338e740468f57bf8dfd9c863010000006a47304402201551a536e9ae05912d7651dab0dfa3a275d14ba6fe611421c4ddc35f762d3db80220221d2e1366907b9f68861a30b67b0c620ce80e178b8a8c86fe649d7e29db56d8012103055a80e0950eefc9792b152fb82643b954450123078d871d0be711616c64c96affffffff0200e87648170000001976a91432fa715655094175dd3b9b83ed7aa731f0df6d8288ac00b4c2b2651803001976a91454ac4121c7d53bdf450efe0e240fff3f21e5378e88ac00000000 \ No newline at end of file diff --git a/configs/coins/dogecoin_testnet.json b/configs/coins/dogecoin_testnet.json new file mode 100644 index 00000000..69158d82 --- /dev/null +++ b/configs/coins/dogecoin_testnet.json @@ -0,0 +1,70 @@ +{ + "coin": { + "name": "Dogecoin Testnet", + "shortcut": "DOGETEST", + "label": "Dogecoin Testnet", + "alias": "dogecoin_testnet" + }, + "ports": { + "backend_rpc": 18038, + "backend_message_queue": 48338, + "blockbook_internal": 19038, + "blockbook_public": 19138 + }, + "ipc": { + "rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}", + "rpc_user": "rpc", + "rpc_pass": "rpcp", + "rpc_timeout": 25, + "message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}" + }, + "backend": { + "package_name": "backend-dogecoin-testnet", + "package_revision": "satoshilabs-1", + "system_user": "dogecoin", + "version": "1.14.3", + "binary_url": "https://github.com/dogecoin/dogecoin/releases/download/v1.14.3/dogecoin-1.14.3-x86_64-linux-gnu.tar.gz", + "verification_type": "sha256", + "verification_source": "a95cc29ac3c19a450e9083cc3ac24b6f61763d3ed1563bfc3ea9afbf0a2804fd", + "extract_command": "tar -C backend --strip 1 -xf", + "exclude_files": [ + "bin/dogecoin-qt" + ], + "exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/dogecoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid -rest", + "logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/*.log", + "postinst_script_template": "", + "service_type": "forking", + "service_additional_params_template": "", + "protect_memory": false, + "mainnet": false, + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", + "additional_params": { + "discover": 0, + "rpcthreads": 16, + "upnp": 0, + "whitelist": "127.0.0.1" + } + }, + "blockbook": { + "package_name": "blockbook-dogecoin-testnet", + "system_user": "blockbook-dogecoin", + "internal_binding_template": ":{{.Ports.BlockbookInternal}}", + "public_binding_template": ":{{.Ports.BlockbookPublic}}", + "explorer_url": "", + "additional_params": "-resyncindexperiod=30011 -resyncmempoolperiod=2011", + "block_chain": { + "parse": true, + "mempool_workers": 8, + "mempool_sub_workers": 2, + "block_addresses_to_keep": 300, + "xpub_magic": 70617039, + "slip44": 1, + "additional_params": {} + } + }, + "meta": { + "package_maintainer": "IT Admin", + "package_maintainer_email": "it@satoshilabs.com" + } +} diff --git a/docs/ports.md b/docs/ports.md index ce6a0453..802b162d 100644 --- a/docs/ports.md +++ b/docs/ports.md @@ -55,6 +55,7 @@ | Litecoin Testnet | 19034 | 19134 | 18034 | 48334 | | Bitcoin Gold Testnet | 19035 | 19135 | 18035 | 48335 | | Ethereum Ropsten | 19036 | 19136 | 18036 | 48336 p2p | +| Dogecoin Testnet | 19038 | 19138 | 18038 | 48338 | Vertcoin Testnet | 19040 | 19140 | 18040 | 48340 | | Monacoin Testnet | 19041 | 19141 | 18041 | 48341 | | DigiByte Testnet | 19042 | 19142 | 18042 | 48342 | diff --git a/tests/rpc/testdata/dogecoin_testnet.json b/tests/rpc/testdata/dogecoin_testnet.json new file mode 100644 index 00000000..d5e02372 --- /dev/null +++ b/tests/rpc/testdata/dogecoin_testnet.json @@ -0,0 +1,59 @@ +{ + "blockHeight": 1000026, + "blockHash": "1d817bb9494aae8937c7b2ee7328eed4518b91cfd5bb4308b14516530ea8c30b", + "blockTime": 1495656473, + "blockTxs": [ + "6a86882d6732cef2c2b87286cdfea028f57f8e46a444bc0745e4b7c758b8a987", + "0c51e442d35946bf0e10ef321c5b2492bbe2c5e218a7e6fafaceb09496c3965f", + "909c00caac5cb72df3bc3c198d6bb0d897f102834ea8621a6329bf5983fc22c5", + "05d64a16beaf6604281efa28ee5449df8a58ad5a18528440ee89b9c28d062388", + "9f6c0c98b3d61454e40d26746531e8278d55c0e19628bdc2829ceb3655719a39", + "51d503e96dd4292a168f9b3958106ed5122f3d28aac279cfc14f05b720569a74", + "135af3d89384d2e97aada23fcb53995642ded2afc52347cea15bbec1f1c2e39c", + "c88637b70b11f3d7750bdc7cc30e446c0e7b4c595891a103083e3ff0da2a1f4c" + ], + "txDetails": { + "0c51e442d35946bf0e10ef321c5b2492bbe2c5e218a7e6fafaceb09496c3965f": { + "hex": "0100000002f2abad3753e2e52be2de82f9c2b7e899237eee901f66c5dec22fbc16ef1cde2d010000006b483045022100fbee8b46d376d7cad5d6240a56cc9fc58a9bf6fba812abb3a6006fde1899bb750220386f11ff554966362a78a75cd56bf1708d2156f490384893300307cffefdad51012102991a76081c2513ba269f98c84ffa3d94d1a923858b4fe27f888e8cc8640fef03fffffffffdf846e9f59b30ebbd61fcdba290871611af468a61d663c0d89ad33cadae0acc010000006b483045022100bc9f869763ce4b16cb819a752f29a40e44b52230304a85550010f22b6b9a1aeb022032af127c7133257897c9c999a36bd1751870fca970e92c15163addd2679eb4d0012102991a76081c2513ba269f98c84ffa3d94d1a923858b4fe27f888e8cc8640fef03ffffffff0200d6117e030000001976a91477d527b839af5b9d2126de7df15908613d68b31188ac00275c0b120000001976a914a4cbacf5e85425abfaf2338b068351236e69807f88ac00000000", + "txid": "0c51e442d35946bf0e10ef321c5b2492bbe2c5e218a7e6fafaceb09496c3965f", + "blocktime": 1495656473, + "time": 1495656473, + "locktime": 0, + "version": 1, + "vin": [ + { + "txid": "2dde1cef16bc2fc2dec5661f90ee7e2399e8b7c2f982dee22be5e25337adabf2", + "vout": 1, + "scriptSig": { + "hex": "483045022100fbee8b46d376d7cad5d6240a56cc9fc58a9bf6fba812abb3a6006fde1899bb750220386f11ff554966362a78a75cd56bf1708d2156f490384893300307cffefdad51012102991a76081c2513ba269f98c84ffa3d94d1a923858b4fe27f888e8cc8640fef03" + }, + "sequence": 4294967295 + }, + { + "txid": "cc0aaead3cd39ad8c063d6618a46af11168790a2dbfc61bdeb309bf5e946f8fd", + "vout": 1, + "scriptSig": { + "hex": "483045022100bc9f869763ce4b16cb819a752f29a40e44b52230304a85550010f22b6b9a1aeb022032af127c7133257897c9c999a36bd1751870fca970e92c15163addd2679eb4d0012102991a76081c2513ba269f98c84ffa3d94d1a923858b4fe27f888e8cc8640fef03" + }, + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 150.00000000, + "n": 0, + "scriptPubKey": { + "hex": "76a91477d527b839af5b9d2126de7df15908613d68b31188ac" + } + }, + { + "value": 775.00000000, + "n": 1, + "scriptPubKey": { + "hex": "76a914a4cbacf5e85425abfaf2338b068351236e69807f88ac" + } + } + ] + } + } +} \ No newline at end of file diff --git a/tests/sync/testdata/dogecoin_testnet.json b/tests/sync/testdata/dogecoin_testnet.json new file mode 100644 index 00000000..3f7db20d --- /dev/null +++ b/tests/sync/testdata/dogecoin_testnet.json @@ -0,0 +1,155 @@ +{ + "connectBlocks": { + "syncRanges": [ + {"lower": 2101303, "upper": 2101345} + ], + "blocks": { + "2101317": { + "height": 2101317, + "hash": "debcad94a94ec0a18088ce418207c3f0169aeb278db5d5e7fe1acc0a854169be", + "noTxs": 3, + "txDetails": [ + { + "hex": "0100000001ccc918717419ea3c038f5e1b4c1eb20ede84d5157acb394b89d15bd1922f51e201000000da004730440220652ffef2be035bb7365f30f16450e64fdcba0f18c41fcd0f36e74f5c50d30c0902200d1bf9a4ab1e16d16e47271f10a918461c005ab5793a2b7eb67e1f14cda20151014830450221008c89d5526a3dbab2fd506fb88c3de5e1d0e94d57c408e4f2c39c35cba4c27a0902205bd541dda1703ba2f239ef092e3b59f1092acc71c5135834f9d49b8d030d0f480147522103abf01d993487a683db0a788298e176624b8530c9481b8f3f17eaec015a6e8c882103ec7f0dd153f1fa7f2fd5d6b331796298ebd0a657950c70cbb58eac34c7b475f352aeffffffff0200743ba40b00000017a914f2c3c9e719f5c996ca59798309b3677c5385070d8700f0a24c795a010017a91401d4df05a673fc46698c4d2effdac931d76002528700000000", + "txid": "14e085da1e44a7885fde414a6efb2f92b856625ca8f874ac11e09c776304a886", + "version": 1, + "vin": [ + { + "txid": "e2512f92d15bd1894b39cb7a15d584de0eb21e4c1b5e8f033cea19747118c9cc", + "vout": 1, + "scriptSig": { + "hex": "004730440220652ffef2be035bb7365f30f16450e64fdcba0f18c41fcd0f36e74f5c50d30c0902200d1bf9a4ab1e16d16e47271f10a918461c005ab5793a2b7eb67e1f14cda20151014830450221008c89d5526a3dbab2fd506fb88c3de5e1d0e94d57c408e4f2c39c35cba4c27a0902205bd541dda1703ba2f239ef092e3b59f1092acc71c5135834f9d49b8d030d0f480147522103abf01d993487a683db0a788298e176624b8530c9481b8f3f17eaec015a6e8c882103ec7f0dd153f1fa7f2fd5d6b331796298ebd0a657950c70cbb58eac34c7b475f352ae" + }, + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 500.00000000, + "n": 0, + "scriptPubKey": { + "hex": "a914f2c3c9e719f5c996ca59798309b3677c5385070d87" + } + }, + { + "value": 3809520.00000000, + "n": 1, + "scriptPubKey": { + "hex": "a91401d4df05a673fc46698c4d2effdac931d760025287" + } + } + ], + "time": 1576249514, + "blocktime": 1576249514 + }, + { + "hex": "01000000018e7275b4aa7ac76609bfb0259837fab9317f691045ec6ca6218363b827690eca01000000db0048304502210096021cc5d6ee479887d2eacf16ebb2867bf666a9c9fbc3dd92b1604e0d0ddc51022014e68ad785126dead79421f8027bfe2fc6ccc70a3cb2159fd071170ff4a0a2b101483045022100e0e68deca4b83ec36898e89b35d6cc17e24f2afee7f821f294ee7f02b226fd9202207ac48ecb29433023d2d4e2f93f1e844e1cb31047317490cfd4e886d07ce4925c0147522103abf01d993487a683db0a788298e176624b8530c9481b8f3f17eaec015a6e8c882103ec7f0dd153f1fa7f2fd5d6b331796298ebd0a657950c70cbb58eac34c7b475f352aeffffffff0200743ba40b00000017a914a33f3c34fa6cf20d5c69bff84ce516adbe85c6708700d950f219f6000017a91401d4df05a673fc46698c4d2effdac931d76002528700000000", + "txid": "e0432574b3ec052a0622639c781bf5eee5aa7372361e329dd6bc434db1b03db7", + "version": 1, + "vin": [ + { + "txid": "ca0e6927b8638321a66cec4510697f31b9fa379825b0bf0966c77aaab475728e", + "vout": 1, + "scriptSig": { + "hex": "0048304502210096021cc5d6ee479887d2eacf16ebb2867bf666a9c9fbc3dd92b1604e0d0ddc51022014e68ad785126dead79421f8027bfe2fc6ccc70a3cb2159fd071170ff4a0a2b101483045022100e0e68deca4b83ec36898e89b35d6cc17e24f2afee7f821f294ee7f02b226fd9202207ac48ecb29433023d2d4e2f93f1e844e1cb31047317490cfd4e886d07ce4925c0147522103abf01d993487a683db0a788298e176624b8530c9481b8f3f17eaec015a6e8c882103ec7f0dd153f1fa7f2fd5d6b331796298ebd0a657950c70cbb58eac34c7b475f352ae" + }, + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 500.00000000, + "n": 0, + "scriptPubKey": { + "hex": "a914a33f3c34fa6cf20d5c69bff84ce516adbe85c67087" + } + }, + { + "value": 2705913.00000000, + "n": 1, + "scriptPubKey": { + "hex": "a91401d4df05a673fc46698c4d2effdac931d760025287" + } + } + ], + "time": 1576249514, + "blocktime": 1576249514 + } + ] + }, + "2101339": { + "height": 2101339, + "hash": "da25c3650e1feacfabbc4b6a65d7ba70a3f354b763506f1348d798f51cbe5b35", + "noTxs": 7, + "txDetails": [ + { + "hex": "01000000018ab51e1ed1f2671fa03041d32911f70eabe7e5b36289dbaecbb13cdd6376022c01000000d9004730440220593c40ce566ca2137eea75f2b3c9aedb79671b75b65a6cc19002ff63f4c568fe0220163ff99d3baf64efaaa8fa48f6ee9cd488c9c9931a70e87ab5eca107f115d9f4014730440220784a49214b47a75056351f676467f6dab5f06f84259f7fc7e1bc9efeab55eaf202204d53d292bdc1c0db7567b0056ec715a0f24ebe0f7ba95fdb8e5591d8a3da73820147522103abf01d993487a683db0a788298e176624b8530c9481b8f3f17eaec015a6e8c882103ec7f0dd153f1fa7f2fd5d6b331796298ebd0a657950c70cbb58eac34c7b475f352aeffffffff0200743ba40b00000017a9144051325c50c4e2c3e867342b2639204d844399d8870081f16957a2010017a91401d4df05a673fc46698c4d2effdac931d76002528700000000", + "txid": "bfe99f76c54ce18b56220670c7c42ded599f5043f65b65e6b2066867b29ef19c", + "version": 1, + "vin": [ + { + "txid": "2c027663dd3cb1cbaedb8962b3e5e7ab0ef71129d34130a01f67f2d11e1eb58a", + "vout": 1, + "scriptSig": { + "hex": "004730440220593c40ce566ca2137eea75f2b3c9aedb79671b75b65a6cc19002ff63f4c568fe0220163ff99d3baf64efaaa8fa48f6ee9cd488c9c9931a70e87ab5eca107f115d9f4014730440220784a49214b47a75056351f676467f6dab5f06f84259f7fc7e1bc9efeab55eaf202204d53d292bdc1c0db7567b0056ec715a0f24ebe0f7ba95fdb8e5591d8a3da73820147522103abf01d993487a683db0a788298e176624b8530c9481b8f3f17eaec015a6e8c882103ec7f0dd153f1fa7f2fd5d6b331796298ebd0a657950c70cbb58eac34c7b475f352ae" + }, + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 500.00000000, + "n": 0, + "scriptPubKey": { + "hex": "a9144051325c50c4e2c3e867342b2639204d844399d887" + } + }, + { + "value": 4599713.00000000, + "n": 1, + "scriptPubKey": { + "hex": "a91401d4df05a673fc46698c4d2effdac931d760025287" + } + } + ], + "time": 1576254096, + "blocktime": 1576254096 + }, + { + "hex": "0100000001c536d697327ee834f55bf6347ee73d6413b6126ec54ae69700caf4be6723192d01000000db00483045022100bf6ecb6ba5586adc0fcc95e2205d75c8965ebb17d892d5a1459e1f73aa1c5efb022023988cffc13d4942f44ac4f82dfc79547ce312b2d6dda62b2f6e875465b7faeb01483045022100d3d67d93d7e2c3224036f09ad2f9a07ef12d65a8d8542f3d79249ebbc5f068a80220154638ade598e1929ed2c38bcab477805ea01c9582dbf1f25ec23f268013b11a0147522103abf01d993487a683db0a788298e176624b8530c9481b8f3f17eaec015a6e8c882103ec7f0dd153f1fa7f2fd5d6b331796298ebd0a657950c70cbb58eac34c7b475f352aeffffffff0200743ba40b00000017a914497d17688b2a45fa496db089ed6c8978ba809dd98700833f59ff3d010017a91401d4df05a673fc46698c4d2effdac931d76002528700000000", + "txid": "71a93721f624f14e957fb9de84d2c3bb49490d2d2f0b33b00350c7011e0f3068", + "version": 1, + "vin": [ + { + "txid": "2d192367bef4ca0097e64ac56e12b613643de77e34f65bf534e87e3297d636c5", + "vout": 1, + "scriptSig": { + "hex": "00483045022100bf6ecb6ba5586adc0fcc95e2205d75c8965ebb17d892d5a1459e1f73aa1c5efb022023988cffc13d4942f44ac4f82dfc79547ce312b2d6dda62b2f6e875465b7faeb01483045022100d3d67d93d7e2c3224036f09ad2f9a07ef12d65a8d8542f3d79249ebbc5f068a80220154638ade598e1929ed2c38bcab477805ea01c9582dbf1f25ec23f268013b11a0147522103abf01d993487a683db0a788298e176624b8530c9481b8f3f17eaec015a6e8c882103ec7f0dd153f1fa7f2fd5d6b331796298ebd0a657950c70cbb58eac34c7b475f352ae" + }, + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 500.00000000, + "n": 0, + "scriptPubKey": { + "hex": "a914497d17688b2a45fa496db089ed6c8978ba809dd987" + } + }, + { + "value": 3496419.00000000, + "n": 1, + "scriptPubKey": { + "hex": "a91401d4df05a673fc46698c4d2effdac931d760025287" + } + } + ], + "time": 1576254096, + "blocktime": 1576254096 + } + ] + } + } + } +} diff --git a/tests/tests.json b/tests/tests.json index d5b83cf6..564837b0 100644 --- a/tests/tests.json +++ b/tests/tests.json @@ -85,6 +85,10 @@ "rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync"], "sync": ["ConnectBlocksParallel", "ConnectBlocks"] }, + "dogecoin_testnet": { + "rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync"], + "sync": ["ConnectBlocksParallel", "ConnectBlocks"] + }, "ethereum_testnet_ropsten": { "rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"]