Support Polis (#118)
* Update .gitignore Intelij IDEA * Polis initial configuration * Remove polis-qt from excluded files * Fix * Update v1.4.10 * Test files * Fix * Add PackedTxInfo * Add Parsing Blocks test * Exclude polis-qt * Integration test data * Fixutxostat
parent
127d24be06
commit
f108559d7c
|
@ -12,4 +12,5 @@ build/ldb
|
|||
build/sst_dump
|
||||
build/*.deb
|
||||
.bin-image
|
||||
.deb-image
|
||||
.deb-image
|
||||
\.idea/
|
||||
|
|
|
@ -22,6 +22,7 @@ import (
|
|||
"blockbook/bchain/coins/namecoin"
|
||||
"blockbook/bchain/coins/nuls"
|
||||
"blockbook/bchain/coins/pivx"
|
||||
"blockbook/bchain/coins/polis"
|
||||
"blockbook/bchain/coins/qtum"
|
||||
"blockbook/bchain/coins/vertcoin"
|
||||
"blockbook/bchain/coins/xzc"
|
||||
|
@ -74,6 +75,7 @@ func init() {
|
|||
BlockChainFactories["Groestlcoin Testnet"] = grs.NewGroestlcoinRPC
|
||||
BlockChainFactories["PIVX"] = pivx.NewPivXRPC
|
||||
BlockChainFactories["PIVX Testnet"] = pivx.NewPivXRPC
|
||||
BlockChainFactories["Polis"] = polis.NewPolisRPC
|
||||
BlockChainFactories["Zcoin"] = xzc.NewZcoinRPC
|
||||
BlockChainFactories["Fujicoin"] = fujicoin.NewFujicoinRPC
|
||||
BlockChainFactories["Flo"] = flo.NewFloRPC
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
package polis
|
||||
|
||||
import (
|
||||
"blockbook/bchain/coins/btc"
|
||||
"github.com/martinboehm/btcd/wire"
|
||||
"github.com/martinboehm/btcutil/chaincfg"
|
||||
)
|
||||
|
||||
const (
|
||||
MainnetMagic wire.BitcoinNet = 0xbd6b0cbf
|
||||
TestnetMagic wire.BitcoinNet = 0xffcae2ce
|
||||
RegtestMagic wire.BitcoinNet = 0xdcb7c1fc
|
||||
)
|
||||
|
||||
var (
|
||||
MainNetParams chaincfg.Params
|
||||
TestNetParams chaincfg.Params
|
||||
RegtestParams chaincfg.Params
|
||||
)
|
||||
|
||||
func init() {
|
||||
MainNetParams = chaincfg.MainNetParams
|
||||
MainNetParams.Net = MainnetMagic
|
||||
|
||||
// Address encoding magics
|
||||
MainNetParams.PubKeyHashAddrID = []byte{55} // base58 prefix: P
|
||||
MainNetParams.ScriptHashAddrID = []byte{56} // base58 prefix: 3
|
||||
|
||||
TestNetParams = chaincfg.TestNet3Params
|
||||
TestNetParams.Net = TestnetMagic
|
||||
|
||||
// Address encoding magics
|
||||
TestNetParams.PubKeyHashAddrID = []byte{140} // base58 prefix: y
|
||||
TestNetParams.ScriptHashAddrID = []byte{19} // base58 prefix: 8 or 9
|
||||
|
||||
RegtestParams = chaincfg.RegressionNetParams
|
||||
RegtestParams.Net = RegtestMagic
|
||||
|
||||
// Address encoding magics
|
||||
RegtestParams.PubKeyHashAddrID = []byte{140} // base58 prefix: y
|
||||
RegtestParams.ScriptHashAddrID = []byte{19} // base58 prefix: 8 or 9
|
||||
}
|
||||
|
||||
// PolisParser handle
|
||||
type PolisParser struct {
|
||||
*btc.BitcoinParser
|
||||
}
|
||||
|
||||
// NewPolisParser returns new PolisParser instance
|
||||
func NewPolisParser(params *chaincfg.Params, c *btc.Configuration) *PolisParser {
|
||||
return &PolisParser{BitcoinParser: btc.NewBitcoinParser(params, c)}
|
||||
}
|
||||
|
||||
// GetChainParams contains network parameters for the main Polis network,
|
||||
// the regression test Polis network, the test Polis network and
|
||||
// the simulation test Polis 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
|
||||
}
|
||||
}
|
|
@ -0,0 +1,308 @@
|
|||
// +build unittest
|
||||
|
||||
package polis
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"blockbook/bchain"
|
||||
"blockbook/bchain/coins/btc"
|
||||
"encoding/hex"
|
||||
"io/ioutil"
|
||||
"math/big"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"testing"
|
||||
"github.com/martinboehm/btcutil/chaincfg"
|
||||
)
|
||||
|
||||
|
||||
type testBlock struct {
|
||||
size int
|
||||
time int64
|
||||
txs []string
|
||||
}
|
||||
|
||||
var testParseBlockTxs = map[int]testBlock{
|
||||
// Simple POW block
|
||||
50000: {
|
||||
size: 1393,
|
||||
time: 1520175937,
|
||||
txs: []string{
|
||||
"b68057244d6ad2df0017bad1cd8a24487e21404b52873c59876a484c93f5a69e",
|
||||
"3d27b82972196ecce604c2923bc9105cd683352fd56f8ba052dee57a296a2d71",
|
||||
"d22704ddad675d652a6b501694d9e026f19b41842946ea285490315cb944c674",
|
||||
"7be2e53414c9480ea1590e40cfa8361ac7594f7435f919a6eeff96367b0dffa9",
|
||||
"e2486a9610698888c4baad7001385e95aca053ab9fc7cc9d15280c9c835c975c",
|
||||
},
|
||||
},
|
||||
// Simple POS block
|
||||
280000: {
|
||||
size: 275,
|
||||
time: 1549070495,
|
||||
txs: []string{
|
||||
"9a820cb226364e852ec5d13bc3ead1ad127bf28ef2808919571200a1262b46b5",
|
||||
"fcca99e281fa0c43085dfe82c24b4367ff21d3a148539e781c061fe29a793ab1",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
c := m.Run()
|
||||
chaincfg.ResetParams()
|
||||
os.Exit(c)
|
||||
}
|
||||
|
||||
func helperLoadBlock(t *testing.T, height int) []byte {
|
||||
name := fmt.Sprintf("block_dump.%d", height)
|
||||
path := filepath.Join("testdata", name)
|
||||
|
||||
d, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
d = bytes.TrimSpace(d)
|
||||
|
||||
b := make([]byte, hex.DecodedLen(len(d)))
|
||||
_, err = hex.Decode(b, d)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
func TestParseBlock(t *testing.T) {
|
||||
p := NewPolisParser(GetChainParams("main"), &btc.Configuration{})
|
||||
|
||||
for height, tb := range testParseBlockTxs {
|
||||
b := helperLoadBlock(t, height)
|
||||
|
||||
blk, err := p.ParseBlock(b)
|
||||
if err != nil {
|
||||
t.Errorf("ParseBlock() error %v", err)
|
||||
}
|
||||
|
||||
if blk.Size != tb.size {
|
||||
t.Errorf("ParseBlock() block size: got %d, want %d", blk.Size, tb.size)
|
||||
}
|
||||
|
||||
if blk.Time != tb.time {
|
||||
t.Errorf("ParseBlock() block time: got %d, want %d", blk.Time, tb.time)
|
||||
}
|
||||
|
||||
if len(blk.Txs) != len(tb.txs) {
|
||||
t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(tb.txs))
|
||||
}
|
||||
|
||||
for ti, tx := range tb.txs {
|
||||
if blk.Txs[ti].Txid != tx {
|
||||
t.Errorf("ParseBlock() transaction %d: got %s, want %s", ti, blk.Txs[ti].Txid, tx)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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: "P9hRjWq6tMqhroxswc2f5jp2ND2py8YEnu"},
|
||||
want: "76a9140c26ca7967e6fe946f00bf81bcd3b86f43538edf88ac",
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
parser := NewPolisParser(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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_GetAddressesFromAddrDesc(t *testing.T) {
|
||||
type args struct {
|
||||
script string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want []string
|
||||
want2 bool
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "P2PKH1",
|
||||
args: args{script: "76a9140c26ca7967e6fe946f00bf81bcd3b86f43538edf88ac"},
|
||||
want: []string{"P9hRjWq6tMqhroxswc2f5jp2ND2py8YEnu"},
|
||||
want2: true,
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
|
||||
parser := NewPolisParser(GetChainParams("main"), &btc.Configuration{})
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
b, _ := hex.DecodeString(tt.args.script)
|
||||
got, got2, err := parser.GetAddressesFromAddrDesc(b)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("GetAddressesFromAddrDesc() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want)
|
||||
}
|
||||
if !reflect.DeepEqual(got2, tt.want2) {
|
||||
t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
testTx1 bchain.Tx
|
||||
testTxPacked1 = "0004e3868bca91b06e020000000198160d0ba0168003897358f1a6d2a2499a8e93dc6d341613b960ed2083de3fe0010000006b483045022100c531bd672ed3cb1a9285191ac168f1627e6075a54f5cf4a22ee8ec717b9a047f0220068241d9cc10adf1ddcc30aef4e62863d663af50371ebc639d11532ddf6e636e012102182bc5cd0a82c43c7ed9c4acc4b735e04e7f3275b43ff2514b8a1beb1feb5493feffffff021e470d8d0e0000001976a914344bf2db193190967d3b8da659a3ce2fde5f44a588acb63dd7a4300000001976a91414c343cae45bbcf7a27b8284b8c328587f6cc45588ac85e30400"
|
||||
)
|
||||
|
||||
func init() {
|
||||
testTx1 = bchain.Tx{
|
||||
Hex: "020000000198160d0ba0168003897358f1a6d2a2499a8e93dc6d341613b960ed2083de3fe0010000006b483045022100c531bd672ed3cb1a9285191ac168f1627e6075a54f5cf4a22ee8ec717b9a047f0220068241d9cc10adf1ddcc30aef4e62863d663af50371ebc639d11532ddf6e636e012102182bc5cd0a82c43c7ed9c4acc4b735e04e7f3275b43ff2514b8a1beb1feb5493feffffff021e470d8d0e0000001976a914344bf2db193190967d3b8da659a3ce2fde5f44a588acb63dd7a4300000001976a91414c343cae45bbcf7a27b8284b8c328587f6cc45588ac85e30400",
|
||||
Blocktime: 1554132023,
|
||||
Txid: "6882e77c916c5442d09e295b88fbb8a2fac6dbb988975bb00dbded088e0229a9",
|
||||
LockTime: 320389,
|
||||
Version: 2,
|
||||
Vin: []bchain.Vin{
|
||||
{
|
||||
ScriptSig: bchain.ScriptSig{
|
||||
Hex: "483045022100c531bd672ed3cb1a9285191ac168f1627e6075a54f5cf4a22ee8ec717b9a047f0220068241d9cc10adf1ddcc30aef4e62863d663af50371ebc639d11532ddf6e636e012102182bc5cd0a82c43c7ed9c4acc4b735e04e7f3275b43ff2514b8a1beb1feb5493",
|
||||
},
|
||||
Txid: "e03fde8320ed60b91316346ddc938e9a49a2d2a6f1587389038016a00b0d1698",
|
||||
Vout: 1,
|
||||
Sequence: 4294967294,
|
||||
},
|
||||
},
|
||||
Vout: []bchain.Vout{
|
||||
{
|
||||
ValueSat: *big.NewInt(62495999774),
|
||||
N: 0,
|
||||
ScriptPubKey: bchain.ScriptPubKey{
|
||||
Hex: "76a914344bf2db193190967d3b8da659a3ce2fde5f44a588ac",
|
||||
Addresses: []string{
|
||||
"PDMhGxFYTaomhzSqWKHbUzx7smYUZvZVjd",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
ValueSat: *big.NewInt(208923999670),
|
||||
N: 1,
|
||||
ScriptPubKey: bchain.ScriptPubKey{
|
||||
Hex: "76a91414c343cae45bbcf7a27b8284b8c328587f6cc45588ac",
|
||||
Addresses: []string{
|
||||
"PAUxb3g3DZNrjgbRidZy3NC9TNhVrPRzAR",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func Test_PackTx(t *testing.T) {
|
||||
type args struct {
|
||||
tx bchain.Tx
|
||||
height uint32
|
||||
blockTime int64
|
||||
parser *PolisParser
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "polis-1",
|
||||
args: args{
|
||||
tx: testTx1,
|
||||
height: 320390,
|
||||
blockTime: 1554132023,
|
||||
parser: NewPolisParser(GetChainParams("main"), &btc.Configuration{}),
|
||||
},
|
||||
want: testTxPacked1,
|
||||
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 *PolisParser
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want *bchain.Tx
|
||||
want1 uint32
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "polis-1",
|
||||
args: args{
|
||||
packedTx: testTxPacked1,
|
||||
parser: NewPolisParser(GetChainParams("main"), &btc.Configuration{}),
|
||||
},
|
||||
want: &testTx1,
|
||||
want1: 320390,
|
||||
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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
package polis
|
||||
|
||||
import (
|
||||
"blockbook/bchain"
|
||||
"blockbook/bchain/coins/btc"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/golang/glog"
|
||||
)
|
||||
|
||||
// PolisRPC is an interface to JSON-RPC bitcoind service.
|
||||
type PolisRPC struct {
|
||||
*btc.BitcoinRPC
|
||||
}
|
||||
|
||||
// NewPolisRPC returns new PolisRPC instance.
|
||||
func NewPolisRPC(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) {
|
||||
b, err := btc.NewBitcoinRPC(config, pushHandler)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s := &PolisRPC{
|
||||
b.(*btc.BitcoinRPC),
|
||||
}
|
||||
s.RPCMarshaler = btc.JSONMarshalerV1{}
|
||||
s.ChainConfig.SupportsEstimateSmartFee = false
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// Initialize initializes PolisRPC instance.
|
||||
func (b *PolisRPC) Initialize() error {
|
||||
chainName, err := b.GetChainInfoAndInitializeMempool(b)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
params := GetChainParams(chainName)
|
||||
|
||||
// always create parser
|
||||
b.Parser = NewPolisParser(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
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
00000020dfc2afd28e72a76db82a40793e13f5fb1f7a2b95c81bf1c388129cdbc3052f0f53556fd7ecd06002359e20f52a6b9bd08f94d2e4441256499ce46e91741dbb7e9ff0545c56b24c1c000000000202000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0603c045040101ffffffff01000000000000000000000000000200000001bc90c3dcec40ef8855c547d60145db719265e17067e9a9f9d1c94a38b0a8a4c30200000000ffffffff030000000000000000000030ff66000000001976a914ba364eade2f5a3b6068c30fcde08378eaa2ff29e88ac0020aa44000000001976a9147d7c5860b78c814f802012563eb79dc398b3b14688ac00000000
|
|
@ -0,0 +1 @@
|
|||
00000020df750da1e6ef1d07bacc08c386e7059b67bfb381395c7dfc9703000000000000f3f3e5d5ef207575e353dd7a1a59f18473a35a77419c5afae361d55709ad7892410b9c5ac176061a6c6b09400501000000010000000000000000000000000000000000000000000000000000000000000000ffffffff200350c30004410b9c5a0840056105567b02000d2f6e6f64655374726174756d2f0000000002f02a7515000000001976a9146629c9b161656be9637e0dd83153d7600084047b88acbfabd455000000001976a914f59d4ec7db19d17d6c43e75376ebb3848e0a24d288ac000000000100000003db65905855874c10d72d5a9b9e3fa7d541dae2240c9fe98028c63391847e930b010000006a473044022058fb25986162a2b59412d810b8ffe6100892599f6ecf82ce4293743ccc175c8f0220191855fc2ac4047db37784d5465a701a2d28f1f549bf359a26f684c9660d6cd40121036bb85d56ee2010121836af34dc42c4452895cddbfb5efb1211cde91cf267ef52feffffffe92f932936c37cc66e5cf2abe5e970ee2d64ec7873f1b06b7587f609ad6f5b6a010000006a47304402204d0159f20fee14b457f05e03cdacf0dcdbac332dbacd81712bb14e0c372450c4022022806cb0b8940f43a4af18a57b12c576fe135c1388eddc9e64e72875dba314e60121036bb85d56ee2010121836af34dc42c4452895cddbfb5efb1211cde91cf267ef52feffffffd38d7da8cb5576d58388e0d11a4c961a8a62ef7868488fe0a716139c0feffebd010000006b483045022100f2e12113349751239636e02c246bd4a6c636b2cc41e4e1dc3ec5a6db7fa02d0a022030c93a94c317a8ec1cf7ee9d437033b3c6dd97fa4b0deaeaa82cd9421941dfbb0121036bb85d56ee2010121836af34dc42c4452895cddbfb5efb1211cde91cf267ef52feffffff01c366b963000000001976a9141e1b579b13f646679ef8de4fee795830ea58d0f488ac4fc300000100000001f29f1bbf47d7052547f95413e81d6f9114a0d12e7cfc6272badcfaae672c27a9010000006a47304402202815ea3f59923df9d47ce70bc94387e838b43c2aa12a449222ede5849955db09022069588b99110035946dfb85f53be4316f21ed5e3321699e0d1c64ce2c07c60a2c012103424311c02421c52480177a3ecdc4c97d580798862fd490e821540b571abf7f79feffffff0260a50906000000001976a914a605e54f7c07dd797009e32d950f4d019ff5096e88ac3034040d000000001976a914af26b84931364f7eafbf86c5e4604e8b7e64a59d88ac4fc300000100000001f596f3280ee23d9f812a0983511e9ebe3508cfd6840a5810fe290a68dddff5d6000000006a47304402200ffe565761b4494b4d1cd8c535e816795f4f2be24f9667f454ab1eb905375fdb02202eb41f281cdd0f1ed17824c72926fe56c7508f93c2048ed5832913befa24ad2501210331ef0b98c08f2d0dbadbfb1262a330046e667f74d3a2d0428d51cba33cd068e8feffffff0278a62900000000001976a91495ec2efe8ce15ad80f92290cfa20f54e024f1d6388ac87acd902000000001976a914b024d8793d072b989b2d2f636f2494e98190bb5d88ac4fc300000100000001b0a5f838b6fd3d51ce2b48fc2c35fb4519be6332faf8979ba97d559727788bce000000006a4730440220089e42b35c10187e2e250abb4a448e044a0f24d7c7043b7f70acc54ec306903802206524b755d784ccadd9991a42e782412320566da925fb2492e6209be07d9a0011012102e9d115035383d4c97982642134104cdf580ea38eedbfeb2f836ef727e8cec869feffffff027c9c4d00000000001976a914ca23ff9efd82b1b0f2767573621908077bd9840588ac9537f007000000001976a914aedba9af0407cc64fbd4d3e9e715cc46e72105c088ac4fc30000
|
|
@ -0,0 +1,66 @@
|
|||
{
|
||||
"coin": {
|
||||
"name": "Polis",
|
||||
"shortcut": "POLIS",
|
||||
"label": "Polis",
|
||||
"alias": "polis"
|
||||
},
|
||||
"ports": {
|
||||
"backend_rpc": 8067,
|
||||
"backend_message_queue": 38367,
|
||||
"blockbook_internal": 9067,
|
||||
"blockbook_public": 9167
|
||||
},
|
||||
"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-polis",
|
||||
"package_revision": "satoshilabs-1",
|
||||
"system_user": "polis",
|
||||
"version": "1.4.10",
|
||||
"binary_url": "https://github.com/polispay/polis/releases/download/v1.4.10/poliscore-1.4.10-x86_64-linux-gnu.tar.gz",
|
||||
"verification_type": "sha256",
|
||||
"verification_source": "9688beeb4c789c2b20f4277f7363fcc986fb0e6cc75127179663272642fafcd3",
|
||||
"extract_command": "tar -C backend --strip 1 -xf",
|
||||
"exclude_files": [
|
||||
"bin/polis-qt"
|
||||
],
|
||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/polisd -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": {
|
||||
"mempoolexpiry": 72
|
||||
}
|
||||
},
|
||||
"blockbook": {
|
||||
"package_name": "blockbook-polis",
|
||||
"system_user": "blockbook-polis",
|
||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||
"explorer_url": "",
|
||||
"additional_params": "",
|
||||
"block_chain": {
|
||||
"parse": true,
|
||||
"subversion": "/Polis Core:1.4.10/",
|
||||
"mempool_workers": 8,
|
||||
"mempool_sub_workers": 2,
|
||||
"block_addresses_to_keep": 300,
|
||||
"additional_params": {}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"package_maintainer": "Cronos",
|
||||
"package_maintainer_email": "eabz@polispay.org"
|
||||
}
|
||||
}
|
|
@ -27,6 +27,7 @@
|
|||
| Bellcoin | 9052 | 9152 | 8052 | 38352 |
|
||||
| NULS | 9053 | 9153 | 8053 | 38353 |
|
||||
| Flo | 9066 | 9166 | 8066 | 38366 |
|
||||
| Polis | 9067 | 9167 | 8067 | 38367 |
|
||||
| Qtum | 9088 | 9188 | 8088 | 38388 |
|
||||
| Bitcoin Testnet | 19030 | 19130 | 18030 | 48330 |
|
||||
| Bitcoin Cash Testnet | 19031 | 19131 | 18031 | 48331 |
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
{
|
||||
"blockHeight": 308506,
|
||||
"blockHash": "7db10f77c97acf921cb57843b0155657b57de674cd914802ce3320f52d478dfe",
|
||||
"blockTime": 1552686920,
|
||||
"blockTxs": [
|
||||
"319a7c8bcec7951931b79eade2985362c41b827f3fd013dedfe9b1a96fa57a03",
|
||||
"7780a2a8fb2356ecfaaf556ff53ba93a46cdce3bd93be8256a7e304f404600bc",
|
||||
"17f243fa49f5316062d650b20ce37d6dd795e46ed9fd4f64c9b4ccf689915d9b",
|
||||
"72270d839f189d1193953e1450a31b620ba255a6d664c8a9a0386f8b8e2800f1"
|
||||
],
|
||||
"txDetails": {
|
||||
"17f243fa49f5316062d650b20ce37d6dd795e46ed9fd4f64c9b4ccf689915d9b": {
|
||||
"hex": "0200000001adc444b348621c06d881f6d1402fcb188316163c0c510d845b71cfc3a9ee1101010000006b483045022100e8378228debfddf315ebbc4a7455bfa3fceb8ae577c176e760f73c4be9ba781702201081481c27b72a9d2f8826f20e6289323276288a96181866821111c805d9305701210230ffa39fe697cc4d28d453ed84ed6545b9ce83a0863367b831dae54674488967ffffffff01f89bb0b0000000001976a914a738d8ab602e40c83c1d617aa3075b1954312d7988ac00000000",
|
||||
"txid": "17f243fa49f5316062d650b20ce37d6dd795e46ed9fd4f64c9b4ccf689915d9b",
|
||||
"blocktime": 1552686920,
|
||||
"time": 1552686920,
|
||||
"locktime": 0,
|
||||
"version": 2,
|
||||
"vin": [
|
||||
{
|
||||
"txid": "0111eea9c3cf715b840d510c3c16168318cb2f40d1f681d8061c6248b344c4ad",
|
||||
"vout": 1,
|
||||
"sequence": 4294967295,
|
||||
"scriptSig": {
|
||||
"hex": "483045022100e8378228debfddf315ebbc4a7455bfa3fceb8ae577c176e760f73c4be9ba781702201081481c27b72a9d2f8826f20e6289323276288a96181866821111c805d9305701210230ffa39fe697cc4d28d453ed84ed6545b9ce83a0863367b831dae54674488967"
|
||||
}
|
||||
}
|
||||
],
|
||||
"vout": [
|
||||
{
|
||||
"value": 29.64364280,
|
||||
"n": 0,
|
||||
"scriptPubKey": {
|
||||
"hex": "76a914a738d8ab602e40c83c1d617aa3075b1954312d7988ac"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
{
|
||||
"connectBlocks": {
|
||||
"syncRanges": [
|
||||
{"lower": 248706, "upper": 248726}
|
||||
],
|
||||
"blocks": {
|
||||
"300900": {
|
||||
"height": 300900,
|
||||
"hash": "427125bf9fe38a04cbe6e23b1ccfdd9aa9aec2e32350300e6f5e96ecd24926bb",
|
||||
"noTxs": 2,
|
||||
"txDetails": [
|
||||
{
|
||||
"hex": "02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff06036497040101ffffffff0100000000000000000000000000",
|
||||
"txid": "25144a48788e97f64aebb7c9f79452be07d45d212068b83f90787f657c8f4051",
|
||||
"version": 2,
|
||||
"vin": [
|
||||
{
|
||||
"coinbase": "036497040101",
|
||||
"sequence": 4294967295
|
||||
}
|
||||
],
|
||||
"vout": [
|
||||
{
|
||||
"value": 0.00000000,
|
||||
"n": 0,
|
||||
"scriptPubKey": {
|
||||
"hex": ""
|
||||
}
|
||||
}
|
||||
],
|
||||
"time": 1551720401,
|
||||
"blocktime": 1551720401
|
||||
},
|
||||
{
|
||||
"hex": "02000000013cfcafa26d96e9735ae5dacbe7ab9e3e1e13c472ac63bc27ac5ee4c799d20d9f0100000000ffffffff030000000000000000006ca53bdf0a0000001976a914e744aa894a8de0f200f8a00f58d2367c7523cae788ac0020aa44000000001976a914fec8380fd18ca3ad8c1c42938e102ee3ffac6fc188ac00000000",
|
||||
"txid": "5174a1980cee089ca868758ffd396d71e742f34d9c7bada21d294b54e6819a4f",
|
||||
"version": 2,
|
||||
"vin": [
|
||||
{
|
||||
"txid": "9f0dd299c7e45eac27bc63ac72c4131e3e9eabe7cbdae55a73e9966da2affc3c",
|
||||
"vout": 1,
|
||||
"scriptSig": {
|
||||
"hex": ""
|
||||
},
|
||||
"sequence": 4294967295
|
||||
}
|
||||
],
|
||||
"vout": [
|
||||
{
|
||||
"value": 0.00000000,
|
||||
"n": 0,
|
||||
"scriptPubKey": {
|
||||
"hex": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"value": 466.94901100,
|
||||
"n": 1,
|
||||
"scriptPubKey": {
|
||||
"hex": "76a914e744aa894a8de0f200f8a00f58d2367c7523cae788ac"
|
||||
}
|
||||
},
|
||||
{
|
||||
"value": 11.52000000,
|
||||
"n": 2,
|
||||
"scriptPubKey": {
|
||||
"hex": "76a914fec8380fd18ca3ad8c1c42938e102ee3ffac6fc188ac"
|
||||
}
|
||||
}
|
||||
],
|
||||
"time": 1551720401,
|
||||
"blocktime": 1551720401
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -116,6 +116,11 @@
|
|||
"EstimateSmartFee", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"],
|
||||
"sync": ["ConnectBlocksParallel", "ConnectBlocks", "HandleFork"]
|
||||
},
|
||||
"polis": {
|
||||
"rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync",
|
||||
"EstimateSmartFee", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"],
|
||||
"sync": ["ConnectBlocksParallel", "ConnectBlocks"]
|
||||
},
|
||||
"zcoin": {
|
||||
"rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync",
|
||||
"EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"],
|
||||
|
|
Loading…
Reference in New Issue