Merge branch 'rpc-tests'

This commit is contained in:
Jakub Matys 2018-06-21 14:06:12 +02:00
commit 9ddb85f3ee
10 changed files with 390 additions and 114 deletions

View File

@ -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)
}

View File

@ -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 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)
}
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)
}

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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,197 @@ 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 > 1 {
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")
}
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)
}
}
}

View File

@ -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"
}
}
]

View File

@ -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"
}
}
]

View File

@ -33,6 +33,24 @@
}
}
]
},
"0x17ee235fc0359155b25419e0e4c65d9c500df6e71e8288d6ef020d04cc2f2cb3": {
"hex": "7b226e6f6e6365223a223078346566222c226761735072696365223a223078626134336237343030222c22676173223a2230783936653838222c22746f223a22307864303534323939633438326164356362333961336661383734373235663965326132306433343963222c2276616c7565223a22307830222c22696e707574223a2230783165626366613630303030303030303030303030303030303030303030303030633034383732383566313736663532306635636434363732306236383662366534366165636430373030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303031303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030313430303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030633461303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303530303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030353831303030303030303030303030303030303030303030303030633365313631343261306432366336616530623163656238643961373236653734653164613664663666656562653137653437306464626434656261663364623938333136386235316337623136363732613131623966306662383864623438323962653237346230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303034363336663665363230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303437323666373336313030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030222c2268617368223a22307831376565323335666330333539313535623235343139653065346336356439633530306466366537316538323838643665663032306430346363326632636233222c22626c6f636b4e756d626572223a223078326263616630222c2266726f6d223a22307838623461353365353739303739343466633261653539623837373066393331623639326232373062222c227472616e73616374696f6e496e646578223a22307830222c2276223a2230783163222c2272223a22307866633739633836353638323039313030323134616339353662373930653066383935656130343135313438643233613239353632356564393761633936333534222c2273223a223078373232303833616331643764663662626162393939383537616163323561336665646265386130633561326266376364653835393738363266373862313937227d",
"txid": "0x17ee235fc0359155b25419e0e4c65d9c500df6e71e8288d6ef020d04cc2f2cb3",
"blocktime": 1521515026,
"time": 1521515026,
"vin": [
{
"addresses": ["0x8b4a53e57907944fc2ae59b8770f931b692b270b"]
}
],
"vout": [
{
"scriptPubKey": {
"addresses": ["0xd054299c482ad5cb39a3fa874725f9e2a20d349c"]
}
}
]
}
}
}

View File

@ -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 {

View File

@ -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
@ -25,4 +25,10 @@ at_exit() {
}
trap at_exit EXIT
sleep inf
wait -n
code=$?
if [ $code != 0 ]; then
exit $code
fi