diff --git a/bchain/coins/blockchain.go b/bchain/coins/blockchain.go index a44e9bbc..0db70402 100644 --- a/bchain/coins/blockchain.go +++ b/bchain/coins/blockchain.go @@ -25,6 +25,7 @@ import ( "blockbook/bchain/coins/pivx" "blockbook/bchain/coins/polis" "blockbook/bchain/coins/qtum" + "blockbook/bchain/coins/ravencoin" "blockbook/bchain/coins/vertcoin" "blockbook/bchain/coins/viacoin" "blockbook/bchain/coins/vipstarcoin" @@ -90,6 +91,7 @@ func init() { BlockChainFactories["NULS"] = nuls.NewNulsRPC BlockChainFactories["VIPSTARCOIN"] = vipstarcoin.NewVIPSTARCOINRPC BlockChainFactories["ZelCash"] = zec.NewZCashRPC + BlockChainFactories["Ravencoin"] = ravencoin.NewRavencoinRPC } // GetCoinNameFromConfig gets coin name and coin shortcut from config file diff --git a/bchain/coins/ravencoin/ravencoinparser.go b/bchain/coins/ravencoin/ravencoinparser.go new file mode 100644 index 00000000..a3f5510d --- /dev/null +++ b/bchain/coins/ravencoin/ravencoinparser.go @@ -0,0 +1,91 @@ +package ravencoin + +import ( + "blockbook/bchain" + "blockbook/bchain/coins/btc" + "blockbook/bchain/coins/utils" + "bytes" + + "github.com/martinboehm/btcd/wire" + "github.com/martinboehm/btcutil/chaincfg" +) + +const ( + MainnetMagic wire.BitcoinNet = 0x4e564152 + TestnetMagic wire.BitcoinNet = 0x544e5652 +) + +var ( + MainNetParams chaincfg.Params + TestNetParams chaincfg.Params +) + +func init() { + MainNetParams = chaincfg.MainNetParams + MainNetParams.Net = MainnetMagic + MainNetParams.PubKeyHashAddrID = []byte{60} + MainNetParams.ScriptHashAddrID = []byte{122} + + TestNetParams = chaincfg.TestNet3Params + TestNetParams.Net = TestnetMagic + TestNetParams.PubKeyHashAddrID = []byte{111} + TestNetParams.ScriptHashAddrID = []byte{196} +} + +// RavencoinParser handle +type RavencoinParser struct { + *btc.BitcoinParser +} + +// NewRavencoinParser returns new RavencoinParser instance +func NewRavencoinParser(params *chaincfg.Params, c *btc.Configuration) *RavencoinParser { + return &RavencoinParser{BitcoinParser: btc.NewBitcoinParser(params, c)} +} + +// GetChainParams contains network parameters +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 + } +} + +// ParseBlock parses raw block to our Block struct +func (p *RavencoinParser) ParseBlock(b []byte) (*bchain.Block, error) { + r := bytes.NewReader(b) + w := wire.MsgBlock{} + h := wire.BlockHeader{} + err := h.Deserialize(r) + if err != nil { + return nil, err + } + + err = utils.DecodeTransactions(r, 0, wire.WitnessEncoding, &w) + if err != nil { + return nil, err + } + + txs := make([]bchain.Tx, len(w.Transactions)) + for ti, t := range w.Transactions { + txs[ti] = p.TxFromMsgTx(t, false) + } + + return &bchain.Block{ + BlockHeader: bchain.BlockHeader{ + Size: len(b), + Time: h.Timestamp.Unix(), + }, + Txs: txs, + }, nil +} diff --git a/bchain/coins/ravencoin/ravencoinparser_test.go b/bchain/coins/ravencoin/ravencoinparser_test.go new file mode 100644 index 00000000..cbaa9305 --- /dev/null +++ b/bchain/coins/ravencoin/ravencoinparser_test.go @@ -0,0 +1,273 @@ +// +build unittest + +package ravencoin + +import ( + "blockbook/bchain" + "blockbook/bchain/coins/btc" + "encoding/hex" + "math/big" + "os" + "reflect" + "testing" + + "github.com/martinboehm/btcutil/chaincfg" +) + +func TestMain(m *testing.M) { + c := m.Run() + chaincfg.ResetParams() + os.Exit(c) +} + +func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { + type args struct { + address string + } + tests := []struct { + name string + args args + want string + wantErr bool + }{ + { + name: "P2PKH1", + args: args{address: "RAoGkGhKwzxLnstApumYPD2eTrAJ849cga"}, + want: "76a91410a8805f1a6af1a5927088544b0b6ec7d6f0ab8b88ac", + wantErr: false, + }, + { + name: "P2PKH2", + args: args{address: "RTq37kPJqMS36tZYunxo2abrBMLeYSCAaa"}, + want: "76a914cb78181d62d312fdb9aacca433570150dcf0dec288ac", + wantErr: false, + }, + { + name: "P2SH1", + args: args{address: "rCzjkBoY2duVn2WizKxfBedTVWAg6UhfLZ"}, + want: "a9144a2a40987c74578ee517d426aa2c43fc568f7e0887", + wantErr: false, + }, + { + name: "P2SH2", + args: args{address: "rDzGemZkv9FbDDh5pvWfr7TWtMUnNRRE7T"}, + want: "a914550bc2fcc1992afade4d298326ee6a03ab975a9387", + wantErr: false, + }, + } + parser := NewRavencoinParser(GetChainParams("main"), &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) + } + }) + } +} + +var ( + testTx1 bchain.Tx + testTxPacked1 = "000a08848bcae7c30e0200000001c171348ffc8976074fa064e48598a816fce3798afc635fb67d99580e50b8e614000000006a473044022009e07574fa543ad259bd3334eb365c655c96d310c578b64c24d7f77fa7dc591c0220427d8ae6eacd1ca2d1994e9ec49cb322aacdde98e4bdb065e0fce81162fb3aa9012102d46827546548b9b47ae1e9e84fc4e53513e0987eeb1dd41220ba39f67d3bf46affffffff02f8137114000000001976a914587a2afa560ccaeaeb67cb72a0db7e2573a179e488ace0c48110000000001976a914d85e6ab66ab0b2c4cfd40ca3b0a779529da5799288ac00000000" + + testTx2 bchain.Tx + testTxPacked2 = "000a08848bcae7c30e02000000029e2e14113b2f55726eebaa440edec707fcec3a31ce28fa125afea1e755fb6850010000006a47304402204034c3862f221551cffb2aa809f621f989a75cdb549c789a5ceb3a82c0bcc21c022001b4638f5d73fdd406a4dd9bf99be3dfca4a572b8f40f09b8fd495a7756c0db70121027a32ef45aef2f720ccf585f6fb0b8a7653db89cacc3320e5b385146851aba705fefffffff3b240ae32c542786876fcf23b4b2ab4c34ef077912898ee529756ed4ba35910000000006a47304402204d442645597b13abb85e96e5acd34eff50a4418822fe6a37ed378cdd24574dff02205ae667c56eab63cc45a51063f15b72136fd76e97c46af29bd28e8c4d405aa211012102cde27d7b29331ea3fef909a8d91f6f7753e99a3dd129914be50df26eed73fab3feffffff028447bf38000000001976a9146d7badec5426b880df25a3afc50e476c2423b34b88acb26b556a740000001976a914b3020d0ab85710151fa509d5d9a4e783903d681888ac83080a00" +) + +func init() { + testTx1 = bchain.Tx{ + Hex: "0200000001c171348ffc8976074fa064e48598a816fce3798afc635fb67d99580e50b8e614000000006a473044022009e07574fa543ad259bd3334eb365c655c96d310c578b64c24d7f77fa7dc591c0220427d8ae6eacd1ca2d1994e9ec49cb322aacdde98e4bdb065e0fce81162fb3aa9012102d46827546548b9b47ae1e9e84fc4e53513e0987eeb1dd41220ba39f67d3bf46affffffff02f8137114000000001976a914587a2afa560ccaeaeb67cb72a0db7e2573a179e488ace0c48110000000001976a914d85e6ab66ab0b2c4cfd40ca3b0a779529da5799288ac00000000", + Blocktime: 1554837703, + Txid: "d4d3a093586eae0c3668fd288d9e24955928a894c20b551b38dd18c99b123a7c", + LockTime: 0, + Version: 2, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "473044022009e07574fa543ad259bd3334eb365c655c96d310c578b64c24d7f77fa7dc591c0220427d8ae6eacd1ca2d1994e9ec49cb322aacdde98e4bdb065e0fce81162fb3aa9012102d46827546548b9b47ae1e9e84fc4e53513e0987eeb1dd41220ba39f67d3bf46a", + }, + Txid: "14e6b8500e58997db65f63fc8a79e3fc16a89885e464a04f077689fc8f3471c1", + Vout: 0, + Sequence: 4294967295, + }, + }, + Vout: []bchain.Vout{ + { + ValueSat: *big.NewInt(342955000), + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914587a2afa560ccaeaeb67cb72a0db7e2573a179e488ac", + Addresses: []string{ + "RHM1tmdvkk7vDoiGxwUJAMNNmDqywZ5tEn", + }, + }, + }, + { + ValueSat: *big.NewInt(276940000), + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914d85e6ab66ab0b2c4cfd40ca3b0a779529da5799288ac", + Addresses: []string{ + "RV1F99b9UBBrCM8aNKugsqsDM8iqoCq7Mt", + }, + }, + }, + }, + } + + testTx2 = bchain.Tx{ + Hex: "02000000029e2e14113b2f55726eebaa440edec707fcec3a31ce28fa125afea1e755fb6850010000006a47304402204034c3862f221551cffb2aa809f621f989a75cdb549c789a5ceb3a82c0bcc21c022001b4638f5d73fdd406a4dd9bf99be3dfca4a572b8f40f09b8fd495a7756c0db70121027a32ef45aef2f720ccf585f6fb0b8a7653db89cacc3320e5b385146851aba705fefffffff3b240ae32c542786876fcf23b4b2ab4c34ef077912898ee529756ed4ba35910000000006a47304402204d442645597b13abb85e96e5acd34eff50a4418822fe6a37ed378cdd24574dff02205ae667c56eab63cc45a51063f15b72136fd76e97c46af29bd28e8c4d405aa211012102cde27d7b29331ea3fef909a8d91f6f7753e99a3dd129914be50df26eed73fab3feffffff028447bf38000000001976a9146d7badec5426b880df25a3afc50e476c2423b34b88acb26b556a740000001976a914b3020d0ab85710151fa509d5d9a4e783903d681888ac83080a00", + Blocktime: 1554837703, + Txid: "8e480d5c1bf7f11d1cbe396ab7dc14e01ea4e1aff45de7c055924f61304ad434", + LockTime: 657539, + Version: 2, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "47304402204034c3862f221551cffb2aa809f621f989a75cdb549c789a5ceb3a82c0bcc21c022001b4638f5d73fdd406a4dd9bf99be3dfca4a572b8f40f09b8fd495a7756c0db70121027a32ef45aef2f720ccf585f6fb0b8a7653db89cacc3320e5b385146851aba705", + }, + Txid: "5068fb55e7a1fe5a12fa28ce313aecfc07c7de0e44aaeb6e72552f3b11142e9e", + Vout: 1, + Sequence: 4294967294, + }, + { + ScriptSig: bchain.ScriptSig{ + Hex: "47304402204d442645597b13abb85e96e5acd34eff50a4418822fe6a37ed378cdd24574dff02205ae667c56eab63cc45a51063f15b72136fd76e97c46af29bd28e8c4d405aa211012102cde27d7b29331ea3fef909a8d91f6f7753e99a3dd129914be50df26eed73fab3", + }, + Txid: "1059a34bed569752ee98289177f04ec3b42a4b3bf2fc76687842c532ae40b2f3", + Vout: 0, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + ValueSat: *big.NewInt(952059780), + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a9146d7badec5426b880df25a3afc50e476c2423b34b88ac", + Addresses: []string{ + "RKG5tpWwjhtqddTgA3QhUh7QmKcuvBnhBX", + }, + }, + }, + { + ValueSat: *big.NewInt(500000189362), + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914b3020d0ab85710151fa509d5d9a4e783903d681888ac", + Addresses: []string{ + "RRbhVMbLfuezHPwUMujTmDFAzv64Y9mJqd", + }, + }, + }, + }, + } +} + +func Test_PackTx(t *testing.T) { + type args struct { + tx bchain.Tx + height uint32 + blockTime int64 + parser *RavencoinParser + } + tests := []struct { + name string + args args + want string + wantErr bool + }{ + { + name: "ravencoin-1", + args: args{ + tx: testTx1, + height: 657540, + blockTime: 1554837703, + parser: NewRavencoinParser(GetChainParams("main"), &btc.Configuration{}), + }, + want: testTxPacked1, + wantErr: false, + }, + { + name: "ravencoin-2", + args: args{ + tx: testTx2, + height: 657540, + blockTime: 1554837703, + parser: NewRavencoinParser(GetChainParams("main"), &btc.Configuration{}), + }, + want: testTxPacked2, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime) + if (err != nil) != tt.wantErr { + t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr) + return + } + h := hex.EncodeToString(got) + 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 + parser *RavencoinParser + } + tests := []struct { + name string + args args + want *bchain.Tx + want1 uint32 + wantErr bool + }{ + { + name: "ravencoin-1", + args: args{ + packedTx: testTxPacked1, + parser: NewRavencoinParser(GetChainParams("main"), &btc.Configuration{}), + }, + want: &testTx1, + want1: 657540, + wantErr: false, + }, + { + name: "ravencoin-2", + args: args{ + packedTx: testTxPacked2, + parser: NewRavencoinParser(GetChainParams("main"), &btc.Configuration{}), + }, + want: &testTx2, + want1: 657540, + 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) + } + }) + } +} diff --git a/bchain/coins/ravencoin/ravencoinrpc.go b/bchain/coins/ravencoin/ravencoinrpc.go new file mode 100644 index 00000000..b5da5299 --- /dev/null +++ b/bchain/coins/ravencoin/ravencoinrpc.go @@ -0,0 +1,58 @@ +package ravencoin + +import ( + "blockbook/bchain" + "blockbook/bchain/coins/btc" + "encoding/json" + + "github.com/golang/glog" +) + +// RavencoinRPC is an interface to JSON-RPC bitcoind service. +type RavencoinRPC struct { + *btc.BitcoinRPC +} + +// NewRavencoinRPC returns new RavencoinRPC instance. +func NewRavencoinRPC(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) { + b, err := btc.NewBitcoinRPC(config, pushHandler) + if err != nil { + return nil, err + } + + s := &RavencoinRPC{ + b.(*btc.BitcoinRPC), + } + s.RPCMarshaler = btc.JSONMarshalerV1{} + s.ChainConfig.SupportsEstimateFee = false + + return s, nil +} + +// Initialize initializes RavencoinRPC instance. +func (b *RavencoinRPC) Initialize() error { + ci, err := b.GetChainInfo() + if err != nil { + return err + } + chainName := ci.Chain + + glog.Info("Chain name ", chainName) + params := GetChainParams(chainName) + + // always create parser + b.Parser = NewRavencoinParser(params, b.ChainConfig) + + // parameters for getInfo request + if params.Net == MainnetMagic { + b.Testnet = false + b.Network = "livenet" + } else { + b.Testnet = true + b.Network = "testnet" + } + + glog.Info("rpc: block chain ", params.Name) + + return nil +} diff --git a/configs/coins/ravencoin.json b/configs/coins/ravencoin.json new file mode 100644 index 00000000..a7414197 --- /dev/null +++ b/configs/coins/ravencoin.json @@ -0,0 +1,67 @@ +{ + "coin": { + "name": "Ravencoin", + "shortcut": "RVN", + "label": "Ravencoin", + "alias": "ravencoin" + }, + "ports": { + "backend_rpc": 8059, + "backend_message_queue": 38359, + "blockbook_internal": 9059, + "blockbook_public": 9159 + }, + "ipc": { + "rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}", + "rpc_user": "rpc", + "rpc_pass": "rpc", + "rpc_timeout": 25, + "message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}" + }, + "backend": { + "package_name": "backend-ravencoin", + "package_revision": "satoshilabs-1", + "system_user": "ravencoin", + "version": "2.2.2.0", + "binary_url": "https://github.com/RavenProject/Ravencoin/releases/download/v2.2.2/raven-2.2.2.0-x86_64-linux-gnu.tar.gz", + "verification_type": "sha256", + "verification_source": "f6e2c20e9741a9485a8b8b34044bd5b2cdd8c5d5871b04272ec96a4ebf6bcf2e", + "extract_command": "tar -C backend --strip 1 -xf", + "exclude_files": [ + "bin/raven-qt" + ], + "exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/ravend -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid", + "logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/*.log", + "postinst_script_template": "", + "service_type": "forking", + "service_additional_params_template": "", + "protect_memory": true, + "mainnet": true, + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", + "additional_params": { + "deprecatedrpc": "estimatefee" + } + }, + "blockbook": { + "package_name": "blockbook-ravencoin", + "system_user": "blockbook-ravencoin", + "internal_binding_template": ":{{.Ports.BlockbookInternal}}", + "public_binding_template": ":{{.Ports.BlockbookPublic}}", + "explorer_url": "", + "additional_params": "", + "block_chain": { + "parse": true, + "mempool_workers": 8, + "mempool_sub_workers": 2, + "block_addresses_to_keep": 300, + "xpub_magic": 76067358, + "slip44": 175, + "additional_params": {} + } + }, + "meta": { + "package_maintainer": "Scotty", + "package_maintainer_email": "scotty.rvn@gmail.com" + } +} diff --git a/docs/ports.md b/docs/ports.md index ec7dfbf2..71f2095c 100644 --- a/docs/ports.md +++ b/docs/ports.md @@ -30,6 +30,7 @@ | VIPSTARCOIN | 9056 | 9156 | 8056 | 38356 | | MonetaryUnit | 9057 | 9157 | 8057 | 38357 | | ZelCash | 9058 | 9158 | 8058 | 38358 | +| Ravencoin | 9059 | 9159 | 8059 | 38359 | | Flo | 9066 | 9166 | 8066 | 38366 | | Polis | 9067 | 9167 | 8067 | 38367 | | Qtum | 9088 | 9188 | 8088 | 38388 | diff --git a/tests/rpc/testdata/ravencoin.json b/tests/rpc/testdata/ravencoin.json new file mode 100644 index 00000000..059f807d --- /dev/null +++ b/tests/rpc/testdata/ravencoin.json @@ -0,0 +1,119 @@ +{ + "blockHeight": 707554, + "blockHash": "000000000000429dbd10e090e00384199e85555d501cfa47720e5261c66942a6", + "blockTime": 1557858845, + "blockTxs": [ + "194a89653371595337c306e559d71a94a72f3395c8801189cb396ce6330636cd", + "58ce37e86e5c17e3c08ef14c55d994aaf4c11003fd749aa597b141c89d22c582", + "9d3e19d6f147c362410fa361b0cae9690e8de1c727e7a99bc145e7d95580a314", + "739b0ef5a5d8314f84f61105b107b7534dc9748b288fcd06dc8087783ce26e20" + ], + "txDetails": { + "58ce37e86e5c17e3c08ef14c55d994aaf4c11003fd749aa597b141c89d22c582": { + "hex": "02000000025496421e6a3627ec4a5eab571ff22b3a1a5aa7555d48b7013976eef18443a115000000006a473044022027e2ef2d5057e03864373e6a3bbf8206af18bd64c817a42979f784688a703c4d02203230b32182046d01a16ea765f85219fd3ba8b2d731eb4a0446d968da170da5a5012102f721c9e757b10fe342869b92ba76c4fbcc74d634fc9536b9c068fc033488d655feffffff886c20d01cc0647f0bff7fea3506d88fd7a49dcc17de2938846f6a52055d1f6e800000006b483045022100cf6c8d2452c5f146e317a77ccafdf6cb516c3050f9d6e71d0d834db8a02d1cc7022041823ee041589a1fcdb43d5ce121cb6470506f6726a4f667d6d20af894a034260121035e5dfde430f2d5f832c4df4a9a251293b0ba29995aee49a6908586de22cbc8c3feffffff0295117782570600001976a9147f7d88fa55fab938161953faf6bd3d026cd078dc88acf2420f00000000001976a914e8fd48114696f4e6ee5b3e5d532c408a19f691b788ac92cb0a00", + "txid": "58ce37e86e5c17e3c08ef14c55d994aaf4c11003fd749aa597b141c89d22c582", + "blocktime": 1557858845, + "time": 1557858845, + "locktime": 707474, + "version": 2, + "vin": [ + { + "txid": "15a14384f1ee763901b7485d55a75a1a3a2bf21f57ab5e4aec27366a1e429654", + "vout": 0, + "sequence": 4294967294, + "scriptSig": { + "hex": "473044022027e2ef2d5057e03864373e6a3bbf8206af18bd64c817a42979f784688a703c4d02203230b32182046d01a16ea765f85219fd3ba8b2d731eb4a0446d968da170da5a5012102f721c9e757b10fe342869b92ba76c4fbcc74d634fc9536b9c068fc033488d655" + } + }, + { + "txid": "6e1f5d05526a6f843829de17cc9da4d78fd80635ea7fff0b7f64c01cd0206c88", + "vout": 128, + "sequence": 4294967294, + "scriptSig": { + "hex": "483045022100cf6c8d2452c5f146e317a77ccafdf6cb516c3050f9d6e71d0d834db8a02d1cc7022041823ee041589a1fcdb43d5ce121cb6470506f6726a4f667d6d20af894a034260121035e5dfde430f2d5f832c4df4a9a251293b0ba29995aee49a6908586de22cbc8c3" + } + } + ], + "vout": [ + { + "value": 69729.20762773, + "n": 0, + "scriptPubKey": { + "hex": "76a9147f7d88fa55fab938161953faf6bd3d026cd078dc88ac", + "addresses": [ + "RLuJHD2GRHzTbwc47Cg43oAJQZRMMVcU7S" + ] + } + }, + { + "value": 0.01000178, + "n": 1, + "scriptPubKey": { + "hex": "76a914e8fd48114696f4e6ee5b3e5d532c408a19f691b788ac", + "addresses": [ + "RWX8GL2MHTewUvEcJMwu1cSZEhrSitG9Nz" + ] + } + } + ] + }, + "9d3e19d6f147c362410fa361b0cae9690e8de1c727e7a99bc145e7d95580a314": { + "hex": "0200000004152c754032d6d014e21a10f68cd0d1f62b29ad3997bc637f434f513240a6393a370000006b483045022100f397fe990bc6871408a8178a4cac7afc27a989abd8dc32536d4b392e2d46d7d502205aafc72f6b76bfee3373da3786492c8d24107d1005751f25e6be4f8788d85a8e012103f8a3801f6e45a63821c41c8cd5baa1aca5760e2dac0edce67ea1721e3a63a35dfeffffff1d8cedc545c969e9fe0b74465c47081bc25d9c423a1668c9ede948c5627aa78f020000006a4730440220580ccb55105732dca7ae5e338c9d9af1651c1d8a9d167a0dfea41b977c38f67502205a5fe94fb9190a97f8bff5ee94e603323da36c0383a1d6fbf27b499bf900a24d012103f8a3801f6e45a63821c41c8cd5baa1aca5760e2dac0edce67ea1721e3a63a35dfeffffffb832371edbbd6ae9498ec3f33cc61333d1cfb0497f4600cbc0a05ceae82e39e7640000006b483045022100906a567b719038f7b5e0750e5c8ff4b1356dd28ecd867edfb7bf65623b50c64d02203bfe4bd0d08b4caff78112aa63bb4fbfb6804c428488dd5ac30266f0f2ba1fa9012103f8a3801f6e45a63821c41c8cd5baa1aca5760e2dac0edce67ea1721e3a63a35dfeffffffc20447c40b451c4ccb643863a3d06ecbf96681d8f5dace42a80a0e1b7627ec62660000006b483045022100e9912569e224fee0f9febfc1a9356918229461d323c891d93b21e2396bf8e3e2022053c814c6661b3fdabc838d0ea77585b9c340f659fbe902dc5cf7559939350756012103f8a3801f6e45a63821c41c8cd5baa1aca5760e2dac0edce67ea1721e3a63a35dfeffffff0269ef8a00000000001976a9148273705545d167297b7278503447d809d9e84b2e88ac003c9476520200001976a9147cf41bc3cdba1b8edf811877ab1cc9493847a3e488ace0cb0a00", + "txid": "9d3e19d6f147c362410fa361b0cae9690e8de1c727e7a99bc145e7d95580a314", + "blocktime": 1557858845, + "time": 1557858845, + "locktime": 707552, + "version": 2, + "vin": [ + { + "txid": "3a39a64032514f437f63bc9739ad292bf6d1d08cf6101ae214d0d63240752c15", + "vout": 55, + "sequence": 4294967294, + "scriptSig": { + "hex": "483045022100f397fe990bc6871408a8178a4cac7afc27a989abd8dc32536d4b392e2d46d7d502205aafc72f6b76bfee3373da3786492c8d24107d1005751f25e6be4f8788d85a8e012103f8a3801f6e45a63821c41c8cd5baa1aca5760e2dac0edce67ea1721e3a63a35d" + } + }, + { + "txid": "8fa77a62c548e9edc968163a429c5dc21b08475c46740bfee969c945c5ed8c1d", + "vout": 2, + "sequence": 4294967294, + "scriptSig": { + "hex": "4730440220580ccb55105732dca7ae5e338c9d9af1651c1d8a9d167a0dfea41b977c38f67502205a5fe94fb9190a97f8bff5ee94e603323da36c0383a1d6fbf27b499bf900a24d012103f8a3801f6e45a63821c41c8cd5baa1aca5760e2dac0edce67ea1721e3a63a35d" + } + }, + { + "txid": "e7392ee8ea5ca0c0cb00467f49b0cfd13313c63cf3c38e49e96abddb1e3732b8", + "vout": 100, + "sequence": 4294967294, + "scriptSig": { + "hex": "483045022100906a567b719038f7b5e0750e5c8ff4b1356dd28ecd867edfb7bf65623b50c64d02203bfe4bd0d08b4caff78112aa63bb4fbfb6804c428488dd5ac30266f0f2ba1fa9012103f8a3801f6e45a63821c41c8cd5baa1aca5760e2dac0edce67ea1721e3a63a35d" + } + }, + { + "txid": "62ec27761b0e0aa842cedaf5d88166f9cb6ed0a3633864cb4c1c450bc44704c2", + "vout": 102, + "sequence": 4294967294, + "scriptSig": { + "hex": "483045022100e9912569e224fee0f9febfc1a9356918229461d323c891d93b21e2396bf8e3e2022053c814c6661b3fdabc838d0ea77585b9c340f659fbe902dc5cf7559939350756012103f8a3801f6e45a63821c41c8cd5baa1aca5760e2dac0edce67ea1721e3a63a35d" + } + } + ], + "vout": [ + { + "value": 0.09105257, + "n": 0, + "scriptPubKey": { + "hex": "76a9148273705545d167297b7278503447d809d9e84b2e88ac" + } + }, + { + "value": 25532.00000000, + "n": 1, + "scriptPubKey": { + "hex": "76a9147cf41bc3cdba1b8edf811877ab1cc9493847a3e488ac" + } + } + ] + } + } +} diff --git a/tests/sync/testdata/ravencoin.json b/tests/sync/testdata/ravencoin.json new file mode 100644 index 00000000..84441c1e --- /dev/null +++ b/tests/sync/testdata/ravencoin.json @@ -0,0 +1,331 @@ +{ + "connectBlocks": { + "syncRanges": [ + {"lower": 702610, "upper": 702619}, + {"lower": 707540, "upper": 707548} + ], + "blocks": { + "702610": { + "height": 702610, + "hash": "00000000000042b3cd2d763d46320fc0a4fa973f11dec48f730da1992a1b4a19", + "noTxs": 6, + "txDetails": [ + { + "hex": "02000000026bba01cbc000c54057b8558ac0acae555638a8338d85c7553723ebeacf32578a000000006a473044022024103908c0cf880d0f58bd00a825bc2ded66b42626da62c594de95860385f0f3022005b9f5fa339fd236d777f7bad4058955b3d5792a0dbc44dfe855db2b9fb3d0d1012102c90a0c3a4e95987e7d9e8d1bf743707340ec876d478dcf42effcd1e9e77ecd34feffffffea8457394368f8cd3915a5aff8faf628d111b376af1a3f8bc34e36b807dac34a030000006a4730440220515cb94883c0823d66dac740beb68a1510c46471ca2eaab2924ccf79d5d1db470220644a5fe3972d2f3bda6e6a3744dbb233c6d3afae76d54722f0b84458ef488af4012102c90a0c3a4e95987e7d9e8d1bf743707340ec876d478dcf42effcd1e9e77ecd34feffffff02b21d842b050000001976a91493f0a84f3e4fdcfea587d0c68f6236ec4ba8c0db88ac005cb2ec220000001976a914ee121fca023b92d0369eeb3a9dae9de2610b287088ac90b80a00", + "txid": "32e7361f430957d58bc0e99ed0b115c673bc7c0755c92c925ba80802ad1182f5", + "blocktime": 1557559421, + "time": 1557559421, + "version": 2, + "vin": [ + { + "txid": "8a5732cfeaeb233755c7858d33a8385655aeacc08a55b85740c500c0cb01ba6b", + "vout": 0, + "sequence": 4294967294, + "scriptSig": { + "hex": "473044022024103908c0cf880d0f58bd00a825bc2ded66b42626da62c594de95860385f0f3022005b9f5fa339fd236d777f7bad4058955b3d5792a0dbc44dfe855db2b9fb3d0d1012102c90a0c3a4e95987e7d9e8d1bf743707340ec876d478dcf42effcd1e9e77ecd34" + } + }, + { + "txid": "4ac3da07b8364ec38b3f1aaf76b311d128f6faf8afa51539cdf86843395784ea", + "vout": 3, + "sequence": 4294967294, + "scriptSig": { + "hex": "4730440220515cb94883c0823d66dac740beb68a1510c46471ca2eaab2924ccf79d5d1db470220644a5fe3972d2f3bda6e6a3744dbb233c6d3afae76d54722f0b84458ef488af4012102c90a0c3a4e95987e7d9e8d1bf743707340ec876d478dcf42effcd1e9e77ecd34" + } + } + ], + "vout": [ + { + "value": 222.04915122, + "n": 0, + "scriptPubKey": { + "hex": "76a91493f0a84f3e4fdcfea587d0c68f6236ec4ba8c0db88ac" + } + }, + { + "value": 1500.00000000, + "n": 1, + "scriptPubKey": { + "hex": "76a914ee121fca023b92d0369eeb3a9dae9de2610b287088ac" + } + } + ] + }, + { + "hex": "020000000164e38b17ec20ca8a1071c100070e556cdb995b307040c8ac834e1b3e68dee349010000006b483045022100f161513ce7b96df7d772c1e34f71ce0515ff97d64c49cd3c1766406280adcd5802203b51e896b675f336b4600534ae67980b2193f6c39e1380facc7d69c34d0156060121021d06c7124eb7be62b3d4bf8f094510c29760a5f06c1b62c51c9f5df51857d27dfeffffff02e07866eb130000001976a914c889edba47f299e5a79dddbcad6fb9a1b566fc7888ac72abea26a40700001976a9141737a3b2e5b6e9e20067ec56f7db7d29014b1ce588ac91b80a00", + "txid": "2e9bd5cc2afa7f5b9de22b39149c4341bc189a7b9ef7df49876173bdbc85b802", + "blocktime": 1557559421, + "time": 1557559421, + "version": 2, + "vin": [ + { + "txid": "49e3de683e1b4e83acc84070305b99db6c550e0700c171108aca20ec178be364", + "vout": 1, + "sequence": 4294967294, + "scriptSig": { + "hex": "483045022100f161513ce7b96df7d772c1e34f71ce0515ff97d64c49cd3c1766406280adcd5802203b51e896b675f336b4600534ae67980b2193f6c39e1380facc7d69c34d0156060121021d06c7124eb7be62b3d4bf8f094510c29760a5f06c1b62c51c9f5df51857d27d" + } + } + ], + "vout": [ + { + "value": 855.5374000, + "n": 0, + "scriptPubKey": { + "hex": "76a914c889edba47f299e5a79dddbcad6fb9a1b566fc7888ac" + } + }, + { + "value": 84016.08944498, + "n": 1, + "scriptPubKey": { + "hex": "76a9141737a3b2e5b6e9e20067ec56f7db7d29014b1ce588ac" + } + } + ] + } + ] + }, + "702611": { + "height": 702611, + "hash": "0000000000001c8c9218bad5a338daa93d16695a2bbfd1d35c32aba8094ccc07", + "noTxs": 2, + "txDetails": [ + { + "hex": "02000000018f7a8b54bf2cc90ef51937601f63aa7bb9948a4891a8fdd970327efa86c3c6cf030000006b483045022100971099caabc08e507171f65648ea8d0b13ad1d0471479d4744cf2e41c02ab9aa0220652161d0cdd1d379249d2914c3ff2702680535647157c518ea7357d7cec0313a01210339ac9143c476ede4a7b39ec03d7b85b36c4d571ebe84f0d5caabb6948d34f43ffeffffff05b0da0e1e000000001976a914d1d3d3c7064a9aa29077f322b498b5ca6317bb5388ac3b3b740b090000001976a9142fdede3c1573c646ca13b59f4456b4e439a6ac3588ac6531e81f000000001976a9149d9bddb3e257cc565b775ac5147c8f74d1e2a9b788ac00d4121f000000001976a91407e5d84e1805d96781f9571095767f0103f68fda88ac72b85a22000000001976a914b5a99ad52450f8c2a8e81ab2cfa4e156936e3da888ac91b80a00", + "txid": "1579ab536518550f2fc71609b0c007ba6f78167ecc361362e3a4480357946598", + "blocktime": 1557559435, + "time": 1557559435, + "version": 2, + "vin": [ + { + "txid": "cfc6c386fa7e3270d9fda891488a94b97baa631f603719f50ec92cbf548b7a8f", + "vout": 3, + "sequence": 4294967295, + "scriptSig": { + "hex": "483045022100971099caabc08e507171f65648ea8d0b13ad1d0471479d4744cf2e41c02ab9aa0220652161d0cdd1d379249d2914c3ff2702680535647157c518ea7357d7cec0313a01210339ac9143c476ede4a7b39ec03d7b85b36c4d571ebe84f0d5caabb6948d34f43f" + } + } + ], + "vout": [ + { + "value": 5.04289968, + "n": 0, + "scriptPubKey": { + "hex": "76a914d1d3d3c7064a9aa29077f322b498b5ca6317bb5388ac" + } + }, + { + "value": 388.46872379, + "n": 1, + "scriptPubKey": { + "hex": "76a9142fdede3c1573c646ca13b59f4456b4e439a6ac3588ac" + } + }, + { + "value": 5.35310693, + "n": 2, + "scriptPubKey": { + "hex": "76a9149d9bddb3e257cc565b775ac5147c8f74d1e2a9b788ac" + } + }, + { + "value": 5.21327616, + "n": 3, + "scriptPubKey": { + "hex": "76a91407e5d84e1805d96781f9571095767f0103f68fda88ac" + } + }, + { + "value": 5.76370802, + "n": 4, + "scriptPubKey": { + "hex": "76a914b5a99ad52450f8c2a8e81ab2cfa4e156936e3da888ac" + } + } + ] + } + ] + }, + "702619": { + "height": 702619, + "hash": "00000000000009aa5f637d634a18b42d62ae820daa341b5386b29248e2a42356", + "noTxs": 3, + "txDetails": [ + { + "hex": "0200000001b93ae2aff06bc580e26331d6d59d2f3ae910cdc549993bb3a21acb53db3a50c80a0000006b483045022100d0083a5968774f7f01de6cc72f8fa04e458ea5ce4cccc58e73254966d8645cf9022056f10deaeaa44eb89f4b0204a16140a49237a1e79cd4d017837ab6719eb14959012102b1e1ef3235d31b84cbd22e0fd8c049202724e7e9382729ad2b881cda664639dcfeffffff03289d0ad5030000001976a91475fceb999dc2625360ad647894eec8f46882802a88ac50dc8956020000001976a9141cc4e68334b4a15aae8406ed296308c4f463d2ac88ac80d1cc67060000001976a914aedf3be432c995a5c054d102c16624b0e64bd04c88ac99b80a00", + "txid": "0d4774305ee1be1d88334218379bf0669004c416e828e6fdceafcd320612bc81", + "blocktime": 1557559657, + "time": 1557559657, + "version": 2, + "vin": [ + { + "txid": "c8503adb53cb1aa2b33b9949c5cd10e93a2f9dd5d63163e280c56bf0afe23ab9", + "vout": 10, + "sequence": 4294967294, + "scriptSig": { + "hex": "483045022100d0083a5968774f7f01de6cc72f8fa04e458ea5ce4cccc58e73254966d8645cf9022056f10deaeaa44eb89f4b0204a16140a49237a1e79cd4d017837ab6719eb14959012102b1e1ef3235d31b84cbd22e0fd8c049202724e7e9382729ad2b881cda664639dc" + } + } + ], + "vout": [ + { + "value": 164.59144488, + "n": 0, + "scriptPubKey": { + "hex": "76a91475fceb999dc2625360ad647894eec8f46882802a88ac" + } + }, + { + "value": 100.41810000, + "n": 1, + "scriptPubkey": { + "hex": "76a9141cc4e68334b4a15aae8406ed296308c4f463d2ac88ac" + } + }, + { + "value": 275.11280000, + "n": 2, + "scriptPubkey": { + "hex": "76a914aedf3be432c995a5c054d102c16624b0e64bd04c88ac" + } + } + ] + } + ] + }, + "707548": { + "height": 707548, + "hash": "0000000000001deb9c03419e16bcf4d3bba37a68eab17b1d9e80d833d59eaa2f", + "noTxs": 2, + "txDetails": [ + { + "hex": "020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1503ddcb0a044208db5c014f10509801000000000000ffffffff020088526a740000001976a914055594c199fafa48f6ba46a3ada7cfc3c9d6eb1d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "txid": "4e99215422b368329b7edc738461d9ee864fa9a9b95fcc2c07fa8b17cc0da49c", + "blocktime": 1557858226, + "time": 1557858226, + "version": 2, + "vin": [ + { + "txid": "d7924d630473a8ed5934db65c06e364e76f5237ca7673d38b6f2a8aa52c52997", + "vout": 0, + "sequence": 4294967295, + "scriptSig": { + "hex": "483045022100952c376e729d5d9f2973bb4ad305e370d6a3331e61e3b9f8831c25c7bbb47c6002201f7c43ddc733d8aee44df51f431a3a0ae473ce95a98597602e4a87bc9e3874870121039e0b146c77f4c85cef15c2f51ad18ffa3141e08ee3ea55a41af68408ecb5e458" + } + } + ], + "vout": [ + { + "value": 33.51362274, + "n": 0, + "scriptPubKey": { + "hex": "76a9142f366c3fddc3dc8ce4f9a2b97042f5bb6159a6ab88ac" + } + }, + { + "value": 10.10052689, + "n": 1, + "scriptPubKey": { + "hex": "76a9144e4802c29f3b6b3ab0a32ce6314efa1e069141cc88ac" + } + }, + { + "value": 800.26159654, + "n": 2, + "scriptPubKey": { + "hex": "76a914f72a0f212c006992e36e3d3cac889f3e1a5b12c288ac" + } + }, + { + "value": 8.59088871, + "n": 3, + "scriptPubKey": { + "hex": "76a91438e85a0dc5ae187322239d7cba044664cbc587f888ac" + } + }, + { + "value": 6.09864291, + "n": 4, + "scriptPubKey": { + "hex": "76a914cf349fa004830769fa76e698033f0a00777f1fc588ac" + } + }, + { + "value": 9.36995447, + "n": 5, + "scriptPubKey": { + "hex": "76a914f43058a7559aef593985759588695e0198ead7f688ac" + } + }, + { + "value": 6.90847110, + "n": 6, + "scriptPubKey": { + "hex": "76a9140484e38edeb95813ba2d0919493de1710a66189d88ac" + } + }, + { + "value": 7.45144308, + "n": 7, + "scriptPubKey": { + "hex": "76a914b9dd0d2742a248ceef9c88630cd9f8a00747076188ac" + } + } + ] + } + ] + } + } + }, + "handleFork": { + "syncRanges": [ + {"lower": 702610, "upper": 702619}, + {"lower": 707540, "upper": 707548} + ], + "fakeBlocks": { + "702617": { + "height": 702617, + "hash": "0000000000002934ba9dc2f595a159f59b658c27247186bc90fe06798fad141e" + }, + "702618": { + "height": 702618, + "hash": "000000000000605b9334525e1082de041c35c3bd25a62fe1cb73cdb241787884" + }, + "702619": { + "height": 702619, + "hash": "0000000000004cc962adcfa5380f3664a34df55ddef94bc27c59064890c29bea" + }, + "707547": { + "height": 707547, + "hash": "000000000000468a219597a5e99fafa3e9e9fafd4f52b1b3f09796b3cf8b0125" + }, + "707548": { + "height": 707548, + "hash": "000000000000111258e9313f60f56a809c2ec63b81373af4eb5c2c5b140aff12" + } + }, + "realBlocks": { + "702617": { + "height": 702617, + "hash": "000000000000208422f13be75d8e9dba367245ca11b5ce7a7a3d1f88ca31a2c4" + }, + "702618": { + "height": 702618, + "hash": "00000000000047cdfb5ecb000b59a9f7622280356008f9cc05e15321626528ff" + }, + "702619": { + "height": 702619, + "hash": "00000000000009aa5f637d634a18b42d62ae820daa341b5386b29248e2a42356" + }, + "707547": { + "height": 707547, + "hash": "00000000000031c13e3c865d5f7861f28aa02bf997716471f364db6b69b6244f" + }, + "707548": { + "height": 707548, + "hash": "0000000000001deb9c03419e16bcf4d3bba37a68eab17b1d9e80d833d59eaa2f" + } + } + } +} diff --git a/tests/tests.json b/tests/tests.json index 1185902c..a49a29b8 100644 --- a/tests/tests.json +++ b/tests/tests.json @@ -155,5 +155,10 @@ "rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync", "EstimateSmartFee", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"], "sync": ["ConnectBlocksParallel", "ConnectBlocks", "HandleFork"] + }, + "ravencoin": { + "rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync", + "EstimateSmartFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"], + "sync": ["ConnectBlocksParallel", "ConnectBlocks", "HandleFork"] } }