From 9f4b74e68ddf766c35e9c17e1150d5bdac2a77fd Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Wed, 20 Jun 2018 19:05:42 +0200 Subject: [PATCH 01/10] Fixed ssh call in tunnel script --- contrib/scripts/start-backend-tunnels.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/scripts/start-backend-tunnels.sh b/contrib/scripts/start-backend-tunnels.sh index 913a8e81..d546a950 100755 --- a/contrib/scripts/start-backend-tunnels.sh +++ b/contrib/scripts/start-backend-tunnels.sh @@ -15,7 +15,7 @@ testnet_ports=$(gawk 'match($0, /"rpcURL":\s+"(http|ws):\/\/[^:]+:([0-9]+)"/, a) for port in $testnet_ports do - ssh -nNT -L $port:localhost:$port blockbook-dev.corp & + ssh -nNT -L $port:localhost:$port $host & pid=$! echo "Started tunnel to ${host}:${port} (pid: ${pid})" done From 9b69b9254808b7b664b7bdb0a53eaaacc75b4a75 Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Wed, 20 Jun 2018 19:06:35 +0200 Subject: [PATCH 02/10] Exit tunnel script if some of children dies --- contrib/scripts/start-backend-tunnels.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/contrib/scripts/start-backend-tunnels.sh b/contrib/scripts/start-backend-tunnels.sh index d546a950..3f77437e 100755 --- a/contrib/scripts/start-backend-tunnels.sh +++ b/contrib/scripts/start-backend-tunnels.sh @@ -25,4 +25,10 @@ at_exit() { } trap at_exit EXIT -sleep inf + +wait -n +code=$? + +if [ $code != 0 ]; then + exit $code +fi From cc29a994015bd2ebec27274db1e96d6fd3104712 Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Wed, 20 Jun 2018 19:08:30 +0200 Subject: [PATCH 03/10] Added second transaction to Ethereum RPC test --- .../tests/rpc/testdata/Ethereum_Testnet.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/bchain/tests/rpc/testdata/Ethereum_Testnet.json b/bchain/tests/rpc/testdata/Ethereum_Testnet.json index cef9511f..82bbf3c7 100644 --- a/bchain/tests/rpc/testdata/Ethereum_Testnet.json +++ b/bchain/tests/rpc/testdata/Ethereum_Testnet.json @@ -33,6 +33,24 @@ } } ] + }, + "0x17ee235fc0359155b25419e0e4c65d9c500df6e71e8288d6ef020d04cc2f2cb3": { + "hex": "7b226e6f6e6365223a223078346566222c226761735072696365223a223078626134336237343030222c22676173223a2230783936653838222c22746f223a22307864303534323939633438326164356362333961336661383734373235663965326132306433343963222c2276616c7565223a22307830222c22696e707574223a2230783165626366613630303030303030303030303030303030303030303030303030633034383732383566313736663532306635636434363732306236383662366534366165636430373030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303031303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030313430303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030633461303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303530303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030353831303030303030303030303030303030303030303030303030633365313631343261306432366336616530623163656238643961373236653734653164613664663666656562653137653437306464626434656261663364623938333136386235316337623136363732613131623966306662383864623438323962653237346230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303034363336663665363230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303437323666373336313030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030222c2268617368223a22307831376565323335666330333539313535623235343139653065346336356439633530306466366537316538323838643665663032306430346363326632636233222c22626c6f636b4e756d626572223a223078326263616630222c2266726f6d223a22307838623461353365353739303739343466633261653539623837373066393331623639326232373062222c227472616e73616374696f6e496e646578223a22307830222c2276223a2230783163222c2272223a22307866633739633836353638323039313030323134616339353662373930653066383935656130343135313438643233613239353632356564393761633936333534222c2273223a223078373232303833616331643764663662626162393939383537616163323561336665646265386130633561326266376364653835393738363266373862313937227d", + "txid": "0x17ee235fc0359155b25419e0e4c65d9c500df6e71e8288d6ef020d04cc2f2cb3", + "blocktime": 1521515026, + "time": 1521515026, + "vin": [ + { + "addresses": ["0x8b4a53e57907944fc2ae59b8770f931b692b270b"] + } + ], + "vout": [ + { + "scriptPubKey": { + "addresses": ["0xd054299c482ad5cb39a3fa874725f9e2a20d349c"] + } + } + ] } } } From 757b3e39d6f0e4e51c4b60aae17c0668e3b20d62 Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Wed, 20 Jun 2018 19:09:47 +0200 Subject: [PATCH 04/10] Added mempool RPC/resync tests --- bchain/coins/btc/bitcoinrpc_test.go | 13 +++ bchain/tests/rpc/rpc.go | 162 +++++++++++++++++++++++++++- 2 files changed, 174 insertions(+), 1 deletion(-) diff --git a/bchain/coins/btc/bitcoinrpc_test.go b/bchain/coins/btc/bitcoinrpc_test.go index 52b09898..9da65080 100644 --- a/bchain/coins/btc/bitcoinrpc_test.go +++ b/bchain/coins/btc/bitcoinrpc_test.go @@ -19,6 +19,7 @@ func getRPCClient(cfg json.RawMessage) (bchain.BlockChain, error) { if err != nil { return nil, err } + cli.Mempool = bchain.NewUTXOMempool(cli, cli.ChainConfig.MempoolWorkers, cli.ChainConfig.MempoolSubWorkers) return cli, nil } @@ -43,3 +44,15 @@ func TestBitcoinRPC_GetBlock(t *testing.T) { func TestBitcoinRPC_GetTransaction(t *testing.T) { rpcTest.TestGetTransaction(t) } + +func TestBitcoinRPC_TestGetTransactionForMempool(t *testing.T) { + rpcTest.TestGetTransactionForMempool(t) +} + +func TestBitcoinRPC_TestMempoolSync(t *testing.T) { + rpcTest.TestMempoolSync(t) +} + +func TestBitcoinRPC_GetMempoolEntry(t *testing.T) { + rpcTest.TestGetMempoolEntry(t) +} diff --git a/bchain/tests/rpc/rpc.go b/bchain/tests/rpc/rpc.go index 0a486963..15f799f3 100644 --- a/bchain/tests/rpc/rpc.go +++ b/bchain/tests/rpc/rpc.go @@ -5,8 +5,10 @@ package rpc import ( "blockbook/bchain" "encoding/json" + "math/rand" "reflect" "testing" + "time" ) type TestConfig struct { @@ -103,6 +105,7 @@ func (rt *Test) TestGetBlock(t *testing.T) { } } + func (rt *Test) TestGetTransaction(t *testing.T) { for txid, want := range rt.TestData.TxDetails { got, err := rt.Client.GetTransaction(txid) @@ -110,7 +113,6 @@ func (rt *Test) TestGetTransaction(t *testing.T) { t.Error(err) return } - // Confirmations is variable field, we just check if is set and reset it if got.Confirmations > 0 { got.Confirmations = 0 @@ -124,3 +126,161 @@ func (rt *Test) TestGetTransaction(t *testing.T) { } } } + +func (rt *Test) getMempool(t *testing.T) []string { + var ( + txs []string + err error + ) + // attempts to get transactions for 2 min + for i := 0; i < 8; i++ { + txs, err = rt.Client.GetMempool() + if err != nil { + t.Fatal(err) + } + if len(txs) == 0 { + time.Sleep(15 * time.Second) + continue + } + + // done + break + } + if len(txs) == 0 { + t.Skipf("Skipping test, all attempts to get mempool failed") + } + + return txs +} + +func (rt *Test) getMempoolTransaction(t *testing.T, txid string) *bchain.Tx { + tx, err := rt.Client.GetTransactionForMempool(txid) + if err != nil { + t.Fatal(err) + } + if tx.Confirmations > 0 { + t.Skip("Skipping test, transaction moved away from mepool") + } + + return tx +} + +func (rt *Test) TestGetTransactionForMempool(t *testing.T) { + txs := rt.getMempool(t) + txid := txs[rand.Intn(len(txs))] + got := rt.getMempoolTransaction(t, txid) + + want, err := rt.Client.GetTransaction(txid) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("GetTransactionForMempool() got %v, want %v", got, want) + } +} + +func (rt *Test) getMempoolAddresses(t *testing.T, txs []string) map[string][]string { + txid2addrs := map[string][]string{} + for i := 0; i < len(txs); i++ { + tx := rt.getMempoolTransaction(t, txs[i]) + addrs := []string{} + for _, vin := range tx.Vin { + for _, a := range vin.Addresses { + addrs = append(addrs, a) + } + } + for _, vout := range tx.Vout { + for _, a := range vout.ScriptPubKey.Addresses { + addrs = append(addrs, a) + } + } + if len(addrs) > 0 { + txid2addrs[tx.Txid] = addrs + } + } + return txid2addrs +} + +func (rt *Test) TestMempoolSync(t *testing.T) { + for i := 0; i < 3; i++ { + txs := rt.getMempool(t) + txid2addrs := rt.getMempoolAddresses(t, txs) + if len(txid2addrs) == 0 { + t.Fatal("No transaction in mempool has any address") + } + + n, err := rt.Client.ResyncMempool(nil) + if err != nil { + t.Fatal(err) + } + + if tmp := rt.getMempool(t); len(txs) != len(tmp) { + // mempool reset + continue + } + + if len(txs) != n { + t.Fatalf("ResyncMempool() returned different number of transactions than backend call") + } + + for txid, addrs := range txid2addrs { + for _, a := range addrs { + txs, err := rt.Client.GetMempoolTransactions(a) + if err != nil { + t.Fatal(err) + } + if !containsString(txs, txid) { + t.Errorf("ResyncMempool() - for address %s, transaction %s wasn't found in mempool", a, txid) + return + } + } + } + + // done + return + } + t.Skip("Skipping test, all attempts to sync mempool failed due to network state changes") +} + +func containsString(slice []string, s string) bool { + for i := 0; i < len(slice); i++ { + if slice[i] == s { + return true + } + } + return false +} + +func (rt *Test) TestGetMempoolEntry(t *testing.T) { + for i := 0; i < 3; i++ { + txs := rt.getMempool(t) + h, err := rt.Client.GetBestBlockHeight() + if err != nil { + t.Fatal(err) + } + + tx := rt.getMempoolTransaction(t, txs[rand.Intn(len(txs))]) + e, err := rt.Client.GetMempoolEntry(tx.Txid) + if err != nil { + if err, ok := err.(*bchain.RPCError); ok && err.Code == -5 { + // mempool reset + continue + } + } + + if e.Height != h { + t.Errorf("GetMempoolEntry() got height %d, want %d", e.Height, h) + } + if e.Size <= 0 { + t.Errorf("GetMempoolEntry() got zero or negative size %d", e.Size) + } + if e.Fee <= 0 { + t.Errorf("GetMempoolEntry() got zero or negative fee %f", e.Fee) + } + + // done + return + } + t.Skip("Skipping test, all attempts to get mempool entry failed due to network state changes") +} From ae8058f26944d15db069ed8b9fc6993575fd8957 Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Wed, 20 Jun 2018 19:45:41 +0200 Subject: [PATCH 05/10] Fixed different behaviour between transaction parsing from wire or JSON JSON version sometimes returned nil Address field in ScriptPubKey (if it was omitted in input JSON) but wire version always returned allocated empty slice. --- bchain/coins/btc/bitcoinparser.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bchain/coins/btc/bitcoinparser.go b/bchain/coins/btc/bitcoinparser.go index 41c52759..ec0fc687 100644 --- a/bchain/coins/btc/bitcoinparser.go +++ b/bchain/coins/btc/bitcoinparser.go @@ -113,9 +113,11 @@ func (p *BitcoinParser) TxFromMsgTx(t *wire.MsgTx, parseAddresses bool) bchain.T } vout := make([]bchain.Vout, len(t.TxOut)) for i, out := range t.TxOut { - addrs := []string{} + var addrs []string if parseAddresses { - addrs, _ = p.OutputScriptToAddresses(out.PkScript) + if tmp, _ := p.OutputScriptToAddresses(out.PkScript); len(tmp) > 0 { + addrs = tmp + } } s := bchain.ScriptPubKey{ Hex: hex.EncodeToString(out.PkScript), From 12cca393c6c00f3dbf27e90e6af21735d332445b Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Thu, 21 Jun 2018 11:18:02 +0200 Subject: [PATCH 06/10] Added tests for SendRawTransaction, EstimateSmartFee and EstimateFee --- bchain/coins/btc/bitcoinrpc_test.go | 12 +++++++ bchain/tests/rpc/rpc.go | 36 +++++++++++++++++++ .../tests/rpc/testdata/Bitcoin_Testnet.json | 24 ++++++------- 3 files changed, 60 insertions(+), 12 deletions(-) diff --git a/bchain/coins/btc/bitcoinrpc_test.go b/bchain/coins/btc/bitcoinrpc_test.go index 9da65080..266e6a35 100644 --- a/bchain/coins/btc/bitcoinrpc_test.go +++ b/bchain/coins/btc/bitcoinrpc_test.go @@ -56,3 +56,15 @@ func TestBitcoinRPC_TestMempoolSync(t *testing.T) { func TestBitcoinRPC_GetMempoolEntry(t *testing.T) { rpcTest.TestGetMempoolEntry(t) } + +func TestBitcoinRPC_SendRawTransaction(t *testing.T) { + rpcTest.TestSendRawTransaction(t) +} + +func TestBitcoinRPC_EstimateSmartFee(t *testing.T) { + rpcTest.TestEstimateSmartFee(t) +} + +func TestBitcoinRPC_EstimateFee(t *testing.T) { + rpcTest.TestEstimateFee(t) +} diff --git a/bchain/tests/rpc/rpc.go b/bchain/tests/rpc/rpc.go index 15f799f3..4c39de7c 100644 --- a/bchain/tests/rpc/rpc.go +++ b/bchain/tests/rpc/rpc.go @@ -284,3 +284,39 @@ func (rt *Test) TestGetMempoolEntry(t *testing.T) { } t.Skip("Skipping test, all attempts to get mempool entry failed due to network state changes") } + +func (rt *Test) TestSendRawTransaction(t *testing.T) { + for txid, tx := range rt.TestData.TxDetails { + _, err := rt.Client.SendRawTransaction(tx.Hex) + if err != nil { + if err, ok := err.(*bchain.RPCError); ok && err.Code == -27 { + continue + } + } + t.Errorf("SendRawTransaction() for %s returned unexpected error: %#v", txid, err) + } +} + +func (rt *Test) TestEstimateSmartFee(t *testing.T) { + for _, blocks := range []int{1, 2, 3, 5, 10} { + fee, err := rt.Client.EstimateSmartFee(blocks, true) + if err != nil { + t.Error(err) + } + if fee != -1 && (fee < 0 || fee > 1) { + t.Errorf("EstimateSmartFee() returned unexpected fee rate: %f", fee) + } + } +} + +func (rt *Test) TestEstimateFee(t *testing.T) { + for _, blocks := range []int{1, 2, 3, 5, 10} { + fee, err := rt.Client.EstimateFee(blocks) + if err != nil { + t.Error(err) + } + if fee != -1 && (fee < 0 || fee > 1) { + t.Errorf("EstimateFee() returned unexpected fee rate: %f", fee) + } + } +} diff --git a/bchain/tests/rpc/testdata/Bitcoin_Testnet.json b/bchain/tests/rpc/testdata/Bitcoin_Testnet.json index 0eb09a8a..ece3c941 100644 --- a/bchain/tests/rpc/testdata/Bitcoin_Testnet.json +++ b/bchain/tests/rpc/testdata/Bitcoin_Testnet.json @@ -78,43 +78,43 @@ } ] }, - "5bef621ad6d0970939ae36270a3228d3c315f8008fb04eebffab5f7a3589d114": { - "hex": "01000000025b0551bd0fffcf55881e285e15b364ab9a831d2494d2eb7a163a4bbd6f551151000000006b483045022100dff500e8c060a9c8810483d4ada8f91c0b844e92778cc762300040870109c0be02207029fa781ec37ddeb0ffbfa7160e625afdd126f30ec11fb9bc25f4d2164933bb0121023c6017ab9f471a69157180c5e30b9aef2ff73ea2a1a774c53a975e2557536314ffffffffd49a58913818610b0aa065d4f32995863d216c44040a49d454f6b7eeb65c9adc010000006b483045022100dce24b819b70f920d0bb60fa1241fa14f2500412a60aceeaae2610e1593b5e3c022041fdc5a02dc26af043bea27713f1245340b98bd47aa283e23b96ecc4aae157a4012102d18a88bcf5f65d937de7d9bc24d2f492a55216087262bf4683d0055dd0521a56feffffff02da869800000000001976a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac80fe210a000000001976a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac00000000", - "txid": "5bef621ad6d0970939ae36270a3228d3c315f8008fb04eebffab5f7a3589d114", + "3005378ee85fc905a1812bdfae4b2e0e9bb09f5867a53fd73237bb319a1774aa": { + "hex": "01000000000102c997f74e9ad52a44446302381e0fa6de080dadadf55842588bde1be8a47b438000000000171600147edbcdda98080eeb6e8a63c63da135498295c3cdffffffff563c9674a40bf1aa1063f767a50d2288146116fe869012ad3dad03d71e74a8800100000017160014af97d082fd5de049bce2991d9dcaa5d3035a1b04ffffffff0290f4f700000000001976a914abba3808b854c70b63ff038fcddfbafcb707713988ac74b77b030100000017a914fb1e0f36e2d8e91a43c7faba7dae18a610070c4a87024730440220538fcd8fbbf39b813372a7ff6251f1d22c9e940f54272ab525e1d1dc5f03049b022066cc5a1c445573e7e069fdaf3aa33d6665ef5f7936cb155cfd9093e888ca9461012102b45e239d96f8504ae45a32af7c80f6164f7b9658166e318521ee822192fee3ef0248304502210089e579ce52f765c8de6033e1cee93c94aa9a5ef3a194fec12885ed163dc60688022050aadd6aa170c6cfb58f406497949b0140327b4889ca7e082bdcfa8cc03d487f012103fb1a838f38d587dea0532f4a15a39b96e411cdb37c5160ba576a4cb0072db01900000000", + "txid": "3005378ee85fc905a1812bdfae4b2e0e9bb09f5867a53fd73237bb319a1774aa", "blocktime": 1528788394, "time": 1528788394, "locktime": 0, "vin": [ { - "txid": "5111556fbd4b3a167aebd294241d839aab64b3155e281e8855cfff0fbd51055b", + "txid": "80437ba4e81bde8b584258f5adad0d08dea60f1e38026344442ad59a4ef797c9", "vout": 0, "sequence": 4294967295, "scriptSig": { - "hex": "483045022100dff500e8c060a9c8810483d4ada8f91c0b844e92778cc762300040870109c0be02207029fa781ec37ddeb0ffbfa7160e625afdd126f30ec11fb9bc25f4d2164933bb0121023c6017ab9f471a69157180c5e30b9aef2ff73ea2a1a774c53a975e2557536314" + "hex": "1600147edbcdda98080eeb6e8a63c63da135498295c3cd" } }, { - "txid": "dc9a5cb6eeb7f654d4490a04446c213d869529f3d465a00a0b61183891589ad4", + "txid": "80a8741ed703ad3dad129086fe16611488220da567f76310aaf10ba474963c56", "vout": 1, - "sequence": 4294967294, + "sequence": 4294967295, "scriptSig": { - "hex": "483045022100dce24b819b70f920d0bb60fa1241fa14f2500412a60aceeaae2610e1593b5e3c022041fdc5a02dc26af043bea27713f1245340b98bd47aa283e23b96ecc4aae157a4012102d18a88bcf5f65d937de7d9bc24d2f492a55216087262bf4683d0055dd0521a56" + "hex": "160014af97d082fd5de049bce2991d9dcaa5d3035a1b04" } } ], "vout": [ { - "value": 0.09995994, + "value": 0.16250000, "n": 0, "scriptPubKey": { - "hex": "76a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac" + "hex": "76a914abba3808b854c70b63ff038fcddfbafcb707713988ac" } }, { - "value": 1.7, + "value": 43.53406836, "n": 1, "scriptPubKey": { - "hex": "76a914b4f1349ec3e7c751c6720e2c0783e3449e21e36888ac" + "hex": "a914fb1e0f36e2d8e91a43c7faba7dae18a610070c4a87" } } ] From 86f814e95f1de314627148de70b056242044e698 Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Thu, 21 Jun 2018 12:09:02 +0200 Subject: [PATCH 07/10] New RPC tests added for other coins --- bchain/coins/bch/bcashrpc_test.go | 25 +++ bchain/coins/dash/dashrpc_test.go | 21 +++ bchain/coins/zec/zcashrpc_test.go | 21 +++ bchain/tests/rpc/testdata/Bcash_Testnet.json | 158 +++++++------------ 4 files changed, 128 insertions(+), 97 deletions(-) diff --git a/bchain/coins/bch/bcashrpc_test.go b/bchain/coins/bch/bcashrpc_test.go index 8185fd05..948c1f0f 100644 --- a/bchain/coins/bch/bcashrpc_test.go +++ b/bchain/coins/bch/bcashrpc_test.go @@ -19,6 +19,7 @@ func getRPCClient(cfg json.RawMessage) (bchain.BlockChain, error) { if err != nil { return nil, err } + cli.Mempool = bchain.NewUTXOMempool(cli, cli.ChainConfig.MempoolWorkers, cli.ChainConfig.MempoolSubWorkers) return cli, nil } @@ -43,3 +44,27 @@ func TestBCashRPC_GetBlock(t *testing.T) { func TestBCashRPC_GetTransaction(t *testing.T) { rpcTest.TestGetTransaction(t) } + +func TestBCashRPC_TestGetTransactionForMempool(t *testing.T) { + rpcTest.TestGetTransactionForMempool(t) +} + +func TestBCashRPC_TestMempoolSync(t *testing.T) { + rpcTest.TestMempoolSync(t) +} + +func TestBCashRPC_GetMempoolEntry(t *testing.T) { + rpcTest.TestGetMempoolEntry(t) +} + +func TestBCashRPC_SendRawTransaction(t *testing.T) { + rpcTest.TestSendRawTransaction(t) +} + +func TestBCashRPC_EstimateSmartFee(t *testing.T) { + rpcTest.TestEstimateSmartFee(t) +} + +func TestBCashRPC_EstimateFee(t *testing.T) { + rpcTest.TestEstimateFee(t) +} diff --git a/bchain/coins/dash/dashrpc_test.go b/bchain/coins/dash/dashrpc_test.go index 90c09bb4..ebfa2847 100644 --- a/bchain/coins/dash/dashrpc_test.go +++ b/bchain/coins/dash/dashrpc_test.go @@ -16,6 +16,7 @@ func getRPCClient(cfg json.RawMessage) (bchain.BlockChain, error) { } cli := c.(*DashRPC) cli.Parser = NewDashParser(GetChainParams("test"), cli.ChainConfig) + cli.Mempool = bchain.NewUTXOMempool(cli, cli.ChainConfig.MempoolWorkers, cli.ChainConfig.MempoolSubWorkers) return cli, nil } @@ -40,3 +41,23 @@ func TestDashRPC_GetBlock(t *testing.T) { func TestDashRPC_GetTransaction(t *testing.T) { rpcTest.TestGetTransaction(t) } + +func TestDashRPC_TestGetTransactionForMempool(t *testing.T) { + rpcTest.TestGetTransactionForMempool(t) +} + +func TestDashRPC_TestMempoolSync(t *testing.T) { + rpcTest.TestMempoolSync(t) +} + +func TestDashRPC_SendRawTransaction(t *testing.T) { + rpcTest.TestSendRawTransaction(t) +} + +func TestDashRPC_EstimateSmartFee(t *testing.T) { + rpcTest.TestEstimateSmartFee(t) +} + +func TestDashRPC_EstimateFee(t *testing.T) { + rpcTest.TestEstimateFee(t) +} diff --git a/bchain/coins/zec/zcashrpc_test.go b/bchain/coins/zec/zcashrpc_test.go index a69ffa77..4c6f7e1f 100644 --- a/bchain/coins/zec/zcashrpc_test.go +++ b/bchain/coins/zec/zcashrpc_test.go @@ -16,6 +16,7 @@ func getRPCClient(cfg json.RawMessage) (bchain.BlockChain, error) { } cli := c.(*ZCashRPC) cli.Parser = NewZCashParser(cli.ChainConfig) + cli.Mempool = bchain.NewUTXOMempool(cli, cli.ChainConfig.MempoolWorkers, cli.ChainConfig.MempoolSubWorkers) return cli, nil } @@ -40,3 +41,23 @@ func TestZCashRPC_GetBlock(t *testing.T) { func TestZCashRPC_GetTransaction(t *testing.T) { rpcTest.TestGetTransaction(t) } + +func TestZCashRPC_TestGetTransactionForMempool(t *testing.T) { + rpcTest.TestGetTransactionForMempool(t) +} + +func TestZCashRPC_TestMempoolSync(t *testing.T) { + rpcTest.TestMempoolSync(t) +} + +func TestZCashRPC_SendRawTransaction(t *testing.T) { + rpcTest.TestSendRawTransaction(t) +} + +func TestZCashRPC_EstimateSmartFee(t *testing.T) { + rpcTest.TestEstimateSmartFee(t) +} + +func TestZCashRPC_EstimateFee(t *testing.T) { + rpcTest.TestEstimateFee(t) +} diff --git a/bchain/tests/rpc/testdata/Bcash_Testnet.json b/bchain/tests/rpc/testdata/Bcash_Testnet.json index 99d94025..39eba5e7 100644 --- a/bchain/tests/rpc/testdata/Bcash_Testnet.json +++ b/bchain/tests/rpc/testdata/Bcash_Testnet.json @@ -1,142 +1,106 @@ { - "blockHeight": 1239639, - "blockHash": "0000000075dd9708c23f5830de27c5d644983bb877c575c52926f19be7d80fe2", + "blockHeight": 1241851, + "blockHash": "00000000ff54973b45ac277fc9e92408479703d785eae0e96508bc5aa792d621", "blockTxs": [ - "f12d490ad439ff37c91e9ec5ecd5440c2d4a96653f2668402c5ebacc6d07dcf8", - "0e78e3276bd59dd403306334ab05b2d58167b4cf04dbb94ae76dc189db5bf3df", - "9eeba85181725993afc6a89e2e98c07e12bbd9c732b851af448eb6055d8d8ba7", - "045f898538c5b9a99a4bf21c8e06aa7279caacdf7616994b7d4f0ed39637dff7", - "8614ae1addce0983f8b1bb2e6139fca4e7aa2d4f57f28ce1145bd1103c75a307", - "1d10b63e6d336b19ce7f7a867639b52b42be7e63ea53a86e5c7b101eb8f5bf59", - "1cbb193374d455ad09f1ae4486418dbbd65435ac14b1b8733897976bd776478b", - "722d99abace73265477b42849c86f9a8460a07aef7497187db24cffb4b27c856", - "a856b35655852ec5d698561633f997b945ee03d57a7b60e3c86eaabdd3a90054", - "e82cdbb67f6c23c72d0273bdd976697d5bfc4b2373e637f4eeb5211134b84bd6", - "efd3295c37cd3988f16efc09d083dbbc27f5c0074b9ea0dffd4f8540b36dd02c", - "b955bc3e800aa6d72c1a9eb9ce4a513f409ec923c31e30075f58336c830040a8", - "9730ec3e10e5a3bf358e533a497e75f44aceaf28da8248534326e5d7dac0d048", - "a90df75c045e638a0c00902d35c9c72592d0e76ac0fa34fba6aad749c5aded21", - "0e21dd654596cac9f579e21a549a533d1be7319470fcf8f920a35d64cf020d1f" + "0cbcd28da300a850fd922caf633f2aaca0fd0a2d4ce46c6f07314c644287527a", + "32fe2a3a60eb952d6ade53b7030ddb6ad8af5797391857baaad37c5b20f3b5ca" ], "txDetails": { - "9eeba85181725993afc6a89e2e98c07e12bbd9c732b851af448eb6055d8d8ba7": { - "hex": "0200000001b2c673aede02a4054a8c23e456e581d684f47dadb54083317d6152949d55d94e010000006b483045022100f31a23984a44f485a570a102899e3a25cdf6d1234259e602dbe61f2c3e77e490022069a6a7b013452bd66ed3c11aba22a64559134cd1af3d283730a9b7fb33631cca412103cb05918b81d36c387c791d2accfaefead287a4a30427387fb1095fc0c363ef8efeffffff0200c2eb0b0000000017a914ac90ed8510c9a7445b104fd1602341dc2f890d15878906e1e1160000001976a9147f7ed17e71afc40beac9b8d0b0fb53731161339c88ac56ea1200", - "txid": "9eeba85181725993afc6a89e2e98c07e12bbd9c732b851af448eb6055d8d8ba7", - "blocktime":1528796166, - "time":1528796166, - "locktime": 1239638, + "0cbcd28da300a850fd922caf633f2aaca0fd0a2d4ce46c6f07314c644287527a": { + "hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0a03fbf212055374617368ffffffff01483b5009000000001976a914014dc11b35cafe7605b4c1798a5b86efd788cff488ac00000000", + "txid": "0cbcd28da300a850fd922caf633f2aaca0fd0a2d4ce46c6f07314c644287527a", + "blocktime":1529571678, + "time":1529571678, + "locktime": 0, "vin": [ { - "txid": "4ed9559d9452617d318340b5ad7df484d681e556e4238c4a05a402deae73c6b2", - "vout": 1, - "sequence": 4294967294, - "scriptSig": { - "hex": "483045022100f31a23984a44f485a570a102899e3a25cdf6d1234259e602dbe61f2c3e77e490022069a6a7b013452bd66ed3c11aba22a64559134cd1af3d283730a9b7fb33631cca412103cb05918b81d36c387c791d2accfaefead287a4a30427387fb1095fc0c363ef8e" - } + "coinbase": "03fbf212055374617368", + "sequence": 4294967295 } ], "vout": [ { - "value": 2.0, + "value": 1.56253000, "n": 0, "scriptPubKey": { - "hex": "a914ac90ed8510c9a7445b104fd1602341dc2f890d1587" - } - }, - { - "value": 982.78901385, - "n": 1, - "scriptPubKey": { - "hex": "76a9147f7ed17e71afc40beac9b8d0b0fb53731161339c88ac" + "hex": "76a914014dc11b35cafe7605b4c1798a5b86efd788cff488ac" } } ] }, - "0e21dd654596cac9f579e21a549a533d1be7319470fcf8f920a35d64cf020d1f": { - "hex": "0200000008349c1ef994e931d4da1f545d2e578f898ddf457392c5485dc75378de8f36bef4010000006a4730440220351f1566e3ef02e900942103c60cba5a768cd710d3d1afbc75406099ad2d9e4702206e0f639a9991c7afb2136fb2e437629103ad0989898d1c90078ded5f08f5cb3341210303ae341929bdb242226a9a8c15cdbed5b89fa286842714d8be7e3f16c63abe11feffffff4ae685c8efc7f090e75b80f1b705d7bf5fa6dbbcf88c5f5cf2dc0678a9646fb4000000006b483045022100b8dae1825b0d0ccbe212e8da6767ea049bad9acfc737e5c5ef3dc5eeef6d313c02207e4c669956f871a4a5f71903bf38a8c587b81940943682364b11fb1cd9c078d7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2feffffff1ac21ded05387165cb7d0d95e2036a82f79a314575f065407e0c32a6b24b2f1d010000006b483045022100ef4a9469a5b3dbc0f03e8d8c5f254ad86f2c1e92e75a5ee737c3b3186b5edd95022076abcdfa976c3c78d2b196fb79699057248fad6d3d5e782524b85d84704394cc412103882df93f092501520bb36206703dadb65b25a3fbd0323c690dc8e72f5ee4a770feffffffea6905abb313a2aa3f6c8a056294abe06774dbf75688b03b96b8a2132aaf0cbf010000006b483045022100e4ab9dd0a75bc76c6c2cf549fb37c5577bad7f58953a7103abe4a77a95b873c10220545aa0c2b2869d444fb99d237549d6ac270c711d60788a6463ef4fee63ebd8fc4121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9efeffffff8c9a7a668dad3766f953d9779861f9c007b0a06f6ea2afbf8ab30137f34300fa000000006a47304402207253f724d891f5e1e66ec0c8084ade910a52257a1257933c23bd1b4da862e33a0220363df96e31dffa0a599b56c5049519a4d8ed34e96dc1fefecfd2bc31fc6d79d9412103186a4fc8445b3b437587c71f00fc9da7a267c0a38915fcf567528e310a73c0bdfeffffff82445d5b10b84b5256ef028615465e2d139c45584884c06e68bc38930d826e72010000006a47304402204846adc41599336307a087d4fa779a059ffe12c69456c82fa4b03942c901284002203e5f0c5e72b9ded7f48b4d22cbdb39390bea33003d46d8b4652c8ede1f13b3e54121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9efeffffffb8816c2c3b95aa8126f6d2d04798632b3167e6e2144d5f4e84cfb29e9d6f442d010000006a473044022078b1aff9a4ed3452f782db38341d846edd295f9a907c7373519408fb33eeb3240220578da5e91ec0c82604982b09cbd1f44e28260fcd640bcc55f086ce296ef32ef7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2feffffff70628ac9b2814f99fe4cd5f67a76047af533774ae90331fa8cb68e4dcbff1cb0010000006b483045022100cd88592589ab3bbd6e23920770a067a37ffbff3a31238167731377f11903676202202cb1c019365870dad3113abb3b0bc68ab9e65d9d60592f3315ffa444dfd88be741210393bd44ad6ed9295bf408e01bcdbdf6e4e8fd4a573ad20f37e54ff6e9b1596028feffffff027f766c02000000001976a9149f96c6e6c3aabf438eef5c589c47fa4b4f96592a88ac1c3d0f00000000001976a914e2ffd7cf2fe9468512878196d1b48fee9e9d003288ac56ea1200", - "txid": "0e21dd654596cac9f579e21a549a533d1be7319470fcf8f920a35d64cf020d1f", - "blocktime":1528796166, - "time":1528796166, - "locktime": 1239638, + "32fe2a3a60eb952d6ade53b7030ddb6ad8af5797391857baaad37c5b20f3b5ca": { + "hex": "010000000321d231b0d81f74e29145cc5c7dc92b45aecaedc84ed0178d223c1ba75024ff58030000006a473044022004739fe75329dee2f6deedca41eec94ca9c5d6e3a3ad807f28813c81406b6db002204153c2c0c72214295aaeb637ff6390e8ea220adf7ef30f5c0e7b95933f880bed4121027909d648cd5d774d250e5f8ab4c4aadfba07f4abb835f9100387bdc047e176bcfeffffff21d231b0d81f74e29145cc5c7dc92b45aecaedc84ed0178d223c1ba75024ff58040000006a47304402206fd8709b72836a8a7c7d3059a2bcd11e835de7966277aa14a70aaa978a557ea3022036dc594d1050e98091f2382715461bae03faef774ca7ec1f9d6bd852cf3e12a84121028b5d4e481b88bcdb98cf5baff279ba364d73cf1a001bcbebee25895577897e67feffffff21d231b0d81f74e29145cc5c7dc92b45aecaedc84ed0178d223c1ba75024ff58050000006b483045022100cb820ff34bad9ac75e73c8eedc0929547021ec2e0b9099db39177702c1d5ac3802200f2b9727a1396f68e3bcf16a9b5f2ea0587a3496d9f483007b1d940a6edeb52841210387f3f2b2ef3d3ee85fb4530bb702af0fa3644b23d61e8c0e50c87d828cf27136feffffff06e8030000000000001976a9142d2fa4c2a38862814cca01f2f0b78d58f093dfc288ace8030000000000001976a9140ab1ed3b3358a1caec5e75475a1db96b668432b288ace8030000000000001976a914a65b5515f02325e02d3a296be60fe6f612265ea088ac60670100000000001976a914fc92ae15367bd3f9154bf475e07a4017bfadccac88ac48d0bd0b000000001976a91496c4871f24d2534c7c592699045940df9f3cb70088acc0150c00000000001976a9149c0d281ac7ae4e471cdd607af502cdeb038849c488ac00000000", + "txid": "32fe2a3a60eb952d6ade53b7030ddb6ad8af5797391857baaad37c5b20f3b5ca", + "blocktime":1529571678, + "time":1529571678, + "locktime": 0, "vin": [ { - "txid": "f4be368fde7853c75d48c5927345df8d898f572e5d541fdad431e994f91e9c34", - "vout": 1, + "txid": "58ff2450a71b3c228d17d04ec8edcaae452bc97d5ccc4591e2741fd8b031d221", + "vout": 3, "sequence": 4294967294, "scriptSig": { - "hex": "4730440220351f1566e3ef02e900942103c60cba5a768cd710d3d1afbc75406099ad2d9e4702206e0f639a9991c7afb2136fb2e437629103ad0989898d1c90078ded5f08f5cb3341210303ae341929bdb242226a9a8c15cdbed5b89fa286842714d8be7e3f16c63abe11" + "hex": "473044022004739fe75329dee2f6deedca41eec94ca9c5d6e3a3ad807f28813c81406b6db002204153c2c0c72214295aaeb637ff6390e8ea220adf7ef30f5c0e7b95933f880bed4121027909d648cd5d774d250e5f8ab4c4aadfba07f4abb835f9100387bdc047e176bc" } }, { - "txid": "b46f64a97806dcf25c5f8cf8bcdba65fbfd705b7f1805be790f0c7efc885e64a", - "vout": 0, + "txid": "58ff2450a71b3c228d17d04ec8edcaae452bc97d5ccc4591e2741fd8b031d221", + "vout": 4, "sequence": 4294967294, "scriptSig": { - "hex": "483045022100b8dae1825b0d0ccbe212e8da6767ea049bad9acfc737e5c5ef3dc5eeef6d313c02207e4c669956f871a4a5f71903bf38a8c587b81940943682364b11fb1cd9c078d7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2" + "hex": "47304402206fd8709b72836a8a7c7d3059a2bcd11e835de7966277aa14a70aaa978a557ea3022036dc594d1050e98091f2382715461bae03faef774ca7ec1f9d6bd852cf3e12a84121028b5d4e481b88bcdb98cf5baff279ba364d73cf1a001bcbebee25895577897e67" } }, { - "txid": "1d2f4bb2a6320c7e4065f07545319af7826a03e2950d7dcb65713805ed1dc21a", - "vout": 1, + "txid": "58ff2450a71b3c228d17d04ec8edcaae452bc97d5ccc4591e2741fd8b031d221", + "vout": 5, "sequence": 4294967294, "scriptSig": { - "hex": "483045022100ef4a9469a5b3dbc0f03e8d8c5f254ad86f2c1e92e75a5ee737c3b3186b5edd95022076abcdfa976c3c78d2b196fb79699057248fad6d3d5e782524b85d84704394cc412103882df93f092501520bb36206703dadb65b25a3fbd0323c690dc8e72f5ee4a770" - } - }, - { - "txid": "bf0caf2a13a2b8963bb08856f7db7467e0ab9462058a6c3faaa213b3ab0569ea", - "vout": 1, - "sequence": 4294967294, - "scriptSig": { - "hex": "483045022100e4ab9dd0a75bc76c6c2cf549fb37c5577bad7f58953a7103abe4a77a95b873c10220545aa0c2b2869d444fb99d237549d6ac270c711d60788a6463ef4fee63ebd8fc4121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9e" - } - }, - { - "txid": "fa0043f33701b38abfafa26e6fa0b007c0f9619877d953f96637ad8d667a9a8c", - "vout": 0, - "sequence": 4294967294, - "scriptSig": { - "hex": "47304402207253f724d891f5e1e66ec0c8084ade910a52257a1257933c23bd1b4da862e33a0220363df96e31dffa0a599b56c5049519a4d8ed34e96dc1fefecfd2bc31fc6d79d9412103186a4fc8445b3b437587c71f00fc9da7a267c0a38915fcf567528e310a73c0bd" - } - }, - { - "txid": "726e820d9338bc686ec0844858459c132d5e46158602ef56524bb8105b5d4482", - "vout": 1, - "sequence": 4294967294, - "scriptSig": { - "hex": "47304402204846adc41599336307a087d4fa779a059ffe12c69456c82fa4b03942c901284002203e5f0c5e72b9ded7f48b4d22cbdb39390bea33003d46d8b4652c8ede1f13b3e54121031adea1da6e87b0771ea8c2a4723127d8cc9328b0594d159570ebe97b1e021c9e" - } - }, - { - "txid": "2d446f9d9eb2cf844e5f4d14e2e667312b639847d0d2f62681aa953b2c6c81b8", - "vout": 1, - "sequence": 4294967294, - "scriptSig": { - "hex": "473044022078b1aff9a4ed3452f782db38341d846edd295f9a907c7373519408fb33eeb3240220578da5e91ec0c82604982b09cbd1f44e28260fcd640bcc55f086ce296ef32ef7412103c9bd0064d2759628c1f6e5ad9d6345a5bce64dc4f4bb0675162f77acd557e4e2" - } - }, - { - "txid": "b01cffcb4d8eb68cfa3103e94a7733f57a04767af6d54cfe994f81b2c98a6270", - "vout": 1, - "sequence": 4294967294, - "scriptSig": { - "hex": "483045022100cd88592589ab3bbd6e23920770a067a37ffbff3a31238167731377f11903676202202cb1c019365870dad3113abb3b0bc68ab9e65d9d60592f3315ffa444dfd88be741210393bd44ad6ed9295bf408e01bcdbdf6e4e8fd4a573ad20f37e54ff6e9b1596028" + "hex": "483045022100cb820ff34bad9ac75e73c8eedc0929547021ec2e0b9099db39177702c1d5ac3802200f2b9727a1396f68e3bcf16a9b5f2ea0587a3496d9f483007b1d940a6edeb52841210387f3f2b2ef3d3ee85fb4530bb702af0fa3644b23d61e8c0e50c87d828cf27136" } } ], "vout": [ { - "value": 0.40662655, + "value": 0.00001000, "n": 0, "scriptPubKey": { - "hex": "76a9149f96c6e6c3aabf438eef5c589c47fa4b4f96592a88ac" + "hex": "76a9142d2fa4c2a38862814cca01f2f0b78d58f093dfc288ac" } }, { - "value": 0.00998684, + "value": 0.00001000, "n": 1, "scriptPubKey": { - "hex": "76a914e2ffd7cf2fe9468512878196d1b48fee9e9d003288ac" + "hex": "76a9140ab1ed3b3358a1caec5e75475a1db96b668432b288ac" + } + }, + { + "value": 0.00001000, + "n": 2, + "scriptPubKey": { + "hex": "76a914a65b5515f02325e02d3a296be60fe6f612265ea088ac" + } + }, + { + "value": 0.00092000, + "n": 3, + "scriptPubKey": { + "hex": "76a914fc92ae15367bd3f9154bf475e07a4017bfadccac88ac" + } + }, + { + "value": 1.96989000, + "n": 4, + "scriptPubKey": { + "hex": "76a91496c4871f24d2534c7c592699045940df9f3cb70088ac" + } + }, + { + "value": 0.00792000, + "n": 5, + "scriptPubKey": { + "hex": "76a9149c0d281ac7ae4e471cdd607af502cdeb038849c488ac" } } ] From 7e479841a96d0eb57d25f11119f7f69abca41d68 Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Thu, 21 Jun 2018 13:34:51 +0200 Subject: [PATCH 08/10] Fixed TestGetMempoolEntry --- bchain/tests/rpc/rpc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bchain/tests/rpc/rpc.go b/bchain/tests/rpc/rpc.go index 4c39de7c..9cee0ac8 100644 --- a/bchain/tests/rpc/rpc.go +++ b/bchain/tests/rpc/rpc.go @@ -269,7 +269,7 @@ func (rt *Test) TestGetMempoolEntry(t *testing.T) { } } - if e.Height != h { + if e.Height-h > 1 { t.Errorf("GetMempoolEntry() got height %d, want %d", e.Height, h) } if e.Size <= 0 { From 5e6712535b4620d71c141296adc0f6f8bcb4dbf4 Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Thu, 21 Jun 2018 13:48:29 +0200 Subject: [PATCH 09/10] Revert "Fixed different behaviour between transaction parsing from wire or JSON" This reverts commit ae8058f26944d15db069ed8b9fc6993575fd8957. --- bchain/coins/btc/bitcoinparser.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bchain/coins/btc/bitcoinparser.go b/bchain/coins/btc/bitcoinparser.go index ec0fc687..41c52759 100644 --- a/bchain/coins/btc/bitcoinparser.go +++ b/bchain/coins/btc/bitcoinparser.go @@ -113,11 +113,9 @@ func (p *BitcoinParser) TxFromMsgTx(t *wire.MsgTx, parseAddresses bool) bchain.T } vout := make([]bchain.Vout, len(t.TxOut)) for i, out := range t.TxOut { - var addrs []string + addrs := []string{} if parseAddresses { - if tmp, _ := p.OutputScriptToAddresses(out.PkScript); len(tmp) > 0 { - addrs = tmp - } + addrs, _ = p.OutputScriptToAddresses(out.PkScript) } s := bchain.ScriptPubKey{ Hex: hex.EncodeToString(out.PkScript), From ffe3650a0f624fc938fcf6f4a96bb7826b53d7c5 Mon Sep 17 00:00:00 2001 From: Jakub Matys Date: Thu, 21 Jun 2018 13:53:27 +0200 Subject: [PATCH 10/10] Unmarshal empty addresses as empty slice not as nil --- bchain/types.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bchain/types.go b/bchain/types.go index 582e50b3..40cff440 100644 --- a/bchain/types.go +++ b/bchain/types.go @@ -32,14 +32,14 @@ type Vin struct { Vout uint32 `json:"vout"` ScriptSig ScriptSig `json:"scriptSig"` Sequence uint32 `json:"sequence"` - Addresses []string `json:"addresses,omitempty"` + Addresses []string `json:"addresses"` } type ScriptPubKey struct { // Asm string `json:"asm"` Hex string `json:"hex,omitempty"` // Type string `json:"type"` - Addresses []string `json:"addresses,omitempty"` + Addresses []string `json:"addresses"` } type Address interface {