Add support for PIVX

Co-Authored-By: Emil Karlsson <emil.karl@gmail.com>
pull/105/head
rikardwissing 2019-01-04 22:09:55 +01:00
parent c2a581ea72
commit 24bedfec26
12 changed files with 1164 additions and 0 deletions

View File

@ -16,6 +16,7 @@ import (
"blockbook/bchain/coins/monacoin"
"blockbook/bchain/coins/myriad"
"blockbook/bchain/coins/namecoin"
"blockbook/bchain/coins/pivx"
"blockbook/bchain/coins/vertcoin"
"blockbook/bchain/coins/zec"
"blockbook/common"
@ -61,6 +62,7 @@ func init() {
BlockChainFactories["Liquid"] = liquid.NewLiquidRPC
BlockChainFactories["Groestlcoin"] = grs.NewGroestlcoinRPC
BlockChainFactories["Groestlcoin Testnet"] = grs.NewGroestlcoinRPC
BlockChainFactories["PIVX"] = pivx.NewPivXRPC
}
// GetCoinNameFromConfig gets coin name and coin shortcut from config file

View File

@ -0,0 +1,256 @@
package pivx
import (
"blockbook/bchain"
"blockbook/bchain/coins/btc"
"blockbook/bchain/coins/utils"
"bytes"
"io"
"encoding/hex"
"encoding/json"
"math/big"
"github.com/martinboehm/btcd/blockchain"
"github.com/martinboehm/btcd/wire"
"github.com/martinboehm/btcutil/chaincfg"
"github.com/juju/errors"
)
const (
MainnetMagic wire.BitcoinNet = 0x90c4fde9
)
var (
MainNetParams chaincfg.Params
)
func init() {
MainNetParams = chaincfg.MainNetParams
MainNetParams.Net = MainnetMagic
MainNetParams.PubKeyHashAddrID = []byte{30}
MainNetParams.ScriptHashAddrID = []byte{13}
MainNetParams.PrivateKeyID = []byte{212}
}
// PivXParser handle
type PivXParser struct {
*btc.BitcoinParser
baseparser *bchain.BaseParser
BitcoinOutputScriptToAddressesFunc btc.OutputScriptToAddressesFunc
}
// NewPivXParser returns new PivXParser instance
func NewPivXParser(params *chaincfg.Params, c *btc.Configuration) *PivXParser {
p := &PivXParser{
BitcoinParser: btc.NewBitcoinParser(params, c),
baseparser: &bchain.BaseParser{},
}
p.BitcoinOutputScriptToAddressesFunc = p.OutputScriptToAddressesFunc
p.OutputScriptToAddressesFunc = p.outputScriptToAddresses
return p
}
// GetChainParams contains network parameters for the main PivX network
func GetChainParams(chain string) *chaincfg.Params {
if !chaincfg.IsRegistered(&MainNetParams) {
err := chaincfg.Register(&MainNetParams)
if err != nil {
panic(err)
}
}
return &MainNetParams
}
// ParseBlock parses raw block to our Block struct
func (p *PivXParser) 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, errors.Annotatef(err, "Deserialize")
}
if (h.Version > 3) {
// Skip past AccumulatorCheckpoint which was added in pivx block version 4
_, err = r.Seek(32, io.SeekCurrent)
}
err = utils.DecodeTransactions(r, 0, wire.WitnessEncoding, &w)
if err != nil {
return nil, errors.Annotatef(err, "DecodeTransactions")
}
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
}
// PackTx packs transaction to byte array using protobuf
func (p *PivXParser) 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 *PivXParser) UnpackTx(buf []byte) (*bchain.Tx, uint32, error) {
return p.baseparser.UnpackTx(buf)
}
// ParseTx parses byte array containing transaction and returns Tx struct
func (p *PivXParser) ParseTx(b []byte) (*bchain.Tx, error) {
t := wire.MsgTx{}
r := bytes.NewReader(b)
if err := t.Deserialize(r); err != nil {
return nil, err
}
tx := p.TxFromMsgTx(&t, true)
tx.Hex = hex.EncodeToString(b)
return &tx, nil
}
// Parses tx and adds handling for OP_ZEROCOINSPEND inputs
func (p *PivXParser) TxFromMsgTx(t *wire.MsgTx, parseAddresses bool) bchain.Tx {
vin := make([]bchain.Vin, len(t.TxIn))
for i, in := range t.TxIn {
// extra check to not confuse Tx with single OP_ZEROCOINSPEND input as a coinbase Tx
if (!isZeroCoinSpendScript(in.SignatureScript) && blockchain.IsCoinBaseTx(t)) {
vin[i] = bchain.Vin{
Coinbase: hex.EncodeToString(in.SignatureScript),
Sequence: in.Sequence,
}
break
}
s := bchain.ScriptSig{
Hex: hex.EncodeToString(in.SignatureScript),
// missing: Asm,
}
txid := in.PreviousOutPoint.Hash.String()
vin[i] = bchain.Vin{
Txid: txid,
Vout: in.PreviousOutPoint.Index,
Sequence: in.Sequence,
ScriptSig: s,
}
}
vout := make([]bchain.Vout, len(t.TxOut))
for i, out := range t.TxOut {
addrs := []string{}
if parseAddresses {
addrs, _, _ = p.OutputScriptToAddressesFunc(out.PkScript)
}
s := bchain.ScriptPubKey{
Hex: hex.EncodeToString(out.PkScript),
Addresses: addrs,
// missing: Asm,
// missing: Type,
}
var vs big.Int
vs.SetInt64(out.Value)
vout[i] = bchain.Vout{
ValueSat: vs,
N: uint32(i),
ScriptPubKey: s,
}
}
tx := bchain.Tx{
Txid: t.TxHash().String(),
Version: t.Version,
LockTime: t.LockTime,
Vin: vin,
Vout: vout,
// skip: BlockHash,
// skip: Confirmations,
// skip: Time,
// skip: Blocktime,
}
return tx
}
// ParseTxFromJson parses JSON message containing transaction and returns Tx struct
func (p *PivXParser) ParseTxFromJson(msg json.RawMessage) (*bchain.Tx, error) {
var tx bchain.Tx
err := json.Unmarshal(msg, &tx)
if err != nil {
return nil, err
}
for i := range tx.Vout {
vout := &tx.Vout[i]
// convert vout.JsonValue to big.Int and clear it, it is only temporary value used for unmarshal
vout.ValueSat, err = p.AmountToBigInt(vout.JsonValue)
if err != nil {
return nil, err
}
vout.JsonValue = ""
if(vout.ScriptPubKey.Addresses == nil) {
vout.ScriptPubKey.Addresses = []string{}
}
}
return &tx, nil
}
// outputScriptToAddresses converts ScriptPubKey to bitcoin addresses
func (p *PivXParser) outputScriptToAddresses(script []byte) ([]string, bool, error) {
if (isZeroCoinSpendScript(script) || isZeroCoinMintScript(script)) {
hexScript := hex.EncodeToString(script)
anonAddr := "Anonymous " + hexScript
return []string{anonAddr}, false, nil
}
rv, s, _ := p.BitcoinOutputScriptToAddressesFunc(script)
return rv, s, nil
}
func (p *PivXParser) GetAddrDescForUnknownInput(tx *bchain.Tx, input int) bchain.AddressDescriptor {
if len(tx.Vin) > input {
scriptHex := tx.Vin[input].ScriptSig.Hex
if(scriptHex != "") {
script, _ := hex.DecodeString(scriptHex)
return script
}
}
s := make([]byte, 10)
return s
}
// Checks if script is OP_ZEROCOINMINT
func isZeroCoinMintScript(signatureScript []byte) bool {
OP_ZEROCOINMINT := byte(0xc1)
if (len(signatureScript) > 1 && signatureScript[0] == OP_ZEROCOINMINT) {
return true
}
return false
}
// Checks if script is OP_ZEROCOINSPEND
func isZeroCoinSpendScript(signatureScript []byte) bool {
OP_ZEROCOINSPEND := byte(0xc2)
if (len(signatureScript) >= 100 && signatureScript[0] == OP_ZEROCOINSPEND) {
return true
}
return false
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,52 @@
package pivx
import (
"blockbook/bchain"
"blockbook/bchain/coins/btc"
"encoding/json"
"github.com/golang/glog"
)
// PivXRPC is an interface to JSON-RPC bitcoind service.
type PivXRPC struct {
*btc.BitcoinRPC
}
// NewPivXRPC returns new PivXRPC instance.
func NewPivXRPC(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) {
b, err := btc.NewBitcoinRPC(config, pushHandler)
if err != nil {
return nil, err
}
s := &PivXRPC{
b.(*btc.BitcoinRPC),
}
s.RPCMarshaler = btc.JSONMarshalerV1{}
s.ChainConfig.SupportsEstimateFee = true
s.ChainConfig.SupportsEstimateSmartFee = false
return s, nil
}
// Initialize initializes PivXRPC instance.
func (b *PivXRPC) Initialize() error {
chainName, err := b.GetChainInfoAndInitializeMempool(b)
if err != nil {
return err
}
glog.Info("Chain name ", chainName)
params := GetChainParams(chainName)
// always create parser
b.Parser = NewPivXParser(params, b.ChainConfig)
b.Testnet = false
b.Network = "livenet"
glog.Info("rpc: block chain ", params.Name)
return nil
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
03000000633961176107ee729e0f02012e912435763e928176be20b186edc9dd2daf221d7f4089636ae11f5146f83c319ef99bda07f54e781207eaafecb839abfc1b28200394aa597b927b1a000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff060300350c0101ffffffff0100000000000000000000000000010000000188557c816acd0a61579b701278c7dde85ea25d57877f9dbc65d3b2df2feacc42320000006b483045022100f5d0e98d064d5256852e420a4a3779527fb182c5edbfecf6143fc70eeba8eeef02202f0b2445185fbf846cca07c56c317733a9a4e46f960615f541da7aa27c33cfa201210251c5555ff3c684aebfca92f5329e2f660da54856299da067060a1bcf5e8fae73ffffffff03000000000000000000f06832fa0100000023210251c5555ff3c684aebfca92f5329e2f660da54856299da067060a1bcf5e8fae73aca038370e000000001976a914b4aa56c103b398f875bb8d15c3bb4136aa62725f88ac0000000046304402202ec79736cc3f27a0a4c9c88da691e5e92157f79d60842b84acdbff9419fe6389022021b8c2db30010014f6f3e95542c3d23736fb4c6b99eff3cf35656c73f5934325

View File

@ -0,0 +1 @@
04000000906adbd137f2c824f8cdce809663a41ff6fa2e3af4f80e5554f33a0b55fcb6890cd0460e015621ae5f6ca55aa711b69cb6477ac09e718bd0c6ced1431209c7e5234fe659cfba001b00000000bd0f261afc21a46479e1a120498c6969bfaeba28b0e65b0b8742c220700be0b00201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff060363310d0101ffffffff010000000000000000000000000001000000010dc257a1ebb9d0d8d8ca83c748b92473bfb240a609009db5dc3c5cfda73b74a70100000048473044022016829a99e4802c54fbed81d16aa9ff1fdef76e3c785280cd2f49c143a286d84f02203fc486252cc3b0c292fbbc612aba4389d2bcd0c1a0a4d3a942283d98b239ad1e01ffffffff030000000000000000006df29f333d0000002321025828d51aa0212ea822e6dcf8449b0687e0767c47d5e6f86dc957369821390071ace08cc00e000000001976a914654363f2589c0aab6910c5a9d430d8c13eeb3b9a88ac0000000046304402203fb9480f6df91c547d99b84470c513c2d4b0dbe40e40b6e7ebf94579e92c6c320220751ed475c905e9979557e186dd8c0fd5773dfecfd196ed4ba711e2ee63189392

View File

@ -0,0 +1,63 @@
{
"coin": {
"name": "PIVX",
"shortcut": "PIV",
"label": "PIVX",
"alias": "pivx"
},
"ports": {
"backend_rpc": 8047,
"backend_message_queue": 38347,
"blockbook_internal": 9047,
"blockbook_public": 9147
},
"ipc": {
"rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}",
"rpc_user": "rpc",
"rpc_pass": "pivxrpc",
"rpc_timeout": 25,
"message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}"
},
"backend": {
"package_name": "backend-pivx",
"package_revision": "satoshilabs-1",
"system_user": "pivx",
"version": "3.1.1",
"binary_url": "https://github.com/PIVX-Project/PIVX/releases/download/v3.1.1/pivx-3.1.1-x86_64-linux-gnu.tar.gz",
"verification_type": "sha256",
"verification_source": "aac5b13beb9ff96b0ce62d2258d54166c756c8336672a67c7aae6b73a76b0c03",
"extract_command": "tar -C backend --strip 1 -xf",
"exclude_files": ["bin/pivx-qt"],
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/pivxd -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": false,
"mainnet": true,
"server_config_file": "bitcoin_like.conf",
"client_config_file": "bitcoin_like_client.conf",
"additional_params": {
"whitelist": "127.0.0.1"
}
},
"blockbook": {
"package_name": "blockbook-pivx",
"system_user": "blockbook-pivx",
"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,
"additional_params": {}
}
},
"meta": {
"package_maintainer": "rikardwissing",
"package_maintainer_email": "rikard@coinid.org"
}
}

40
tests/rpc/testdata/pivx.json vendored 100644
View File

@ -0,0 +1,40 @@
{
"blockHeight": 863801,
"blockHash": "84c3697c0a0cfdeb8499d69da97151ed8babfd44cdf59d5b7d5e2dcc4870bdf9",
"blockTime": 1508218661,
"blockTxs": [
"64215f794d731e78714de663cdb83e2cf233800e5d4d2cc3d4c235bc4301651f",
"275915c605b5581acaaa5757b05a8a38c1e1aa6be49a8ab051301db9c8fac502",
"ffcbfcea3a996e2496bb29bfd3462f1d8a9d55302f44545984830f0a455e79bf",
"bd4cfa6d63326dd1bf881cdc46f77e96efcef54e39d2b4e34749ecf65c26e772"
],
"txDetails": {
"64215f794d731e78714de663cdb83e2cf233800e5d4d2cc3d4c235bc4301651f": {
"hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0603392e0d0101ffffffff0100000000000000000000000000",
"txid": "64215f794d731e78714de663cdb83e2cf233800e5d4d2cc3d4c235bc4301651f",
"version": 1,
"locktime": 0,
"vin": [
{
"coinbase": "03392e0d0101",
"sequence": 4294967295
}
],
"vout": [
{
"value": 0,
"n": 0,
"scriptPubKey": {
"asm": "",
"hex": "",
"type": "nonstandard"
}
}
],
"blockhash": "84c3697c0a0cfdeb8499d69da97151ed8babfd44cdf59d5b7d5e2dcc4870bdf9",
"time": 1508218661,
"blocktime": 1508218661,
"confirmations": 0
}
}
}

274
tests/sync/testdata/pivx.json vendored 100644
View File

@ -0,0 +1,274 @@
{
"connectBlocks": {
"syncRanges": [{ "lower": 863801, "upper": 863801 }],
"blocks": {
"863801": {
"height": 863801,
"hash": "84c3697c0a0cfdeb8499d69da97151ed8babfd44cdf59d5b7d5e2dcc4870bdf9",
"noTxs": 4,
"txDetails": [
{
"hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0603392e0d0101ffffffff0100000000000000000000000000",
"txid": "64215f794d731e78714de663cdb83e2cf233800e5d4d2cc3d4c235bc4301651f",
"version": 1,
"locktime": 0,
"vin": [
{
"coinbase": "03392e0d0101",
"sequence": 4294967295
}
],
"vout": [
{
"value": 0,
"n": 0,
"scriptPubKey": {
"asm": "",
"hex": "",
"type": "nonstandard"
}
}
],
"blockhash": "84c3697c0a0cfdeb8499d69da97151ed8babfd44cdf59d5b7d5e2dcc4870bdf9",
"confirmations": 696596,
"time": 1508218661,
"blocktime": 1508218661
},
{
"txid": "275915c605b5581acaaa5757b05a8a38c1e1aa6be49a8ab051301db9c8fac502",
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "d182548f1e3dd98a16fcec20c63d1a7c08da586c9e7a51a128c1127518d1a974",
"vout": 1,
"scriptSig": {
"asm": "3045022100ab7a97ba8dde60216ec72264b042631df8776a9a9504337f18d36d05408579b302203429a01dd94bbc62ad42d02e2fab23e62384ad70af19b8e13bc6ce9a610748dc01",
"hex": "483045022100ab7a97ba8dde60216ec72264b042631df8776a9a9504337f18d36d05408579b302203429a01dd94bbc62ad42d02e2fab23e62384ad70af19b8e13bc6ce9a610748dc01"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0,
"n": 0,
"scriptPubKey": {
"asm": "",
"hex": "",
"type": "nonstandard"
}
},
{
"value": 2654.99854617,
"n": 1,
"scriptPubKey": {
"asm": "025828d51aa0212ea822e6dcf8449b0687e0767c47d5e6f86dc957369821390071 OP_CHECKSIG",
"hex": "21025828d51aa0212ea822e6dcf8449b0687e0767c47d5e6f86dc957369821390071ac",
"reqSigs": 1,
"type": "pubkey",
"addresses": ["D7Vvc9VjKRgXDjLgcJViGAqajMebXwFaQz"]
}
},
{
"value": 2.295,
"n": 2,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 3b8953e9abcf1765dfea4ec9865d130f8f53a6cd OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9143b8953e9abcf1765dfea4ec9865d130f8f53a6cd88ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": ["DAZtvH5zmP3qqLhx3QdRaQipL69n84uMb7"]
}
}
],
"blockhash": "84c3697c0a0cfdeb8499d69da97151ed8babfd44cdf59d5b7d5e2dcc4870bdf9",
"confirmations": 696596,
"time": 1508218661,
"blocktime": 1508218661
},
{
"txid": "ffcbfcea3a996e2496bb29bfd3462f1d8a9d55302f44545984830f0a455e79bf",
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "1a59166aec662dfb9311dae22b11368b78fc3ce68bbf0cad1f5584ddfe29aee6",
"vout": 37,
"scriptSig": {
"asm": "304402205db3a97ec8793bc1431f90920b19fd11de334b45a2669740d432f06c40a5b93802203e35145b2ceb25544eb950ae654b3271d7f040ff092c2c0c2f26a0a2a05297a101 023f2ad5a047f48a540d3e521299f6e0c3999dd0b18d83842108cb729ccc11b4a6",
"hex": "47304402205db3a97ec8793bc1431f90920b19fd11de334b45a2669740d432f06c40a5b93802203e35145b2ceb25544eb950ae654b3271d7f040ff092c2c0c2f26a0a2a05297a10121023f2ad5a047f48a540d3e521299f6e0c3999dd0b18d83842108cb729ccc11b4a6"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 50,
"n": 0,
"scriptPubKey": {
"asm": "OP_ZEROCOINMINT 128 e3e3034c52ffec6b861c9bc0aafc35898b1772548138866bb4d1fdbe8331bd73bf118e36d69db6f44e4622f52e6da2ee973afd36fc7d762b9f18d78857d096dc2d3577a526f40974405289c6301d9df2c7ace8dfec580c5247c30acaf220ff7ec86cb5aa42c749c719cd41c0a00dee951a0d0c977dfff9b5b10885a1a0506570",
"hex": "c10280004c80e3e3034c52ffec6b861c9bc0aafc35898b1772548138866bb4d1fdbe8331bd73bf118e36d69db6f44e4622f52e6da2ee973afd36fc7d762b9f18d78857d096dc2d3577a526f40974405289c6301d9df2c7ace8dfec580c5247c30acaf220ff7ec86cb5aa42c749c719cd41c0a00dee951a0d0c977dfff9b5b10885a1a0506570",
"type": "zerocoinmint"
}
},
{
"value": 49.991,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 6c7afd9a36aa90435033b101d86a49e2dd33bc96 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9146c7afd9a36aa90435033b101d86a49e2dd33bc9688ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": ["DF2grWqS22duV6zjybPsjn3DHr1fuh4AFt"]
}
}
],
"blockhash": "84c3697c0a0cfdeb8499d69da97151ed8babfd44cdf59d5b7d5e2dcc4870bdf9",
"confirmations": 696596,
"time": 1508218661,
"blocktime": 1508218661
},
{
"txid": "bd4cfa6d63326dd1bf881cdc46f77e96efcef54e39d2b4e34749ecf65c26e772",
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "eb151efd7054b92af313fdcad3e96be958466784e2a426ecd1cb2ea42bdc26bf",
"vout": 8,
"scriptSig": {
"asm": "3045022100ab05f2b6fa212b924a1da7fba59b4f88988594df4dc6f49569ad40c101f1528f022035951603ce08c056a5a62b1d2926a621d57f56875feae5bee22a4e4e533d351401 03961ce992b67e570147aa9abf4b095892b4d4c2265508abbd2c3942d7485bd361",
"hex": "483045022100ab05f2b6fa212b924a1da7fba59b4f88988594df4dc6f49569ad40c101f1528f022035951603ce08c056a5a62b1d2926a621d57f56875feae5bee22a4e4e533d3514012103961ce992b67e570147aa9abf4b095892b4d4c2265508abbd2c3942d7485bd361"
},
"sequence": 4294967295
},
{
"txid": "3432767329aa76f70f99aa21a21601108a474f354d0fc7b222b2bdbec8b8dbfb",
"vout": 1,
"scriptSig": {
"asm": "3045022100a8abf366cb1a1f322c241f23dc1e97ea4d6520c1f861d6893d480945c6a11e4902207d20b250119e48923cb952fd37f5980fb1357d1b4d5492fd8eb7e57118f1ccc301",
"hex": "483045022100a8abf366cb1a1f322c241f23dc1e97ea4d6520c1f861d6893d480945c6a11e4902207d20b250119e48923cb952fd37f5980fb1357d1b4d5492fd8eb7e57118f1ccc301"
},
"sequence": 4294967295
},
{
"txid": "4bea64cdcd1cfcbf322247a31009fa78378aa08d323fd8c808db05f4ed370537",
"vout": 1,
"scriptSig": {
"asm": "30440220404278668d56b3922c03523d40fa38d8e9f01017f9834f8fee8605f920fdb6ef0220122ff839258555e2c580e0654ba3bc180fd23ab9687878b9d262cf67f8ace0eb01",
"hex": "4730440220404278668d56b3922c03523d40fa38d8e9f01017f9834f8fee8605f920fdb6ef0220122ff839258555e2c580e0654ba3bc180fd23ab9687878b9d262cf67f8ace0eb01"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 5000,
"n": 0,
"scriptPubKey": {
"asm": "OP_ZEROCOINMINT 128 bf24c8600b8c52ab4c9c2beb23d5b4678b1428d0a7a1a4b0f272773ef9aff94dd80411e0f1f16645ef78ac99a8cb8ff318e9ec7fb5998d69f0c4b5f65a580fb14ab00fe0f1d734d946d8e512af87af736a63e89988f8e8e20e6853eb724b7c1628d3ceb4ea03f1f5abdb946f27dcafdbd14b552a6e7f7802fc35bc2225b42e61",
"hex": "c10280004c80bf24c8600b8c52ab4c9c2beb23d5b4678b1428d0a7a1a4b0f272773ef9aff94dd80411e0f1f16645ef78ac99a8cb8ff318e9ec7fb5998d69f0c4b5f65a580fb14ab00fe0f1d734d946d8e512af87af736a63e89988f8e8e20e6853eb724b7c1628d3ceb4ea03f1f5abdb946f27dcafdbd14b552a6e7f7802fc35bc2225b42e61",
"type": "zerocoinmint"
}
},
{
"value": 1000,
"n": 1,
"scriptPubKey": {
"asm": "OP_ZEROCOINMINT 129 31152da13cf56e8dd2414d0c5aec2eae511d35d7d7036c3670e06369d889771fb1dd40eb952b624a9a808675a89250a2508b021235ddbf2084e19e5f9061fecd663cd803ebf1cc85abb95ef06be7c31c8289f4c0c053ae272b5c18d8b99f39aba9be166b288f26693bec6c5398b8a6b6112c76d9f8d0aa957ac8f9090a3156c200",
"hex": "c10281004c8131152da13cf56e8dd2414d0c5aec2eae511d35d7d7036c3670e06369d889771fb1dd40eb952b624a9a808675a89250a2508b021235ddbf2084e19e5f9061fecd663cd803ebf1cc85abb95ef06be7c31c8289f4c0c053ae272b5c18d8b99f39aba9be166b288f26693bec6c5398b8a6b6112c76d9f8d0aa957ac8f9090a3156c200",
"type": "zerocoinmint"
}
},
{
"value": 500,
"n": 2,
"scriptPubKey": {
"asm": "OP_ZEROCOINMINT 128 ab395dcfcc9d0d7245b5dc0da2aa20981735116ec8585627a595336590771a1b5350f97d6fb80f5efdadc13cfe99ea478056034ca0964721b66a5d696211ae036ff8645805cdef2dcb77fcca53ae935bfcf8288e91ca7737245e36230173cc5310117777e7e48d90aa17cc5261548b8be639d28b72876b6dc3afecc841200f7f",
"hex": "c10280004c80ab395dcfcc9d0d7245b5dc0da2aa20981735116ec8585627a595336590771a1b5350f97d6fb80f5efdadc13cfe99ea478056034ca0964721b66a5d696211ae036ff8645805cdef2dcb77fcca53ae935bfcf8288e91ca7737245e36230173cc5310117777e7e48d90aa17cc5261548b8be639d28b72876b6dc3afecc841200f7f",
"type": "zerocoinmint"
}
},
{
"value": 100,
"n": 3,
"scriptPubKey": {
"asm": "OP_ZEROCOINMINT 128 ff2b65fca5c36a4dd3b7ff9a193324cfc589cbc7412c80d0c93ca34cea3a6f0301c61aa6976ef7324711b4d6644558eaa951d34d017677d1186c326fbb8fdb4ae58c93d10d8d16142d5b25a1cc679e5ba8c3ff582f21b552539e4fc5b986f4cf994bf1bb3b6adcb6e441f5feb7be31599bf545ce583d01c29d1c8f057d0aec54",
"hex": "c10280004c80ff2b65fca5c36a4dd3b7ff9a193324cfc589cbc7412c80d0c93ca34cea3a6f0301c61aa6976ef7324711b4d6644558eaa951d34d017677d1186c326fbb8fdb4ae58c93d10d8d16142d5b25a1cc679e5ba8c3ff582f21b552539e4fc5b986f4cf994bf1bb3b6adcb6e441f5feb7be31599bf545ce583d01c29d1c8f057d0aec54",
"type": "zerocoinmint"
}
},
{
"value": 50,
"n": 4,
"scriptPubKey": {
"asm": "OP_ZEROCOINMINT 129 6bbb23f619a38a8db29e0c2f75808ea286c1f1f2ce99e293f1e6936602dcec37c0bfa7a6be6330a0f576c396f67cc4368ee50cd0dcaa2f4a89f7a3d7b22a1f8454a3fb4c50fff3dab474a2d489ae0a4906878c8e6355aac95f23611eed4d0645e5920a38c168feba3c103638184409b695b322ab6dd3346d82586f154729b1b900",
"hex": "c10281004c816bbb23f619a38a8db29e0c2f75808ea286c1f1f2ce99e293f1e6936602dcec37c0bfa7a6be6330a0f576c396f67cc4368ee50cd0dcaa2f4a89f7a3d7b22a1f8454a3fb4c50fff3dab474a2d489ae0a4906878c8e6355aac95f23611eed4d0645e5920a38c168feba3c103638184409b695b322ab6dd3346d82586f154729b1b900",
"type": "zerocoinmint"
}
},
{
"value": 10,
"n": 5,
"scriptPubKey": {
"asm": "OP_ZEROCOINMINT 129 7d4e07354e18be2b7cf56d839000832e25952638f7ff0110279f63dcabc05eb2339fbcc5f5e42ab6f5ffa878d2142afe305729e1bd2fdc2f6f27f7ad3160751ece1a96b98f8b4d2c998d858a67448eaf693de15b0780b5ea060acfd81c6cfe04bf0ed883e12b8571d1fb5adb3ae06abe99bfc0bc2588a5e9603a3b2cc023a88100",
"hex": "c10281004c817d4e07354e18be2b7cf56d839000832e25952638f7ff0110279f63dcabc05eb2339fbcc5f5e42ab6f5ffa878d2142afe305729e1bd2fdc2f6f27f7ad3160751ece1a96b98f8b4d2c998d858a67448eaf693de15b0780b5ea060acfd81c6cfe04bf0ed883e12b8571d1fb5adb3ae06abe99bfc0bc2588a5e9603a3b2cc023a88100",
"type": "zerocoinmint"
}
},
{
"value": 5,
"n": 6,
"scriptPubKey": {
"asm": "OP_ZEROCOINMINT 128 b182b775351d0a2ed26ad8dd36879fdac81de2d89c4c1f2ff0230832904f8f56ec78c3d6ad5afc1b137b8c47712b9f9d2b34fa11ef1d1a9748d914842672d9188c17601304540e4b8ec7cffb212d06e0bc69956a7ad828378887cbf535e558db91b2109ccfe4af9f859cd104cc4c65382f3884a54163464e45ea6fa7168de027",
"hex": "c10280004c80b182b775351d0a2ed26ad8dd36879fdac81de2d89c4c1f2ff0230832904f8f56ec78c3d6ad5afc1b137b8c47712b9f9d2b34fa11ef1d1a9748d914842672d9188c17601304540e4b8ec7cffb212d06e0bc69956a7ad828378887cbf535e558db91b2109ccfe4af9f859cd104cc4c65382f3884a54163464e45ea6fa7168de027",
"type": "zerocoinmint"
}
},
{
"value": 1,
"n": 7,
"scriptPubKey": {
"asm": "OP_ZEROCOINMINT 128 8dffa29073b184676895dbea7da434cdc27e501187b779c92abca1d806bec86fdee2c2ae16e4eb27571b3d4145c21bfd639343dc77259aedfe6d56502579735bbe2642c3a3e52532c48f5a136767c9815dd2076d0b6bcd9be2d3a63238c8f4a434460106b0e207f1059ae01fc972a60694b8351154167eb4a043da196b3a711e",
"hex": "c10280004c808dffa29073b184676895dbea7da434cdc27e501187b779c92abca1d806bec86fdee2c2ae16e4eb27571b3d4145c21bfd639343dc77259aedfe6d56502579735bbe2642c3a3e52532c48f5a136767c9815dd2076d0b6bcd9be2d3a63238c8f4a434460106b0e207f1059ae01fc972a60694b8351154167eb4a043da196b3a711e",
"type": "zerocoinmint"
}
},
{
"value": 28.51241166,
"n": 8,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 693155e0e4882ba26feeedfdffd9af2f9e8040d0 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a914693155e0e4882ba26feeedfdffd9af2f9e8040d088ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": ["DEjJbHhPsqZZZnVDaXb9p3wM5Ws28Abkg7"]
}
}
],
"blockhash": "84c3697c0a0cfdeb8499d69da97151ed8babfd44cdf59d5b7d5e2dcc4870bdf9",
"confirmations": 696594,
"time": 1508218661,
"blocktime": 1508218661
}
]
}
}
},
"handleFork": {
"syncRanges": [{ "lower": 863801, "upper": 863801 }],
"fakeBlocks": {
"863801": {
"height": 863801,
"hash": "915a2413d358f373be303f242aa92619e6e0eeb16856217140f8749b86acea79"
}
},
"realBlocks": {
"863801": {
"height": 863801,
"hash": "84c3697c0a0cfdeb8499d69da97151ed8babfd44cdf59d5b7d5e2dcc4870bdf9"
}
}
}
}

View File

@ -85,5 +85,10 @@
"rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync",
"EstimateSmartFee", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"],
"sync": ["ConnectBlocksParallel", "ConnectBlocks", "HandleFork"]
},
"pivx": {
"rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "GetTransactionForMempool", "MempoolSync",
"EstimateSmartFee", "EstimateFee", "GetBestBlockHash", "GetBestBlockHeight", "GetBlockHeader"],
"sync": ["ConnectBlocksParallel", "ConnectBlocks", "HandleFork"]
}
}