From 124dee84fa9c5faa577dcfbe4861d2d70c5025a3 Mon Sep 17 00:00:00 2001 From: ciripel <37701673+ciripel@users.noreply.github.com> Date: Sat, 11 Apr 2020 17:34:37 +0300 Subject: [PATCH 1/9] SnowGem Support (#342) * SnowGem Support * changed bynary_url to debian9.11 source The Debian Source contain also the fetch_params.sh * changed sha256 source * Fix integration tests config file after merge * Implemented snowgem parser * fixed paxkedTx * Fixed testdata tx hex Co-authored-by: Martin --- bchain/coins/blockchain.go | 2 + bchain/coins/snowgem/snowgemparser.go | 98 ++++++++ bchain/coins/snowgem/snowgemparser_test.go | 248 +++++++++++++++++++++ bchain/coins/snowgem/snowgemrpc.go | 115 ++++++++++ configs/coins/snowgem.json | 72 ++++++ docs/ports.md | 1 + docs/testing.md | 2 +- tests/rpc/testdata/snowgem.json | 150 +++++++++++++ tests/sync/testdata/snowgem.json | 239 ++++++++++++++++++++ tests/tests.json | 5 + 10 files changed, 931 insertions(+), 1 deletion(-) create mode 100644 bchain/coins/snowgem/snowgemparser.go create mode 100644 bchain/coins/snowgem/snowgemparser_test.go create mode 100644 bchain/coins/snowgem/snowgemrpc.go create mode 100644 configs/coins/snowgem.json create mode 100644 tests/rpc/testdata/snowgem.json create mode 100644 tests/sync/testdata/snowgem.json diff --git a/bchain/coins/blockchain.go b/bchain/coins/blockchain.go index e280dfba..2d9da669 100644 --- a/bchain/coins/blockchain.go +++ b/bchain/coins/blockchain.go @@ -34,6 +34,7 @@ import ( "blockbook/bchain/coins/qtum" "blockbook/bchain/coins/ravencoin" "blockbook/bchain/coins/ritocoin" + "blockbook/bchain/coins/snowgem" "blockbook/bchain/coins/unobtanium" "blockbook/bchain/coins/vertcoin" "blockbook/bchain/coins/viacoin" @@ -108,6 +109,7 @@ func init() { BlockChainFactories["CPUchain"] = cpuchain.NewCPUchainRPC BlockChainFactories["Unobtanium"] = unobtanium.NewUnobtaniumRPC BlockChainFactories["DeepOnion"] = deeponion.NewDeepOnionRPC + BlockChainFactories["SnowGem"] = snowgem.NewSnowGemRPC BlockChainFactories["Bitcore"] = bitcore.NewBitcoreRPC BlockChainFactories["Omotenashicoin"] = omotenashicoin.NewOmotenashiCoinRPC BlockChainFactories["Omotenashicoin Testnet"] = omotenashicoin.NewOmotenashiCoinRPC diff --git a/bchain/coins/snowgem/snowgemparser.go b/bchain/coins/snowgem/snowgemparser.go new file mode 100644 index 00000000..e320f5a3 --- /dev/null +++ b/bchain/coins/snowgem/snowgemparser.go @@ -0,0 +1,98 @@ +package snowgem + +import ( + "blockbook/bchain" + "blockbook/bchain/coins/btc" + + "github.com/martinboehm/btcd/wire" + "github.com/martinboehm/btcutil/chaincfg" +) + +const ( + // MainnetMagic is mainnet network constant + MainnetMagic wire.BitcoinNet = 0x6427c824 + // TestnetMagic is testnet network constant + TestnetMagic wire.BitcoinNet = 0xbff91afa + // RegtestMagic is regtest network constant + RegtestMagic wire.BitcoinNet = 0x5f3fe8aa +) + +var ( + // MainNetParams are parser parameters for mainnet + MainNetParams chaincfg.Params + // TestNetParams are parser parameters for testnet + TestNetParams chaincfg.Params + // RegtestParams are parser parameters for regtest + RegtestParams chaincfg.Params +) + +func init() { + MainNetParams = chaincfg.MainNetParams + MainNetParams.Net = MainnetMagic + + // Address encoding magics + MainNetParams.AddressMagicLen = 2 + MainNetParams.PubKeyHashAddrID = []byte{0x1C, 0x28} // base58 prefix: s1 + MainNetParams.ScriptHashAddrID = []byte{0x1C, 0x2D} // base58 prefix: s3 + + TestNetParams = chaincfg.TestNet3Params + TestNetParams.Net = TestnetMagic + + // Address encoding magics + TestNetParams.AddressMagicLen = 2 + TestNetParams.PubKeyHashAddrID = []byte{0x1D, 0x25} // base58 prefix: tm + TestNetParams.ScriptHashAddrID = []byte{0x1C, 0xBA} // base58 prefix: t2 + + RegtestParams = chaincfg.RegressionNetParams + RegtestParams.Net = RegtestMagic +} + +// SnowGemParser handle +type SnowGemParser struct { + *btc.BitcoinParser + baseparser *bchain.BaseParser +} + +// NewSnowGemParser returns new SnowGemParser instance +func NewSnowGemParser(params *chaincfg.Params, c *btc.Configuration) *SnowGemParser { + return &SnowGemParser{ + BitcoinParser: btc.NewBitcoinParser(params, c), + baseparser: &bchain.BaseParser{}, + } +} + +// GetChainParams contains network parameters for the main SnowGem network, +// the regression test SnowGem network, the test SnowGem network and +// the simulation test SnowGem network, in this order +func GetChainParams(chain string) *chaincfg.Params { + if !chaincfg.IsRegistered(&MainNetParams) { + err := chaincfg.Register(&MainNetParams) + if err == nil { + err = chaincfg.Register(&TestNetParams) + } + if err == nil { + err = chaincfg.Register(&RegtestParams) + } + if err != nil { + panic(err) + } + } + switch chain { + case "test": + return &TestNetParams + case "regtest": + return &RegtestParams + default: + return &MainNetParams + } +} + +// PackTx packs transaction to byte array using protobuf +func (p *SnowGemParser) PackTx(tx *bchain.Tx, height uint32, blockTime int64) ([]byte, error) { + return p.baseparser.PackTx(tx, height, blockTime) +} + +// UnpackTx unpacks transaction from protobuf byte array +func (p *SnowGemParser) UnpackTx(buf []byte) (*bchain.Tx, uint32, error) { + return p.baseparser.UnpackTx(buf) +} diff --git a/bchain/coins/snowgem/snowgemparser_test.go b/bchain/coins/snowgem/snowgemparser_test.go new file mode 100644 index 00000000..c7524191 --- /dev/null +++ b/bchain/coins/snowgem/snowgemparser_test.go @@ -0,0 +1,248 @@ +// +build unittest + +package snowgem + +import ( + "blockbook/bchain" + "blockbook/bchain/coins/btc" + "bytes" + "encoding/hex" + "math/big" + "os" + "reflect" + "testing" + + "github.com/martinboehm/btcutil/chaincfg" +) + +var ( + testTx1, testTx2 bchain.Tx + + testTxPacked1 = "0a20241803e368d7459f31286a155191ee386896d366d57c19d8e67a8f040d6ff71f12f4010400008085202f890119950c49d69b37d5f4fbb390d852387559e6a6d3fce9f390a409e4acf3f06381020000006a4730440220452aedf599e575598eb36d27ed98a6d388efda6e9be2bab96f16d0644e7df3060220669f4f3a4976ed73fa3ca9ecaad84dcf6ec35099c3bad631499985ea6a378d19012102ed9fb7fb61ec514be890ab45a925d554ff12050f099514251d5ebe904accc93ffeffffff02d3d0a146000000001976a9141a78c04d87f553545ba225b7bc7a271731f659d688ac7c54ae02000000001976a914b86f4b063545ebc2e80522a59d2dd206b707401b88aca68d0e00c58d0e00000000000000000000000018aba4b8ed0520a69b3a28b19b3a3298010a0012208163f0f3ace409a490f3e9fcd3a6e659753852d890b3fbf4d5379bd6490c95191802226a4730440220452aedf599e575598eb36d27ed98a6d388efda6e9be2bab96f16d0644e7df3060220669f4f3a4976ed73fa3ca9ecaad84dcf6ec35099c3bad631499985ea6a378d19012102ed9fb7fb61ec514be890ab45a925d554ff12050f099514251d5ebe904accc93f28feffffff0f3a480a0446a1d0d310001a1976a9141a78c04d87f553545ba225b7bc7a271731f659d688ac2223733150636953644665724a78665673397451353571446f3839695676466f7162436a7a3a480a0402ae547c10011a1976a914b86f4b063545ebc2e80522a59d2dd206b707401b88ac22237331653177736d6f7955625673794b726745374b73714c5164374c69755961685261524000" + testTxPacked2 = "0a2071dd4d998b0a711fe5ed21f8661ed27ca8b99afc488f5bbe149ec3c6492ec50312d2010400008085202f89017308714b21338783a435c5e420542a0f6243da5be6dc8bdf19e2d526a318d6a8000000006a47304402207ce5ebcb2dc5e8027b5d672babd2e6aaa186a917caf2b44eec63f7db16277b8b02207a89214d825fae08ebc86bca1f46579e770e830bd31b8101498207a2d901fd74012103c3fe8969a7b08f1d586a68da70d6aeff61aa3b4cbe7ca2cb5aae11529ca2af12feffffff014dd45023000000001976a914cef34ec02e80351cf4f9d63843fc79a77c9ab71888acaa8d0e00c98d0e00000000000000000000000018f9a6b8ed0520aa9b3a28b59b3a3298010a001220a8d618a326d5e219df8bdce65bda43620f2a5420e4c535a4838733214b7108731800226a47304402207ce5ebcb2dc5e8027b5d672babd2e6aaa186a917caf2b44eec63f7db16277b8b02207a89214d825fae08ebc86bca1f46579e770e830bd31b8101498207a2d901fd74012103c3fe8969a7b08f1d586a68da70d6aeff61aa3b4cbe7ca2cb5aae11529ca2af1228feffffff0f3a480a042350d44d10001a1976a914cef34ec02e80351cf4f9d63843fc79a77c9ab71888ac2223733167347a74585446447751326b506253385431666755334c645075666376354d764d4000" +) + +func init() { + testTx1 = bchain.Tx{ + Hex: "0400008085202f890119950c49d69b37d5f4fbb390d852387559e6a6d3fce9f390a409e4acf3f06381020000006a4730440220452aedf599e575598eb36d27ed98a6d388efda6e9be2bab96f16d0644e7df3060220669f4f3a4976ed73fa3ca9ecaad84dcf6ec35099c3bad631499985ea6a378d19012102ed9fb7fb61ec514be890ab45a925d554ff12050f099514251d5ebe904accc93ffeffffff02d3d0a146000000001976a9141a78c04d87f553545ba225b7bc7a271731f659d688ac7c54ae02000000001976a914b86f4b063545ebc2e80522a59d2dd206b707401b88aca68d0e00c58d0e000000000000000000000000", + Blocktime: 1571689003, + Time: 1571689003, + Txid: "241803e368d7459f31286a155191ee386896d366d57c19d8e67a8f040d6ff71f", + LockTime: 953766, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "4730440220452aedf599e575598eb36d27ed98a6d388efda6e9be2bab96f16d0644e7df3060220669f4f3a4976ed73fa3ca9ecaad84dcf6ec35099c3bad631499985ea6a378d19012102ed9fb7fb61ec514be890ab45a925d554ff12050f099514251d5ebe904accc93f", + }, + Txid: "8163f0f3ace409a490f3e9fcd3a6e659753852d890b3fbf4d5379bd6490c9519", + Vout: 2, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + ValueSat: *big.NewInt(1185009875), + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a9141a78c04d87f553545ba225b7bc7a271731f659d688ac", + Addresses: []string{ + "s1PciSdFerJxfVs9tQ55qDo89iVvFoqbCjz", + }, + }, + }, + { + ValueSat: *big.NewInt(44979324), + N: 1, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914b86f4b063545ebc2e80522a59d2dd206b707401b88ac", + Addresses: []string{ + "s1e1wsmoyUbVsyKrgE7KsqLQd7LiuYahRaR", + }, + }, + }, + }, + } + + testTx2 = bchain.Tx{ + Hex: "0400008085202f89017308714b21338783a435c5e420542a0f6243da5be6dc8bdf19e2d526a318d6a8000000006a47304402207ce5ebcb2dc5e8027b5d672babd2e6aaa186a917caf2b44eec63f7db16277b8b02207a89214d825fae08ebc86bca1f46579e770e830bd31b8101498207a2d901fd74012103c3fe8969a7b08f1d586a68da70d6aeff61aa3b4cbe7ca2cb5aae11529ca2af12feffffff014dd45023000000001976a914cef34ec02e80351cf4f9d63843fc79a77c9ab71888acaa8d0e00c98d0e000000000000000000000000", + Blocktime: 1571689337, + Time: 1571689337, + Txid: "71dd4d998b0a711fe5ed21f8661ed27ca8b99afc488f5bbe149ec3c6492ec503", + LockTime: 953770, + Vin: []bchain.Vin{ + { + ScriptSig: bchain.ScriptSig{ + Hex: "47304402207ce5ebcb2dc5e8027b5d672babd2e6aaa186a917caf2b44eec63f7db16277b8b02207a89214d825fae08ebc86bca1f46579e770e830bd31b8101498207a2d901fd74012103c3fe8969a7b08f1d586a68da70d6aeff61aa3b4cbe7ca2cb5aae11529ca2af12", + }, + Txid: "a8d618a326d5e219df8bdce65bda43620f2a5420e4c535a4838733214b710873", + Vout: 0, + Sequence: 4294967294, + }, + }, + Vout: []bchain.Vout{ + { + ValueSat: *big.NewInt(592499789), + N: 0, + ScriptPubKey: bchain.ScriptPubKey{ + Hex: "76a914cef34ec02e80351cf4f9d63843fc79a77c9ab71888ac", + Addresses: []string{ + "s1g4ztXTFDwQ2kPbS8T1fgU3LdPufcv5MvM", + }, + }, + }, + }, + } +} + +func TestMain(m *testing.M) { + c := m.Run() + chaincfg.ResetParams() + os.Exit(c) +} + +func TestGetAddrDesc(t *testing.T) { + type args struct { + tx bchain.Tx + parser *SnowGemParser + } + tests := []struct { + name string + args args + }{ + { + name: "snowgem-1", + args: args{ + tx: testTx1, + parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), + }, + }, + { + name: "snowgem-2", + args: args{ + tx: testTx2, + parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for n, vout := range tt.args.tx.Vout { + got1, err := tt.args.parser.GetAddrDescFromVout(&vout) + if err != nil { + t.Errorf("getAddrDescFromVout() error = %v, vout = %d", err, n) + return + } + got2, err := tt.args.parser.GetAddrDescFromAddress(vout.ScriptPubKey.Addresses[0]) + if err != nil { + t.Errorf("getAddrDescFromAddress() error = %v, vout = %d", err, n) + return + } + if !bytes.Equal(got1, got2) { + t.Errorf("Address descriptors mismatch: got1 = %v, got2 = %v", got1, got2) + } + } + }) + } +} + +func TestPackTx(t *testing.T) { + type args struct { + tx bchain.Tx + height uint32 + blockTime int64 + parser *SnowGemParser + } + tests := []struct { + name string + args args + want string + wantErr bool + }{ + { + name: "snowgem-1", + args: args{ + tx: testTx1, + height: 953777, + blockTime: 1571689003, + parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), + }, + want: testTxPacked1, + wantErr: false, + }, + { + name: "snowgem-2", + args: args{ + tx: testTx2, + height: 953781, + blockTime: 1571689337, + parser: NewSnowGemParser(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 TestUnpackTx(t *testing.T) { + type args struct { + packedTx string + parser *SnowGemParser + } + tests := []struct { + name string + args args + want *bchain.Tx + want1 uint32 + wantErr bool + }{ + { + name: "snowgem-1", + args: args{ + packedTx: testTxPacked1, + parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), + }, + want: &testTx1, + want1: 953777, + wantErr: false, + }, + { + name: "snowgem-2", + args: args{ + packedTx: testTxPacked2, + parser: NewSnowGemParser(GetChainParams("main"), &btc.Configuration{}), + }, + want: &testTx2, + want1: 953781, + 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/snowgem/snowgemrpc.go b/bchain/coins/snowgem/snowgemrpc.go new file mode 100644 index 00000000..0a6b11e4 --- /dev/null +++ b/bchain/coins/snowgem/snowgemrpc.go @@ -0,0 +1,115 @@ +package snowgem + +import ( + "blockbook/bchain" + "blockbook/bchain/coins/btc" + "encoding/json" + + "github.com/golang/glog" + "github.com/juju/errors" +) + +// SnowGemRPC is an interface to JSON-RPC bitcoind service +type SnowGemRPC struct { + *btc.BitcoinRPC +} + +// NewSnowGemRPC returns new SnowGemRPC instance +func NewSnowGemRPC(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) { + b, err := btc.NewBitcoinRPC(config, pushHandler) + if err != nil { + return nil, err + } + z := &SnowGemRPC{ + BitcoinRPC: b.(*btc.BitcoinRPC), + } + z.RPCMarshaler = btc.JSONMarshalerV1{} + z.ChainConfig.SupportsEstimateSmartFee = false + return z, nil +} + +// Initialize initializes SnowGemRPC instance +func (z *SnowGemRPC) Initialize() error { + ci, err := z.GetChainInfo() + if err != nil { + return err + } + chainName := ci.Chain + + params := GetChainParams(chainName) + + z.Parser = NewSnowGemParser(params, z.ChainConfig) + + // parameters for getInfo request + if params.Net == MainnetMagic { + z.Testnet = false + z.Network = "livenet" + } else { + z.Testnet = true + z.Network = "testnet" + } + + glog.Info("rpc: block chain ", params.Name) + + return nil +} + +// GetBlock returns block with given hash. +func (z *SnowGemRPC) GetBlock(hash string, height uint32) (*bchain.Block, error) { + var err error + if hash == "" && height > 0 { + hash, err = z.GetBlockHash(height) + if err != nil { + return nil, err + } + } + + glog.V(1).Info("rpc: getblock (verbosity=1) ", hash) + + res := btc.ResGetBlockThin{} + req := btc.CmdGetBlock{Method: "getblock"} + req.Params.BlockHash = hash + req.Params.Verbosity = 1 + err = z.Call(&req, &res) + + if err != nil { + return nil, errors.Annotatef(err, "hash %v", hash) + } + if res.Error != nil { + return nil, errors.Annotatef(res.Error, "hash %v", hash) + } + + txs := make([]bchain.Tx, 0, len(res.Result.Txids)) + for _, txid := range res.Result.Txids { + tx, err := z.GetTransaction(txid) + if err != nil { + if err == bchain.ErrTxNotFound { + glog.Errorf("rpc: getblock: skipping transanction in block %s due error: %s", hash, err) + continue + } + return nil, err + } + txs = append(txs, *tx) + } + block := &bchain.Block{ + BlockHeader: res.Result.BlockHeader, + Txs: txs, + } + return block, nil +} + +// GetTransactionForMempool returns a transaction by the transaction ID. +// It could be optimized for mempool, i.e. without block time and confirmations +func (z *SnowGemRPC) GetTransactionForMempool(txid string) (*bchain.Tx, error) { + return z.GetTransaction(txid) +} + +// GetMempoolEntry returns mempool data for given transaction +func (z *SnowGemRPC) GetMempoolEntry(txid string) (*bchain.MempoolEntry, error) { + return nil, errors.New("GetMempoolEntry: not implemented") +} + +func isErrBlockNotFound(err *bchain.RPCError) bool { + return err.Message == "Block not found" || + err.Message == "Block height out of range" +} diff --git a/configs/coins/snowgem.json b/configs/coins/snowgem.json new file mode 100644 index 00000000..0550ae34 --- /dev/null +++ b/configs/coins/snowgem.json @@ -0,0 +1,72 @@ +{ + "coin": { + "name": "SnowGem", + "shortcut": "XSG", + "label": "SnowGem", + "alias": "snowgem" + }, + "ports": { + "backend_rpc": 8062, + "backend_message_queue": 38362, + "blockbook_internal": 9062, + "blockbook_public": 9162 + }, + "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-snowgem", + "package_revision": "satoshilabs-1", + "system_user": "snowgem", + "version": "3.0.4-7", + "binary_url": "https://github.com/Snowgem/Snowgem/releases/download/v3000457-20190909/snowgem-debian9.11.0-3000457-20190926.zip", + "verification_type": "sha256", + "verification_source": "c5583bd31c8de86b19c481cf2c6445ebc1129e74fafc05e205064eb776ca96d3", + "extract_command": "unzip -j -d backend", + "exclude_files": [], + "exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/snowgemd -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": "HOME={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend {{.Env.BackendInstallPath}}/{{.Coin.Alias}}/fetch-params.sh", + "service_type": "forking", + "service_additional_params_template": "Environment=\"HOME={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend\"", + "protect_memory": false, + "mainnet": true, + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", + "additional_params": { + "addnode": [ + "seednode1.snowgem.org", + "seednode2.snowgem.org", + "seednode3.snowgem.org", + "explorer.snowgem.org", + "explorer1.snowgem.org", + "explorer2.snowgem.org" + ] + } + }, + "blockbook": { + "package_name": "blockbook-snowgem", + "system_user": "blockbook-snowgem", + "internal_binding_template": ":{{.Ports.BlockbookInternal}}", + "public_binding_template": ":{{.Ports.BlockbookPublic}}", + "explorer_url": "", + "additional_params": "", + "block_chain": { + "parse": true, + "mempool_workers": 4, + "mempool_sub_workers": 8, + "block_addresses_to_keep": 300, + "xpub_magic": 76067358, + "slip44": 410, + "additional_params": {} + } + }, + "meta": { + "package_maintainer": "Amitabha", + "package_maintainer_email": "nedelcu.alexandru@yahoo.com" + } +} diff --git a/docs/ports.md b/docs/ports.md index 9a2450f7..78293ccf 100644 --- a/docs/ports.md +++ b/docs/ports.md @@ -34,6 +34,7 @@ | Ravencoin | 9059 | 9159 | 8059 | 38359 | | Ritocoin | 9060 | 9160 | 8060 | 38360 | | Decred | 9061 | 9161 | 8061 | 38361 | +| SnowGem | 9062 | 9162 | 8062 | 38362 | | Flo | 9066 | 9166 | 8066 | 38366 | | Polis | 9067 | 9167 | 8067 | 38367 | | Qtum | 9088 | 9188 | 8088 | 38388 | diff --git a/docs/testing.md b/docs/testing.md index 3426a9e3..aa6de9ee 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -42,7 +42,7 @@ It perfectly fits with layered test definitions. For example, you can: * run tests for single coin – `make test-integration ARGS="-run=TestIntegration/bitcoin/"` * run single test suite – `make test-integration ARGS="-run=TestIntegration//sync/"` * run single test – `make test-integration ARGS="-run=TestIntegration//sync/HandleFork"` -* run tests for set of coins – `make test-integration ARGS="-run='TestIntegration/(bcash|bgold|bitcoin|dash|dogecoin|litecoin|vertcoin|zcash|zelcash)/'"` +* run tests for set of coins – `make test-integration ARGS="-run='TestIntegration/(bcash|bgold|bitcoin|dash|dogecoin|litecoin|snowgem|vertcoin|zcash|zelcash)/'"` Test fixtures are defined in *testdata* directory in package of particular test suite. They are separate JSON files named by coin. File schemes are very similar with verbose results of CLI tools and are described below. Integration tests diff --git a/tests/rpc/testdata/snowgem.json b/tests/rpc/testdata/snowgem.json new file mode 100644 index 00000000..67e4647e --- /dev/null +++ b/tests/rpc/testdata/snowgem.json @@ -0,0 +1,150 @@ +{ + "blockHeight":917888, + "blockHash":"00000662d02c2fcf3dd53f38a551db8e01e06cd1f6e26567cbaf1100208feba4", + "blockTime":1569520212, + "blockTxs":[ + "fbbd4595cc152ee19d3f160dccfca5af7589dfad8e5867e671b5ae8dfe434533", + "b1ab0b7bc4f30dea352ba6b641777d0ed6157027625aacb36da1c5eedc28e157", + "3d5b131f9e39070d595a89ac09426f62f8ea914e6af3a0ff0c592c9f9a9a68af", + "0fc8c13e18de2c4f95ce5651dd9386b75da679570c27d9b458cbe3e0340a71c3", + "fc192471f04051fcdf2669273c54c3ce75c472e312a2af0f885bd8bd8d718bf8" + ], + "txDetails":{ + "b1ab0b7bc4f30dea352ba6b641777d0ed6157027625aacb36da1c5eedc28e157":{ + "hex":"0400008085202f8901d79a4bae6a56937ddbe26fa44ad8eedc389a415fcbbf75a46ef1500cd0837e5d000000006a47304402207d7268375db5a1544368fa9a3c4e77244bc36c3ecf18b21a409f267f1436aac802202e0d7f4abafab362607d70c88a35cc50bfb4f5643d9f8d5208f5db0862946dd2012103af4c37554efb4420c42edc2f7a84e3e687dc050a832afb6ac5bcc12cfb903fbffeffffff0584f1f81f000000001976a914b38cf949ff45875224793172f8333c43e657e3e888aca61ef369000000001976a914559f99e0b3f83666cb0ef0b55c1c367b68e1d65988ac20d55023000000001976a9147a7b884e38d58bbfffbec0a0f0bee44336ca1e8a88ac205c5071000000001976a9149d0da224652d49091082f0b1c2e2b713cbceb47a88ac20d55023000000001976a91406a5e5f229d7bfd6b979747c92e6e1f6dcc95c3488ac74010e0093010e000000000000000000000000", + "txid":"b1ab0b7bc4f30dea352ba6b641777d0ed6157027625aacb36da1c5eedc28e157", + "blocktime":1569520212, + "time":1569520212, + "locktime":917876, + "version":4, + "vin":[ + { + "txid":"5d7e83d00c50f16ea475bfcb5f419a38dceed84aa46fe2db7d93566aae4b9ad7", + "vout":0, + "sequence":4294967294, + "n":0, + "scriptSig":{ + "hex":"47304402207d7268375db5a1544368fa9a3c4e77244bc36c3ecf18b21a409f267f1436aac802202e0d7f4abafab362607d70c88a35cc50bfb4f5643d9f8d5208f5db0862946dd2012103af4c37554efb4420c42edc2f7a84e3e687dc050a832afb6ac5bcc12cfb903fbf", + "asm":"304402207d7268375db5a1544368fa9a3c4e77244bc36c3ecf18b21a409f267f1436aac802202e0d7f4abafab362607d70c88a35cc50bfb4f5643d9f8d5208f5db0862946dd2[ALL] 03af4c37554efb4420c42edc2f7a84e3e687dc050a832afb6ac5bcc12cfb903fbf" + }, + "addr":"s1YHHWM4vUV6fDHv4CgUG2Uj3b2s9fe5FFw", + "valueZat":5400041445, + "value":54.00041445, + "doubleSpentTxID":null + } + ], + "vout":[ + { + "value":"5.36408452", + "n":0, + "scriptPubKey":{ + "hex":"76a914b38cf949ff45875224793172f8333c43e657e3e888ac", + "asm":"OP_DUP OP_HASH160 b38cf949ff45875224793172f8333c43e657e3e8 OP_EQUALVERIFY OP_CHECKSIG", + "addresses":[ + "s1da844qW7tuQvbtqMERetbCYuqnHwy5k9L" + ], + "type":"pubkeyhash" + } + }, + { + "value":"17.77540774", + "n":1, + "scriptPubKey":{ + "hex":"76a914559f99e0b3f83666cb0ef0b55c1c367b68e1d65988ac", + "asm":"OP_DUP OP_HASH160 559f99e0b3f83666cb0ef0b55c1c367b68e1d659 OP_EQUALVERIFY OP_CHECKSIG", + "addresses":[ + "s1V1UrHL8MFmUB8cEfrfaLhjxo8FA4D9w5W" + ], + "type":"pubkeyhash" + } + }, + { + "value":"5.92500000", + "n":2, + "scriptPubKey":{ + "hex":"76a9147a7b884e38d58bbfffbec0a0f0bee44336ca1e8a88ac", + "asm":"OP_DUP OP_HASH160 7a7b884e38d58bbfffbec0a0f0bee44336ca1e8a OP_EQUALVERIFY OP_CHECKSIG", + "addresses":[ + "s1YNNeHbZZW4biHAKj8G9HyA7QwHDrWPo7C" + ], + "type":"pubkeyhash" + } + }, + { + "value":"19.01091872", + "n":3, + "scriptPubKey":{ + "hex":"76a9149d0da224652d49091082f0b1c2e2b713cbceb47a88ac", + "asm":"OP_DUP OP_HASH160 9d0da224652d49091082f0b1c2e2b713cbceb47a OP_EQUALVERIFY OP_CHECKSIG", + "addresses":[ + "s1bXAe5ZFY69SH4NckixTFfJjYaApyCWzkb" + ], + "type":"pubkeyhash" + } + }, + { + "value":"5.92500000", + "n":4, + "scriptPubKey":{ + "hex":"76a91406a5e5f229d7bfd6b979747c92e6e1f6dcc95c3488ac", + "asm":"OP_DUP OP_HASH160 06a5e5f229d7bfd6b979747c92e6e1f6dcc95c34 OP_EQUALVERIFY OP_CHECKSIG", + "addresses":[ + "s1Mou1fHFBFDaW54DtBJFG6iYNKMe55gi8x" + ], + "type":"pubkeyhash" + } + } + ] + }, + "3d5b131f9e39070d595a89ac09426f62f8ea914e6af3a0ff0c592c9f9a9a68af":{ + "hex":"0400008085202f890156b8879f14dcc4290d211a0ff14b7e91e55c67e7e776bc84cd69d712c025eef9000000006a4730440220144962d60a9aa0ebcf588bd2e6e2318688638ebcd304ab6f8e1d885a8519584102204f7f79bc5a20d19e5cc8cb30d4a540abe6a4c5899687f8165ea4f2aecf37dfae01210249172fff41eb94f01fb91c40aa833a8f448dcb1e04a9ca4eda609448cd62f6a8feffffff02d3952606000000001976a9141b94f6e3fc8601a3d9c059548e880c50738603db88ac691e868c000000001976a914f1af4ea3681f7d71cb7eaf55d899b9b78b1e095f88ac75010e0094010e000000000000000000000000", + "txid":"3d5b131f9e39070d595a89ac09426f62f8ea914e6af3a0ff0c592c9f9a9a68af", + "blocktime":1569520212, + "time":1569520212, + "locktime":917877, + "version":4, + "vin":[ + { + "txid":"f9ee25c012d769cd84bc76e7e7675ce5917e4bf10f1a210d29c4dc149f87b856", + "vout":0, + "sequence":4294967294, + "n":0, + "scriptSig":{ + "hex":"4730440220144962d60a9aa0ebcf588bd2e6e2318688638ebcd304ab6f8e1d885a8519584102204f7f79bc5a20d19e5cc8cb30d4a540abe6a4c5899687f8165ea4f2aecf37dfae01210249172fff41eb94f01fb91c40aa833a8f448dcb1e04a9ca4eda609448cd62f6a8", + "asm":"30440220144962d60a9aa0ebcf588bd2e6e2318688638ebcd304ab6f8e1d885a8519584102204f7f79bc5a20d19e5cc8cb30d4a540abe6a4c5899687f8165ea4f2aecf37dfae[ALL] 0249172fff41eb94f01fb91c40aa833a8f448dcb1e04a9ca4eda609448cd62f6a8" + }, + "addr":"s1ikGwxJc6MTs3nWWc7ZTMMGLJtZwJwZedH", + "valueZat":2460792113, + "value":24.60792113, + "doubleSpentTxID":null + } + ], + "vout":[ + { + "value":"1.03192019", + "n":0, + "scriptPubKey":{ + "hex":"76a9141b94f6e3fc8601a3d9c059548e880c50738603db88ac", + "asm":"OP_DUP OP_HASH160 1b94f6e3fc8601a3d9c059548e880c50738603db OP_EQUALVERIFY OP_CHECKSIG", + "addresses":[ + "s1Piav7BuN4kn2AnTb4SdzkHQsw8UHQiu7n" + ], + "type":"pubkeyhash" + } + }, + { + "value":"23.57599849", + "n":1, + "scriptPubKey":{ + "hex":"76a914f1af4ea3681f7d71cb7eaf55d899b9b78b1e095f88ac", + "asm":"OP_DUP OP_HASH160 f1af4ea3681f7d71cb7eaf55d899b9b78b1e095f OP_EQUALVERIFY OP_CHECKSIG", + "addresses":[ + "s1jEf5VB8hseLWbw5HUUuSZnzYGQQBKi3nb" + ], + "type":"pubkeyhash" + } + } + ] + } + } +} diff --git a/tests/sync/testdata/snowgem.json b/tests/sync/testdata/snowgem.json new file mode 100644 index 00000000..2b24a403 --- /dev/null +++ b/tests/sync/testdata/snowgem.json @@ -0,0 +1,239 @@ +{ + "connectBlocks": { + "syncRanges": [ + { + "lower": 943331, + "upper": 943351 + } + ], + "blocks": { + "943349": { + "height": 943349, + "hash": "000007d5b11959867bf46720791a6799d83d87de9384d2f5f3f892bc52d8c281", + "noTxs": 10, + "txDetails": [ + { + "hex": "0400008085202f89025f30318bdb82c4a6a5ac5b870f171127ecfa508da040ba801bd0cad8be351427000000006b483045022100fc76eac8cf79322a4da3d7d2e097813b2d69546fbe0a1b6ef397b7ec15d0082f0220189f66e38da34ee8cd7d3345e7c04b461a0a51e4a7d24ada54d0f778a0e0623e012103c5431c6d472a228bd3e6e78bc26fa4b18b018a4c8043baa7364135376dfd8508feffffffea9069e91fa1abd7a937a92e1275b1ff0f0926c706ca43abfeaba664743e1af2030000006a473044022079fd5b5df1af2ce9ce9bcd2c135dd170d4efe21af3033955a6a545e61565d66002202199b916f6e114367ae1a315400f48366d5e108b90f442ca5124f0e8afd9804101210399d3bcde8bfae660708bd01fc0721e50ff0a3daa37b2145b2d1218e1bac59a47feffffff045c2c2813000000001976a91480eca29dfabef283f5018ba0897edf004c2b080188ac71b5760a000000001976a914ee71004bfceea3150b26677b6394363f224c7d7688acf39af204000000001976a9147abec94753493aa2605e98e9f793a556f962b26688ac146f4700000000001976a914d37c693d4e726e8856018fae6d5bc1a66a36bed388acea640e0009650e000000000000000000000000", + "txid": "bb3720854b9632491f9eeb47b51267acd42a7deef314fac8a82ab91be369ffcd", + "version": 4, + "vin":[ + { + "txid":"271435bed8cad01b80ba40a08d50faec2711170f875baca5a6c482db8b31305f", + "vout":0, + "sequence":4294967294, + "n":0, + "scriptSig":{ + "hex":"483045022100fc76eac8cf79322a4da3d7d2e097813b2d69546fbe0a1b6ef397b7ec15d0082f0220189f66e38da34ee8cd7d3345e7c04b461a0a51e4a7d24ada54d0f778a0e0623e012103c5431c6d472a228bd3e6e78bc26fa4b18b018a4c8043baa7364135376dfd8508", + "asm":"3045022100fc76eac8cf79322a4da3d7d2e097813b2d69546fbe0a1b6ef397b7ec15d0082f0220189f66e38da34ee8cd7d3345e7c04b461a0a51e4a7d24ada54d0f778a0e0623e[ALL] 03c5431c6d472a228bd3e6e78bc26fa4b18b018a4c8043baa7364135376dfd8508" + }, + "addr":"s1XpTwKfMfbgeDawaB62WCiDtqwcZh3CctP", + "valueZat":579980000, + "value":5.7998, + "doubleSpentTxID":null + }, + { + "txid":"f21a3e7464a6abfeab43ca06c726090fffb175122ea937a9d7aba11fe96990ea", + "vout":3, + "sequence":4294967294, + "n":1, + "scriptSig":{ + "hex":"473044022079fd5b5df1af2ce9ce9bcd2c135dd170d4efe21af3033955a6a545e61565d66002202199b916f6e114367ae1a315400f48366d5e108b90f442ca5124f0e8afd9804101210399d3bcde8bfae660708bd01fc0721e50ff0a3daa37b2145b2d1218e1bac59a47", + "asm":"3044022079fd5b5df1af2ce9ce9bcd2c135dd170d4efe21af3033955a6a545e61565d66002202199b916f6e114367ae1a315400f48366d5e108b90f442ca5124f0e8afd98041[ALL] 0399d3bcde8bfae660708bd01fc0721e50ff0a3daa37b2145b2d1218e1bac59a47" + }, + "addr":"s1NEhKJELW4RWbpGoDVmXQTQqo1ivktbnYU", + "valueZat":4661952, + "value":0.04661952, + "doubleSpentTxID":null + } + ], + "vout":[ +{ +"value":"3.21399900", +"n":0, +"scriptPubKey":{ +"hex":"76a91480eca29dfabef283f5018ba0897edf004c2b080188ac", +"asm":"OP_DUP OP_HASH160 80eca29dfabef283f5018ba0897edf004c2b0801 OP_EQUALVERIFY OP_CHECKSIG", +"addresses":[ +"s1YxSBxT1Wu6vzqgs1N6Hph7VLmRUPJNdZw" +], +"type":"pubkeyhash" +} +}, +{ +"value":"1.75551857", +"n":1, +"scriptPubKey":{ +"hex":"76a914ee71004bfceea3150b26677b6394363f224c7d7688ac", +"asm":"OP_DUP OP_HASH160 ee71004bfceea3150b26677b6394363f224c7d76 OP_EQUALVERIFY OP_CHECKSIG", +"addresses":[ +"s1iwWQp6dVVovMFyHfwJaUmxpZhrveDDzrK" +], +"type":"pubkeyhash" +} +}, +{ +"value":"0.83008243", +"n":2, +"scriptPubKey":{ +"hex":"76a9147abec94753493aa2605e98e9f793a556f962b26688ac", +"asm":"OP_DUP OP_HASH160 7abec94753493aa2605e98e9f793a556f962b266 OP_EQUALVERIFY OP_CHECKSIG", +"addresses":[ +"s1YPmDAQUhykLKjkGSvV7pxn28YL6mbKzce" +], +"type":"pubkeyhash" +} +}, +{ +"value":"0.04681492", +"n":3, +"scriptPubKey":{ +"hex":"76a914d37c693d4e726e8856018fae6d5bc1a66a36bed388ac", +"asm":"OP_DUP OP_HASH160 d37c693d4e726e8856018fae6d5bc1a66a36bed3 OP_EQUALVERIFY OP_CHECKSIG", +"addresses":[ +"s1gUyqQhV5ru7XvErupwxgxHH3Zkvv1c917" +], +"type":"pubkeyhash" +} +} +], + "blockhash": "000007d5b11959867bf46720791a6799d83d87de9384d2f5f3f892bc52d8c281", + "time": 1571060124, + "blocktime": 1571060124 + }, + { + "hex": "0400008085202f8902142080004eebe2717ecbd4c1c76f2be9ffa21852f1d01b119876f45e78d17702000000006a473044022078cee145819259dcd48c39ea775879f97376ac83dccd43169d3bfd0e1b366a46022041de61b262ea8c52c2f690369e01fdc2173d458a7b6301d18de9443a31f4033c0121031d8aa9aac23547fd74cc684b97b44522411c2dd46b2e5a976506e4fd03a6ddc4feffffff7cd5b3f717a0a47c417272fa89713ba2cdb02158ffb5b098086521a40817a852030000006b4830450221009eb6971b2987eb820876d0645c6356889d1c0c9da0cd27f21f10fa1b5012a4b6022008acfec60206c53d0a4cc07264887d995ab48b82f72806d02d415ccfb931bfc3012102325fcd6c5832bd35fd3a21deac58eac116a47e470a64e1c832abb761d2c34960feffffff046faa3b11000000001976a914c4add9b9b3821a8980429b5cca3d7e01b80372b988ac0189cb0c000000001976a914ee71004bfceea3150b26677b6394363f224c7d7688acf7121a00000000001976a914eed272078828027547346245251850b1b6227e0588ac39562305000000001976a9141e62bd8aabfa73997d2cf018255e2e981e50d7ce88acea640e0009650e000000000000000000000000", + "txid": "80a8b77f8dd5ce0d3a4a6d4b54219a6989d266eb4dabb9ee5de1b5252040a841", + "version": 4, + "vin":[ + { + "txid":"0277d1785ef47698111bd0f15218a2ffe92b6fc7c1d4cb7e71e2eb4e00802014", + "vout":0, + "sequence":4294967294, + "n":0, + "scriptSig":{ + "hex":"473044022078cee145819259dcd48c39ea775879f97376ac83dccd43169d3bfd0e1b366a46022041de61b262ea8c52c2f690369e01fdc2173d458a7b6301d18de9443a31f4033c0121031d8aa9aac23547fd74cc684b97b44522411c2dd46b2e5a976506e4fd03a6ddc4", + "asm":"3044022078cee145819259dcd48c39ea775879f97376ac83dccd43169d3bfd0e1b366a46022041de61b262ea8c52c2f690369e01fdc2173d458a7b6301d18de9443a31f4033c[ALL] 031d8aa9aac23547fd74cc684b97b44522411c2dd46b2e5a976506e4fd03a6ddc4" + }, + "addr":"s1dXDK6JqSjPXrtV7WUn4M91wJoYN4DyTzF", + "valueZat":589980000, + "value":5.8998, + "doubleSpentTxID":null + }, + { + "txid":"52a81708a421650898b0b5ff5821b0cda23b7189fa7272417ca4a017f7b3d57c", + "vout":3, + "sequence":4294967294, + "n":1, + "scriptSig":{ + "hex":"4830450221009eb6971b2987eb820876d0645c6356889d1c0c9da0cd27f21f10fa1b5012a4b6022008acfec60206c53d0a4cc07264887d995ab48b82f72806d02d415ccfb931bfc3012102325fcd6c5832bd35fd3a21deac58eac116a47e470a64e1c832abb761d2c34960", + "asm":"30450221009eb6971b2987eb820876d0645c6356889d1c0c9da0cd27f21f10fa1b5012a4b6022008acfec60206c53d0a4cc07264887d995ab48b82f72806d02d415ccfb931bfc3[ALL] 02325fcd6c5832bd35fd3a21deac58eac116a47e470a64e1c832abb761d2c34960" + }, + "addr":"s1YyURMT6a7KpKxmn8K8qqo7dJ1crpzMYSD", + "valueZat":1719564, + "value":0.01719564, + "doubleSpentTxID":null + } + ], + "vout":[ +{ +"value":"2.89122927", +"n":0, +"scriptPubKey":{ +"hex":"76a914c4add9b9b3821a8980429b5cca3d7e01b80372b988ac", +"asm":"OP_DUP OP_HASH160 c4add9b9b3821a8980429b5cca3d7e01b80372b9 OP_EQUALVERIFY OP_CHECKSIG", +"addresses":[ +"s1f8gveARasBFZA7yWLja6neqkysD2591wv" +], +"type":"pubkeyhash" +} +}, +{ +"value":"2.14665473", +"n":1, +"scriptPubKey":{ +"hex":"76a914ee71004bfceea3150b26677b6394363f224c7d7688ac", +"asm":"OP_DUP OP_HASH160 ee71004bfceea3150b26677b6394363f224c7d76 OP_EQUALVERIFY OP_CHECKSIG", +"addresses":[ +"s1iwWQp6dVVovMFyHfwJaUmxpZhrveDDzrK" +], +"type":"pubkeyhash" +} +}, +{ +"value":"0.01708791", +"n":2, +"scriptPubKey":{ +"hex":"76a914eed272078828027547346245251850b1b6227e0588ac", +"asm":"OP_DUP OP_HASH160 eed272078828027547346245251850b1b6227e05 OP_EQUALVERIFY OP_CHECKSIG", +"addresses":[ +"s1iyX9MnpyyZqHgVSC4QLDTfRD9TV5FPYPy" +], +"type":"pubkeyhash" +} +}, +{ +"value":"0.86201913", +"n":3, +"scriptPubKey":{ +"hex":"76a9141e62bd8aabfa73997d2cf018255e2e981e50d7ce88ac", +"asm":"OP_DUP OP_HASH160 1e62bd8aabfa73997d2cf018255e2e981e50d7ce OP_EQUALVERIFY OP_CHECKSIG", +"addresses":[ +"s1PyQn4FuzA7CMfmc1N48dZTT3v12vrmCJy" +], +"type":"pubkeyhash" +} +} +], + "blockhash": "000007d5b11959867bf46720791a6799d83d87de9384d2f5f3f892bc52d8c281", + "time": 1571060124, + "blocktime": 1571060124 + } + ] + } + } + }, + "handleFork": { + "syncRanges": [ + { + "lower": 943331, + "upper": 943351 + } + ], + "fakeBlocks": { + "943348": { + "height": 943348, + "hash": "000006ee20e7b5786deb6d85026c506dd6e8818595ad0294794696216d5f9ebb" + }, + "943349": { + "height": 943349, + "hash": "0000019cb463362807e0039d994be5aa1cd825a750d1247d2bdd2a02d5f928b5" + }, + "943350": { + "height": 943350, + "hash": "0000033273a875149c0f443c9857696a9c76244c60fc952d710b17647c139dfe" + }, + "943351": { + "height": 943351, + "hash": "000007228f8f328fae080b58d9953f8da05c51083dce5ca30d88fa986be43ea3" + } + }, + "realBlocks": { + "943348": { + "height": 943348, + "hash": "0000088a040ab7ce267433641c9c0589db78a0166e61b8fe1d9651944f76516e" + }, + "943349": { + "height": 943349, + "hash": "000007d5b11959867bf46720791a6799d83d87de9384d2f5f3f892bc52d8c281" + }, + "943350": { + "height": 943350, + "hash": "000000fe40bbd6dec887ef4dceea547fd28b8ece496e2c2202bfdff5da9f3462" + }, + "943351": { + "height": 943351, + "hash": "0000039f0e6e3b4be8ccfdbfd9758784a8258e09053a5270c0843fc7fa3788eb" + } + } + } +} \ No newline at end of file diff --git a/tests/tests.json b/tests/tests.json index da443d97..49ae8212 100644 --- a/tests/tests.json +++ b/tests/tests.json @@ -206,6 +206,11 @@ "GetBestBlockHash", "GetBestBlockHeight"], "sync": ["ConnectBlocksParallel", "ConnectBlocks"] }, + "snowgem": { + "rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync", + "EstimateSmartFee", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"], + "sync": ["ConnectBlocksParallel", "ConnectBlocks", "HandleFork"] + }, "omotenashicoin": { "rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync", "EstimateSmartFee", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight"], From 7eb4675f548b10c88430d1dacf07a6275715e50d Mon Sep 17 00:00:00 2001 From: Scotty0448 Date: Wed, 15 Apr 2020 17:18:05 -0600 Subject: [PATCH 2/9] Update Ravencoin support --- bchain/coins/ravencoin/ravencoinparser.go | 41 ++++---------- .../coins/ravencoin/ravencoinparser_test.go | 6 +- bchain/coins/ravencoin/ravencoinrpc.go | 55 ++++++++++++++++++- configs/coins/ravencoin.json | 6 +- 4 files changed, 71 insertions(+), 37 deletions(-) diff --git a/bchain/coins/ravencoin/ravencoinparser.go b/bchain/coins/ravencoin/ravencoinparser.go index f873d562..341f434b 100644 --- a/bchain/coins/ravencoin/ravencoinparser.go +++ b/bchain/coins/ravencoin/ravencoinparser.go @@ -3,8 +3,6 @@ package ravencoin import ( "blockbook/bchain" "blockbook/bchain/coins/btc" - "blockbook/bchain/coins/utils" - "bytes" "github.com/martinboehm/btcd/wire" "github.com/martinboehm/btcutil/chaincfg" @@ -37,11 +35,15 @@ func init() { // RavencoinParser handle type RavencoinParser struct { *btc.BitcoinParser + baseparser *bchain.BaseParser } // NewRavencoinParser returns new RavencoinParser instance func NewRavencoinParser(params *chaincfg.Params, c *btc.Configuration) *RavencoinParser { - return &RavencoinParser{BitcoinParser: btc.NewBitcoinParser(params, c)} + return &RavencoinParser{ + BitcoinParser: btc.NewBitcoinParser(params, c), + baseparser: &bchain.BaseParser{}, + } } // GetChainParams contains network parameters @@ -63,31 +65,12 @@ func GetChainParams(chain string) *chaincfg.Params { } } -// 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) - } +// PackTx packs transaction to byte array using protobuf +func (p *RavencoinParser) PackTx(tx *bchain.Tx, height uint32, blockTime int64) ([]byte, error) { + return p.baseparser.PackTx(tx, height, blockTime) +} - return &bchain.Block{ - BlockHeader: bchain.BlockHeader{ - Size: len(b), - Time: h.Timestamp.Unix(), - }, - Txs: txs, - }, nil +// UnpackTx unpacks transaction from protobuf byte array +func (p *RavencoinParser) UnpackTx(buf []byte) (*bchain.Tx, uint32, error) { + return p.baseparser.UnpackTx(buf) } diff --git a/bchain/coins/ravencoin/ravencoinparser_test.go b/bchain/coins/ravencoin/ravencoinparser_test.go index cbaa9305..f30d198f 100644 --- a/bchain/coins/ravencoin/ravencoinparser_test.go +++ b/bchain/coins/ravencoin/ravencoinparser_test.go @@ -74,16 +74,17 @@ func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { var ( testTx1 bchain.Tx - testTxPacked1 = "000a08848bcae7c30e0200000001c171348ffc8976074fa064e48598a816fce3798afc635fb67d99580e50b8e614000000006a473044022009e07574fa543ad259bd3334eb365c655c96d310c578b64c24d7f77fa7dc591c0220427d8ae6eacd1ca2d1994e9ec49cb322aacdde98e4bdb065e0fce81162fb3aa9012102d46827546548b9b47ae1e9e84fc4e53513e0987eeb1dd41220ba39f67d3bf46affffffff02f8137114000000001976a914587a2afa560ccaeaeb67cb72a0db7e2573a179e488ace0c48110000000001976a914d85e6ab66ab0b2c4cfd40ca3b0a779529da5799288ac00000000" + testTxPacked1 = "0a20d4d3a093586eae0c3668fd288d9e24955928a894c20b551b38dd18c99b123a7c12e1010200000001c171348ffc8976074fa064e48598a816fce3798afc635fb67d99580e50b8e614000000006a473044022009e07574fa543ad259bd3334eb365c655c96d310c578b64c24d7f77fa7dc591c0220427d8ae6eacd1ca2d1994e9ec49cb322aacdde98e4bdb065e0fce81162fb3aa9012102d46827546548b9b47ae1e9e84fc4e53513e0987eeb1dd41220ba39f67d3bf46affffffff02f8137114000000001976a914587a2afa560ccaeaeb67cb72a0db7e2573a179e488ace0c48110000000001976a914d85e6ab66ab0b2c4cfd40ca3b0a779529da5799288ac0000000018c7e1b3e5052000288491283298010a00122014e6b8500e58997db65f63fc8a79e3fc16a89885e464a04f077689fc8f3471c11800226a473044022009e07574fa543ad259bd3334eb365c655c96d310c578b64c24d7f77fa7dc591c0220427d8ae6eacd1ca2d1994e9ec49cb322aacdde98e4bdb065e0fce81162fb3aa9012102d46827546548b9b47ae1e9e84fc4e53513e0987eeb1dd41220ba39f67d3bf46a28ffffffff0f3a470a04147113f810001a1976a914587a2afa560ccaeaeb67cb72a0db7e2573a179e488ac222252484d31746d64766b6b3776446f69477877554a414d4e4e6d447179775a3574456e3a470a041081c4e010011a1976a914d85e6ab66ab0b2c4cfd40ca3b0a779529da5799288ac2222525631463939623955424272434d38614e4b7567737173444d3869716f4371374d744002" testTx2 bchain.Tx - testTxPacked2 = "000a08848bcae7c30e02000000029e2e14113b2f55726eebaa440edec707fcec3a31ce28fa125afea1e755fb6850010000006a47304402204034c3862f221551cffb2aa809f621f989a75cdb549c789a5ceb3a82c0bcc21c022001b4638f5d73fdd406a4dd9bf99be3dfca4a572b8f40f09b8fd495a7756c0db70121027a32ef45aef2f720ccf585f6fb0b8a7653db89cacc3320e5b385146851aba705fefffffff3b240ae32c542786876fcf23b4b2ab4c34ef077912898ee529756ed4ba35910000000006a47304402204d442645597b13abb85e96e5acd34eff50a4418822fe6a37ed378cdd24574dff02205ae667c56eab63cc45a51063f15b72136fd76e97c46af29bd28e8c4d405aa211012102cde27d7b29331ea3fef909a8d91f6f7753e99a3dd129914be50df26eed73fab3feffffff028447bf38000000001976a9146d7badec5426b880df25a3afc50e476c2423b34b88acb26b556a740000001976a914b3020d0ab85710151fa509d5d9a4e783903d681888ac83080a00" + testTxPacked2 = "0a208e480d5c1bf7f11d1cbe396ab7dc14e01ea4e1aff45de7c055924f61304ad43412f40202000000029e2e14113b2f55726eebaa440edec707fcec3a31ce28fa125afea1e755fb6850010000006a47304402204034c3862f221551cffb2aa809f621f989a75cdb549c789a5ceb3a82c0bcc21c022001b4638f5d73fdd406a4dd9bf99be3dfca4a572b8f40f09b8fd495a7756c0db70121027a32ef45aef2f720ccf585f6fb0b8a7653db89cacc3320e5b385146851aba705fefffffff3b240ae32c542786876fcf23b4b2ab4c34ef077912898ee529756ed4ba35910000000006a47304402204d442645597b13abb85e96e5acd34eff50a4418822fe6a37ed378cdd24574dff02205ae667c56eab63cc45a51063f15b72136fd76e97c46af29bd28e8c4d405aa211012102cde27d7b29331ea3fef909a8d91f6f7753e99a3dd129914be50df26eed73fab3feffffff028447bf38000000001976a9146d7badec5426b880df25a3afc50e476c2423b34b88acb26b556a740000001976a914b3020d0ab85710151fa509d5d9a4e783903d681888ac83080a0018c7e1b3e50520839128288491283298010a0012205068fb55e7a1fe5a12fa28ce313aecfc07c7de0e44aaeb6e72552f3b11142e9e1801226a47304402204034c3862f221551cffb2aa809f621f989a75cdb549c789a5ceb3a82c0bcc21c022001b4638f5d73fdd406a4dd9bf99be3dfca4a572b8f40f09b8fd495a7756c0db70121027a32ef45aef2f720ccf585f6fb0b8a7653db89cacc3320e5b385146851aba70528feffffff0f3298010a0012201059a34bed569752ee98289177f04ec3b42a4b3bf2fc76687842c532ae40b2f31800226a47304402204d442645597b13abb85e96e5acd34eff50a4418822fe6a37ed378cdd24574dff02205ae667c56eab63cc45a51063f15b72136fd76e97c46af29bd28e8c4d405aa211012102cde27d7b29331ea3fef909a8d91f6f7753e99a3dd129914be50df26eed73fab328feffffff0f3a470a0438bf478410001a1976a9146d7badec5426b880df25a3afc50e476c2423b34b88ac2222524b4735747057776a6874716464546741335168556837516d4b637576426e6842583a480a05746a556bb210011a1976a914b3020d0ab85710151fa509d5d9a4e783903d681888ac222252526268564d624c6675657a485077554d756a546d4446417a76363459396d4a71644002" ) func init() { testTx1 = bchain.Tx{ Hex: "0200000001c171348ffc8976074fa064e48598a816fce3798afc635fb67d99580e50b8e614000000006a473044022009e07574fa543ad259bd3334eb365c655c96d310c578b64c24d7f77fa7dc591c0220427d8ae6eacd1ca2d1994e9ec49cb322aacdde98e4bdb065e0fce81162fb3aa9012102d46827546548b9b47ae1e9e84fc4e53513e0987eeb1dd41220ba39f67d3bf46affffffff02f8137114000000001976a914587a2afa560ccaeaeb67cb72a0db7e2573a179e488ace0c48110000000001976a914d85e6ab66ab0b2c4cfd40ca3b0a779529da5799288ac00000000", Blocktime: 1554837703, + Time: 1554837703, Txid: "d4d3a093586eae0c3668fd288d9e24955928a894c20b551b38dd18c99b123a7c", LockTime: 0, Version: 2, @@ -124,6 +125,7 @@ func init() { testTx2 = bchain.Tx{ Hex: "02000000029e2e14113b2f55726eebaa440edec707fcec3a31ce28fa125afea1e755fb6850010000006a47304402204034c3862f221551cffb2aa809f621f989a75cdb549c789a5ceb3a82c0bcc21c022001b4638f5d73fdd406a4dd9bf99be3dfca4a572b8f40f09b8fd495a7756c0db70121027a32ef45aef2f720ccf585f6fb0b8a7653db89cacc3320e5b385146851aba705fefffffff3b240ae32c542786876fcf23b4b2ab4c34ef077912898ee529756ed4ba35910000000006a47304402204d442645597b13abb85e96e5acd34eff50a4418822fe6a37ed378cdd24574dff02205ae667c56eab63cc45a51063f15b72136fd76e97c46af29bd28e8c4d405aa211012102cde27d7b29331ea3fef909a8d91f6f7753e99a3dd129914be50df26eed73fab3feffffff028447bf38000000001976a9146d7badec5426b880df25a3afc50e476c2423b34b88acb26b556a740000001976a914b3020d0ab85710151fa509d5d9a4e783903d681888ac83080a00", Blocktime: 1554837703, + Time: 1554837703, Txid: "8e480d5c1bf7f11d1cbe396ab7dc14e01ea4e1aff45de7c055924f61304ad434", LockTime: 657539, Version: 2, diff --git a/bchain/coins/ravencoin/ravencoinrpc.go b/bchain/coins/ravencoin/ravencoinrpc.go index 2eeccd18..45f186b3 100644 --- a/bchain/coins/ravencoin/ravencoinrpc.go +++ b/bchain/coins/ravencoin/ravencoinrpc.go @@ -6,6 +6,7 @@ import ( "encoding/json" "github.com/golang/glog" + "github.com/juju/errors" ) // RavencoinRPC is an interface to JSON-RPC bitcoind service. @@ -23,7 +24,7 @@ func NewRavencoinRPC(config json.RawMessage, pushHandler func(bchain.Notificatio s := &RavencoinRPC{ b.(*btc.BitcoinRPC), } - s.RPCMarshaler = btc.JSONMarshalerV1{} + s.RPCMarshaler = btc.JSONMarshalerV2{} s.ChainConfig.SupportsEstimateFee = false return s, nil @@ -36,8 +37,6 @@ func (b *RavencoinRPC) Initialize() error { return err } chainName := ci.Chain - - glog.Info("Chain name ", chainName) params := GetChainParams(chainName) // always create parser @@ -56,3 +55,53 @@ func (b *RavencoinRPC) Initialize() error { return nil } + +// GetBlock returns block with given hash. +func (b *RavencoinRPC) GetBlock(hash string, height uint32) (*bchain.Block, error) { + var err error + if hash == "" && height > 0 { + hash, err = b.GetBlockHash(height) + if err != nil { + return nil, err + } + } + + glog.V(1).Info("rpc: getblock (verbosity=1) ", hash) + + res := btc.ResGetBlockThin{} + req := btc.CmdGetBlock{Method: "getblock"} + req.Params.BlockHash = hash + req.Params.Verbosity = 1 + err = b.Call(&req, &res) + + if err != nil { + return nil, errors.Annotatef(err, "hash %v", hash) + } + if res.Error != nil { + return nil, errors.Annotatef(res.Error, "hash %v", hash) + } + + txs := make([]bchain.Tx, 0, len(res.Result.Txids)) + for _, txid := range res.Result.Txids { + tx, err := b.GetTransaction(txid) + if err != nil { + if err == bchain.ErrTxNotFound { + glog.Errorf("rpc: getblock: skipping transaction in block %s due to error: %s", hash, err) + continue + } + return nil, err + } + txs = append(txs, *tx) + } + block := &bchain.Block{ + BlockHeader: res.Result.BlockHeader, + Txs: txs, + } + return block, nil +} + +// GetTransactionForMempool returns a transaction by the transaction ID. +// It could be optimized for mempool, i.e. without block time and confirmations +func (b *RavencoinRPC) GetTransactionForMempool(txid string) (*bchain.Tx, error) { + return b.GetTransaction(txid) +} diff --git a/configs/coins/ravencoin.json b/configs/coins/ravencoin.json index c6e55a05..991bc697 100644 --- a/configs/coins/ravencoin.json +++ b/configs/coins/ravencoin.json @@ -22,10 +22,10 @@ "package_name": "backend-ravencoin", "package_revision": "satoshilabs-1", "system_user": "ravencoin", - "version": "3.3.1.0", - "binary_url": "https://github.com/RavenProject/Ravencoin/releases/download/v3.3.1/raven-3.3.1.0-x86_64-linux-gnu.tar.gz", + "version": "4.0.0.0", + "binary_url": "https://github.com/RavenProject/Ravencoin/releases/download/v4.0.0/raven-4.0.0.0-x86_64-linux-gnu.tar.gz", "verification_type": "sha256", - "verification_source": "92387c207dead51d1c7e726f06ee1e51a4c4ff6bc1be7735c11576c3c6b3c3a9", + "verification_source": "938d64bc16483699ff62c01fcdc536dc62e5a599e4d0a646f11a6823f9a4c5c0", "extract_command": "tar -C backend --strip 1 -xf", "exclude_files": [ "bin/raven-qt" From ea6a7e0db69483347eaf8a1c4cb2d4e50e399422 Mon Sep 17 00:00:00 2001 From: Dehumanizer77 Date: Thu, 16 Apr 2020 08:49:14 +0200 Subject: [PATCH 3/9] etc: Bump backend 1.11.1 -> 1.11.2 --- configs/coins/ethereum-classic.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configs/coins/ethereum-classic.json b/configs/coins/ethereum-classic.json index 46a9903c..a757c788 100644 --- a/configs/coins/ethereum-classic.json +++ b/configs/coins/ethereum-classic.json @@ -19,10 +19,10 @@ "package_name": "backend-ethereum-classic", "package_revision": "satoshilabs-1", "system_user": "ethereum-classic", - "version": "1.11.1", - "binary_url": "https://github.com/etclabscore/core-geth/releases/download/v1.11.1/core-geth-linux.zip", + "version": "1.11.2", + "binary_url": "https://github.com/etclabscore/core-geth/releases/download/v1.11.2/core-geth-linux-v1.11.2.zip", "verification_type": "sha256", - "verification_source": "db4b232de315ea66786158a1f0b8324474781fc4afe2c5435be0514988a88aa1", + "verification_source": "593ebe30cf7161d8c085fa8ca4e6438028159bc09d30f89a5525faa25dd7aa64", "extract_command": "unzip -d backend", "exclude_files": [], "exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --classic --ipcdisable --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port 38337 --ws --wsaddr 0.0.0.0 --wsport {{.Ports.BackendRPC}} --wsorigins \"*\" --rpc --rpcport 8137 -rpcaddr 0.0.0.0 --rpccorsdomain \"*\" 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'", From ddd981a40544139ea8c10772e182183c759c78b0 Mon Sep 17 00:00:00 2001 From: Adam Collier Date: Tue, 14 Apr 2020 23:52:14 +0100 Subject: [PATCH 4/9] Add in xpub magic to vertcoin testnet --- configs/coins/vertcoin_testnet.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/configs/coins/vertcoin_testnet.json b/configs/coins/vertcoin_testnet.json index 3136ef2a..db52e4d5 100644 --- a/configs/coins/vertcoin_testnet.json +++ b/configs/coins/vertcoin_testnet.json @@ -53,6 +53,10 @@ "mempool_workers": 8, "mempool_sub_workers": 2, "block_addresses_to_keep": 300, + "xpub_magic": 70617039, + "xpub_magic_segwit_p2sh": 71979618, + "xpub_magic_segwit_native": 73342198, + "slip44": 1, "additional_params": {} } }, From 42bc7d2ba3aba412261f8663c059d4b7cbbe1f01 Mon Sep 17 00:00:00 2001 From: Dehumanizer77 Date: Thu, 30 Apr 2020 09:36:25 +0200 Subject: [PATCH 5/9] eth (+testnet): Bump backend 1.9.11->1.9.13 --- configs/coins/ethereum.json | 6 +++--- configs/coins/ethereum_testnet_ropsten.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/configs/coins/ethereum.json b/configs/coins/ethereum.json index 805c4ed3..33cf4145 100644 --- a/configs/coins/ethereum.json +++ b/configs/coins/ethereum.json @@ -21,10 +21,10 @@ "package_name": "backend-ethereum", "package_revision": "satoshilabs-1", "system_user": "ethereum", - "version": "1.9.11-6a62fe39", - "binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.11-6a62fe39.tar.gz", + "version": "1.9.13-cbc4ac26", + "binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.13-cbc4ac26.tar.gz", "verification_type": "gpg", - "verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.11-6a62fe39.tar.gz.asc", + "verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.13-cbc4ac26.tar.gz.asc", "extract_command": "tar -C backend --strip 1 -xf", "exclude_files": [], "exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --ipcdisable --syncmode full --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port 38336 --ws --wsaddr 0.0.0.0 --wsport {{.Ports.BackendRPC}} --wsorigins \"*\" --rpc --rpcport 8136 -rpcaddr 0.0.0.0 --rpccorsdomain \"*\" --rpcvhosts \"*\" 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'", diff --git a/configs/coins/ethereum_testnet_ropsten.json b/configs/coins/ethereum_testnet_ropsten.json index 117838ec..62a95617 100644 --- a/configs/coins/ethereum_testnet_ropsten.json +++ b/configs/coins/ethereum_testnet_ropsten.json @@ -20,10 +20,10 @@ "package_name": "backend-ethereum-testnet-ropsten", "package_revision": "satoshilabs-1", "system_user": "ethereum", - "version": "1.9.11-6a62fe39", - "binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.11-6a62fe39.tar.gz", + "version": "1.9.13-cbc4ac26", + "binary_url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.13-cbc4ac26.tar.gz", "verification_type": "gpg", - "verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.11-6a62fe39.tar.gz.asc", + "verification_source": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.13-cbc4ac26.tar.gz.asc", "extract_command": "tar -C backend --strip 1 -xf", "exclude_files": [], "exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/geth --testnet --syncmode full --ipcdisable --cache 1024 --nat none --datadir {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend --port 48336 --ws --wsaddr 0.0.0.0 --wsport {{.Ports.BackendRPC}} --wsorigins \"*\" 2>>{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'", From 945827c330795c38e3c1a3f7b74024634d44a0c6 Mon Sep 17 00:00:00 2001 From: Dehumanizer77 Date: Thu, 30 Apr 2020 09:46:42 +0200 Subject: [PATCH 6/9] vtc (+testnet): Bump backend 0.14.0->0.15.0.1 --- configs/coins/vertcoin.json | 6 +++--- configs/coins/vertcoin_testnet.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/configs/coins/vertcoin.json b/configs/coins/vertcoin.json index 216c744c..fbb287d1 100644 --- a/configs/coins/vertcoin.json +++ b/configs/coins/vertcoin.json @@ -22,10 +22,10 @@ "package_name": "backend-vertcoin", "package_revision": "satoshilabs-1", "system_user": "vertcoin", - "version": "0.14.0", - "binary_url": "https://github.com/vertcoin-project/vertcoin-core/releases/download/0.14.0/vertcoind-v0.14.0-linux-amd64.zip", + "version": "0.15.0.1", + "binary_url": "https://github.com/vertcoin-project/vertcoin-core/releases/download/0.15.0.1/vertcoind-v0.15.0.1-linux-amd64.zip", "verification_type": "gpg", - "verification_source": "https://github.com/vertcoin-project/vertcoin-core/releases/download/0.14.0/vertcoind-v0.14.0-linux-amd64.zip.sig", + "verification_source": "https://github.com/vertcoin-project/vertcoin-core/releases/download/0.15.0.1/vertcoind-v0.15.0.1-linux-amd64.zip.sig", "extract_command": "unzip -d backend", "exclude_files": [], "exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/vertcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid", diff --git a/configs/coins/vertcoin_testnet.json b/configs/coins/vertcoin_testnet.json index db52e4d5..54f32bcb 100644 --- a/configs/coins/vertcoin_testnet.json +++ b/configs/coins/vertcoin_testnet.json @@ -22,10 +22,10 @@ "package_name": "backend-vertcoin-testnet", "package_revision": "satoshilabs-1", "system_user": "vertcoin", - "version": "0.14.0", - "binary_url": "https://github.com/vertcoin-project/vertcoin-core/releases/download/0.14.0/vertcoind-v0.14.0-linux-amd64.zip", + "version": "0.15.0.1", + "binary_url": "https://github.com/vertcoin-project/vertcoin-core/releases/download/0.15.0.1/vertcoind-v0.15.0.1-linux-amd64.zip", "verification_type": "gpg", - "verification_source": "https://github.com/vertcoin-project/vertcoin-core/releases/download/0.14.0/vertcoind-v0.14.0-linux-amd64.zip.sig", + "verification_source": "https://github.com/vertcoin-project/vertcoin-core/releases/download/0.15.0.1/vertcoind-v0.15.0.1-linux-amd64.zip.sig", "extract_command": "unzip -d backend", "exclude_files": [], "exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/vertcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid", From f97d23590ccb8c17abd1eca97e80c256a1b9b1c1 Mon Sep 17 00:00:00 2001 From: Dehumanizer77 Date: Thu, 30 Apr 2020 09:47:45 +0200 Subject: [PATCH 7/9] zec (+testnet): Bump backend 2.1.1-1->2.1.2 --- configs/coins/zcash.json | 6 +++--- configs/coins/zcash_testnet.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/configs/coins/zcash.json b/configs/coins/zcash.json index bb2b6ac3..71d6aaf9 100644 --- a/configs/coins/zcash.json +++ b/configs/coins/zcash.json @@ -22,10 +22,10 @@ "package_name": "backend-zcash", "package_revision": "satoshilabs-1", "system_user": "zcash", - "version": "2.1.1-1", - "binary_url": "https://z.cash/downloads/zcash-2.1.1-1-linux64-debian-stretch.tar.gz", + "version": "2.1.2", + "binary_url": "https://z.cash/downloads/zcash-2.1.2-linux64-debian-stretch.tar.gz", "verification_type": "sha256", - "verification_source": "15780d5b34cc0f9536d85d7c424b9788327e0881d0c503ef9f8dc277b2e2a4ff", + "verification_source": "e9cea9fc252d12444b30fa9a66aeb8375845ec11764ecc52b56f31e5c61b775c", "extract_command": "tar -C backend --strip 1 -xf", "exclude_files": [], "exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/zcashd -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid", diff --git a/configs/coins/zcash_testnet.json b/configs/coins/zcash_testnet.json index 25b27a39..5d15b651 100644 --- a/configs/coins/zcash_testnet.json +++ b/configs/coins/zcash_testnet.json @@ -22,10 +22,10 @@ "package_name": "backend-zcash-testnet", "package_revision": "satoshilabs-1", "system_user": "zcash", - "version": "2.1.1-1", - "binary_url": "https://z.cash/downloads/zcash-2.1.1-1-linux64-debian-stretch.tar.gz", + "version": "2.1.2", + "binary_url": "https://z.cash/downloads/zcash-2.1.2-linux64-debian-stretch.tar.gz", "verification_type": "sha256", - "verification_source": "15780d5b34cc0f9536d85d7c424b9788327e0881d0c503ef9f8dc277b2e2a4ff", + "verification_source": "e9cea9fc252d12444b30fa9a66aeb8375845ec11764ecc52b56f31e5c61b775c", "extract_command": "tar -C backend --strip 1 -xf", "exclude_files": [], "exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/zcashd -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid", From a6fd137283d0355a7795b433d3fc30f48d6faa71 Mon Sep 17 00:00:00 2001 From: Scotty0448 Date: Fri, 1 May 2020 10:55:59 -0600 Subject: [PATCH 8/9] Bump Ravencoin backend to 4.1.0.0 --- configs/coins/ravencoin.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configs/coins/ravencoin.json b/configs/coins/ravencoin.json index 991bc697..60c07da6 100644 --- a/configs/coins/ravencoin.json +++ b/configs/coins/ravencoin.json @@ -22,10 +22,10 @@ "package_name": "backend-ravencoin", "package_revision": "satoshilabs-1", "system_user": "ravencoin", - "version": "4.0.0.0", - "binary_url": "https://github.com/RavenProject/Ravencoin/releases/download/v4.0.0/raven-4.0.0.0-x86_64-linux-gnu.tar.gz", + "version": "4.1.0.0", + "binary_url": "https://github.com/RavenProject/Ravencoin/releases/download/v4.1.0/raven-4.1.0.0-x86_64-linux-gnu.tar.gz", "verification_type": "sha256", - "verification_source": "938d64bc16483699ff62c01fcdc536dc62e5a599e4d0a646f11a6823f9a4c5c0", + "verification_source": "b586bcb289ed6fb30e14dd1ac7ea6f1f896c37d368f48dcebee359d2fb64768b", "extract_command": "tar -C backend --strip 1 -xf", "exclude_files": [ "bin/raven-qt" From 828e10b62936f77091d4b53fa1b465cc7408b14c Mon Sep 17 00:00:00 2001 From: Martin Boehm Date: Sat, 2 May 2020 17:24:56 +0200 Subject: [PATCH 9/9] Parsing of ERC20 name, symbol and decimals in different format #400 --- bchain/coins/eth/erc20.go | 26 ++++++++++++++------------ bchain/coins/eth/erc20_test.go | 10 ++++++++++ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/bchain/coins/eth/erc20.go b/bchain/coins/eth/erc20.go index 6903d1e4..6a7739b0 100644 --- a/bchain/coins/eth/erc20.go +++ b/bchain/coins/eth/erc20.go @@ -145,24 +145,26 @@ func parseErc20StringProperty(contractDesc bchain.AddressDescriptor, data string n := parseErc20NumericProperty(contractDesc, data[64:128]) if n != nil { l := n.Uint64() - if 2*int(l) <= len(data)-128 { + if l > 0 && 2*int(l) <= len(data)-128 { b, err := hex.DecodeString(data[128 : 128+2*l]) if err == nil { return string(b) } } } - } else if len(data) == 64 { - // allow string properties as 32 bytes of UTF-8 data - b, err := hex.DecodeString(data) - if err == nil { - i := bytes.Index(b, []byte{0}) - if i > 0 { - b = b[:i] - } - if utf8.Valid(b) { - return string(b) - } + } + // allow string properties as UTF-8 data + b, err := hex.DecodeString(data) + if err == nil { + i := bytes.Index(b, []byte{0}) + if i > 32 { + i = 32 + } + if i > 0 { + b = b[:i] + } + if utf8.Valid(b) { + return string(b) } } if glog.V(1) { diff --git a/bchain/coins/eth/erc20_test.go b/bchain/coins/eth/erc20_test.go index 0a12738b..64f4236e 100644 --- a/bchain/coins/eth/erc20_test.go +++ b/bchain/coins/eth/erc20_test.go @@ -138,6 +138,16 @@ func TestErc20_parseErc20StringProperty(t *testing.T) { args: "0x44616920537461626c65636f696e2076312e3020444444444444444444444444", want: "Dai Stablecoin v1.0 DDDDDDDDDDDD", }, + { + name: "long", + args: "0x556e6973776170205631000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + want: "Uniswap V1", + }, + { + name: "garbage", + args: "0x2234880850896048596206002535425366538144616734015984380565810000", + want: "", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {