Merge branch 'dev' of https://github.com/blackjok3rtt/komodo into dev
z
This commit is contained in:
83
qa/pull-tester/cc-tests.sh
Executable file
83
qa/pull-tester/cc-tests.sh
Executable file
@@ -0,0 +1,83 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e -o pipefail
|
||||||
|
|
||||||
|
CURDIR=$(cd $(dirname "$0"); pwd)
|
||||||
|
# Get BUILDDIR and REAL_BITCOIND
|
||||||
|
. "${CURDIR}/tests-config.sh"
|
||||||
|
|
||||||
|
export BITCOINCLI=${BUILDDIR}/qa/pull-tester/run-bitcoin-cli
|
||||||
|
export BITCOIND=${REAL_BITCOIND}
|
||||||
|
|
||||||
|
#Run the tests
|
||||||
|
# FAUCET test should be permanently first!!!
|
||||||
|
|
||||||
|
testScripts=(
|
||||||
|
'cryptoconditions_faucet.py'
|
||||||
|
'cryptoconditions_channels.py'
|
||||||
|
'cryptoconditions_dice.py'
|
||||||
|
'cryptoconditions_oracles.py'
|
||||||
|
'cryptoconditions_rewards.py'
|
||||||
|
'cryptoconditions_token.py'
|
||||||
|
'cryptoconditions_gateways.py'
|
||||||
|
);
|
||||||
|
|
||||||
|
extArg="-extended"
|
||||||
|
passOn=${@#$extArg}
|
||||||
|
|
||||||
|
successCount=0
|
||||||
|
declare -a failures
|
||||||
|
|
||||||
|
function runTestScript
|
||||||
|
{
|
||||||
|
local testName="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
echo -e "=== Running testscript ${testName} ==="
|
||||||
|
|
||||||
|
if eval "$@"
|
||||||
|
then
|
||||||
|
successCount=$(expr $successCount + 1)
|
||||||
|
echo "--- Success: ${testName} ---"
|
||||||
|
else
|
||||||
|
failures[${#failures[@]}]="$testName"
|
||||||
|
echo "!!! FAIL: ${testName} !!!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "x${ENABLE_BITCOIND}${ENABLE_UTILS}${ENABLE_WALLET}" = "x111" ]; then
|
||||||
|
for (( i = 0; i < ${#testScripts[@]}; i++ ))
|
||||||
|
do
|
||||||
|
if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "$1" == "${testScripts[$i]}" ] || [ "$1.py" == "${testScripts[$i]}" ]
|
||||||
|
then
|
||||||
|
runTestScript \
|
||||||
|
"${testScripts[$i]}" \
|
||||||
|
"${BUILDDIR}/qa/rpc-tests/${testScripts[$i]}" \
|
||||||
|
--srcdir "${BUILDDIR}/src" ${passOn}
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
for (( i = 0; i < ${#testScriptsExt[@]}; i++ ))
|
||||||
|
do
|
||||||
|
if [ "$1" == $extArg ] || [ "$1" == "${testScriptsExt[$i]}" ] || [ "$1.py" == "${testScriptsExt[$i]}" ]
|
||||||
|
then
|
||||||
|
runTestScript \
|
||||||
|
"${testScriptsExt[$i]}" \
|
||||||
|
"${BUILDDIR}/qa/rpc-tests/${testScriptsExt[$i]}" \
|
||||||
|
--srcdir "${BUILDDIR}/src" ${passOn}
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "\n\nTests completed: $(expr $successCount + ${#failures[@]})"
|
||||||
|
echo "successes $successCount; failures: ${#failures[@]}"
|
||||||
|
|
||||||
|
if [ ${#failures[@]} -gt 0 ]
|
||||||
|
then
|
||||||
|
echo -e "\nFailing tests: ${failures[*]}"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "No rpc tests to run. Wallet, utils, and bitcoind must all be enabled"
|
||||||
|
fi
|
||||||
@@ -13,12 +13,6 @@ export BITCOIND=${REAL_BITCOIND}
|
|||||||
testScripts=(
|
testScripts=(
|
||||||
'ac_private.py'
|
'ac_private.py'
|
||||||
'verushash.py'
|
'verushash.py'
|
||||||
'cryptoconditions.py'
|
|
||||||
'cryptoconditions_dice.py'
|
|
||||||
'cryptoconditions_faucet.py'
|
|
||||||
'cryptoconditions_oracles.py'
|
|
||||||
'cryptoconditions_rewards.py'
|
|
||||||
'cryptoconditions_token.py'
|
|
||||||
'paymentdisclosure.py'
|
'paymentdisclosure.py'
|
||||||
'prioritisetransaction.py'
|
'prioritisetransaction.py'
|
||||||
'wallet_treestate.py'
|
'wallet_treestate.py'
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ You can run a single test by calling `qa/pull-tester/rpc-tests.sh <testname>`.
|
|||||||
|
|
||||||
Run all possible tests with `qa/pull-tester/rpc-tests.sh -extended`.
|
Run all possible tests with `qa/pull-tester/rpc-tests.sh -extended`.
|
||||||
|
|
||||||
|
Also it's possible to run CryptoConditions tests only by `qa/pull-tester/cc-tests.sh --noshutdown --tracerpc`
|
||||||
|
|
||||||
Possible options:
|
Possible options:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
111
qa/rpc-tests/cryptoconditions_channels.py
Executable file
111
qa/rpc-tests/cryptoconditions_channels.py
Executable file
@@ -0,0 +1,111 @@
|
|||||||
|
#!/usr/bin/env python2
|
||||||
|
# Copyright (c) 2018 SuperNET developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
|
||||||
|
from test_framework.test_framework import CryptoconditionsTestFramework
|
||||||
|
from test_framework.authproxy import JSONRPCException
|
||||||
|
from test_framework.util import assert_equal, assert_greater_than, \
|
||||||
|
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
||||||
|
stop_nodes, sync_blocks, sync_mempools, wait_bitcoinds, rpc_port, assert_raises
|
||||||
|
from cryptoconditions import assert_success, assert_error, generate_random_string
|
||||||
|
|
||||||
|
|
||||||
|
class CryptoconditionsChannelsTest(CryptoconditionsTestFramework):
|
||||||
|
|
||||||
|
def run_channels_tests(self):
|
||||||
|
|
||||||
|
|
||||||
|
"""!!! for testing needed test daemon which built with custom flag
|
||||||
|
export CONFIGURE_FLAGS='CPPFLAGS=-DTESTMODE'
|
||||||
|
since in usual mode 101 confirmations are needed for payment/refund
|
||||||
|
"""
|
||||||
|
|
||||||
|
rpc = self.nodes[0]
|
||||||
|
rpc1 = self.nodes[1]
|
||||||
|
|
||||||
|
# getting empty channels list
|
||||||
|
result = rpc.channelsinfo()
|
||||||
|
assert_equal(len(result), 2)
|
||||||
|
assert_equal(result["result"], "success")
|
||||||
|
assert_equal(result["name"], "Channels Info")
|
||||||
|
|
||||||
|
# 10 payments, 100000 sat denomination channel opening with second node pubkey
|
||||||
|
new_channel_hex = rpc.channelsopen(self.pubkey1, "10", "100000")
|
||||||
|
assert_success(new_channel_hex)
|
||||||
|
channel_txid = self.send_and_mine(new_channel_hex["hex"], rpc)
|
||||||
|
assert channel_txid, "got channel txid"
|
||||||
|
|
||||||
|
# checking if our new channel in common channels list
|
||||||
|
result = rpc.channelsinfo()
|
||||||
|
assert_equal(len(result), 3)
|
||||||
|
|
||||||
|
# checking info about channel directly
|
||||||
|
result = rpc.channelsinfo(channel_txid)
|
||||||
|
assert_success(result)
|
||||||
|
assert_equal(result["Open"], "10 payments of 100000 satoshi")
|
||||||
|
|
||||||
|
# open transaction should be confirmed
|
||||||
|
rpc.generate(1)
|
||||||
|
|
||||||
|
# trying to make wrong denomination channel payment
|
||||||
|
result = rpc.channelspayment(channel_txid, "199000")
|
||||||
|
assert_error(result)
|
||||||
|
|
||||||
|
# trying to make 0 channel payment
|
||||||
|
result = rpc.channelspayment(channel_txid, "0")
|
||||||
|
assert_error(result)
|
||||||
|
|
||||||
|
# trying to make negative channel payment
|
||||||
|
result = rpc.channelspayment(channel_txid, "-1")
|
||||||
|
assert_error(result)
|
||||||
|
|
||||||
|
# valid channel payment
|
||||||
|
result = rpc.channelspayment(channel_txid, "100000")
|
||||||
|
assert_success(result)
|
||||||
|
payment_tx_id = self.send_and_mine(result["hex"], rpc)
|
||||||
|
assert payment_tx_id, "got txid"
|
||||||
|
|
||||||
|
# now in channelinfo payment information should appear
|
||||||
|
result = rpc.channelsinfo(channel_txid)
|
||||||
|
assert_equal(result["Payment"], "100000 satoshi to {}, 9 payments left".format(self.addr1))
|
||||||
|
|
||||||
|
# executing channel close
|
||||||
|
result = rpc.channelsclose(channel_txid)
|
||||||
|
assert_success(result)
|
||||||
|
channel_close_txid = self.send_and_mine(result["hex"], rpc)
|
||||||
|
assert channel_close_txid, "got txid"
|
||||||
|
|
||||||
|
rpc.generate(2)
|
||||||
|
self.sync_all()
|
||||||
|
|
||||||
|
# now in channelinfo closed flag should appear
|
||||||
|
result = rpc.channelsinfo(channel_txid)
|
||||||
|
assert_equal(result["Close"], "channel")
|
||||||
|
|
||||||
|
# executing channel refund
|
||||||
|
result = rpc.channelsrefund(channel_txid, channel_close_txid)
|
||||||
|
assert_success(result)
|
||||||
|
refund_txid = self.send_and_mine(result["hex"], rpc)
|
||||||
|
assert refund_txid, "got txid"
|
||||||
|
|
||||||
|
def run_test(self):
|
||||||
|
print("Mining blocks...")
|
||||||
|
rpc = self.nodes[0]
|
||||||
|
rpc1 = self.nodes[1]
|
||||||
|
# utxos from block 1 become mature in block 101
|
||||||
|
if not self.options.noshutdown:
|
||||||
|
rpc.generate(101)
|
||||||
|
self.sync_all()
|
||||||
|
rpc.getinfo()
|
||||||
|
rpc1.getinfo()
|
||||||
|
# this corresponds to -pubkey above
|
||||||
|
print("Importing privkeys")
|
||||||
|
rpc.importprivkey(self.privkey)
|
||||||
|
rpc1.importprivkey(self.privkey1)
|
||||||
|
self.run_channels_tests()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
CryptoconditionsChannelsTest().main()
|
||||||
@@ -4,78 +4,15 @@
|
|||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import CryptoconditionsTestFramework
|
||||||
from test_framework.authproxy import JSONRPCException
|
from test_framework.authproxy import JSONRPCException
|
||||||
from test_framework.util import assert_equal, assert_greater_than, \
|
from test_framework.util import assert_equal, assert_greater_than, \
|
||||||
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
||||||
stop_nodes, sync_blocks, sync_mempools, wait_bitcoinds, rpc_port, assert_raises
|
stop_nodes, sync_blocks, sync_mempools, wait_bitcoinds, rpc_port, assert_raises
|
||||||
from cryptoconditions import assert_success, assert_error, generate_random_string
|
from cryptoconditions import assert_success, assert_error, generate_random_string
|
||||||
|
|
||||||
class CryptoconditionsDiceTest(BitcoinTestFramework):
|
|
||||||
|
|
||||||
def setup_chain(self):
|
class CryptoconditionsDiceTest(CryptoconditionsTestFramework):
|
||||||
print("Initializing CC test directory "+self.options.tmpdir)
|
|
||||||
self.num_nodes = 2
|
|
||||||
initialize_chain_clean(self.options.tmpdir, self.num_nodes)
|
|
||||||
|
|
||||||
def setup_network(self, split = False):
|
|
||||||
print("Setting up network...")
|
|
||||||
self.addr = "RWPg8B91kfK5UtUN7z6s6TeV9cHSGtVY8D"
|
|
||||||
self.pubkey = "02676d00110c2cd14ae24f95969e8598f7ccfaa675498b82654a5b5bd57fc1d8cf"
|
|
||||||
self.privkey = "UqMgxk7ySPNQ4r9nKAFPjkXy6r5t898yhuNCjSZJLg3RAM4WW1m9"
|
|
||||||
self.addr1 = "RXEXoa1nRmKhMbuZovpcYwQMsicwzccZBp"
|
|
||||||
self.pubkey1 = "024026d4ad4ecfc1f705a9b42ca64af6d2ad947509c085534a30b8861d756c6ff0"
|
|
||||||
self.privkey1 = "UtdydP56pGTFmawHzHr1wDrc4oUwCNW1ttX8Pc3KrvH3MA8P49Wi"
|
|
||||||
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir,
|
|
||||||
extra_args=[[
|
|
||||||
# always give -ac_name as first extra_arg and port as third
|
|
||||||
'-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node0/REGTEST.conf',
|
|
||||||
'-port=64367',
|
|
||||||
'-rpcport=64368',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt'
|
|
||||||
],
|
|
||||||
['-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node1/REGTEST.conf',
|
|
||||||
'-port=64365',
|
|
||||||
'-rpcport=64366',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey1,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'-addnode=127.0.0.1:64367',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt']]
|
|
||||||
)
|
|
||||||
self.is_network_split = split
|
|
||||||
self.rpc = self.nodes[0]
|
|
||||||
self.rpc1 = self.nodes[1]
|
|
||||||
self.sync_all()
|
|
||||||
print("Done setting up network")
|
|
||||||
|
|
||||||
def send_and_mine(self, xtn, rpc_connection):
|
|
||||||
txid = rpc_connection.sendrawtransaction(xtn)
|
|
||||||
assert txid, 'got txid'
|
|
||||||
# we need the tx above to be confirmed in the next block
|
|
||||||
rpc_connection.generate(1)
|
|
||||||
return txid
|
|
||||||
|
|
||||||
def run_dice_tests(self):
|
def run_dice_tests(self):
|
||||||
rpc = self.nodes[0]
|
rpc = self.nodes[0]
|
||||||
@@ -244,7 +181,8 @@ class CryptoconditionsDiceTest(BitcoinTestFramework):
|
|||||||
rpc = self.nodes[0]
|
rpc = self.nodes[0]
|
||||||
rpc1 = self.nodes[1]
|
rpc1 = self.nodes[1]
|
||||||
# utxos from block 1 become mature in block 101
|
# utxos from block 1 become mature in block 101
|
||||||
rpc.generate(101)
|
if not self.options.noshutdown:
|
||||||
|
rpc.generate(101)
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
rpc.getinfo()
|
rpc.getinfo()
|
||||||
rpc1.getinfo()
|
rpc1.getinfo()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import CryptoconditionsTestFramework
|
||||||
from test_framework.authproxy import JSONRPCException
|
from test_framework.authproxy import JSONRPCException
|
||||||
from test_framework.util import assert_equal, assert_greater_than, \
|
from test_framework.util import assert_equal, assert_greater_than, \
|
||||||
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
||||||
@@ -12,71 +12,7 @@ from test_framework.util import assert_equal, assert_greater_than, \
|
|||||||
from cryptoconditions import assert_success, assert_error, generate_random_string
|
from cryptoconditions import assert_success, assert_error, generate_random_string
|
||||||
|
|
||||||
|
|
||||||
class CryptoconditionsFaucetTest(BitcoinTestFramework):
|
class CryptoconditionsFaucetTest(CryptoconditionsTestFramework):
|
||||||
|
|
||||||
def setup_chain(self):
|
|
||||||
print("Initializing CC test directory "+self.options.tmpdir)
|
|
||||||
self.num_nodes = 2
|
|
||||||
initialize_chain_clean(self.options.tmpdir, self.num_nodes)
|
|
||||||
|
|
||||||
def setup_network(self, split = False):
|
|
||||||
print("Setting up network...")
|
|
||||||
self.addr = "RWPg8B91kfK5UtUN7z6s6TeV9cHSGtVY8D"
|
|
||||||
self.pubkey = "02676d00110c2cd14ae24f95969e8598f7ccfaa675498b82654a5b5bd57fc1d8cf"
|
|
||||||
self.privkey = "UqMgxk7ySPNQ4r9nKAFPjkXy6r5t898yhuNCjSZJLg3RAM4WW1m9"
|
|
||||||
self.addr1 = "RXEXoa1nRmKhMbuZovpcYwQMsicwzccZBp"
|
|
||||||
self.pubkey1 = "024026d4ad4ecfc1f705a9b42ca64af6d2ad947509c085534a30b8861d756c6ff0"
|
|
||||||
self.privkey1 = "UtdydP56pGTFmawHzHr1wDrc4oUwCNW1ttX8Pc3KrvH3MA8P49Wi"
|
|
||||||
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir,
|
|
||||||
extra_args=[[
|
|
||||||
# always give -ac_name as first extra_arg and port as third
|
|
||||||
'-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node0/REGTEST.conf',
|
|
||||||
'-port=64367',
|
|
||||||
'-rpcport=64368',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt'
|
|
||||||
],
|
|
||||||
['-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node1/REGTEST.conf',
|
|
||||||
'-port=64365',
|
|
||||||
'-rpcport=64366',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey1,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'-addnode=127.0.0.1:64367',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt']]
|
|
||||||
)
|
|
||||||
self.is_network_split = split
|
|
||||||
self.rpc = self.nodes[0]
|
|
||||||
self.rpc1 = self.nodes[1]
|
|
||||||
self.sync_all()
|
|
||||||
print("Done setting up network")
|
|
||||||
|
|
||||||
def send_and_mine(self, xtn, rpc_connection):
|
|
||||||
txid = rpc_connection.sendrawtransaction(xtn)
|
|
||||||
assert txid, 'got txid'
|
|
||||||
# we need the tx above to be confirmed in the next block
|
|
||||||
rpc_connection.generate(1)
|
|
||||||
return txid
|
|
||||||
|
|
||||||
def run_faucet_tests(self):
|
def run_faucet_tests(self):
|
||||||
rpc = self.rpc
|
rpc = self.rpc
|
||||||
|
|||||||
94
qa/rpc-tests/cryptoconditions_gateways.py
Executable file
94
qa/rpc-tests/cryptoconditions_gateways.py
Executable file
@@ -0,0 +1,94 @@
|
|||||||
|
#!/usr/bin/env python2
|
||||||
|
# Copyright (c) 2018 SuperNET developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
|
||||||
|
from test_framework.test_framework import CryptoconditionsTestFramework
|
||||||
|
from test_framework.authproxy import JSONRPCException
|
||||||
|
from test_framework.util import assert_equal, assert_greater_than, \
|
||||||
|
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
||||||
|
stop_nodes, sync_blocks, sync_mempools, wait_bitcoinds, rpc_port, assert_raises
|
||||||
|
from cryptoconditions import assert_success, assert_error, generate_random_string
|
||||||
|
|
||||||
|
|
||||||
|
class CryptoconditionsGatewaysTest(CryptoconditionsTestFramework):
|
||||||
|
|
||||||
|
def run_gateways_tests(self):
|
||||||
|
rpc = self.nodes[0]
|
||||||
|
rpc1 = self.nodes[1]
|
||||||
|
|
||||||
|
result = rpc.gatewaysaddress()
|
||||||
|
assert_success(result)
|
||||||
|
for x in ['GatewaysCCaddress', 'myCCaddress', 'Gatewaysmarker', 'myaddress']:
|
||||||
|
assert_equal(result[x][0], 'R')
|
||||||
|
|
||||||
|
assert_equal("03ea9c062b9652d8eff34879b504eda0717895d27597aaeb60347d65eed96ccb40", result["GatewaysPubkey"])
|
||||||
|
|
||||||
|
# getting an empty gateways list
|
||||||
|
|
||||||
|
result = rpc.gatewayslist()
|
||||||
|
assert_equal(result, [])
|
||||||
|
|
||||||
|
# Gateways binding preparation
|
||||||
|
|
||||||
|
# creating oracle
|
||||||
|
oracle_hex = rpc.oraclescreate("Test", "Testing", "Ihh")
|
||||||
|
assert_success(oracle_hex)
|
||||||
|
oracle_txid = self.send_and_mine(oracle_hex["hex"], rpc)
|
||||||
|
assert oracle_txid, "got txid"
|
||||||
|
|
||||||
|
# registering as an oracle publisher
|
||||||
|
reg_hex = rpc.oraclesregister(oracle_txid, "10000")
|
||||||
|
assert_success(reg_hex)
|
||||||
|
reg_txid = self.send_and_mine(reg_hex["hex"], rpc)
|
||||||
|
assert reg_txid, "got txid"
|
||||||
|
|
||||||
|
# subscribing on oracle
|
||||||
|
sub_hex = rpc.oraclessubscribe(oracle_txid, self.pubkey, "1")
|
||||||
|
assert_success(sub_hex)
|
||||||
|
sub_txid = self.send_and_mine(sub_hex["hex"], rpc)
|
||||||
|
assert sub_txid, "got txid"
|
||||||
|
|
||||||
|
# creating token
|
||||||
|
token_hex = rpc.tokencreate("Test", "1", "Testing")
|
||||||
|
assert_success(token_hex)
|
||||||
|
token_txid = self.send_and_mine(token_hex["hex"], rpc)
|
||||||
|
assert token_txid, "got txid"
|
||||||
|
|
||||||
|
# converting tokens
|
||||||
|
convertion_hex = rpc.tokenconvert("241",token_txid,"03ea9c062b9652d8eff34879b504eda0717895d27597aaeb60347d65eed96ccb40","100000000")
|
||||||
|
assert_success(convertion_hex)
|
||||||
|
convertion_txid = self.send_and_mine(convertion_hex["hex"], rpc)
|
||||||
|
assert convertion_txid, "got txid"
|
||||||
|
|
||||||
|
# binding gateway
|
||||||
|
bind_hex = rpc.gatewaysbind(token_txid, oracle_txid, "KMD", "100000000", "1", "1", self.pubkey)
|
||||||
|
assert_success(bind_hex)
|
||||||
|
bind_txid = self.send_and_mine(bind_hex["hex"], rpc)
|
||||||
|
assert bind_txid, "got txid"
|
||||||
|
|
||||||
|
# checking if created gateway in list
|
||||||
|
result = rpc.gatewayslist()
|
||||||
|
assert_equal(result[0], bind_txid)
|
||||||
|
|
||||||
|
|
||||||
|
def run_test(self):
|
||||||
|
print("Mining blocks...")
|
||||||
|
rpc = self.nodes[0]
|
||||||
|
rpc1 = self.nodes[1]
|
||||||
|
# utxos from block 1 become mature in block 101
|
||||||
|
if not self.options.noshutdown:
|
||||||
|
rpc.generate(101)
|
||||||
|
self.sync_all()
|
||||||
|
rpc.getinfo()
|
||||||
|
rpc1.getinfo()
|
||||||
|
# this corresponds to -pubkey above
|
||||||
|
print("Importing privkeys")
|
||||||
|
rpc.importprivkey(self.privkey)
|
||||||
|
rpc1.importprivkey(self.privkey1)
|
||||||
|
self.run_gateways_tests()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
CryptoconditionsGatewaysTest().main()
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import CryptoconditionsTestFramework
|
||||||
from test_framework.authproxy import JSONRPCException
|
from test_framework.authproxy import JSONRPCException
|
||||||
from test_framework.util import assert_equal, assert_greater_than, \
|
from test_framework.util import assert_equal, assert_greater_than, \
|
||||||
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
||||||
@@ -12,72 +12,7 @@ from test_framework.util import assert_equal, assert_greater_than, \
|
|||||||
from cryptoconditions import assert_success, assert_error, generate_random_string
|
from cryptoconditions import assert_success, assert_error, generate_random_string
|
||||||
|
|
||||||
|
|
||||||
class CryptoconditionsOraclesTest(BitcoinTestFramework):
|
class CryptoconditionsOraclesTest(CryptoconditionsTestFramework):
|
||||||
|
|
||||||
|
|
||||||
def setup_chain(self):
|
|
||||||
print("Initializing CC test directory "+self.options.tmpdir)
|
|
||||||
self.num_nodes = 2
|
|
||||||
initialize_chain_clean(self.options.tmpdir, self.num_nodes)
|
|
||||||
|
|
||||||
def setup_network(self, split = False):
|
|
||||||
print("Setting up network...")
|
|
||||||
self.addr = "RWPg8B91kfK5UtUN7z6s6TeV9cHSGtVY8D"
|
|
||||||
self.pubkey = "02676d00110c2cd14ae24f95969e8598f7ccfaa675498b82654a5b5bd57fc1d8cf"
|
|
||||||
self.privkey = "UqMgxk7ySPNQ4r9nKAFPjkXy6r5t898yhuNCjSZJLg3RAM4WW1m9"
|
|
||||||
self.addr1 = "RXEXoa1nRmKhMbuZovpcYwQMsicwzccZBp"
|
|
||||||
self.pubkey1 = "024026d4ad4ecfc1f705a9b42ca64af6d2ad947509c085534a30b8861d756c6ff0"
|
|
||||||
self.privkey1 = "UtdydP56pGTFmawHzHr1wDrc4oUwCNW1ttX8Pc3KrvH3MA8P49Wi"
|
|
||||||
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir,
|
|
||||||
extra_args=[[
|
|
||||||
# always give -ac_name as first extra_arg and port as third
|
|
||||||
'-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node0/REGTEST.conf',
|
|
||||||
'-port=64367',
|
|
||||||
'-rpcport=64368',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt'
|
|
||||||
],
|
|
||||||
['-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node1/REGTEST.conf',
|
|
||||||
'-port=64365',
|
|
||||||
'-rpcport=64366',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey1,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'-addnode=127.0.0.1:64367',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt']]
|
|
||||||
)
|
|
||||||
self.is_network_split = split
|
|
||||||
self.rpc = self.nodes[0]
|
|
||||||
self.rpc1 = self.nodes[1]
|
|
||||||
self.sync_all()
|
|
||||||
print("Done setting up network")
|
|
||||||
|
|
||||||
def send_and_mine(self, xtn, rpc_connection):
|
|
||||||
txid = rpc_connection.sendrawtransaction(xtn)
|
|
||||||
assert txid, 'got txid'
|
|
||||||
# we need the tx above to be confirmed in the next block
|
|
||||||
rpc_connection.generate(1)
|
|
||||||
return txid
|
|
||||||
|
|
||||||
def run_oracles_tests(self):
|
def run_oracles_tests(self):
|
||||||
rpc = self.nodes[0]
|
rpc = self.nodes[0]
|
||||||
@@ -269,8 +204,6 @@ class CryptoconditionsOraclesTest(BitcoinTestFramework):
|
|||||||
oraclesdata_Ihh = self.send_and_mine(result["hex"], rpc)
|
oraclesdata_Ihh = self.send_and_mine(result["hex"], rpc)
|
||||||
result = rpc.oraclessamples(globals()["oracle_{}".format("Ihh")], oraclesdata_Ihh, "1")
|
result = rpc.oraclessamples(globals()["oracle_{}".format("Ihh")], oraclesdata_Ihh, "1")
|
||||||
assert_equal("[u'0']", str(result["samples"][0]), "Data match")
|
assert_equal("[u'0']", str(result["samples"][0]), "Data match")
|
||||||
assert_equal("[u'00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff']", str(result["samples"][1]), "Data match")
|
|
||||||
assert_equal("[u'00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff']", str(result["samples"][2]), "Data match")
|
|
||||||
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
@@ -278,7 +211,8 @@ class CryptoconditionsOraclesTest(BitcoinTestFramework):
|
|||||||
rpc = self.nodes[0]
|
rpc = self.nodes[0]
|
||||||
rpc1 = self.nodes[1]
|
rpc1 = self.nodes[1]
|
||||||
# utxos from block 1 become mature in block 101
|
# utxos from block 1 become mature in block 101
|
||||||
rpc.generate(101)
|
if not self.options.noshutdown:
|
||||||
|
rpc.generate(101)
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
rpc.getinfo()
|
rpc.getinfo()
|
||||||
rpc1.getinfo()
|
rpc1.getinfo()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import CryptoconditionsTestFramework
|
||||||
from test_framework.authproxy import JSONRPCException
|
from test_framework.authproxy import JSONRPCException
|
||||||
from test_framework.util import assert_equal, assert_greater_than, \
|
from test_framework.util import assert_equal, assert_greater_than, \
|
||||||
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
||||||
@@ -12,72 +12,7 @@ from test_framework.util import assert_equal, assert_greater_than, \
|
|||||||
from cryptoconditions import assert_success, assert_error, generate_random_string
|
from cryptoconditions import assert_success, assert_error, generate_random_string
|
||||||
|
|
||||||
|
|
||||||
class CryptoconditionsRewardsTest(BitcoinTestFramework):
|
class CryptoconditionsRewardsTest(CryptoconditionsTestFramework):
|
||||||
|
|
||||||
|
|
||||||
def setup_chain(self):
|
|
||||||
print("Initializing CC test directory "+self.options.tmpdir)
|
|
||||||
self.num_nodes = 2
|
|
||||||
initialize_chain_clean(self.options.tmpdir, self.num_nodes)
|
|
||||||
|
|
||||||
def setup_network(self, split = False):
|
|
||||||
print("Setting up network...")
|
|
||||||
self.addr = "RWPg8B91kfK5UtUN7z6s6TeV9cHSGtVY8D"
|
|
||||||
self.pubkey = "02676d00110c2cd14ae24f95969e8598f7ccfaa675498b82654a5b5bd57fc1d8cf"
|
|
||||||
self.privkey = "UqMgxk7ySPNQ4r9nKAFPjkXy6r5t898yhuNCjSZJLg3RAM4WW1m9"
|
|
||||||
self.addr1 = "RXEXoa1nRmKhMbuZovpcYwQMsicwzccZBp"
|
|
||||||
self.pubkey1 = "024026d4ad4ecfc1f705a9b42ca64af6d2ad947509c085534a30b8861d756c6ff0"
|
|
||||||
self.privkey1 = "UtdydP56pGTFmawHzHr1wDrc4oUwCNW1ttX8Pc3KrvH3MA8P49Wi"
|
|
||||||
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir,
|
|
||||||
extra_args=[[
|
|
||||||
# always give -ac_name as first extra_arg and port as third
|
|
||||||
'-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node0/REGTEST.conf',
|
|
||||||
'-port=64367',
|
|
||||||
'-rpcport=64368',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt'
|
|
||||||
],
|
|
||||||
['-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node1/REGTEST.conf',
|
|
||||||
'-port=64365',
|
|
||||||
'-rpcport=64366',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey1,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'-addnode=127.0.0.1:64367',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt']]
|
|
||||||
)
|
|
||||||
self.is_network_split = split
|
|
||||||
self.rpc = self.nodes[0]
|
|
||||||
self.rpc1 = self.nodes[1]
|
|
||||||
self.sync_all()
|
|
||||||
print("Done setting up network")
|
|
||||||
|
|
||||||
def send_and_mine(self, xtn, rpc_connection):
|
|
||||||
txid = rpc_connection.sendrawtransaction(xtn)
|
|
||||||
assert txid, 'got txid'
|
|
||||||
# we need the tx above to be confirmed in the next block
|
|
||||||
rpc_connection.generate(1)
|
|
||||||
return txid
|
|
||||||
|
|
||||||
def run_rewards_tests(self):
|
def run_rewards_tests(self):
|
||||||
rpc = self.nodes[0]
|
rpc = self.nodes[0]
|
||||||
@@ -194,7 +129,8 @@ class CryptoconditionsRewardsTest(BitcoinTestFramework):
|
|||||||
rpc = self.nodes[0]
|
rpc = self.nodes[0]
|
||||||
rpc1 = self.nodes[1]
|
rpc1 = self.nodes[1]
|
||||||
# utxos from block 1 become mature in block 101
|
# utxos from block 1 become mature in block 101
|
||||||
rpc.generate(101)
|
if not self.options.noshutdown:
|
||||||
|
rpc.generate(101)
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
rpc.getinfo()
|
rpc.getinfo()
|
||||||
rpc1.getinfo()
|
rpc1.getinfo()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import CryptoconditionsTestFramework
|
||||||
from test_framework.authproxy import JSONRPCException
|
from test_framework.authproxy import JSONRPCException
|
||||||
from test_framework.util import assert_equal, assert_greater_than, \
|
from test_framework.util import assert_equal, assert_greater_than, \
|
||||||
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
initialize_chain_clean, initialize_chain, start_nodes, start_node, connect_nodes_bi, \
|
||||||
@@ -12,72 +12,7 @@ from test_framework.util import assert_equal, assert_greater_than, \
|
|||||||
from cryptoconditions import assert_success, assert_error, generate_random_string
|
from cryptoconditions import assert_success, assert_error, generate_random_string
|
||||||
|
|
||||||
|
|
||||||
class CryptoconditionsTokenTest(BitcoinTestFramework):
|
class CryptoconditionsTokenTest(CryptoconditionsTestFramework):
|
||||||
|
|
||||||
|
|
||||||
def setup_chain(self):
|
|
||||||
print("Initializing CC test directory "+self.options.tmpdir)
|
|
||||||
self.num_nodes = 2
|
|
||||||
initialize_chain_clean(self.options.tmpdir, self.num_nodes)
|
|
||||||
|
|
||||||
def setup_network(self, split = False):
|
|
||||||
print("Setting up network...")
|
|
||||||
self.addr = "RWPg8B91kfK5UtUN7z6s6TeV9cHSGtVY8D"
|
|
||||||
self.pubkey = "02676d00110c2cd14ae24f95969e8598f7ccfaa675498b82654a5b5bd57fc1d8cf"
|
|
||||||
self.privkey = "UqMgxk7ySPNQ4r9nKAFPjkXy6r5t898yhuNCjSZJLg3RAM4WW1m9"
|
|
||||||
self.addr1 = "RXEXoa1nRmKhMbuZovpcYwQMsicwzccZBp"
|
|
||||||
self.pubkey1 = "024026d4ad4ecfc1f705a9b42ca64af6d2ad947509c085534a30b8861d756c6ff0"
|
|
||||||
self.privkey1 = "UtdydP56pGTFmawHzHr1wDrc4oUwCNW1ttX8Pc3KrvH3MA8P49Wi"
|
|
||||||
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir,
|
|
||||||
extra_args=[[
|
|
||||||
# always give -ac_name as first extra_arg and port as third
|
|
||||||
'-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node0/REGTEST.conf',
|
|
||||||
'-port=64367',
|
|
||||||
'-rpcport=64368',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt'
|
|
||||||
],
|
|
||||||
['-ac_name=REGTEST',
|
|
||||||
'-conf='+self.options.tmpdir+'/node1/REGTEST.conf',
|
|
||||||
'-port=64365',
|
|
||||||
'-rpcport=64366',
|
|
||||||
'-regtest',
|
|
||||||
'-addressindex=1',
|
|
||||||
'-spentindex=1',
|
|
||||||
'-ac_supply=5555555',
|
|
||||||
'-ac_reward=10000000000000',
|
|
||||||
'-pubkey=' + self.pubkey1,
|
|
||||||
'-ac_cc=2',
|
|
||||||
'-whitelist=127.0.0.1',
|
|
||||||
'-debug',
|
|
||||||
'-addnode=127.0.0.1:64367',
|
|
||||||
'--daemon',
|
|
||||||
'-rpcuser=rt',
|
|
||||||
'-rpcpassword=rt']]
|
|
||||||
)
|
|
||||||
self.is_network_split = split
|
|
||||||
self.rpc = self.nodes[0]
|
|
||||||
self.rpc1 = self.nodes[1]
|
|
||||||
self.sync_all()
|
|
||||||
print("Done setting up network")
|
|
||||||
|
|
||||||
def send_and_mine(self, xtn, rpc_connection):
|
|
||||||
txid = rpc_connection.sendrawtransaction(xtn)
|
|
||||||
assert txid, 'got txid'
|
|
||||||
# we need the tx above to be confirmed in the next block
|
|
||||||
rpc_connection.generate(1)
|
|
||||||
return txid
|
|
||||||
|
|
||||||
def run_token_tests(self):
|
def run_token_tests(self):
|
||||||
rpc = self.nodes[0]
|
rpc = self.nodes[0]
|
||||||
@@ -274,7 +209,8 @@ class CryptoconditionsTokenTest(BitcoinTestFramework):
|
|||||||
rpc = self.nodes[0]
|
rpc = self.nodes[0]
|
||||||
rpc1 = self.nodes[1]
|
rpc1 = self.nodes[1]
|
||||||
# utxos from block 1 become mature in block 101
|
# utxos from block 1 become mature in block 101
|
||||||
rpc.generate(101)
|
if not self.options.noshutdown:
|
||||||
|
rpc.generate(101)
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
rpc.getinfo()
|
rpc.getinfo()
|
||||||
rpc1.getinfo()
|
rpc1.getinfo()
|
||||||
|
|||||||
@@ -180,3 +180,72 @@ class ComparisonTestFramework(BitcoinTestFramework):
|
|||||||
extra_args=[['-debug', '-whitelist=127.0.0.1']] * self.num_nodes,
|
extra_args=[['-debug', '-whitelist=127.0.0.1']] * self.num_nodes,
|
||||||
binary=[self.options.testbinary] +
|
binary=[self.options.testbinary] +
|
||||||
[self.options.refbinary]*(self.num_nodes-1))
|
[self.options.refbinary]*(self.num_nodes-1))
|
||||||
|
|
||||||
|
|
||||||
|
class CryptoconditionsTestFramework(BitcoinTestFramework):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.num_nodes = 2
|
||||||
|
|
||||||
|
def setup_chain(self):
|
||||||
|
print("Initializing CC test directory "+self.options.tmpdir)
|
||||||
|
initialize_chain_clean(self.options.tmpdir, self.num_nodes)
|
||||||
|
|
||||||
|
def setup_network(self, split = False):
|
||||||
|
print("Setting up network...")
|
||||||
|
self.addr = "RWPg8B91kfK5UtUN7z6s6TeV9cHSGtVY8D"
|
||||||
|
self.pubkey = "02676d00110c2cd14ae24f95969e8598f7ccfaa675498b82654a5b5bd57fc1d8cf"
|
||||||
|
self.privkey = "UqMgxk7ySPNQ4r9nKAFPjkXy6r5t898yhuNCjSZJLg3RAM4WW1m9"
|
||||||
|
self.addr1 = "RXEXoa1nRmKhMbuZovpcYwQMsicwzccZBp"
|
||||||
|
self.pubkey1 = "024026d4ad4ecfc1f705a9b42ca64af6d2ad947509c085534a30b8861d756c6ff0"
|
||||||
|
self.privkey1 = "UtdydP56pGTFmawHzHr1wDrc4oUwCNW1ttX8Pc3KrvH3MA8P49Wi"
|
||||||
|
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir,
|
||||||
|
extra_args=[[
|
||||||
|
# always give -ac_name as first extra_arg and port as third
|
||||||
|
'-ac_name=REGTEST',
|
||||||
|
'-conf='+self.options.tmpdir+'/node0/REGTEST.conf',
|
||||||
|
'-port=64367',
|
||||||
|
'-rpcport=64368',
|
||||||
|
'-regtest',
|
||||||
|
'-addressindex=1',
|
||||||
|
'-spentindex=1',
|
||||||
|
'-ac_supply=5555555',
|
||||||
|
'-ac_reward=10000000000000',
|
||||||
|
'-pubkey=' + self.pubkey,
|
||||||
|
'-ac_cc=2',
|
||||||
|
'-whitelist=127.0.0.1',
|
||||||
|
'-debug',
|
||||||
|
'--daemon',
|
||||||
|
'-rpcuser=rt',
|
||||||
|
'-rpcpassword=rt'
|
||||||
|
],
|
||||||
|
['-ac_name=REGTEST',
|
||||||
|
'-conf='+self.options.tmpdir+'/node1/REGTEST.conf',
|
||||||
|
'-port=64365',
|
||||||
|
'-rpcport=64366',
|
||||||
|
'-regtest',
|
||||||
|
'-addressindex=1',
|
||||||
|
'-spentindex=1',
|
||||||
|
'-ac_supply=5555555',
|
||||||
|
'-ac_reward=10000000000000',
|
||||||
|
'-pubkey=' + self.pubkey1,
|
||||||
|
'-ac_cc=2',
|
||||||
|
'-whitelist=127.0.0.1',
|
||||||
|
'-debug',
|
||||||
|
'-addnode=127.0.0.1:64367',
|
||||||
|
'--daemon',
|
||||||
|
'-rpcuser=rt',
|
||||||
|
'-rpcpassword=rt']]
|
||||||
|
)
|
||||||
|
self.is_network_split = split
|
||||||
|
self.rpc = self.nodes[0]
|
||||||
|
self.rpc1 = self.nodes[1]
|
||||||
|
self.sync_all()
|
||||||
|
print("Done setting up network")
|
||||||
|
|
||||||
|
def send_and_mine(self, xtn, rpc_connection):
|
||||||
|
txid = rpc_connection.sendrawtransaction(xtn)
|
||||||
|
assert txid, 'got txid'
|
||||||
|
# we need the tx above to be confirmed in the next block
|
||||||
|
rpc_connection.generate(1)
|
||||||
|
return txid
|
||||||
|
|||||||
@@ -124,7 +124,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ac_name": "ZILLA",
|
"ac_name": "ZILLA",
|
||||||
"ac_supply": "11000000"
|
"ac_supply": "11000000",
|
||||||
|
"ac_sapling": "5000000",
|
||||||
|
"addnode": [
|
||||||
|
"51.68.215.104"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ac_name": "RFOX",
|
"ac_name": "RFOX",
|
||||||
|
|||||||
@@ -27,19 +27,19 @@ echo $pubkey
|
|||||||
./komodod -pubkey=$pubkey -ac_name=BEER -ac_supply=100000000 -addnode=78.47.196.146 &
|
./komodod -pubkey=$pubkey -ac_name=BEER -ac_supply=100000000 -addnode=78.47.196.146 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=PIZZA -ac_supply=100000000 -addnode=78.47.196.146 &
|
./komodod -pubkey=$pubkey -ac_name=PIZZA -ac_supply=100000000 -addnode=78.47.196.146 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=NINJA -ac_supply=100000000 -addnode=78.47.196.146 &
|
./komodod -pubkey=$pubkey -ac_name=NINJA -ac_supply=100000000 -addnode=78.47.196.146 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=OOT -ac_supply=216000000 -ac_saplinig=5000000 -addnode=174.138.107.226 &
|
./komodod -pubkey=$pubkey -ac_name=OOT -ac_supply=216000000 -ac_sapling=5000000 -addnode=174.138.107.226 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=BNTN -ac_supply=500000000 -addnode=94.130.169.205 &
|
./komodod -pubkey=$pubkey -ac_name=BNTN -ac_supply=500000000 -addnode=94.130.169.205 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=CHAIN -ac_supply=999999 -addnode=78.47.146.222 &
|
./komodod -pubkey=$pubkey -ac_name=CHAIN -ac_supply=999999 -addnode=78.47.146.222 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=PRLPAY -ac_supply=500000000 -addnode=13.250.226.125 &
|
./komodod -pubkey=$pubkey -ac_name=PRLPAY -ac_supply=500000000 -addnode=13.250.226.125 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=DSEC -ac_supply=7000000 -addnode=185.148.147.30 &
|
./komodod -pubkey=$pubkey -ac_name=DSEC -ac_supply=7000000 -addnode=185.148.147.30 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=GLXT -ac_supply=10000000000 -addnode=13.230.224.15 &
|
./komodod -pubkey=$pubkey -ac_name=GLXT -ac_supply=10000000000 -addnode=13.230.224.15 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=EQL -ac_supply=500000000 -ac_ccactivate=205000 -addnode=46.101.124.153 &
|
./komodod -pubkey=$pubkey -ac_name=EQL -ac_supply=500000000 -ac_ccactivate=205000 -addnode=46.101.124.153 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=ZILLA -ac_supply=11000000 -addnode=54.39.23.248 &
|
./komodod -pubkey=$pubkey -ac_name=ZILLA -ac_supply=11000000 -ac_sapling=5000000 -addnode=51.68.215.104 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=RFOX -ac_supply=1000000000 -ac_reward=100000000 -addnode=78.47.196.146 &
|
./komodod -pubkey=$pubkey -ac_name=RFOX -ac_supply=1000000000 -ac_reward=100000000 -addnode=78.47.196.146 &
|
||||||
~/VerusCoin/src/komodod -pubkey=$pubkey -ac_name=VRSC -ac_algo=verushash -ac_cc=1 -ac_veruspos=50 -ac_supply=0 -ac_eras=3 -ac_reward=0,38400000000,2400000000 -ac_halving=1,43200,1051920 -ac_decay=100000000,0,0 -ac_end=10080,226080,0 -ac_timelockgte=19200000000 -ac_timeunlockfrom=129600 -ac_timeunlockto=1180800 -addnode=185.25.48.236 -addnode=185.64.105.111 &
|
~/VerusCoin/src/komodod -pubkey=$pubkey -ac_name=VRSC -ac_algo=verushash -ac_cc=1 -ac_veruspos=50 -ac_supply=0 -ac_eras=3 -ac_reward=0,38400000000,2400000000 -ac_halving=1,43200,1051920 -ac_decay=100000000,0,0 -ac_end=10080,226080,0 -ac_timelockgte=19200000000 -ac_timeunlockfrom=129600 -ac_timeunlockto=1180800 -addnode=185.25.48.236 -addnode=185.64.105.111 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=SEC -ac_cc=333 -ac_supply=1000000000 -addnode=185.148.145.43 &
|
./komodod -pubkey=$pubkey -ac_name=SEC -ac_cc=333 -ac_supply=1000000000 -addnode=185.148.145.43 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=CCL -ac_supply=200000000 -ac_end=1 -ac_cc=2 -addressindex=1 -spentindex=1 -addnode=142.93.136.89 -addnode=195.201.22.89 &
|
./komodod -pubkey=$pubkey -ac_name=CCL -ac_supply=200000000 -ac_end=1 -ac_cc=2 -addressindex=1 -spentindex=1 -addnode=142.93.136.89 -addnode=195.201.22.89 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=PIRATE -ac_supply=0 -ac_reward=25600000000 -ac_halving=77777 -ac_private=1 -addnode=136.243.102.225 &
|
./komodod -pubkey=$pubkey -ac_name=PIRATE -ac_supply=0 -ac_reward=25600000000 -ac_halving=77777 -ac_private=1 -addnode=178.63.77.56 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=MGNX -ac_supply=12465003 -ac_staked=90 -ac_reward=2000000000 -ac_halving=525960 -ac_cc=2 -ac_end=2629800 -addnode=142.93.27.180 &
|
./komodod -pubkey=$pubkey -ac_name=MGNX -ac_supply=12465003 -ac_staked=90 -ac_reward=2000000000 -ac_halving=525960 -ac_cc=2 -ac_end=2629800 -addnode=142.93.27.180 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=PGT -ac_supply=10000000 -ac_end=1 -addnode=190.114.254.104 &
|
./komodod -pubkey=$pubkey -ac_name=PGT -ac_supply=10000000 -ac_end=1 -addnode=190.114.254.104 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=KMDICE -ac_supply=10500000 -ac_reward=2500000000 -ac_halving=210000 -ac_cc=2 -addressindex=1 -spentindex=1 -addnode=144.76.217.232 &
|
./komodod -pubkey=$pubkey -ac_name=KMDICE -ac_supply=10500000 -ac_reward=2500000000 -ac_halving=210000 -ac_cc=2 -addressindex=1 -spentindex=1 -addnode=144.76.217.232 &
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ so you can pay to a pubkey, or to its hash. or to a script's hash. the last is h
|
|||||||
all of the above are the standard bitcoin vout types and there should be plenty of materials about it
|
all of the above are the standard bitcoin vout types and there should be plenty of materials about it
|
||||||
Encrypted by a verified device
|
Encrypted by a verified device
|
||||||
what I did with the CC contracts is created a fourth type of vout, the CC vout. this is using the cryptoconditions standard and it is even a different signature mechanism. ed25519 instead of secp256k1. it is basically a big extension to the bitcoin script. There is a special opcode that is added that says it is a CC script.
|
what I did with the CC contracts is created a fourth type of vout, the CC vout. this is using the cryptoconditions standard and it is even a different signature mechanism. ed25519 instead of secp256k1. it is basically a big extension to the bitcoin script. There is a special opcode that is added that says it is a CC script.
|
||||||
|
|
||||||
but it gets more interesting
|
but it gets more interesting
|
||||||
each CC script has an evalcode
|
each CC script has an evalcode
|
||||||
this is just an arbitrary number. but what it does is allows to create a self-contained universe of CC utxo that all have the same evalcode and that is how a faucet CC differentiates itself from a dice CC, the eval code is different
|
this is just an arbitrary number. but what it does is allows to create a self-contained universe of CC utxo that all have the same evalcode and that is how a faucet CC differentiates itself from a dice CC, the eval code is different
|
||||||
@@ -73,7 +73,7 @@ struct CC_utxo
|
|||||||
|
|
||||||
// these are the parameters stored after Verus crypto-condition vouts. new versions may change
|
// these are the parameters stored after Verus crypto-condition vouts. new versions may change
|
||||||
// the format
|
// the format
|
||||||
struct CC_meta
|
struct CC_meta
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> version;
|
std::vector<unsigned char> version;
|
||||||
uint8_t evalCode;
|
uint8_t evalCode;
|
||||||
@@ -110,7 +110,7 @@ int32_t komodo_nextheight();
|
|||||||
static const uint256 zeroid;
|
static const uint256 zeroid;
|
||||||
bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock);
|
bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock);
|
||||||
int32_t is_hexstr(char *str,int32_t n);
|
int32_t is_hexstr(char *str,int32_t n);
|
||||||
bool myAddtomempool(CTransaction &tx, CValidationState *pstate = NULL);
|
bool myAddtomempool(CTransaction &tx, CValidationState *pstate = NULL, bool fSkipExpiry = false);
|
||||||
//uint64_t myGettxout(uint256 hash,int32_t n);
|
//uint64_t myGettxout(uint256 hash,int32_t n);
|
||||||
bool myIsutxo_spentinmempool(uint256 txid,int32_t vout);
|
bool myIsutxo_spentinmempool(uint256 txid,int32_t vout);
|
||||||
bool mytxid_inmempool(uint256 txid);
|
bool mytxid_inmempool(uint256 txid);
|
||||||
|
|||||||
11
src/cc/dapps/Makefile
Normal file
11
src/cc/dapps/Makefile
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# just type make to compile all dapps
|
||||||
|
all: zmigrate oraclefeed
|
||||||
|
|
||||||
|
zmigrate:
|
||||||
|
$(CC) zmigrate.c -o zmigrate -lm
|
||||||
|
|
||||||
|
oraclefeed:
|
||||||
|
$(CC) oraclefeed.c -o oraclefeed -lm
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm zmigrate oraclefeed
|
||||||
28
src/cc/dapps/README.md
Normal file
28
src/cc/dapps/README.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# CryptoCondition dApps
|
||||||
|
|
||||||
|
## Compiling
|
||||||
|
|
||||||
|
To compile all dapps in this directory:
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
## zmigrate - Sprout to Sapling Migration dApp
|
||||||
|
|
||||||
|
This tool converts Sprout zaddress funds into Sapling funds in a new Sapling address.
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
./zmigrate COIN zsaplingaddr
|
||||||
|
|
||||||
|
The above command may need to be run multiple times to complete the process.
|
||||||
|
|
||||||
|
This CLI implementation will be called by GUI wallets, average users do not
|
||||||
|
need to worry about using this low-level tool.
|
||||||
|
|
||||||
|
## oraclefeed - feed of price data using oracles
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
./oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT $BINDTXID [refcoin_cli]
|
||||||
|
|
||||||
|
Supported formats are L and Ihh. Price data from CoinDesk API.
|
||||||
@@ -670,6 +670,7 @@ int64_t find_onetime_amount(char *coinstr,char *coinaddr)
|
|||||||
coinaddr[0] = 0;
|
coinaddr[0] = 0;
|
||||||
if ( (array= get_listunspent(coinstr,"")) != 0 )
|
if ( (array= get_listunspent(coinstr,"")) != 0 )
|
||||||
{
|
{
|
||||||
|
//printf("got listunspent.(%s)\n",jprint(array,0));
|
||||||
if ( (n= cJSON_GetArraySize(array)) > 0 )
|
if ( (n= cJSON_GetArraySize(array)) > 0 )
|
||||||
{
|
{
|
||||||
for (i=0; i<n; i++)
|
for (i=0; i<n; i++)
|
||||||
@@ -734,6 +735,7 @@ int32_t z_sendmany(char *opidstr,char *coinstr,char *acname,char *srcaddr,char *
|
|||||||
cJSON *retjson; char *retstr,params[1024],addr[128];
|
cJSON *retjson; char *retstr,params[1024],addr[128];
|
||||||
sprintf(params,"'[{\"address\":\"%s\",\"amount\":%.8f}]'",destaddr,dstr(amount));
|
sprintf(params,"'[{\"address\":\"%s\",\"amount\":%.8f}]'",destaddr,dstr(amount));
|
||||||
sprintf(addr,"\"%s\"",srcaddr);
|
sprintf(addr,"\"%s\"",srcaddr);
|
||||||
|
printf("z_sendmany from.(%s) -> %s\n",srcaddr,params);
|
||||||
if ( (retjson= get_komodocli(coinstr,&retstr,acname,"z_sendmany",addr,params,"","")) != 0 )
|
if ( (retjson= get_komodocli(coinstr,&retstr,acname,"z_sendmany",addr,params,"","")) != 0 )
|
||||||
{
|
{
|
||||||
printf("unexpected json z_sendmany.(%s)\n",jprint(retjson,0));
|
printf("unexpected json z_sendmany.(%s)\n",jprint(retjson,0));
|
||||||
@@ -906,7 +908,7 @@ int32_t main(int32_t argc,char **argv)
|
|||||||
zsaddr = clonestr(argv[2]);
|
zsaddr = clonestr(argv[2]);
|
||||||
printf("%s: %s %s\n",REFCOIN_CLI,coinstr,zsaddr);
|
printf("%s: %s %s\n",REFCOIN_CLI,coinstr,zsaddr);
|
||||||
uint32_t lastopid; char coinaddr[64],zcaddr[128],opidstr[128]; int32_t finished; int64_t amount,stdamount,txfee;
|
uint32_t lastopid; char coinaddr[64],zcaddr[128],opidstr[128]; int32_t finished; int64_t amount,stdamount,txfee;
|
||||||
stdamount = 10000 * SATOSHIDEN;
|
//stdamount = 500 * SATOSHIDEN;
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
again:
|
again:
|
||||||
printf("start processing zmigrate\n");
|
printf("start processing zmigrate\n");
|
||||||
@@ -916,7 +918,7 @@ again:
|
|||||||
{
|
{
|
||||||
if ( have_pending_opid(coinstr,0) != 0 )
|
if ( have_pending_opid(coinstr,0) != 0 )
|
||||||
{
|
{
|
||||||
sleep(60);
|
sleep(10);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ( (amount= find_onetime_amount(coinstr,coinaddr)) > txfee )
|
if ( (amount= find_onetime_amount(coinstr,coinaddr)) > txfee )
|
||||||
@@ -930,14 +932,33 @@ again:
|
|||||||
if ( (amount= find_sprout_amount(coinstr,zcaddr)) > txfee )
|
if ( (amount= find_sprout_amount(coinstr,zcaddr)) > txfee )
|
||||||
{
|
{
|
||||||
// generate taddr, send max of 10000.0001
|
// generate taddr, send max of 10000.0001
|
||||||
if ( amount > stdamount+txfee )
|
static int64_t lastamount,lastamount2,lastamount3,lastamount4,refamount = 5000 * SATOSHIDEN;
|
||||||
amount = stdamount + txfee;
|
stdamount = refamount;
|
||||||
|
if ( amount == lastamount && amount == lastamount2 )
|
||||||
|
{
|
||||||
|
stdamount /= 10;
|
||||||
|
if ( amount == lastamount3 && amount == lastamount4 )
|
||||||
|
stdamount /= 10;
|
||||||
|
}
|
||||||
|
if ( stdamount < SATOSHIDEN )
|
||||||
|
{
|
||||||
|
stdamount = SATOSHIDEN;
|
||||||
|
refamount = SATOSHIDEN * 50;
|
||||||
|
}
|
||||||
|
if ( stdamount < refamount )
|
||||||
|
refamount = stdamount;
|
||||||
|
lastamount4 = lastamount3;
|
||||||
|
lastamount3 = lastamount2;
|
||||||
|
lastamount2 = lastamount;
|
||||||
|
lastamount = amount;
|
||||||
|
if ( amount > stdamount+2*txfee )
|
||||||
|
amount = stdamount + 2*txfee;
|
||||||
if ( getnewaddress(coinaddr,coinstr,"") == 0 )
|
if ( getnewaddress(coinaddr,coinstr,"") == 0 )
|
||||||
{
|
{
|
||||||
z_sendmany(opidstr,coinstr,"",zcaddr,coinaddr,amount-txfee);
|
z_sendmany(opidstr,coinstr,"",zcaddr,coinaddr,amount-txfee);
|
||||||
lastopid = (uint32_t)time(NULL);
|
lastopid = (uint32_t)time(NULL);
|
||||||
} else printf("couldnt getnewaddress!\n");
|
} else printf("couldnt getnewaddress!\n");
|
||||||
sleep(30);
|
sleep(3);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ( time(NULL) > lastopid+600 )
|
if ( time(NULL) > lastopid+600 )
|
||||||
|
|||||||
@@ -427,11 +427,11 @@ void *dicefinish(void *_ptr)
|
|||||||
if ( vin0_needed > 0 )
|
if ( vin0_needed > 0 )
|
||||||
{
|
{
|
||||||
num = 0;
|
num = 0;
|
||||||
//fprintf(stderr,"iter.%d vin0_needed.%d\n",iter,vin0_needed);
|
//fprintf(stderr,"iter.%d vin0_needed.%d\n",iter,vin0_needed);
|
||||||
utxos = (struct dicefinish_utxo *)calloc(vin0_needed,sizeof(*utxos));
|
utxos = (struct dicefinish_utxo *)calloc(vin0_needed,sizeof(*utxos));
|
||||||
if ( (n= dicefinish_utxosget(num,utxos,vin0_needed,coinaddr)) > 0 )
|
if ( (n= dicefinish_utxosget(num,utxos,vin0_needed,coinaddr)) > 0 )
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"iter.%d vin0_needed.%d got %d, num 0.0002 %d\n",iter,vin0_needed,n,num);
|
//fprintf(stderr,"iter.%d vin0_needed.%d got %d, num 0.0002 %d\n",iter,vin0_needed,n,num);
|
||||||
m = 0;
|
m = 0;
|
||||||
DL_FOREACH_SAFE(DICEFINISH_LIST,ptr,tmp)
|
DL_FOREACH_SAFE(DICEFINISH_LIST,ptr,tmp)
|
||||||
{
|
{
|
||||||
@@ -484,7 +484,8 @@ void *dicefinish(void *_ptr)
|
|||||||
//fprintf(stderr,"error ready.%d dicefinish %d of %d process %s %s using need %.8f finish.%s size.%d betspent.%d\n",ptr->bettxid_ready,m,n,iter<0?"loss":"win",ptr->bettxid.GetHex().c_str(),(double)(iter<0 ? 0 : ptr->winamount)/COIN,ptr->txid.GetHex().c_str(),(int32_t)ptr->rawtx.size(),dice_betspent((char *)"dicefinish",ptr->bettxid));
|
//fprintf(stderr,"error ready.%d dicefinish %d of %d process %s %s using need %.8f finish.%s size.%d betspent.%d\n",ptr->bettxid_ready,m,n,iter<0?"loss":"win",ptr->bettxid.GetHex().c_str(),(double)(iter<0 ? 0 : ptr->winamount)/COIN,ptr->txid.GetHex().c_str(),(int32_t)ptr->rawtx.size(),dice_betspent((char *)"dicefinish",ptr->bettxid));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if ( system("cc/dapps/sendmany100") != 0 )
|
||||||
|
fprintf(stderr,"error issing cc/dapps/sendmany100\n");
|
||||||
free(utxos);
|
free(utxos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -533,7 +534,7 @@ void DiceQueue(int32_t iswin,uint64_t sbits,uint256 fundingtxid,uint256 bettxid,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"DiceQueue status bettxid.%s already in list\n",bettxid.GetHex().c_str());
|
//fprintf(stderr,"DiceQueue status bettxid.%s already in list\n",bettxid.GetHex().c_str());
|
||||||
_dicehash_clear(bettxid);
|
//_dicehash_clear(bettxid);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&DICE_MUTEX);
|
pthread_mutex_unlock(&DICE_MUTEX);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ public:
|
|||||||
CBlockIndex* pskip;
|
CBlockIndex* pskip;
|
||||||
|
|
||||||
//! height of the entry in the chain. The genesis block has height 0
|
//! height of the entry in the chain. The genesis block has height 0
|
||||||
int64_t newcoins,zfunds; int8_t segid; // jl777 fields
|
int64_t newcoins,zfunds,sproutfunds; int8_t segid; // jl777 fields
|
||||||
//! Which # file this block is stored in (blk?????.dat)
|
//! Which # file this block is stored in (blk?????.dat)
|
||||||
int nFile;
|
int nFile;
|
||||||
|
|
||||||
|
|||||||
@@ -1,348 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
|
|
||||||
# We need space, tab and new line, in precisely that order. Quoting is
|
|
||||||
# there to prevent tools from complaining about whitespace usage.
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
file_conv=
|
|
||||||
|
|
||||||
# func_file_conv build_file lazy
|
|
||||||
# Convert a $build file to $host form and store it in $file
|
|
||||||
# Currently only supports Windows hosts. If the determined conversion
|
|
||||||
# type is listed in (the comma separated) LAZY, no conversion will
|
|
||||||
# take place.
|
|
||||||
func_file_conv ()
|
|
||||||
{
|
|
||||||
file=$1
|
|
||||||
case $file in
|
|
||||||
/ | /[!/]*) # absolute file, and not a UNC file
|
|
||||||
if test -z "$file_conv"; then
|
|
||||||
# lazily determine how to convert abs files
|
|
||||||
case `uname -s` in
|
|
||||||
MINGW*)
|
|
||||||
file_conv=mingw
|
|
||||||
;;
|
|
||||||
CYGWIN*)
|
|
||||||
file_conv=cygwin
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
file_conv=wine
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
case $file_conv/,$2, in
|
|
||||||
*,$file_conv,*)
|
|
||||||
;;
|
|
||||||
mingw/*)
|
|
||||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
|
||||||
;;
|
|
||||||
cygwin/*)
|
|
||||||
file=`cygpath -m "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
wine/*)
|
|
||||||
file=`winepath -w "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashL linkdir
|
|
||||||
# Make cl look for libraries in LINKDIR
|
|
||||||
func_cl_dashL ()
|
|
||||||
{
|
|
||||||
func_file_conv "$1"
|
|
||||||
if test -z "$lib_path"; then
|
|
||||||
lib_path=$file
|
|
||||||
else
|
|
||||||
lib_path="$lib_path;$file"
|
|
||||||
fi
|
|
||||||
linker_opts="$linker_opts -LIBPATH:$file"
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashl library
|
|
||||||
# Do a library search-path lookup for cl
|
|
||||||
func_cl_dashl ()
|
|
||||||
{
|
|
||||||
lib=$1
|
|
||||||
found=no
|
|
||||||
save_IFS=$IFS
|
|
||||||
IFS=';'
|
|
||||||
for dir in $lib_path $LIB
|
|
||||||
do
|
|
||||||
IFS=$save_IFS
|
|
||||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.dll.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/$lib.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/lib$lib.a"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/lib$lib.a
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS=$save_IFS
|
|
||||||
|
|
||||||
if test "$found" != yes; then
|
|
||||||
lib=$lib.lib
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_wrapper cl arg...
|
|
||||||
# Adjust compile command to suit cl
|
|
||||||
func_cl_wrapper ()
|
|
||||||
{
|
|
||||||
# Assume a capable shell
|
|
||||||
lib_path=
|
|
||||||
shared=:
|
|
||||||
linker_opts=
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.[oO][bB][jJ])
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fo"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fe"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
-I)
|
|
||||||
eat=1
|
|
||||||
func_file_conv "$2" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-I*)
|
|
||||||
func_file_conv "${1#-I}" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashl "$2"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l*)
|
|
||||||
func_cl_dashl "${1#-l}"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-L)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashL "$2"
|
|
||||||
;;
|
|
||||||
-L*)
|
|
||||||
func_cl_dashL "${1#-L}"
|
|
||||||
;;
|
|
||||||
-static)
|
|
||||||
shared=false
|
|
||||||
;;
|
|
||||||
-Wl,*)
|
|
||||||
arg=${1#-Wl,}
|
|
||||||
save_ifs="$IFS"; IFS=','
|
|
||||||
for flag in $arg; do
|
|
||||||
IFS="$save_ifs"
|
|
||||||
linker_opts="$linker_opts $flag"
|
|
||||||
done
|
|
||||||
IFS="$save_ifs"
|
|
||||||
;;
|
|
||||||
-Xlinker)
|
|
||||||
eat=1
|
|
||||||
linker_opts="$linker_opts $2"
|
|
||||||
;;
|
|
||||||
-*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
|
||||||
func_file_conv "$1"
|
|
||||||
set x "$@" -Tp"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
|
||||||
func_file_conv "$1" mingw
|
|
||||||
set x "$@" "$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
if test -n "$linker_opts"; then
|
|
||||||
linker_opts="-link$linker_opts"
|
|
||||||
fi
|
|
||||||
exec "$@" $linker_opts
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
eat=
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
|
||||||
arguments, and rename the output as expected.
|
|
||||||
|
|
||||||
If you are trying to build a whole package this is not the
|
|
||||||
right script to run: please start by reading the file 'INSTALL'.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "compile $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
|
|
||||||
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
|
|
||||||
func_cl_wrapper "$@" # Doesn't return...
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ofile=
|
|
||||||
cfile=
|
|
||||||
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
# So we strip '-o arg' only if arg is an object.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.obj)
|
|
||||||
ofile=$2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" -o "$2"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*.c)
|
|
||||||
cfile=$1
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$ofile" || test -z "$cfile"; then
|
|
||||||
# If no '-o' option was seen then we might have been invoked from a
|
|
||||||
# pattern rule where we don't need one. That is ok -- this is a
|
|
||||||
# normal compilation that the losing compiler can handle. If no
|
|
||||||
# '.c' file was seen then we are probably linking. That is also
|
|
||||||
# ok.
|
|
||||||
exec "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Name of file we expect compiler to create.
|
|
||||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
|
||||||
|
|
||||||
# Create the lock directory.
|
|
||||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
|
||||||
# that we are using for the .o file. Also, base the name on the expected
|
|
||||||
# object file name, since that is what matters with a parallel build.
|
|
||||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
|
||||||
while true; do
|
|
||||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
# FIXME: race condition here if user kills between mkdir and trap.
|
|
||||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
|
||||||
|
|
||||||
# Run the compile.
|
|
||||||
"$@"
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if test -f "$cofile"; then
|
|
||||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
|
||||||
elif test -f "${cofile}bj"; then
|
|
||||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
rmdir "$lockdir"
|
|
||||||
exit $ret
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC0"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
||||||
@@ -1501,7 +1501,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
|||||||
fReindex = true;
|
fReindex = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool clearWitnessCaches = false;
|
bool clearWitnessCaches = false;
|
||||||
|
|
||||||
bool fLoaded = false;
|
bool fLoaded = false;
|
||||||
@@ -1874,9 +1874,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
|||||||
VERUS_MINTBLOCKS = GetBoolArg("-mint", false);
|
VERUS_MINTBLOCKS = GetBoolArg("-mint", false);
|
||||||
|
|
||||||
if (pwalletMain || !GetArg("-mineraddress", "").empty())
|
if (pwalletMain || !GetArg("-mineraddress", "").empty())
|
||||||
GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", 0));
|
GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", -1));
|
||||||
#else
|
#else
|
||||||
GenerateBitcoins(GetBoolArg("-gen", false), GetArg("-genproclimit", 0));
|
GenerateBitcoins(GetBoolArg("-gen", false), GetArg("-genproclimit", -1));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ try_again:
|
|||||||
curl_handle = curl_easy_init();
|
curl_handle = curl_easy_init();
|
||||||
init_string(&s);
|
init_string(&s);
|
||||||
headers = curl_slist_append(0,"Expect:");
|
headers = curl_slist_append(0,"Expect:");
|
||||||
|
|
||||||
curl_easy_setopt(curl_handle,CURLOPT_USERAGENT,"mozilla/4.0");//"Mozilla/4.0 (compatible; )");
|
curl_easy_setopt(curl_handle,CURLOPT_USERAGENT,"mozilla/4.0");//"Mozilla/4.0 (compatible; )");
|
||||||
curl_easy_setopt(curl_handle,CURLOPT_HTTPHEADER, headers);
|
curl_easy_setopt(curl_handle,CURLOPT_HTTPHEADER, headers);
|
||||||
curl_easy_setopt(curl_handle,CURLOPT_URL, url);
|
curl_easy_setopt(curl_handle,CURLOPT_URL, url);
|
||||||
@@ -196,7 +196,7 @@ try_again:
|
|||||||
bracket0 = (char *)"[";
|
bracket0 = (char *)"[";
|
||||||
bracket1 = (char *)"]";
|
bracket1 = (char *)"]";
|
||||||
}
|
}
|
||||||
|
|
||||||
databuf = (char *)malloc(256 + strlen(command) + strlen(params));
|
databuf = (char *)malloc(256 + strlen(command) + strlen(params));
|
||||||
sprintf(databuf,"{\"id\":\"jl777\",\"method\":\"%s\",\"params\":%s%s%s}",command,bracket0,params,bracket1);
|
sprintf(databuf,"{\"id\":\"jl777\",\"method\":\"%s\",\"params\":%s%s%s}",command,bracket0,params,bracket1);
|
||||||
//printf("url.(%s) userpass.(%s) databuf.(%s)\n",url,userpass,databuf);
|
//printf("url.(%s) userpass.(%s) databuf.(%s)\n",url,userpass,databuf);
|
||||||
@@ -236,7 +236,7 @@ try_again:
|
|||||||
free(s.ptr);
|
free(s.ptr);
|
||||||
sleep((1<<numretries));
|
sleep((1<<numretries));
|
||||||
goto try_again;
|
goto try_again;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -522,7 +522,7 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t
|
|||||||
}
|
}
|
||||||
return(hash);
|
return(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint256 _komodo_getblockhash(int32_t height);*/
|
uint256 _komodo_getblockhash(int32_t height);*/
|
||||||
|
|
||||||
uint64_t komodo_seed(int32_t height)
|
uint64_t komodo_seed(int32_t height)
|
||||||
@@ -889,9 +889,9 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,uint32_t blo
|
|||||||
|
|
||||||
int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width)
|
int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width)
|
||||||
{
|
{
|
||||||
int32_t i,j,n,nonz,numnotaries; CBlock block; CBlockIndex *pindex; uint8_t notarypubs33[64][33],pubkey33[33];
|
int32_t i,j,nonz,numnotaries; CBlock block; CBlockIndex *pindex; uint8_t notarypubs33[64][33],pubkey33[33];
|
||||||
numnotaries = komodo_notaries(notarypubs33,height,0);
|
numnotaries = komodo_notaries(notarypubs33,height,0);
|
||||||
for (i=nonz=0; i<width; i++,n++)
|
for (i=nonz=0; i<width; i++)
|
||||||
{
|
{
|
||||||
if ( height-i <= 0 )
|
if ( height-i <= 0 )
|
||||||
continue;
|
continue;
|
||||||
@@ -1106,9 +1106,9 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
komodo_checkPOW (fast) is called early in the process and should only refer to data immediately available. it is a filter to prevent bad blocks from going into the local DB. The more blocks we can filter out at this stage, the less junk in the local DB that will just get purged later on.
|
komodo_checkPOW (fast) is called early in the process and should only refer to data immediately available. it is a filter to prevent bad blocks from going into the local DB. The more blocks we can filter out at this stage, the less junk in the local DB that will just get purged later on.
|
||||||
|
|
||||||
komodo_checkPOW (slow) is called right before connecting blocks so all prior blocks can be assumed to be there and all checks must pass
|
komodo_checkPOW (slow) is called right before connecting blocks so all prior blocks can be assumed to be there and all checks must pass
|
||||||
|
|
||||||
commission must be in coinbase.vout[1] and must be >= 10000 sats
|
commission must be in coinbase.vout[1] and must be >= 10000 sats
|
||||||
PoS stake must be without txfee and in the last tx in the block at vout[0]
|
PoS stake must be without txfee and in the last tx in the block at vout[0]
|
||||||
*/
|
*/
|
||||||
@@ -1123,11 +1123,13 @@ uint64_t komodo_commission(const CBlock *pblock,int32_t height)
|
|||||||
{
|
{
|
||||||
nSubsidy = GetBlockSubsidy(height,Params().GetConsensus());
|
nSubsidy = GetBlockSubsidy(height,Params().GetConsensus());
|
||||||
//fprintf(stderr,"ht.%d nSubsidy %.8f prod %llu\n",height,(double)nSubsidy/COIN,(long long)(nSubsidy * ASSETCHAINS_COMMISSION));
|
//fprintf(stderr,"ht.%d nSubsidy %.8f prod %llu\n",height,(double)nSubsidy/COIN,(long long)(nSubsidy * ASSETCHAINS_COMMISSION));
|
||||||
return((nSubsidy * ASSETCHAINS_COMMISSION) / COIN);
|
commission = ((nSubsidy * ASSETCHAINS_COMMISSION) / COIN);
|
||||||
n = pblock->vtx[0].vout.size();
|
if ( ASSETCHAINS_FOUNDERS > 1 )
|
||||||
for (j=0; j<n; j++)
|
{
|
||||||
if ( j != 1 )
|
if ( (height % ASSETCHAINS_FOUNDERS) == 0 )
|
||||||
total += pblock->vtx[0].vout[j].nValue;
|
commission = commission * ASSETCHAINS_FOUNDERS;
|
||||||
|
else commission = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1141,9 +1143,8 @@ uint64_t komodo_commission(const CBlock *pblock,int32_t height)
|
|||||||
total += pblock->vtx[i].vout[j].nValue;
|
total += pblock->vtx[i].vout[j].nValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
commission = ((total * ASSETCHAINS_COMMISSION) / COIN);
|
||||||
}
|
}
|
||||||
//fprintf(stderr,"txn.%d n.%d commission total %.8f -> %.8f\n",txn_count,n,dstr(total),dstr((total * ASSETCHAINS_COMMISSION) / COIN));
|
|
||||||
commission = ((total * ASSETCHAINS_COMMISSION) / COIN);
|
|
||||||
if ( commission < 10000 )
|
if ( commission < 10000 )
|
||||||
commission = 0;
|
commission = 0;
|
||||||
return(commission);
|
return(commission);
|
||||||
@@ -1545,7 +1546,7 @@ bool verusCheckPOSBlock(int32_t slowflag, CBlock *pblock, int32_t height)
|
|||||||
{
|
{
|
||||||
fprintf(stderr,"ERROR: chain not fully loaded or invalid PoS block %s - no past block found\n",blkHash.ToString().c_str());
|
fprintf(stderr,"ERROR: chain not fully loaded or invalid PoS block %s - no past block found\n",blkHash.ToString().c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#ifndef KOMODO_ZCASH
|
#ifndef KOMODO_ZCASH
|
||||||
if (!GetTransaction(txid, tx, Params().GetConsensus(), blkHash, true))
|
if (!GetTransaction(txid, tx, Params().GetConsensus(), blkHash, true))
|
||||||
#else
|
#else
|
||||||
@@ -1578,7 +1579,7 @@ bool verusCheckPOSBlock(int32_t slowflag, CBlock *pblock, int32_t height)
|
|||||||
{
|
{
|
||||||
BlockMap::const_iterator it = mapBlockIndex.find(blkHash);
|
BlockMap::const_iterator it = mapBlockIndex.find(blkHash);
|
||||||
if ((it == mapBlockIndex.end()) ||
|
if ((it == mapBlockIndex.end()) ||
|
||||||
!(pastBlockIndex = it->second) ||
|
!(pastBlockIndex = it->second) ||
|
||||||
(height - pastBlockIndex->GetHeight()) < VERUS_MIN_STAKEAGE)
|
(height - pastBlockIndex->GetHeight()) < VERUS_MIN_STAKEAGE)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"ERROR: invalid PoS block %s - stake source too new or not found\n",blkHash.ToString().c_str());
|
fprintf(stderr,"ERROR: invalid PoS block %s - stake source too new or not found\n",blkHash.ToString().c_str());
|
||||||
@@ -1695,7 +1696,7 @@ int64_t komodo_checkcommission(CBlock *pblock,int32_t height)
|
|||||||
// fprintf(stderr,"%02x",script[i]);
|
// fprintf(stderr,"%02x",script[i]);
|
||||||
//fprintf(stderr," payment to wrong pubkey scriptlen.%d, scriptpub[%d]\n",scriptlen,(int32_t)ASSETCHAINS_SCRIPTPUB.size()/2);
|
//fprintf(stderr," payment to wrong pubkey scriptlen.%d, scriptpub[%d]\n",scriptlen,(int32_t)ASSETCHAINS_SCRIPTPUB.size()/2);
|
||||||
return(-1);
|
return(-1);
|
||||||
|
|
||||||
}
|
}
|
||||||
if ( pblock->vtx[0].vout[1].nValue != checktoshis )
|
if ( pblock->vtx[0].vout[1].nValue != checktoshis )
|
||||||
{
|
{
|
||||||
@@ -1806,7 +1807,9 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
|||||||
if ( ASSETCHAINS_SCRIPTPUB.size() > 1 )
|
if ( ASSETCHAINS_SCRIPTPUB.size() > 1 )
|
||||||
{
|
{
|
||||||
int32_t scriptlen; uint8_t scripthex[10000];
|
int32_t scriptlen; uint8_t scripthex[10000];
|
||||||
if ( ASSETCHAINS_SCRIPTPUB.size()/2 == pblock->vtx[0].vout[0].scriptPubKey.size() && scriptlen < sizeof(scripthex) )
|
script = (uint8_t *)&pblock->vtx[0].vout[0].scriptPubKey[0];
|
||||||
|
scriptlen = (int32_t)pblock->vtx[0].vout[0].scriptPubKey.size();
|
||||||
|
if ( ASSETCHAINS_SCRIPTPUB.size()/2 == scriptlen && scriptlen < sizeof(scripthex) )
|
||||||
{
|
{
|
||||||
decode_hex(scripthex,scriptlen,(char *)ASSETCHAINS_SCRIPTPUB.c_str());
|
decode_hex(scripthex,scriptlen,(char *)ASSETCHAINS_SCRIPTPUB.c_str());
|
||||||
if ( memcmp(scripthex,script,scriptlen) != 0 )
|
if ( memcmp(scripthex,script,scriptlen) != 0 )
|
||||||
@@ -1848,9 +1851,9 @@ int32_t komodo_acpublic(uint32_t tiptime)
|
|||||||
return(acpublic);
|
return(acpublic);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t komodo_newcoins(int64_t *zfundsp,int32_t nHeight,CBlock *pblock)
|
int64_t komodo_newcoins(int64_t *zfundsp,int64_t *sproutfundsp,int32_t nHeight,CBlock *pblock)
|
||||||
{
|
{
|
||||||
CTxDestination address; int32_t i,j,m,n,vout; uint8_t *script; uint256 txid,hashBlock; int64_t zfunds=0,vinsum=0,voutsum=0;
|
CTxDestination address; int32_t i,j,m,n,vout; uint8_t *script; uint256 txid,hashBlock; int64_t zfunds=0,vinsum=0,voutsum=0,sproutfunds=0;
|
||||||
n = pblock->vtx.size();
|
n = pblock->vtx.size();
|
||||||
for (i=0; i<n; i++)
|
for (i=0; i<n; i++)
|
||||||
{
|
{
|
||||||
@@ -1890,10 +1893,13 @@ int64_t komodo_newcoins(int64_t *zfundsp,int32_t nHeight,CBlock *pblock)
|
|||||||
{
|
{
|
||||||
zfunds -= joinsplit.vpub_new;
|
zfunds -= joinsplit.vpub_new;
|
||||||
zfunds += joinsplit.vpub_old;
|
zfunds += joinsplit.vpub_old;
|
||||||
|
sproutfunds -= joinsplit.vpub_new;
|
||||||
|
sproutfunds += joinsplit.vpub_old;
|
||||||
}
|
}
|
||||||
zfunds -= tx.valueBalance;
|
zfunds -= tx.valueBalance;
|
||||||
}
|
}
|
||||||
*zfundsp = zfunds;
|
*zfundsp = zfunds;
|
||||||
|
*sproutfundsp = sproutfunds;
|
||||||
if ( ASSETCHAINS_SYMBOL[0] == 0 && (voutsum-vinsum) == 100003*SATOSHIDEN ) // 15 times
|
if ( ASSETCHAINS_SYMBOL[0] == 0 && (voutsum-vinsum) == 100003*SATOSHIDEN ) // 15 times
|
||||||
return(3 * SATOSHIDEN);
|
return(3 * SATOSHIDEN);
|
||||||
//if ( voutsum-vinsum+zfunds > 100000*SATOSHIDEN || voutsum-vinsum+zfunds < 0 )
|
//if ( voutsum-vinsum+zfunds > 100000*SATOSHIDEN || voutsum-vinsum+zfunds < 0 )
|
||||||
@@ -1901,11 +1907,11 @@ int64_t komodo_newcoins(int64_t *zfundsp,int32_t nHeight,CBlock *pblock)
|
|||||||
return(voutsum - vinsum);
|
return(voutsum - vinsum);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t komodo_coinsupply(int64_t *zfundsp,int32_t height)
|
int64_t komodo_coinsupply(int64_t *zfundsp,int64_t *sproutfundsp,int32_t height)
|
||||||
{
|
{
|
||||||
CBlockIndex *pindex; CBlock block; int64_t zfunds=0,supply = 0;
|
CBlockIndex *pindex; CBlock block; int64_t zfunds=0,sproutfunds=0,supply = 0;
|
||||||
//fprintf(stderr,"coinsupply %d\n",height);
|
//fprintf(stderr,"coinsupply %d\n",height);
|
||||||
*zfundsp = 0;
|
*zfundsp = *sproutfundsp = 0;
|
||||||
if ( (pindex= komodo_chainactive(height)) != 0 )
|
if ( (pindex= komodo_chainactive(height)) != 0 )
|
||||||
{
|
{
|
||||||
while ( pindex != 0 && pindex->GetHeight() > 0 )
|
while ( pindex != 0 && pindex->GetHeight() > 0 )
|
||||||
@@ -1913,7 +1919,7 @@ int64_t komodo_coinsupply(int64_t *zfundsp,int32_t height)
|
|||||||
if ( pindex->newcoins == 0 && pindex->zfunds == 0 )
|
if ( pindex->newcoins == 0 && pindex->zfunds == 0 )
|
||||||
{
|
{
|
||||||
if ( komodo_blockload(block,pindex) == 0 )
|
if ( komodo_blockload(block,pindex) == 0 )
|
||||||
pindex->newcoins = komodo_newcoins(&pindex->zfunds,pindex->GetHeight(),&block);
|
pindex->newcoins = komodo_newcoins(&pindex->zfunds,&pindex->sproutfunds,pindex->GetHeight(),&block);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(stderr,"error loading block.%d\n",pindex->GetHeight());
|
fprintf(stderr,"error loading block.%d\n",pindex->GetHeight());
|
||||||
@@ -1922,10 +1928,12 @@ int64_t komodo_coinsupply(int64_t *zfundsp,int32_t height)
|
|||||||
}
|
}
|
||||||
supply += pindex->newcoins;
|
supply += pindex->newcoins;
|
||||||
zfunds += pindex->zfunds;
|
zfunds += pindex->zfunds;
|
||||||
|
sproutfunds += pindex->sproutfunds;
|
||||||
//printf("start ht.%d new %.8f -> supply %.8f zfunds %.8f -> %.8f\n",pindex->GetHeight(),dstr(pindex->newcoins),dstr(supply),dstr(pindex->zfunds),dstr(zfunds));
|
//printf("start ht.%d new %.8f -> supply %.8f zfunds %.8f -> %.8f\n",pindex->GetHeight(),dstr(pindex->newcoins),dstr(supply),dstr(pindex->zfunds),dstr(zfunds));
|
||||||
pindex = pindex->pprev;
|
pindex = pindex->pprev;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*zfundsp = zfunds;
|
*zfundsp = zfunds;
|
||||||
|
*sproutfundsp = sproutfunds;
|
||||||
return(supply);
|
return(supply);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1373,7 +1373,7 @@ void komodo_passport_iteration()
|
|||||||
{
|
{
|
||||||
static long lastpos[34]; static char userpass[33][1024]; static uint32_t lasttime,callcounter,lastinterest;
|
static long lastpos[34]; static char userpass[33][1024]; static uint32_t lasttime,callcounter,lastinterest;
|
||||||
int32_t maxseconds = 10;
|
int32_t maxseconds = 10;
|
||||||
FILE *fp; uint8_t *filedata; long fpos,datalen,lastfpos; int32_t baseid,limit,n,ht,isrealtime,expired,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; uint32_t buf[3],starttime; cJSON *infoobj,*result; uint64_t RTmask = 0;
|
FILE *fp; uint8_t *filedata; long fpos,datalen,lastfpos; int32_t baseid,limit,n,ht,isrealtime,expired,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; uint32_t buf[3],starttime; cJSON *infoobj,*result; uint64_t RTmask = 0; //CBlockIndex *pindex;
|
||||||
expired = 0;
|
expired = 0;
|
||||||
while ( KOMODO_INITDONE == 0 )
|
while ( KOMODO_INITDONE == 0 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,10 +45,10 @@ struct komodo_state KOMODO_STATES[34];
|
|||||||
#define _COINBASE_MATURITY 100
|
#define _COINBASE_MATURITY 100
|
||||||
int COINBASE_MATURITY = _COINBASE_MATURITY;//100;
|
int COINBASE_MATURITY = _COINBASE_MATURITY;//100;
|
||||||
|
|
||||||
int32_t KOMODO_MININGTHREADS = -1,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX,KOMODO_EXCHANGEWALLET,KOMODO_REWIND,KOMODO_CONNECTING = -1,KOMODO_DEALERNODE,KOMODO_EXTRASATOSHI;
|
int32_t KOMODO_MININGTHREADS = -1,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX,KOMODO_EXCHANGEWALLET,KOMODO_REWIND,KOMODO_CONNECTING = -1,KOMODO_DEALERNODE,KOMODO_EXTRASATOSHI,ASSETCHAINS_FOUNDERS;
|
||||||
int32_t KOMODO_INSYNC,KOMODO_LASTMINED,prevKOMODO_LASTMINED,KOMODO_CCACTIVATE,JUMBLR_PAUSE = 1;
|
int32_t KOMODO_INSYNC,KOMODO_LASTMINED,prevKOMODO_LASTMINED,KOMODO_CCACTIVATE,JUMBLR_PAUSE = 1;
|
||||||
std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY,ASSETCHAINS_SCRIPTPUB;
|
std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY,ASSETCHAINS_SCRIPTPUB;
|
||||||
uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEYHASH[20],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE,ASSETCHAINS_TXPOW,ASSETCHAINS_FOUNDERS;
|
uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEYHASH[20],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE,ASSETCHAINS_TXPOW;
|
||||||
bool VERUS_MINTBLOCKS;
|
bool VERUS_MINTBLOCKS;
|
||||||
|
|
||||||
char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN],ASSETCHAINS_USERPASS[4096];
|
char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN],ASSETCHAINS_USERPASS[4096];
|
||||||
@@ -131,7 +131,7 @@ int64_t komodo_current_supply(uint32_t nHeight)
|
|||||||
|
|
||||||
if ( (baseid = komodo_baseid(ASSETCHAINS_SYMBOL)) >= 0 && baseid < 32 )
|
if ( (baseid = komodo_baseid(ASSETCHAINS_SYMBOL)) >= 0 && baseid < 32 )
|
||||||
cur_money = ASSETCHAINS_GENESISTXVAL + ASSETCHAINS_SUPPLY + nHeight * ASSETCHAINS_REWARD[0] / SATOSHIDEN;
|
cur_money = ASSETCHAINS_GENESISTXVAL + ASSETCHAINS_SUPPLY + nHeight * ASSETCHAINS_REWARD[0] / SATOSHIDEN;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// figure out max_money by adding up supply to a maximum of 10,000,000 blocks
|
// figure out max_money by adding up supply to a maximum of 10,000,000 blocks
|
||||||
cur_money = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN + (ASSETCHAINS_MAGIC & 0xffffff) + ASSETCHAINS_GENESISTXVAL;
|
cur_money = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN + (ASSETCHAINS_MAGIC & 0xffffff) + ASSETCHAINS_GENESISTXVAL;
|
||||||
@@ -144,7 +144,7 @@ int64_t komodo_current_supply(uint32_t nHeight)
|
|||||||
for ( int j = 0; j <= ASSETCHAINS_LASTERA; j++ )
|
for ( int j = 0; j <= ASSETCHAINS_LASTERA; j++ )
|
||||||
{
|
{
|
||||||
// if any condition means we have no more rewards, break
|
// if any condition means we have no more rewards, break
|
||||||
if (j != 0 && (nHeight <= ASSETCHAINS_ENDSUBSIDY[j - 1] || (ASSETCHAINS_ENDSUBSIDY[j - 1] == 0 &&
|
if (j != 0 && (nHeight <= ASSETCHAINS_ENDSUBSIDY[j - 1] || (ASSETCHAINS_ENDSUBSIDY[j - 1] == 0 &&
|
||||||
(ASSETCHAINS_REWARD[j] == 0 && (j == ASSETCHAINS_LASTERA || ASSETCHAINS_DECAY[j] != SATOSHIDEN)))))
|
(ASSETCHAINS_REWARD[j] == 0 && (j == ASSETCHAINS_LASTERA || ASSETCHAINS_DECAY[j] != SATOSHIDEN)))))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -155,6 +155,8 @@ int64_t komodo_current_supply(uint32_t nHeight)
|
|||||||
uint64_t lastEnd = j == 0 ? 0 : ASSETCHAINS_ENDSUBSIDY[j - 1];
|
uint64_t lastEnd = j == 0 ? 0 : ASSETCHAINS_ENDSUBSIDY[j - 1];
|
||||||
uint64_t curEnd = ASSETCHAINS_ENDSUBSIDY[j] == 0 ? nHeight : nHeight > ASSETCHAINS_ENDSUBSIDY[j] ? ASSETCHAINS_ENDSUBSIDY[j] : nHeight;
|
uint64_t curEnd = ASSETCHAINS_ENDSUBSIDY[j] == 0 ? nHeight : nHeight > ASSETCHAINS_ENDSUBSIDY[j] ? ASSETCHAINS_ENDSUBSIDY[j] : nHeight;
|
||||||
uint64_t period = ASSETCHAINS_HALVING[j];
|
uint64_t period = ASSETCHAINS_HALVING[j];
|
||||||
|
if ( period == 0 )
|
||||||
|
period = 210000;
|
||||||
uint32_t nSteps = (curEnd - lastEnd) / period;
|
uint32_t nSteps = (curEnd - lastEnd) / period;
|
||||||
uint32_t modulo = (curEnd - lastEnd) % period;
|
uint32_t modulo = (curEnd - lastEnd) % period;
|
||||||
uint64_t decay = ASSETCHAINS_DECAY[j];
|
uint64_t decay = ASSETCHAINS_DECAY[j];
|
||||||
@@ -178,7 +180,7 @@ int64_t komodo_current_supply(uint32_t nHeight)
|
|||||||
lowestSubsidy = 0;
|
lowestSubsidy = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Ex: -ac_eras=3 -ac_reward=0,384,24 -ac_end=1440,260640,0 -ac_halving=1,1440,2103840 -ac_decay 100000000,97750000,0
|
// Ex: -ac_eras=3 -ac_reward=0,384,24 -ac_end=1440,260640,0 -ac_halving=1,1440,2103840 -ac_decay 100000000,97750000,0
|
||||||
subsidyDifference = reward - ASSETCHAINS_REWARD[j + 1];
|
subsidyDifference = reward - ASSETCHAINS_REWARD[j + 1];
|
||||||
if (subsidyDifference < 0)
|
if (subsidyDifference < 0)
|
||||||
@@ -208,7 +210,8 @@ int64_t komodo_current_supply(uint32_t nHeight)
|
|||||||
|
|
||||||
// calculate amount in one step's triangular protrusion over minor triangle's hypotenuse
|
// calculate amount in one step's triangular protrusion over minor triangle's hypotenuse
|
||||||
denominator = nSteps * period;
|
denominator = nSteps * period;
|
||||||
|
if ( denominator == 0 )
|
||||||
|
denominator = 1;
|
||||||
// difference of one step vs. total
|
// difference of one step vs. total
|
||||||
stepDifference = (period * subsidyDifference) / denominator;
|
stepDifference = (period * subsidyDifference) / denominator;
|
||||||
|
|
||||||
@@ -231,7 +234,7 @@ int64_t komodo_current_supply(uint32_t nHeight)
|
|||||||
// if negative slope, the minor triangle is the full number of steps, as the highest
|
// if negative slope, the minor triangle is the full number of steps, as the highest
|
||||||
// level step is full. lowest subsidy is just the lowest so far
|
// level step is full. lowest subsidy is just the lowest so far
|
||||||
lowestSubsidy = reward - (stepDifference * nSteps);
|
lowestSubsidy = reward - (stepDifference * nSteps);
|
||||||
|
|
||||||
// add the step triangles, one per step
|
// add the step triangles, one per step
|
||||||
cur_money += stepTriangle * nSteps;
|
cur_money += stepTriangle * nSteps;
|
||||||
|
|
||||||
@@ -258,4 +261,3 @@ int64_t komodo_current_supply(uint32_t nHeight)
|
|||||||
}
|
}
|
||||||
return((int64_t)(cur_money + (cur_money * ASSETCHAINS_COMMISSION)));
|
return((int64_t)(cur_money + (cur_money * ASSETCHAINS_COMMISSION)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1068,7 +1068,7 @@ uint64_t komodo_block_prg(uint32_t nHeight)
|
|||||||
|
|
||||||
// given a block height, this returns the unlock time for that block height, derived from
|
// given a block height, this returns the unlock time for that block height, derived from
|
||||||
// the ASSETCHAINS_MAGIC number as well as the block height, providing different random numbers
|
// the ASSETCHAINS_MAGIC number as well as the block height, providing different random numbers
|
||||||
// for corresponding blocks across chains, but the same sequence in each chain
|
// for corresponding blocks across chains, but the same sequence in each chain
|
||||||
int64_t komodo_block_unlocktime(uint32_t nHeight)
|
int64_t komodo_block_unlocktime(uint32_t nHeight)
|
||||||
{
|
{
|
||||||
uint64_t fromTime, toTime, unlocktime;
|
uint64_t fromTime, toTime, unlocktime;
|
||||||
@@ -1500,6 +1500,9 @@ uint32_t komodo_assetmagic(char *symbol,uint64_t supply,uint8_t *extraptr,int32_
|
|||||||
{
|
{
|
||||||
vcalc_sha256(0,hash.bytes,extraptr,extralen);
|
vcalc_sha256(0,hash.bytes,extraptr,extralen);
|
||||||
crc0 = hash.uints[0];
|
crc0 = hash.uints[0];
|
||||||
|
int32_t i; for (i=0; i<extralen; i++)
|
||||||
|
fprintf(stderr,"%02x",extraptr[i]);
|
||||||
|
fprintf(stderr," extralen.%d crc0.%x\n",extralen,crc0);
|
||||||
}
|
}
|
||||||
return(calc_crc32(crc0,buf,len));
|
return(calc_crc32(crc0,buf,len));
|
||||||
}
|
}
|
||||||
@@ -1535,7 +1538,7 @@ uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp,uint8_t *extr
|
|||||||
printf("ports\n");
|
printf("ports\n");
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
char *iguanafmtstr = (char *)"curl --url \"http://127.0.0.1:7776\" --data \"{\\\"conf\\\":\\\"%s.conf\\\",\\\"path\\\":\\\"${HOME#\"/\"}/.komodo/%s\\\",\\\"unitval\\\":\\\"20\\\",\\\"zcash\\\":1,\\\"RELAY\\\":-1,\\\"VALIDATE\\\":0,\\\"prefetchlag\\\":-1,\\\"poll\\\":100,\\\"active\\\":1,\\\"agent\\\":\\\"iguana\\\",\\\"method\\\":\\\"addcoin\\\",\\\"startpend\\\":4,\\\"endpend\\\":4,\\\"services\\\":129,\\\"maxpeers\\\":8,\\\"newcoin\\\":\\\"%s\\\",\\\"name\\\":\\\"%s\\\",\\\"hasheaders\\\":1,\\\"useaddmultisig\\\":0,\\\"netmagic\\\":\\\"%s\\\",\\\"p2p\\\":%u,\\\"rpc\\\":%u,\\\"pubval\\\":60,\\\"p2shval\\\":85,\\\"wifval\\\":188,\\\"txfee_satoshis\\\":\\\"10000\\\",\\\"isPoS\\\":0,\\\"minoutput\\\":10000,\\\"minconfirms\\\":2,\\\"genesishash\\\":\\\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\\\",\\\"protover\\\":170002,\\\"genesisblock\\\":\\\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\\\",\\\"debug\\\":0,\\\"seedipaddr\\\":\\\"%s\\\"}\"";
|
char *iguanafmtstr = (char *)"curl --url \"http://127.0.0.1:7776\" --data \"{\\\"conf\\\":\\\"%s.conf\\\",\\\"path\\\":\\\"${HOME#\"/\"}/.komodo/%s\\\",\\\"unitval\\\":\\\"20\\\",\\\"zcash\\\":1,\\\"RELAY\\\":-1,\\\"VALIDATE\\\":0,\\\"prefetchlag\\\":-1,\\\"poll\\\":100,\\\"active\\\":1,\\\"sapling\\\":1,\\\"agent\\\":\\\"iguana\\\",\\\"method\\\":\\\"addcoin\\\",\\\"startpend\\\":4,\\\"endpend\\\":4,\\\"services\\\":129,\\\"maxpeers\\\":8,\\\"newcoin\\\":\\\"%s\\\",\\\"name\\\":\\\"%s\\\",\\\"hasheaders\\\":1,\\\"useaddmultisig\\\":0,\\\"netmagic\\\":\\\"%s\\\",\\\"p2p\\\":%u,\\\"rpc\\\":%u,\\\"pubval\\\":60,\\\"p2shval\\\":85,\\\"wifval\\\":188,\\\"txfee_satoshis\\\":\\\"10000\\\",\\\"isPoS\\\":0,\\\"minoutput\\\":10000,\\\"minconfirms\\\":2,\\\"genesishash\\\":\\\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\\\",\\\"protover\\\":170002,\\\"genesisblock\\\":\\\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\\\",\\\"debug\\\":0,\\\"seedipaddr\\\":\\\"%s\\\"}\"";
|
||||||
|
|
||||||
|
|
||||||
int32_t komodo_whoami(char *pubkeystr,int32_t height,uint32_t timestamp)
|
int32_t komodo_whoami(char *pubkeystr,int32_t height,uint32_t timestamp)
|
||||||
@@ -1604,7 +1607,7 @@ uint64_t komodo_ac_block_subsidy(int nHeight)
|
|||||||
subsidyDifference = subsidy;
|
subsidyDifference = subsidy;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Ex: -ac_eras=3 -ac_reward=0,384,24 -ac_end=1440,260640,0 -ac_halving=1,1440,2103840 -ac_decay 100000000,97750000,0
|
// Ex: -ac_eras=3 -ac_reward=0,384,24 -ac_end=1440,260640,0 -ac_halving=1,1440,2103840 -ac_decay 100000000,97750000,0
|
||||||
subsidyDifference = subsidy - ASSETCHAINS_REWARD[curEra + 1];
|
subsidyDifference = subsidy - ASSETCHAINS_REWARD[curEra + 1];
|
||||||
if (subsidyDifference < 0)
|
if (subsidyDifference < 0)
|
||||||
@@ -1654,11 +1657,9 @@ void komodo_args(char *argv0)
|
|||||||
std::string name,addn; char *dirname,fname[512],arg0str[64],magicstr[9]; uint8_t magic[4],extrabuf[8192],*extraptr=0; FILE *fp; uint64_t val; uint16_t port; int32_t i,baseid,len,n,extralen = 0;
|
std::string name,addn; char *dirname,fname[512],arg0str[64],magicstr[9]; uint8_t magic[4],extrabuf[8192],*extraptr=0; FILE *fp; uint64_t val; uint16_t port; int32_t i,baseid,len,n,extralen = 0;
|
||||||
IS_KOMODO_NOTARY = GetBoolArg("-notary", false);
|
IS_KOMODO_NOTARY = GetBoolArg("-notary", false);
|
||||||
|
|
||||||
if ( GetBoolArg("-gen", false) != 0 )\
|
if ( GetBoolArg("-gen", false) != 0 )
|
||||||
{
|
{
|
||||||
KOMODO_MININGTHREADS = GetArg("-genproclimit",-1);
|
KOMODO_MININGTHREADS = GetArg("-genproclimit",-1);
|
||||||
if (KOMODO_MININGTHREADS == 0)
|
|
||||||
mapArgs["-gen"] = "0";
|
|
||||||
}
|
}
|
||||||
else KOMODO_MININGTHREADS = 0;
|
else KOMODO_MININGTHREADS = 0;
|
||||||
|
|
||||||
@@ -1676,6 +1677,8 @@ void komodo_args(char *argv0)
|
|||||||
if ( strcmp(NOTARY_PUBKEY.c_str(),Notaries_elected1[i][1]) == 0 )
|
if ( strcmp(NOTARY_PUBKEY.c_str(),Notaries_elected1[i][1]) == 0 )
|
||||||
{
|
{
|
||||||
IS_KOMODO_NOTARY = 1;
|
IS_KOMODO_NOTARY = 1;
|
||||||
|
KOMODO_MININGTHREADS = 1;
|
||||||
|
mapArgs ["-genproclimit"] = itostr(KOMODO_MININGTHREADS);
|
||||||
fprintf(stderr,"running as notary.%d %s\n",i,Notaries_elected1[i][0]);
|
fprintf(stderr,"running as notary.%d %s\n",i,Notaries_elected1[i][0]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1765,19 +1768,22 @@ void komodo_args(char *argv0)
|
|||||||
|
|
||||||
MAX_BLOCK_SIGOPS = 60000;
|
MAX_BLOCK_SIGOPS = 60000;
|
||||||
ASSETCHAINS_TXPOW = GetArg("-ac_txpow",0) & 3;
|
ASSETCHAINS_TXPOW = GetArg("-ac_txpow",0) & 3;
|
||||||
ASSETCHAINS_FOUNDERS = GetArg("-ac_founders",0) & 1;
|
ASSETCHAINS_FOUNDERS = GetArg("-ac_founders",0);// & 1;
|
||||||
ASSETCHAINS_SUPPLY = GetArg("-ac_supply",10);
|
ASSETCHAINS_SUPPLY = GetArg("-ac_supply",10);
|
||||||
ASSETCHAINS_COMMISSION = GetArg("-ac_perc",0);
|
ASSETCHAINS_COMMISSION = GetArg("-ac_perc",0);
|
||||||
ASSETCHAINS_OVERRIDE_PUBKEY = GetArg("-ac_pubkey","");
|
ASSETCHAINS_OVERRIDE_PUBKEY = GetArg("-ac_pubkey","");
|
||||||
ASSETCHAINS_SCRIPTPUB = GetArg("-ac_script","");
|
ASSETCHAINS_SCRIPTPUB = GetArg("-ac_script","");
|
||||||
|
//ASSETCHAINS_FOUNDERS_PERIOD = GetArg("-ac_period",0);
|
||||||
|
|
||||||
if ( (ASSETCHAINS_STAKED= GetArg("-ac_staked",0)) > 100 )
|
if ( (ASSETCHAINS_STAKED= GetArg("-ac_staked",0)) > 100 )
|
||||||
ASSETCHAINS_STAKED = 100;
|
ASSETCHAINS_STAKED = 100;
|
||||||
|
|
||||||
// for now, we only support 50% PoS due to other parts of the algorithm needing adjustment for
|
// for now, we only support 50% PoS due to other parts of the algorithm needing adjustment for
|
||||||
// other values
|
// other values
|
||||||
if ( (ASSETCHAINS_LWMAPOS = GetArg("-ac_veruspos",0)) != 0 )
|
if ( (ASSETCHAINS_LWMAPOS = GetArg("-ac_veruspos",0)) != 0 )
|
||||||
|
{
|
||||||
ASSETCHAINS_LWMAPOS = 50;
|
ASSETCHAINS_LWMAPOS = 50;
|
||||||
|
}
|
||||||
ASSETCHAINS_SAPLING = GetArg("-ac_sapling", -1);
|
ASSETCHAINS_SAPLING = GetArg("-ac_sapling", -1);
|
||||||
if (ASSETCHAINS_SAPLING == -1)
|
if (ASSETCHAINS_SAPLING == -1)
|
||||||
{
|
{
|
||||||
@@ -1823,7 +1829,7 @@ void komodo_args(char *argv0)
|
|||||||
}
|
}
|
||||||
if ( ASSETCHAINS_ENDSUBSIDY[0] != 0 || ASSETCHAINS_REWARD[0] != 0 || ASSETCHAINS_HALVING[0] != 0 || ASSETCHAINS_DECAY[0] != 0 || ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_PUBLIC != 0 || ASSETCHAINS_PRIVATE != 0 || ASSETCHAINS_TXPOW != 0 || ASSETCHAINS_FOUNDERS != 0 || ASSETCHAINS_SCRIPTPUB.size() > 1 )
|
if ( ASSETCHAINS_ENDSUBSIDY[0] != 0 || ASSETCHAINS_REWARD[0] != 0 || ASSETCHAINS_HALVING[0] != 0 || ASSETCHAINS_DECAY[0] != 0 || ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_PUBLIC != 0 || ASSETCHAINS_PRIVATE != 0 || ASSETCHAINS_TXPOW != 0 || ASSETCHAINS_FOUNDERS != 0 || ASSETCHAINS_SCRIPTPUB.size() > 1 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"perc %.4f%% ac_pub=[%02x%02x%02x...]\n",dstr(ASSETCHAINS_COMMISSION)*100,ASSETCHAINS_OVERRIDE_PUBKEY33[0],ASSETCHAINS_OVERRIDE_PUBKEY33[1],ASSETCHAINS_OVERRIDE_PUBKEY33[2]);
|
fprintf(stderr,"perc %.4f%% ac_pub=[%02x%02x%02x...] acsize.%d\n",dstr(ASSETCHAINS_COMMISSION)*100,ASSETCHAINS_OVERRIDE_PUBKEY33[0],ASSETCHAINS_OVERRIDE_PUBKEY33[1],ASSETCHAINS_OVERRIDE_PUBKEY33[2],(int32_t)ASSETCHAINS_SCRIPTPUB.size());
|
||||||
extraptr = extrabuf;
|
extraptr = extrabuf;
|
||||||
memcpy(extraptr,ASSETCHAINS_OVERRIDE_PUBKEY33,33), extralen = 33;
|
memcpy(extraptr,ASSETCHAINS_OVERRIDE_PUBKEY33,33), extralen = 33;
|
||||||
|
|
||||||
@@ -1870,9 +1876,19 @@ void komodo_args(char *argv0)
|
|||||||
val = ASSETCHAINS_COMMISSION | (((uint64_t)ASSETCHAINS_STAKED & 0xff) << 32) | (((uint64_t)ASSETCHAINS_CC & 0xffff) << 40) | ((ASSETCHAINS_PUBLIC != 0) << 7) | ((ASSETCHAINS_PRIVATE != 0) << 6) | ASSETCHAINS_TXPOW;
|
val = ASSETCHAINS_COMMISSION | (((uint64_t)ASSETCHAINS_STAKED & 0xff) << 32) | (((uint64_t)ASSETCHAINS_CC & 0xffff) << 40) | ((ASSETCHAINS_PUBLIC != 0) << 7) | ((ASSETCHAINS_PRIVATE != 0) << 6) | ASSETCHAINS_TXPOW;
|
||||||
extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(val),(void *)&val);
|
extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(val),(void *)&val);
|
||||||
if ( ASSETCHAINS_FOUNDERS != 0 )
|
if ( ASSETCHAINS_FOUNDERS != 0 )
|
||||||
extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_FOUNDERS),(void *)&ASSETCHAINS_FOUNDERS);
|
{
|
||||||
|
uint8_t tmp = 1;
|
||||||
|
extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(tmp),(void *)&tmp);
|
||||||
|
if ( ASSETCHAINS_FOUNDERS > 1 )
|
||||||
|
extralen += iguana_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_FOUNDERS),(void *)&ASSETCHAINS_FOUNDERS);
|
||||||
|
}
|
||||||
if ( ASSETCHAINS_SCRIPTPUB.size() > 1 )
|
if ( ASSETCHAINS_SCRIPTPUB.size() > 1 )
|
||||||
extralen += iguana_rwnum(1,&extraptr[extralen],(int32_t)ASSETCHAINS_SCRIPTPUB.size(),(void *)ASSETCHAINS_SCRIPTPUB.c_str());
|
{
|
||||||
|
decode_hex(&extraptr[extralen],ASSETCHAINS_SCRIPTPUB.size()/2,(char *)ASSETCHAINS_SCRIPTPUB.c_str());
|
||||||
|
extralen += ASSETCHAINS_SCRIPTPUB.size()/2;
|
||||||
|
//extralen += iguana_rwnum(1,&extraptr[extralen],(int32_t)ASSETCHAINS_SCRIPTPUB.size(),(void *)ASSETCHAINS_SCRIPTPUB.c_str());
|
||||||
|
fprintf(stderr,"append ac_script %s\n",ASSETCHAINS_SCRIPTPUB.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addn = GetArg("-seednode","");
|
addn = GetArg("-seednode","");
|
||||||
@@ -1899,11 +1915,11 @@ void komodo_args(char *argv0)
|
|||||||
while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 )
|
while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"waiting for datadir\n");
|
fprintf(stderr,"waiting for datadir\n");
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
sleep(3);
|
sleep(3);
|
||||||
#else
|
#else
|
||||||
boost::this_thread::sleep(boost::posix_time::milliseconds(3000));
|
boost::this_thread::sleep(boost::posix_time::milliseconds(3000));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
//fprintf(stderr,"Got datadir.(%s)\n",dirname);
|
//fprintf(stderr,"Got datadir.(%s)\n",dirname);
|
||||||
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
||||||
@@ -2051,4 +2067,3 @@ void komodo_prefetch(FILE *fp)
|
|||||||
}
|
}
|
||||||
fseek(fp,fpos,SEEK_SET);
|
fseek(fp,fpos,SEEK_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
172
src/main.cpp
172
src/main.cpp
@@ -134,7 +134,7 @@ namespace {
|
|||||||
// First sort by most total work, ...
|
// First sort by most total work, ...
|
||||||
if (pa->chainPower > pb->chainPower) return false;
|
if (pa->chainPower > pb->chainPower) return false;
|
||||||
if (pa->chainPower < pb->chainPower) return true;
|
if (pa->chainPower < pb->chainPower) return true;
|
||||||
|
|
||||||
// ... then by earliest time received, ...
|
// ... then by earliest time received, ...
|
||||||
if (pa->nSequenceId < pb->nSequenceId) return false;
|
if (pa->nSequenceId < pb->nSequenceId) return false;
|
||||||
if (pa->nSequenceId > pb->nSequenceId) return true;
|
if (pa->nSequenceId > pb->nSequenceId) return true;
|
||||||
@@ -469,7 +469,7 @@ namespace {
|
|||||||
|
|
||||||
// Make sure pindexBestKnownBlock is up to date, we'll need it.
|
// Make sure pindexBestKnownBlock is up to date, we'll need it.
|
||||||
ProcessBlockAvailability(nodeid);
|
ProcessBlockAvailability(nodeid);
|
||||||
|
|
||||||
if (state->pindexBestKnownBlock == NULL || state->pindexBestKnownBlock->chainPower < chainActive.Tip()->chainPower) {
|
if (state->pindexBestKnownBlock == NULL || state->pindexBestKnownBlock->chainPower < chainActive.Tip()->chainPower) {
|
||||||
// This peer has nothing interesting.
|
// This peer has nothing interesting.
|
||||||
return;
|
return;
|
||||||
@@ -961,13 +961,13 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in
|
|||||||
bool ContextualCheckCoinbaseTransaction(const CTransaction& tx, const int nHeight)
|
bool ContextualCheckCoinbaseTransaction(const CTransaction& tx, const int nHeight)
|
||||||
{
|
{
|
||||||
// if time locks are on, ensure that this coin base is time locked exactly as it should be
|
// if time locks are on, ensure that this coin base is time locked exactly as it should be
|
||||||
if (((uint64_t)(tx.GetValueOut()) >= ASSETCHAINS_TIMELOCKGTE) ||
|
if (((uint64_t)(tx.GetValueOut()) >= ASSETCHAINS_TIMELOCKGTE) ||
|
||||||
(((nHeight >= 31680) || strcmp(ASSETCHAINS_SYMBOL, "VRSC") != 0) && komodo_ac_block_subsidy(nHeight) >= ASSETCHAINS_TIMELOCKGTE))
|
(((nHeight >= 31680) || strcmp(ASSETCHAINS_SYMBOL, "VRSC") != 0) && komodo_ac_block_subsidy(nHeight) >= ASSETCHAINS_TIMELOCKGTE))
|
||||||
{
|
{
|
||||||
CScriptID scriptHash;
|
CScriptID scriptHash;
|
||||||
|
|
||||||
// to be valid, it must be a P2SH transaction and have an op_return in vout[1] that
|
// to be valid, it must be a P2SH transaction and have an op_return in vout[1] that
|
||||||
// holds the full output script, which may include multisig, etc., but starts with
|
// holds the full output script, which may include multisig, etc., but starts with
|
||||||
// the time lock verify of the correct time lock for this block height
|
// the time lock verify of the correct time lock for this block height
|
||||||
if (tx.vout.size() == 2 &&
|
if (tx.vout.size() == 2 &&
|
||||||
CScriptExt(tx.vout[0].scriptPubKey).IsPayToScriptHash(&scriptHash) &&
|
CScriptExt(tx.vout[0].scriptPubKey).IsPayToScriptHash(&scriptHash) &&
|
||||||
@@ -1020,10 +1020,9 @@ bool ContextualCheckTransaction(
|
|||||||
|
|
||||||
// If Sprout rules apply, reject transactions which are intended for Overwinter and beyond
|
// If Sprout rules apply, reject transactions which are intended for Overwinter and beyond
|
||||||
if (isSprout && tx.fOverwintered) {
|
if (isSprout && tx.fOverwintered) {
|
||||||
return state.DoS(isInitBlockDownload() ? 0 : dosLevel,
|
int32_t ht = Params().GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight;
|
||||||
error("ContextualCheckTransaction(): ht.%d activates.%d dosLevel.%d overwinter is not active yet",
|
return state.DoS((ht < 0 || nHeight < ht) ? 0 : dosLevel,error("ContextualCheckTransaction(): ht.%d activates.%d dosLevel.%d overwinter is not active yet",nHeight, Params().GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight, dosLevel),REJECT_INVALID, "tx-overwinter-not-active");
|
||||||
nHeight, Params().GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight, dosLevel),
|
//return state.DoS(isInitBlockDownload() ? 0 : dosLevel,error("ContextualCheckTransaction(): ht.%d activates.%d dosLevel.%d overwinter is not active yet",nHeight, Params().GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight, dosLevel),REJECT_INVALID, "tx-overwinter-not-active");
|
||||||
REJECT_INVALID, "tx-overwinter-not-active");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (saplingActive) {
|
if (saplingActive) {
|
||||||
@@ -1077,11 +1076,14 @@ bool ContextualCheckTransaction(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Rules that apply to Overwinter or later:
|
// Rules that apply to Overwinter or later:
|
||||||
if (overwinterActive) {
|
if (overwinterActive)
|
||||||
|
{
|
||||||
// Reject transactions intended for Sprout
|
// Reject transactions intended for Sprout
|
||||||
if (!tx.fOverwintered) {
|
if (!tx.fOverwintered)
|
||||||
return state.DoS(dosLevel, error("ContextualCheckTransaction: overwinter is active"),
|
{
|
||||||
REJECT_INVALID, "tx-overwinter-active");
|
int32_t ht = Params().GetConsensus().vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight;
|
||||||
|
fprintf(stderr,"overwinter is active tx.%s not, ht.%d vs %d\n",tx.GetHash().ToString().c_str(),nHeight,ht);
|
||||||
|
return state.DoS((ASSETCHAINS_PRIVATE != 0 || ht < 0 || nHeight < ht) ? 0 : dosLevel, error("ContextualCheckTransaction: overwinter is active"),REJECT_INVALID, "tx-overwinter-active");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that all transactions are unexpired
|
// Check that all transactions are unexpired
|
||||||
@@ -1117,7 +1119,7 @@ bool ContextualCheckTransaction(
|
|||||||
return state.DoS(100, error("CheckTransaction(): error computing signature hash"),
|
return state.DoS(100, error("CheckTransaction(): error computing signature hash"),
|
||||||
REJECT_INVALID, "error-computing-signature-hash");
|
REJECT_INVALID, "error-computing-signature-hash");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(tx.IsMint() || tx.vjoinsplit.empty()))
|
if (!(tx.IsMint() || tx.vjoinsplit.empty()))
|
||||||
@@ -1447,7 +1449,7 @@ bool CheckTransactionWithoutProofVerification(uint32_t tiptime,const CTransactio
|
|||||||
{
|
{
|
||||||
static uint32_t counter;
|
static uint32_t counter;
|
||||||
if ( counter++ < 10 )
|
if ( counter++ < 10 )
|
||||||
fprintf(stderr,"found taddr in private chain: z_z.%d z_t.%d t_z.%d\n",z_z,z_t,t_z);
|
fprintf(stderr,"found taddr in private chain: z_z.%d z_t.%d t_z.%d vinsize.%d\n",z_z,z_t,t_z,(int32_t)tx.vin.size());
|
||||||
if ( z_t == 0 || z_z != 0 || t_z != 0 || tx.vin.size() != 0 )
|
if ( z_t == 0 || z_z != 0 || t_z != 0 || tx.vin.size() != 0 )
|
||||||
return state.DoS(100, error("CheckTransaction(): this is a private chain, only sprout -> taddr allowed until deadline"),REJECT_INVALID, "bad-txns-acprivacy-chain");
|
return state.DoS(100, error("CheckTransaction(): this is a private chain, only sprout -> taddr allowed until deadline"),REJECT_INVALID, "bad-txns-acprivacy-chain");
|
||||||
}
|
}
|
||||||
@@ -1597,7 +1599,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, int dosLevel)
|
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, int dosLevel, bool fSkipExpiry)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
if (pfMissingInputs)
|
if (pfMissingInputs)
|
||||||
@@ -1634,7 +1636,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|||||||
}
|
}
|
||||||
// DoS level set to 10 to be more forgiving.
|
// DoS level set to 10 to be more forgiving.
|
||||||
// Check transaction contextually against the set of consensus rules which apply in the next block to be mined.
|
// Check transaction contextually against the set of consensus rules which apply in the next block to be mined.
|
||||||
if (!ContextualCheckTransaction(tx, state, nextBlockHeight, (dosLevel == -1) ? 10 : dosLevel))
|
if (!fSkipExpiry && !ContextualCheckTransaction(tx, state, nextBlockHeight, (dosLevel == -1) ? 10 : dosLevel))
|
||||||
{
|
{
|
||||||
return error("AcceptToMemoryPool: ContextualCheckTransaction failed");
|
return error("AcceptToMemoryPool: ContextualCheckTransaction failed");
|
||||||
}
|
}
|
||||||
@@ -1731,8 +1733,10 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|||||||
if (pfMissingInputs)
|
if (pfMissingInputs)
|
||||||
*pfMissingInputs = true;
|
*pfMissingInputs = true;
|
||||||
//fprintf(stderr,"missing inputs\n");
|
//fprintf(stderr,"missing inputs\n");
|
||||||
//return state.DoS(0, error("AcceptToMemoryPool: tx inputs not found"),REJECT_INVALID, "bad-txns-inputs-missing");
|
if (!fSkipExpiry)
|
||||||
return(false);
|
return state.DoS(0, error("AcceptToMemoryPool: tx inputs not found"),REJECT_INVALID, "bad-txns-inputs-missing");
|
||||||
|
else
|
||||||
|
return(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1740,7 +1744,10 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|||||||
if (!view.HaveInputs(tx))
|
if (!view.HaveInputs(tx))
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"accept failure.1\n");
|
//fprintf(stderr,"accept failure.1\n");
|
||||||
return state.Invalid(error("AcceptToMemoryPool: inputs already spent"),REJECT_DUPLICATE, "bad-txns-inputs-spent");
|
if (!fSkipExpiry)
|
||||||
|
return state.Invalid(error("AcceptToMemoryPool: inputs already spent"),REJECT_DUPLICATE, "bad-txns-inputs-spent");
|
||||||
|
else
|
||||||
|
return(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// are the joinsplit's requirements met?
|
// are the joinsplit's requirements met?
|
||||||
@@ -1751,7 +1758,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|||||||
}
|
}
|
||||||
// Bring the best block into scope
|
// Bring the best block into scope
|
||||||
view.GetBestBlock();
|
view.GetBestBlock();
|
||||||
|
|
||||||
nValueIn = view.GetValueIn(chainActive.LastTip()->GetHeight(),&interest,tx,chainActive.LastTip()->nTime);
|
nValueIn = view.GetValueIn(chainActive.LastTip()->GetHeight(),&interest,tx,chainActive.LastTip()->nTime);
|
||||||
if ( 0 && interest != 0 )
|
if ( 0 && interest != 0 )
|
||||||
fprintf(stderr,"add interest %.8f\n",(double)interest/COIN);
|
fprintf(stderr,"add interest %.8f\n",(double)interest/COIN);
|
||||||
@@ -1846,7 +1853,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|||||||
dFreeCount += nSize;
|
dFreeCount += nSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fRejectAbsurdFee && nFees > ::minRelayTxFee.GetFee(nSize) * 10000 && nFees > nValueOut/19)
|
if (fRejectAbsurdFee && nFees > ::minRelayTxFee.GetFee(nSize) * 10000 && nFees > nValueOut/19)
|
||||||
{
|
{
|
||||||
string errmsg = strprintf("absurdly high fees %s, %d > %d",
|
string errmsg = strprintf("absurdly high fees %s, %d > %d",
|
||||||
hash.ToString(),
|
hash.ToString(),
|
||||||
@@ -1973,14 +1980,14 @@ bool GetAddressUnspent(uint160 addressHash, int type,
|
|||||||
else return(coins.vout[n].nValue);
|
else return(coins.vout[n].nValue);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
bool myAddtomempool(CTransaction &tx, CValidationState *pstate)
|
bool myAddtomempool(CTransaction &tx, CValidationState *pstate, bool fSkipExpiry)
|
||||||
{
|
{
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
if (!pstate)
|
if (!pstate)
|
||||||
pstate = &state;
|
pstate = &state;
|
||||||
CTransaction Ltx; bool fMissingInputs,fOverrideFees = false;
|
CTransaction Ltx; bool fMissingInputs,fOverrideFees = false;
|
||||||
if ( mempool.lookup(tx.GetHash(),Ltx) == 0 )
|
if ( mempool.lookup(tx.GetHash(),Ltx) == 0 )
|
||||||
return(AcceptToMemoryPool(mempool, *pstate, tx, true, &fMissingInputs, !fOverrideFees));
|
return(AcceptToMemoryPool(mempool, *pstate, tx, false, &fMissingInputs, !fOverrideFees, -1, fSkipExpiry));
|
||||||
else return(true);
|
else return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2302,9 +2309,9 @@ int IsNotInSync()
|
|||||||
|
|
||||||
CBlockIndex *pbi = chainActive.Tip();
|
CBlockIndex *pbi = chainActive.Tip();
|
||||||
int longestchain = komodo_longestchain();
|
int longestchain = komodo_longestchain();
|
||||||
if ( !pbi ||
|
if ( !pbi ||
|
||||||
(pindexBestHeader == 0) ||
|
(pindexBestHeader == 0) ||
|
||||||
((pindexBestHeader->GetHeight() - 1) > pbi->GetHeight()) ||
|
((pindexBestHeader->GetHeight() - 1) > pbi->GetHeight()) ||
|
||||||
(longestchain != 0 && longestchain > pbi->GetHeight()) )
|
(longestchain != 0 && longestchain > pbi->GetHeight()) )
|
||||||
{
|
{
|
||||||
return (pbi && pindexBestHeader && (pindexBestHeader->GetHeight() - 1) > pbi->GetHeight()) ?
|
return (pbi && pindexBestHeader && (pindexBestHeader->GetHeight() - 1) > pbi->GetHeight()) ?
|
||||||
@@ -2332,7 +2339,7 @@ void CheckForkWarningConditions()
|
|||||||
// of our head, drop it
|
// of our head, drop it
|
||||||
if (pindexBestForkTip && chainActive.Height() - pindexBestForkTip->GetHeight() >= 288)
|
if (pindexBestForkTip && chainActive.Height() - pindexBestForkTip->GetHeight() >= 288)
|
||||||
pindexBestForkTip = NULL;
|
pindexBestForkTip = NULL;
|
||||||
|
|
||||||
if (pindexBestForkTip || (pindexBestInvalid && pindexBestInvalid->chainPower > (chainActive.LastTip()->chainPower + (GetBlockProof(*chainActive.LastTip()) * 6))))
|
if (pindexBestForkTip || (pindexBestInvalid && pindexBestInvalid->chainPower > (chainActive.LastTip()->chainPower + (GetBlockProof(*chainActive.LastTip()) * 6))))
|
||||||
{
|
{
|
||||||
if (!fLargeWorkForkFound && pindexBestForkBase)
|
if (!fLargeWorkForkFound && pindexBestForkBase)
|
||||||
@@ -2924,7 +2931,7 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex
|
|||||||
{
|
{
|
||||||
CCoinsModifier outs = view.ModifyCoins(hash);
|
CCoinsModifier outs = view.ModifyCoins(hash);
|
||||||
outs->ClearUnspendable();
|
outs->ClearUnspendable();
|
||||||
|
|
||||||
CCoins outsBlock(tx, pindex->GetHeight());
|
CCoins outsBlock(tx, pindex->GetHeight());
|
||||||
// The CCoins serialization does not serialize negative numbers.
|
// The CCoins serialization does not serialize negative numbers.
|
||||||
// No network rules currently depend on the version here, so an inconsistency is harmless
|
// No network rules currently depend on the version here, so an inconsistency is harmless
|
||||||
@@ -3108,7 +3115,7 @@ void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const
|
|||||||
// Aim for one false-positive about every fifty years of normal running:
|
// Aim for one false-positive about every fifty years of normal running:
|
||||||
const int FIFTY_YEARS = 50*365*24*60*60;
|
const int FIFTY_YEARS = 50*365*24*60*60;
|
||||||
double alertThreshold = 1.0 / (FIFTY_YEARS / SPAN_SECONDS);
|
double alertThreshold = 1.0 / (FIFTY_YEARS / SPAN_SECONDS);
|
||||||
|
|
||||||
if (bestHeader->GetHeight() > BLOCKS_EXPECTED)
|
if (bestHeader->GetHeight() > BLOCKS_EXPECTED)
|
||||||
{
|
{
|
||||||
if (p <= alertThreshold && nBlocks < BLOCKS_EXPECTED)
|
if (p <= alertThreshold && nBlocks < BLOCKS_EXPECTED)
|
||||||
@@ -3187,7 +3194,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool fScriptChecks = (!fCheckpointsEnabled || pindex->GetHeight() >= Checkpoints::GetTotalBlocksEstimate(chainparams.Checkpoints()));
|
bool fScriptChecks = (!fCheckpointsEnabled || pindex->GetHeight() >= Checkpoints::GetTotalBlocksEstimate(chainparams.Checkpoints()));
|
||||||
//if ( KOMODO_TESTNET_EXPIRATION != 0 && pindex->GetHeight() > KOMODO_TESTNET_EXPIRATION ) // "testnet"
|
//if ( KOMODO_TESTNET_EXPIRATION != 0 && pindex->GetHeight() > KOMODO_TESTNET_EXPIRATION ) // "testnet"
|
||||||
// return(false);
|
// return(false);
|
||||||
@@ -3253,7 +3260,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
|
|
||||||
// Grab the consensus branch ID for the block's height
|
// Grab the consensus branch ID for the block's height
|
||||||
auto consensusBranchId = CurrentEpochBranchId(pindex->GetHeight(), Params().GetConsensus());
|
auto consensusBranchId = CurrentEpochBranchId(pindex->GetHeight(), Params().GetConsensus());
|
||||||
|
|
||||||
std::vector<PrecomputedTransactionData> txdata;
|
std::vector<PrecomputedTransactionData> txdata;
|
||||||
txdata.reserve(block.vtx.size()); // Required so that pointers to individual PrecomputedTransactionData don't get invalidated
|
txdata.reserve(block.vtx.size()); // Required so that pointers to individual PrecomputedTransactionData don't get invalidated
|
||||||
for (unsigned int i = 0; i < block.vtx.size(); i++)
|
for (unsigned int i = 0; i < block.vtx.size(); i++)
|
||||||
@@ -3393,7 +3400,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
blockundo.vtxundo.push_back(CTxUndo());
|
blockundo.vtxundo.push_back(CTxUndo());
|
||||||
}
|
}
|
||||||
UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->GetHeight());
|
UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->GetHeight());
|
||||||
|
|
||||||
BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
|
BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
|
||||||
BOOST_FOREACH(const uint256 ¬e_commitment, joinsplit.commitments) {
|
BOOST_FOREACH(const uint256 ¬e_commitment, joinsplit.commitments) {
|
||||||
// Insert the note commitments into our temporary tree.
|
// Insert the note commitments into our temporary tree.
|
||||||
@@ -3428,9 +3435,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
}
|
}
|
||||||
int64_t nTime1 = GetTimeMicros(); nTimeConnect += nTime1 - nTimeStart;
|
int64_t nTime1 = GetTimeMicros(); nTimeConnect += nTime1 - nTimeStart;
|
||||||
LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001);
|
LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001);
|
||||||
|
|
||||||
CAmount blockReward = nFees + GetBlockSubsidy(pindex->GetHeight(), chainparams.GetConsensus()) + sum;
|
CAmount blockReward = nFees + GetBlockSubsidy(pindex->GetHeight(), chainparams.GetConsensus()) + sum;
|
||||||
if ( ASSETCHAINS_COMMISSION != 0 ) //ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 &&
|
if ( ASSETCHAINS_COMMISSION != 0 ) //ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 &&
|
||||||
{
|
{
|
||||||
uint64_t checktoshis;
|
uint64_t checktoshis;
|
||||||
if ( (checktoshis= komodo_commission((CBlock *)&block,(int32_t)pindex->GetHeight())) != 0 )
|
if ( (checktoshis= komodo_commission((CBlock *)&block,(int32_t)pindex->GetHeight())) != 0 )
|
||||||
@@ -3495,7 +3502,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
}
|
}
|
||||||
|
|
||||||
ConnectNotarisations(block, pindex->GetHeight());
|
ConnectNotarisations(block, pindex->GetHeight());
|
||||||
|
|
||||||
if (fTxIndex)
|
if (fTxIndex)
|
||||||
if (!pblocktree->WriteTxIndex(vPos))
|
if (!pblocktree->WriteTxIndex(vPos))
|
||||||
return AbortNode(state, "Failed to write transaction index");
|
return AbortNode(state, "Failed to write transaction index");
|
||||||
@@ -3767,7 +3774,7 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) {
|
|||||||
// Write the chain state to disk, if necessary.
|
// Write the chain state to disk, if necessary.
|
||||||
if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED))
|
if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!fBare) {
|
if (!fBare) {
|
||||||
// resurrect mempool transactions from the disconnected block.
|
// resurrect mempool transactions from the disconnected block.
|
||||||
for (int i = 0; i < block.vtx.size(); i++)
|
for (int i = 0; i < block.vtx.size(); i++)
|
||||||
@@ -3776,7 +3783,7 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) {
|
|||||||
CTransaction &tx = block.vtx[i];
|
CTransaction &tx = block.vtx[i];
|
||||||
list<CTransaction> removed;
|
list<CTransaction> removed;
|
||||||
CValidationState stateDummy;
|
CValidationState stateDummy;
|
||||||
|
|
||||||
// don't keep staking or invalid transactions
|
// don't keep staking or invalid transactions
|
||||||
if (tx.IsCoinBase() || ((i == (block.vtx.size() - 1)) && (ASSETCHAINS_STAKED && komodo_isPoS((CBlock *)&block) != 0)) || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL))
|
if (tx.IsCoinBase() || ((i == (block.vtx.size() - 1)) && (ASSETCHAINS_STAKED && komodo_isPoS((CBlock *)&block) != 0)) || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL))
|
||||||
{
|
{
|
||||||
@@ -3797,7 +3804,7 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) {
|
|||||||
|
|
||||||
// Update chainActive and related variables.
|
// Update chainActive and related variables.
|
||||||
UpdateTip(pindexDelete->pprev);
|
UpdateTip(pindexDelete->pprev);
|
||||||
|
|
||||||
// Get the current commitment tree
|
// Get the current commitment tree
|
||||||
SproutMerkleTree newSproutTree;
|
SproutMerkleTree newSproutTree;
|
||||||
SaplingMerkleTree newSaplingTree;
|
SaplingMerkleTree newSaplingTree;
|
||||||
@@ -3879,9 +3886,7 @@ int32_t komodo_activate_sapling(CBlockIndex *pindex)
|
|||||||
}
|
}
|
||||||
if ( activation != 0 )
|
if ( activation != 0 )
|
||||||
{
|
{
|
||||||
//#if KOMODO_SAPLING_ACTIVATION != 1544832000
|
|
||||||
komodo_setactivation(activation);
|
komodo_setactivation(activation);
|
||||||
//#endif
|
|
||||||
fprintf(stderr,"%s sapling activation at %d\n",ASSETCHAINS_SYMBOL,activation);
|
fprintf(stderr,"%s sapling activation at %d\n",ASSETCHAINS_SYMBOL,activation);
|
||||||
ASSETCHAINS_SAPLING = activation;
|
ASSETCHAINS_SAPLING = activation;
|
||||||
}
|
}
|
||||||
@@ -3945,10 +3950,10 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock *
|
|||||||
// Remove conflicting transactions from the mempool.
|
// Remove conflicting transactions from the mempool.
|
||||||
list<CTransaction> txConflicted;
|
list<CTransaction> txConflicted;
|
||||||
mempool.removeForBlock(pblock->vtx, pindexNew->GetHeight(), txConflicted, !IsInitialBlockDownload());
|
mempool.removeForBlock(pblock->vtx, pindexNew->GetHeight(), txConflicted, !IsInitialBlockDownload());
|
||||||
|
|
||||||
// Remove transactions that expire at new block height from mempool
|
// Remove transactions that expire at new block height from mempool
|
||||||
mempool.removeExpired(pindexNew->GetHeight());
|
mempool.removeExpired(pindexNew->GetHeight());
|
||||||
|
|
||||||
// Update chainActive & related variables.
|
// Update chainActive & related variables.
|
||||||
UpdateTip(pindexNew);
|
UpdateTip(pindexNew);
|
||||||
// Tell wallet about transactions that went from mempool
|
// Tell wallet about transactions that went from mempool
|
||||||
@@ -3964,7 +3969,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock *
|
|||||||
GetMainSignals().ChainTip(pindexNew, pblock, oldSproutTree, oldSaplingTree, true);
|
GetMainSignals().ChainTip(pindexNew, pblock, oldSproutTree, oldSaplingTree, true);
|
||||||
|
|
||||||
EnforceNodeDeprecation(pindexNew->GetHeight());
|
EnforceNodeDeprecation(pindexNew->GetHeight());
|
||||||
|
|
||||||
int64_t nTime6 = GetTimeMicros(); nTimePostConnect += nTime6 - nTime5; nTimeTotal += nTime6 - nTime1;
|
int64_t nTime6 = GetTimeMicros(); nTimePostConnect += nTime6 - nTime5; nTimeTotal += nTime6 - nTime1;
|
||||||
LogPrint("bench", " - Connect postprocess: %.2fms [%.2fs]\n", (nTime6 - nTime5) * 0.001, nTimePostConnect * 0.000001);
|
LogPrint("bench", " - Connect postprocess: %.2fms [%.2fs]\n", (nTime6 - nTime5) * 0.001, nTimePostConnect * 0.000001);
|
||||||
LogPrint("bench", "- Connect block: %.2fms [%.2fs]\n", (nTime6 - nTime1) * 0.001, nTimeTotal * 0.000001);
|
LogPrint("bench", "- Connect block: %.2fms [%.2fs]\n", (nTime6 - nTime1) * 0.001, nTimeTotal * 0.000001);
|
||||||
@@ -3972,7 +3977,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock *
|
|||||||
KOMODO_INSYNC = (int32_t)pindexNew->GetHeight();
|
KOMODO_INSYNC = (int32_t)pindexNew->GetHeight();
|
||||||
else KOMODO_INSYNC = 0;
|
else KOMODO_INSYNC = 0;
|
||||||
//fprintf(stderr,"connect.%d insync.%d ASSETCHAINS_SAPLING.%d\n",(int32_t)pindexNew->GetHeight(),KOMODO_INSYNC,ASSETCHAINS_SAPLING);
|
//fprintf(stderr,"connect.%d insync.%d ASSETCHAINS_SAPLING.%d\n",(int32_t)pindexNew->GetHeight(),KOMODO_INSYNC,ASSETCHAINS_SAPLING);
|
||||||
if ( KOMODO_INSYNC != 0 ) //ASSETCHAINS_SYMBOL[0] == 0 &&
|
if ( KOMODO_INSYNC != 0 ) //ASSETCHAINS_SYMBOL[0] == 0 &&
|
||||||
komodo_broadcast(pblock,8);
|
komodo_broadcast(pblock,8);
|
||||||
else if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
else if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
||||||
komodo_broadcast(pblock,4);
|
komodo_broadcast(pblock,4);
|
||||||
@@ -4003,7 +4008,7 @@ static CBlockIndex* FindMostWorkChain() {
|
|||||||
bool fInvalidAncestor = false;
|
bool fInvalidAncestor = false;
|
||||||
while (pindexTest && !chainActive.Contains(pindexTest)) {
|
while (pindexTest && !chainActive.Contains(pindexTest)) {
|
||||||
assert(pindexTest->nChainTx || pindexTest->GetHeight() == 0);
|
assert(pindexTest->nChainTx || pindexTest->GetHeight() == 0);
|
||||||
|
|
||||||
// Pruned nodes may have entries in setBlockIndexCandidates for
|
// Pruned nodes may have entries in setBlockIndexCandidates for
|
||||||
// which block files have been deleted. Remove those as candidates
|
// which block files have been deleted. Remove those as candidates
|
||||||
// for the most work chain if we come across them; we can't switch
|
// for the most work chain if we come across them; we can't switch
|
||||||
@@ -4285,9 +4290,9 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) {
|
|||||||
|
|
||||||
bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) {
|
bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) {
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
|
|
||||||
int nHeight = pindex->GetHeight();
|
int nHeight = pindex->GetHeight();
|
||||||
|
|
||||||
// Remove the invalidity flag from this block and all its descendants.
|
// Remove the invalidity flag from this block and all its descendants.
|
||||||
BlockMap::iterator it = mapBlockIndex.begin();
|
BlockMap::iterator it = mapBlockIndex.begin();
|
||||||
while (it != mapBlockIndex.end()) {
|
while (it != mapBlockIndex.end()) {
|
||||||
@@ -4680,12 +4685,13 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C
|
|||||||
int32_t i,j,rejects=0,lastrejects=0;
|
int32_t i,j,rejects=0,lastrejects=0;
|
||||||
//fprintf(stderr,"put block's tx into mempool\n");
|
//fprintf(stderr,"put block's tx into mempool\n");
|
||||||
// Copy all non Z-txs in mempool to temporary mempool because there can be tx in local mempool that make the block invalid.
|
// Copy all non Z-txs in mempool to temporary mempool because there can be tx in local mempool that make the block invalid.
|
||||||
LOCK(mempool.cs);
|
LOCK2(cs_main,mempool.cs);
|
||||||
|
//fprintf(stderr, "starting... mempoolsize.%ld\n",mempool.size());
|
||||||
list<CTransaction> transactionsToRemove;
|
list<CTransaction> transactionsToRemove;
|
||||||
BOOST_FOREACH(const CTxMemPoolEntry& e, mempool.mapTx) {
|
BOOST_FOREACH(const CTxMemPoolEntry& e, mempool.mapTx) {
|
||||||
const CTransaction &tx = e.GetTx();
|
const CTransaction &tx = e.GetTx();
|
||||||
const uint256 &hash = tx.GetHash();
|
const uint256 &hash = tx.GetHash();
|
||||||
if ( tx.vjoinsplit.size() == 0 ) {
|
if ( tx.vjoinsplit.empty() && tx.vShieldedSpend.empty()) {
|
||||||
transactionsToRemove.push_back(tx);
|
transactionsToRemove.push_back(tx);
|
||||||
tmpmempool.addUnchecked(hash,e,true);
|
tmpmempool.addUnchecked(hash,e,true);
|
||||||
}
|
}
|
||||||
@@ -4695,17 +4701,19 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C
|
|||||||
mempool.remove(tx, removed, false);
|
mempool.remove(tx, removed, false);
|
||||||
}
|
}
|
||||||
// add all the txs in the block to the empty mempool.
|
// add all the txs in the block to the empty mempool.
|
||||||
|
// CC validation shouldnt (cant) depend on the state of mempool!
|
||||||
while ( 1 )
|
while ( 1 )
|
||||||
{
|
{
|
||||||
|
list<CTransaction> removed;
|
||||||
for (i=0; i<block.vtx.size(); i++)
|
for (i=0; i<block.vtx.size(); i++)
|
||||||
{
|
{
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
CTransaction Tx;
|
CTransaction Tx;
|
||||||
const CTransaction &tx = (CTransaction)block.vtx[i];
|
const CTransaction &tx = (CTransaction)block.vtx[i];
|
||||||
if (tx.IsCoinBase() || ((i == (block.vtx.size() - 1)) && (ASSETCHAINS_STAKED && komodo_isPoS((CBlock *)&block) != 0)))
|
if (tx.IsCoinBase() || (!tx.vjoinsplit.empty() && !tx.vShieldedSpend.empty()) || ((i == (block.vtx.size() - 1)) && (ASSETCHAINS_STAKED && komodo_isPoS((CBlock *)&block) != 0)))
|
||||||
continue;
|
continue;
|
||||||
Tx = tx;
|
Tx = tx;
|
||||||
if ( myAddtomempool(Tx, &state) == false ) // happens with out of order tx in block on resync
|
if ( myAddtomempool(Tx, &state, true) == false ) // happens with out of order tx in block on resync
|
||||||
{
|
{
|
||||||
//LogPrintf("Rejected by mempool, reason: .%s.\n", state.GetRejectReason().c_str());
|
//LogPrintf("Rejected by mempool, reason: .%s.\n", state.GetRejectReason().c_str());
|
||||||
// take advantage of other checks, but if we were only rejected because it is a valid staking
|
// take advantage of other checks, but if we were only rejected because it is a valid staking
|
||||||
@@ -4716,7 +4724,10 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C
|
|||||||
ptx = &sTx;
|
ptx = &sTx;
|
||||||
} else rejects++;
|
} else rejects++;
|
||||||
}
|
}
|
||||||
|
// here we remove any txs in the temp mempool that were included in the block.
|
||||||
|
tmpmempool.remove(tx, removed, false);
|
||||||
}
|
}
|
||||||
|
//fprintf(stderr, "removed.%ld\n",removed.size());
|
||||||
if ( rejects == 0 || rejects == lastrejects )
|
if ( rejects == 0 || rejects == lastrejects )
|
||||||
{
|
{
|
||||||
if ( 0 && lastrejects != 0 )
|
if ( 0 && lastrejects != 0 )
|
||||||
@@ -4763,19 +4774,13 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C
|
|||||||
if ( ASSETCHAINS_CC != 0 )
|
if ( ASSETCHAINS_CC != 0 )
|
||||||
{
|
{
|
||||||
// here we add back all txs from the temp mempool to the main mempool.
|
// here we add back all txs from the temp mempool to the main mempool.
|
||||||
// which removes any tx locally that were invalid after the block arrives.
|
BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx)
|
||||||
int invalidtxs = 0;
|
{
|
||||||
LOCK(mempool.cs);
|
const CTransaction &tx = e.GetTx();
|
||||||
BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) {
|
const uint256 &hash = tx.GetHash();
|
||||||
CTransaction tx = e.GetTx();
|
mempool.addUnchecked(hash,e,true);
|
||||||
CValidationState state; bool fMissingInputs,fOverrideFees = false;
|
|
||||||
|
|
||||||
if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees) == false )
|
|
||||||
invalidtxs++;
|
|
||||||
//else fprintf(stderr, "added mempool tx back to mempool\n");
|
|
||||||
}
|
}
|
||||||
if ( 0 && invalidtxs > 0 )
|
//fprintf(stderr, "finished adding back. mempoolsize.%ld\n",mempool.size());
|
||||||
fprintf(stderr, "number of invalid txs: %d\n",invalidtxs );
|
|
||||||
// empty the temp mempool for next time.
|
// empty the temp mempool for next time.
|
||||||
tmpmempool.clear();
|
tmpmempool.clear();
|
||||||
}
|
}
|
||||||
@@ -4791,13 +4796,13 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
assert(pindexPrev);
|
assert(pindexPrev);
|
||||||
|
|
||||||
int nHeight = pindexPrev->GetHeight()+1;
|
int nHeight = pindexPrev->GetHeight()+1;
|
||||||
|
|
||||||
// Check proof of work
|
// Check proof of work
|
||||||
if ( (ASSETCHAINS_SYMBOL[0] != 0 || nHeight < 235300 || nHeight > 236000) && block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams))
|
if ( (ASSETCHAINS_SYMBOL[0] != 0 || nHeight < 235300 || nHeight > 236000) && block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams))
|
||||||
{
|
{
|
||||||
cout << block.nBits << " block.nBits vs. calc " << GetNextWorkRequired(pindexPrev, &block, consensusParams) <<
|
cout << block.nBits << " block.nBits vs. calc " << GetNextWorkRequired(pindexPrev, &block, consensusParams) <<
|
||||||
" for block #" << nHeight << endl;
|
" for block #" << nHeight << endl;
|
||||||
return state.DoS(100, error("%s: incorrect proof of work", __func__),
|
return state.DoS(100, error("%s: incorrect proof of work", __func__),
|
||||||
REJECT_INVALID, "bad-diffbits");
|
REJECT_INVALID, "bad-diffbits");
|
||||||
@@ -4872,7 +4877,7 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn
|
|||||||
// Check that all transactions are finalized
|
// Check that all transactions are finalized
|
||||||
for (uint32_t i = 0; i < block.vtx.size(); i++) {
|
for (uint32_t i = 0; i < block.vtx.size(); i++) {
|
||||||
const CTransaction& tx = block.vtx[i];
|
const CTransaction& tx = block.vtx[i];
|
||||||
|
|
||||||
// Check transaction contextually against consensus rules at block height
|
// Check transaction contextually against consensus rules at block height
|
||||||
if (!ContextualCheckTransaction(tx, state, nHeight, 100)) {
|
if (!ContextualCheckTransaction(tx, state, nHeight, 100)) {
|
||||||
return false; // Failure reason has been set in validation state object
|
return false; // Failure reason has been set in validation state object
|
||||||
@@ -4921,7 +4926,7 @@ bool AcceptBlockHeader(int32_t *futureblockp,const CBlockHeader& block, CValidat
|
|||||||
*ppindex = pindex;
|
*ppindex = pindex;
|
||||||
if ( pindex != 0 && pindex->nStatus & BLOCK_FAILED_MASK )
|
if ( pindex != 0 && pindex->nStatus & BLOCK_FAILED_MASK )
|
||||||
{
|
{
|
||||||
if ( ASSETCHAINS_CC == 0 )
|
if ( ASSETCHAINS_CC == 0 )//&& (ASSETCHAINS_PRIVATE == 0 || KOMODO_INSYNC >= Params().GetConsensus().vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight) )
|
||||||
return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate");
|
return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -5028,7 +5033,7 @@ bool AcceptBlock(int32_t *futureblockp,CBlock& block, CValidationState& state, C
|
|||||||
// regardless of whether pruning is enabled; it should generally be safe to
|
// regardless of whether pruning is enabled; it should generally be safe to
|
||||||
// not process unrequested blocks.
|
// not process unrequested blocks.
|
||||||
bool fTooFarAhead = (pindex->GetHeight() > int(chainActive.Height() + BLOCK_DOWNLOAD_WINDOW)); //MIN_BLOCKS_TO_KEEP));
|
bool fTooFarAhead = (pindex->GetHeight() > int(chainActive.Height() + BLOCK_DOWNLOAD_WINDOW)); //MIN_BLOCKS_TO_KEEP));
|
||||||
|
|
||||||
// TODO: deal better with return value and error conditions for duplicate
|
// TODO: deal better with return value and error conditions for duplicate
|
||||||
// and unrequested blocks.
|
// and unrequested blocks.
|
||||||
//fprintf(stderr,"Accept %s flags already.%d requested.%d morework.%d farahead.%d\n",pindex->GetBlockHash().ToString().c_str(),fAlreadyHave,fRequested,fHasMoreWork,fTooFarAhead);
|
//fprintf(stderr,"Accept %s flags already.%d requested.%d morework.%d farahead.%d\n",pindex->GetBlockHash().ToString().c_str(),fAlreadyHave,fRequested,fHasMoreWork,fTooFarAhead);
|
||||||
@@ -5043,6 +5048,19 @@ bool AcceptBlock(int32_t *futureblockp,CBlock& block, CValidationState& state, C
|
|||||||
auto verifier = libzcash::ProofVerifier::Disabled();
|
auto verifier = libzcash::ProofVerifier::Disabled();
|
||||||
if ((!CheckBlock(futureblockp,pindex->GetHeight(),pindex,block, state, verifier,0)) || !ContextualCheckBlock(block, state, pindex->pprev))
|
if ((!CheckBlock(futureblockp,pindex->GetHeight(),pindex,block, state, verifier,0)) || !ContextualCheckBlock(block, state, pindex->pprev))
|
||||||
{
|
{
|
||||||
|
static int32_t saplinght = -1;
|
||||||
|
CBlockIndex *tmpptr;
|
||||||
|
if ( saplinght == -1 )
|
||||||
|
saplinght = Params().GetConsensus().vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight;
|
||||||
|
if ( saplinght < 0 )
|
||||||
|
*futureblockp = 1;
|
||||||
|
// the problem is when a future sapling block comes in before we detected saplinght
|
||||||
|
if ( saplinght > 0 && (tmpptr= chainActive.LastTip()) != 0 )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"saplinght.%d tipht.%d blockht.%d cmp.%d\n",saplinght,(int32_t)tmpptr->GetHeight(),pindex->GetHeight(),pindex->GetHeight() < 0 || pindex->GetHeight() >= saplinght || (tmpptr->GetHeight() > saplinght-720 && tmpptr->GetHeight() < saplinght+720));
|
||||||
|
if ( pindex->GetHeight() < 0 || pindex->GetHeight() >= saplinght || (tmpptr->GetHeight() > saplinght-720 && tmpptr->GetHeight() < saplinght+720) )
|
||||||
|
*futureblockp = 1;
|
||||||
|
}
|
||||||
if ( *futureblockp == 0 )
|
if ( *futureblockp == 0 )
|
||||||
{
|
{
|
||||||
if (state.IsInvalid() && !state.CorruptionPossible()) {
|
if (state.IsInvalid() && !state.CorruptionPossible()) {
|
||||||
@@ -5053,7 +5071,7 @@ bool AcceptBlock(int32_t *futureblockp,CBlock& block, CValidationState& state, C
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int nHeight = pindex->GetHeight();
|
int nHeight = pindex->GetHeight();
|
||||||
// Write block to history file
|
// Write block to history file
|
||||||
try {
|
try {
|
||||||
@@ -5456,7 +5474,7 @@ bool static LoadBlockIndexDB()
|
|||||||
return false;
|
return false;
|
||||||
LogPrintf("%s: loaded guts\n", __func__);
|
LogPrintf("%s: loaded guts\n", __func__);
|
||||||
boost::this_thread::interruption_point();
|
boost::this_thread::interruption_point();
|
||||||
|
|
||||||
// Calculate chainPower
|
// Calculate chainPower
|
||||||
vector<pair<int, CBlockIndex*> > vSortedByHeight;
|
vector<pair<int, CBlockIndex*> > vSortedByHeight;
|
||||||
vSortedByHeight.reserve(mapBlockIndex.size());
|
vSortedByHeight.reserve(mapBlockIndex.size());
|
||||||
@@ -5714,7 +5732,7 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth
|
|||||||
//fprintf(stderr,"end VerifyDB %u\n",(uint32_t)time(NULL));
|
//fprintf(stderr,"end VerifyDB %u\n",(uint32_t)time(NULL));
|
||||||
if (pindexFailure)
|
if (pindexFailure)
|
||||||
return error("VerifyDB(): *** coin database inconsistencies found (last %i blocks, %i good transactions before that)\n", chainActive.Height() - pindexFailure->GetHeight() + 1, nGoodTransactions);
|
return error("VerifyDB(): *** coin database inconsistencies found (last %i blocks, %i good transactions before that)\n", chainActive.Height() - pindexFailure->GetHeight() + 1, nGoodTransactions);
|
||||||
|
|
||||||
// check level 4: try reconnecting blocks
|
// check level 4: try reconnecting blocks
|
||||||
if (nCheckLevel >= 4) {
|
if (nCheckLevel >= 4) {
|
||||||
CBlockIndex *pindex = pindexState;
|
CBlockIndex *pindex = pindexState;
|
||||||
@@ -5729,9 +5747,9 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth
|
|||||||
return error("VerifyDB(): *** found unconnectable block at %d, hash=%s", pindex->GetHeight(), pindex->GetBlockHash().ToString());
|
return error("VerifyDB(): *** found unconnectable block at %d, hash=%s", pindex->GetHeight(), pindex->GetBlockHash().ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LogPrintf("No coin database inconsistencies in last %i blocks (%i transactions)\n", chainActive.Height() - pindexState->GetHeight(), nGoodTransactions);
|
LogPrintf("No coin database inconsistencies in last %i blocks (%i transactions)\n", chainActive.Height() - pindexState->GetHeight(), nGoodTransactions);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6573,7 +6591,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|||||||
pfrom->fDisconnect = true;
|
pfrom->fDisconnect = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!vRecv.empty())
|
if (!vRecv.empty())
|
||||||
vRecv >> addrFrom >> nNonce;
|
vRecv >> addrFrom >> nNonce;
|
||||||
if (!vRecv.empty()) {
|
if (!vRecv.empty()) {
|
||||||
@@ -6596,7 +6614,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pfrom->nVersion = nVersion;
|
pfrom->nVersion = nVersion;
|
||||||
|
|
||||||
pfrom->addrLocal = addrMe;
|
pfrom->addrLocal = addrMe;
|
||||||
if (pfrom->fInbound && addrMe.IsRoutable())
|
if (pfrom->fInbound && addrMe.IsRoutable())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -274,7 +274,7 @@ void PruneAndFlush();
|
|||||||
|
|
||||||
/** (try to) add transaction to memory pool **/
|
/** (try to) add transaction to memory pool **/
|
||||||
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,
|
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,
|
||||||
bool* pfMissingInputs, bool fRejectAbsurdFee=false, int dosLevel=-1);
|
bool* pfMissingInputs, bool fRejectAbsurdFee=false, int dosLevel=-1, bool fSkipExpiry=false);
|
||||||
|
|
||||||
|
|
||||||
struct CNodeStateStats {
|
struct CNodeStateStats {
|
||||||
|
|||||||
119
src/miner.cpp
119
src/miner.cpp
@@ -68,7 +68,7 @@ public:
|
|||||||
set<uint256> setDependsOn;
|
set<uint256> setDependsOn;
|
||||||
CFeeRate feeRate;
|
CFeeRate feeRate;
|
||||||
double dPriority;
|
double dPriority;
|
||||||
|
|
||||||
COrphan(const CTransaction* ptxIn) : ptx(ptxIn), feeRate(0), dPriority(0)
|
COrphan(const CTransaction* ptxIn) : ptx(ptxIn), feeRate(0), dPriority(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -82,10 +82,10 @@ typedef boost::tuple<double, CFeeRate, const CTransaction*> TxPriority;
|
|||||||
class TxPriorityCompare
|
class TxPriorityCompare
|
||||||
{
|
{
|
||||||
bool byFee;
|
bool byFee;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TxPriorityCompare(bool _byFee) : byFee(_byFee) { }
|
TxPriorityCompare(bool _byFee) : byFee(_byFee) { }
|
||||||
|
|
||||||
bool operator()(const TxPriority& a, const TxPriority& b)
|
bool operator()(const TxPriority& a, const TxPriority& b)
|
||||||
{
|
{
|
||||||
if (byFee)
|
if (byFee)
|
||||||
@@ -148,7 +148,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
CPubKey pk = CPubKey();
|
CPubKey pk = CPubKey();
|
||||||
std::vector<std::vector<unsigned char>> vAddrs;
|
std::vector<std::vector<unsigned char>> vAddrs;
|
||||||
txnouttype txT;
|
txnouttype txT;
|
||||||
if (Solver(scriptPubKeyIn, txT, vAddrs))
|
if ( scriptPubKeyIn.size() > 0 && Solver(scriptPubKeyIn, txT, vAddrs))
|
||||||
{
|
{
|
||||||
if (txT == TX_PUBKEY)
|
if (txT == TX_PUBKEY)
|
||||||
pk = CPubKey(vAddrs[0]);
|
pk = CPubKey(vAddrs[0]);
|
||||||
@@ -170,27 +170,27 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
// -blockversion=N to test forking scenarios
|
// -blockversion=N to test forking scenarios
|
||||||
if (Params().MineBlocksOnDemand())
|
if (Params().MineBlocksOnDemand())
|
||||||
pblock->nVersion = GetArg("-blockversion", pblock->nVersion);
|
pblock->nVersion = GetArg("-blockversion", pblock->nVersion);
|
||||||
|
|
||||||
// Add dummy coinbase tx as first transaction
|
// Add dummy coinbase tx as first transaction
|
||||||
pblock->vtx.push_back(CTransaction());
|
pblock->vtx.push_back(CTransaction());
|
||||||
pblocktemplate->vTxFees.push_back(-1); // updated at end
|
pblocktemplate->vTxFees.push_back(-1); // updated at end
|
||||||
pblocktemplate->vTxSigOps.push_back(-1); // updated at end
|
pblocktemplate->vTxSigOps.push_back(-1); // updated at end
|
||||||
|
|
||||||
// Largest block you're willing to create:
|
// Largest block you're willing to create:
|
||||||
unsigned int nBlockMaxSize = GetArg("-blockmaxsize", MAX_BLOCK_SIZE(chainActive.LastTip()->GetHeight()+1));
|
unsigned int nBlockMaxSize = GetArg("-blockmaxsize", MAX_BLOCK_SIZE(chainActive.LastTip()->GetHeight()+1));
|
||||||
// Limit to betweeen 1K and MAX_BLOCK_SIZE-1K for sanity:
|
// Limit to betweeen 1K and MAX_BLOCK_SIZE-1K for sanity:
|
||||||
nBlockMaxSize = std::max((unsigned int)1000, std::min((unsigned int)(MAX_BLOCK_SIZE(chainActive.LastTip()->GetHeight()+1)-1000), nBlockMaxSize));
|
nBlockMaxSize = std::max((unsigned int)1000, std::min((unsigned int)(MAX_BLOCK_SIZE(chainActive.LastTip()->GetHeight()+1)-1000), nBlockMaxSize));
|
||||||
|
|
||||||
// How much of the block should be dedicated to high-priority transactions,
|
// How much of the block should be dedicated to high-priority transactions,
|
||||||
// included regardless of the fees they pay
|
// included regardless of the fees they pay
|
||||||
unsigned int nBlockPrioritySize = GetArg("-blockprioritysize", DEFAULT_BLOCK_PRIORITY_SIZE);
|
unsigned int nBlockPrioritySize = GetArg("-blockprioritysize", DEFAULT_BLOCK_PRIORITY_SIZE);
|
||||||
nBlockPrioritySize = std::min(nBlockMaxSize, nBlockPrioritySize);
|
nBlockPrioritySize = std::min(nBlockMaxSize, nBlockPrioritySize);
|
||||||
|
|
||||||
// Minimum block size you want to create; block will be filled with free transactions
|
// Minimum block size you want to create; block will be filled with free transactions
|
||||||
// until there are no more or the block reaches this size:
|
// until there are no more or the block reaches this size:
|
||||||
unsigned int nBlockMinSize = GetArg("-blockminsize", DEFAULT_BLOCK_MIN_SIZE);
|
unsigned int nBlockMinSize = GetArg("-blockminsize", DEFAULT_BLOCK_MIN_SIZE);
|
||||||
nBlockMinSize = std::min(nBlockMaxSize, nBlockMinSize);
|
nBlockMinSize = std::min(nBlockMaxSize, nBlockMinSize);
|
||||||
|
|
||||||
// Collect memory pool transactions into the block
|
// Collect memory pool transactions into the block
|
||||||
CAmount nFees = 0;
|
CAmount nFees = 0;
|
||||||
|
|
||||||
@@ -225,7 +225,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
|
|
||||||
CCoinsViewCache view(pcoinsTip);
|
CCoinsViewCache view(pcoinsTip);
|
||||||
uint32_t expired; uint64_t commission;
|
uint32_t expired; uint64_t commission;
|
||||||
|
|
||||||
SaplingMerkleTree sapling_tree;
|
SaplingMerkleTree sapling_tree;
|
||||||
assert(view.GetSaplingAnchorAt(view.GetBestAnchor(SAPLING), sapling_tree));
|
assert(view.GetSaplingAnchorAt(view.GetBestAnchor(SAPLING), sapling_tree));
|
||||||
|
|
||||||
@@ -233,7 +233,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
list<COrphan> vOrphan; // list memory doesn't move
|
list<COrphan> vOrphan; // list memory doesn't move
|
||||||
map<uint256, vector<COrphan*> > mapDependers;
|
map<uint256, vector<COrphan*> > mapDependers;
|
||||||
bool fPrintPriority = GetBoolArg("-printpriority", false);
|
bool fPrintPriority = GetBoolArg("-printpriority", false);
|
||||||
|
|
||||||
// This vector will be sorted into a priority queue:
|
// This vector will be sorted into a priority queue:
|
||||||
vector<TxPriority> vecPriority;
|
vector<TxPriority> vecPriority;
|
||||||
vecPriority.reserve(mempool.mapTx.size() + 1);
|
vecPriority.reserve(mempool.mapTx.size() + 1);
|
||||||
@@ -243,7 +243,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
mi != mempool.mapTx.end(); ++mi)
|
mi != mempool.mapTx.end(); ++mi)
|
||||||
{
|
{
|
||||||
const CTransaction& tx = mi->GetTx();
|
const CTransaction& tx = mi->GetTx();
|
||||||
|
|
||||||
int64_t nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST)
|
int64_t nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST)
|
||||||
? nMedianTimePast
|
? nMedianTimePast
|
||||||
: pblock->GetBlockTime();
|
: pblock->GetBlockTime();
|
||||||
@@ -314,16 +314,16 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fMissingInputs) continue;
|
if (fMissingInputs) continue;
|
||||||
|
|
||||||
// Priority is sum(valuein * age) / modified_txsize
|
// Priority is sum(valuein * age) / modified_txsize
|
||||||
unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
|
unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
dPriority = tx.ComputePriority(dPriority, nTxSize);
|
dPriority = tx.ComputePriority(dPriority, nTxSize);
|
||||||
|
|
||||||
uint256 hash = tx.GetHash();
|
uint256 hash = tx.GetHash();
|
||||||
mempool.ApplyDeltas(hash, dPriority, nTotalIn);
|
mempool.ApplyDeltas(hash, dPriority, nTotalIn);
|
||||||
|
|
||||||
CFeeRate feeRate(nTotalIn-tx.GetValueOut(), nTxSize);
|
CFeeRate feeRate(nTotalIn-tx.GetValueOut(), nTxSize);
|
||||||
|
|
||||||
if (porphan)
|
if (porphan)
|
||||||
{
|
{
|
||||||
porphan->dPriority = dPriority;
|
porphan->dPriority = dPriority;
|
||||||
@@ -339,20 +339,20 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
int64_t interest;
|
int64_t interest;
|
||||||
int nBlockSigOps = 100;
|
int nBlockSigOps = 100;
|
||||||
bool fSortedByFee = (nBlockPrioritySize <= 0);
|
bool fSortedByFee = (nBlockPrioritySize <= 0);
|
||||||
|
|
||||||
TxPriorityCompare comparer(fSortedByFee);
|
TxPriorityCompare comparer(fSortedByFee);
|
||||||
std::make_heap(vecPriority.begin(), vecPriority.end(), comparer);
|
std::make_heap(vecPriority.begin(), vecPriority.end(), comparer);
|
||||||
|
|
||||||
while (!vecPriority.empty())
|
while (!vecPriority.empty())
|
||||||
{
|
{
|
||||||
// Take highest priority transaction off the priority queue:
|
// Take highest priority transaction off the priority queue:
|
||||||
double dPriority = vecPriority.front().get<0>();
|
double dPriority = vecPriority.front().get<0>();
|
||||||
CFeeRate feeRate = vecPriority.front().get<1>();
|
CFeeRate feeRate = vecPriority.front().get<1>();
|
||||||
const CTransaction& tx = *(vecPriority.front().get<2>());
|
const CTransaction& tx = *(vecPriority.front().get<2>());
|
||||||
|
|
||||||
std::pop_heap(vecPriority.begin(), vecPriority.end(), comparer);
|
std::pop_heap(vecPriority.begin(), vecPriority.end(), comparer);
|
||||||
vecPriority.pop_back();
|
vecPriority.pop_back();
|
||||||
|
|
||||||
// Size limits
|
// Size limits
|
||||||
unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
|
unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
if (nBlockSize + nTxSize >= nBlockMaxSize-512) // room for extra autotx
|
if (nBlockSize + nTxSize >= nBlockMaxSize-512) // room for extra autotx
|
||||||
@@ -360,7 +360,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
//fprintf(stderr,"nBlockSize %d + %d nTxSize >= %d nBlockMaxSize\n",(int32_t)nBlockSize,(int32_t)nTxSize,(int32_t)nBlockMaxSize);
|
//fprintf(stderr,"nBlockSize %d + %d nTxSize >= %d nBlockMaxSize\n",(int32_t)nBlockSize,(int32_t)nTxSize,(int32_t)nBlockMaxSize);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Legacy limits on sigOps:
|
// Legacy limits on sigOps:
|
||||||
unsigned int nTxSigOps = GetLegacySigOpCount(tx);
|
unsigned int nTxSigOps = GetLegacySigOpCount(tx);
|
||||||
if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS-1)
|
if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS-1)
|
||||||
@@ -387,14 +387,14 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
comparer = TxPriorityCompare(fSortedByFee);
|
comparer = TxPriorityCompare(fSortedByFee);
|
||||||
std::make_heap(vecPriority.begin(), vecPriority.end(), comparer);
|
std::make_heap(vecPriority.begin(), vecPriority.end(), comparer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!view.HaveInputs(tx))
|
if (!view.HaveInputs(tx))
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"dont have inputs\n");
|
//fprintf(stderr,"dont have inputs\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
CAmount nTxFees = view.GetValueIn(chainActive.LastTip()->GetHeight(),&interest,tx,chainActive.LastTip()->nTime)-tx.GetValueOut();
|
CAmount nTxFees = view.GetValueIn(chainActive.LastTip()->GetHeight(),&interest,tx,chainActive.LastTip()->nTime)-tx.GetValueOut();
|
||||||
|
|
||||||
nTxSigOps += GetP2SHSigOpCount(tx, view);
|
nTxSigOps += GetP2SHSigOpCount(tx, view);
|
||||||
if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS-1)
|
if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS-1)
|
||||||
{
|
{
|
||||||
@@ -425,12 +425,12 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
++nBlockTx;
|
++nBlockTx;
|
||||||
nBlockSigOps += nTxSigOps;
|
nBlockSigOps += nTxSigOps;
|
||||||
nFees += nTxFees;
|
nFees += nTxFees;
|
||||||
|
|
||||||
if (fPrintPriority)
|
if (fPrintPriority)
|
||||||
{
|
{
|
||||||
LogPrintf("priority %.1f fee %s txid %s\n",dPriority, feeRate.ToString(), tx.GetHash().ToString());
|
LogPrintf("priority %.1f fee %s txid %s\n",dPriority, feeRate.ToString(), tx.GetHash().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add transactions that depend on this one to the priority queue
|
// Add transactions that depend on this one to the priority queue
|
||||||
if (mapDependers.count(hash))
|
if (mapDependers.count(hash))
|
||||||
{
|
{
|
||||||
@@ -448,7 +448,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nLastBlockTx = nBlockTx;
|
nLastBlockTx = nBlockTx;
|
||||||
nLastBlockSize = nBlockSize;
|
nLastBlockSize = nBlockSize;
|
||||||
blocktime = 1 + std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
|
blocktime = 1 + std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
|
||||||
@@ -497,7 +497,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
//printf("staking PoS ht.%d t%u lag.%u\n",(int32_t)chainActive.LastTip()->GetHeight()+1,blocktime,(uint32_t)(GetAdjustedTime() - (blocktime-13)));
|
//printf("staking PoS ht.%d t%u lag.%u\n",(int32_t)chainActive.LastTip()->GetHeight()+1,blocktime,(uint32_t)(GetAdjustedTime() - (blocktime-13)));
|
||||||
} else return(0); //fprintf(stderr,"no utxos eligible for staking\n");
|
} else return(0); //fprintf(stderr,"no utxos eligible for staking\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create coinbase tx
|
// Create coinbase tx
|
||||||
CMutableTransaction txNew = CreateNewContextualCMutableTransaction(consensusParams, nHeight);
|
CMutableTransaction txNew = CreateNewContextualCMutableTransaction(consensusParams, nHeight);
|
||||||
txNew.vin.resize(1);
|
txNew.vin.resize(1);
|
||||||
@@ -531,7 +531,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
fprintf(stderr,"CreateNewBlock: attempt to add timelock to pay2sh or pay2cc\n");
|
fprintf(stderr,"CreateNewBlock: attempt to add timelock to pay2sh or pay2cc\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
opretScript += scriptPubKeyIn;
|
opretScript += scriptPubKeyIn;
|
||||||
|
|
||||||
txNew.vout[0].scriptPubKey = CScriptExt().PayToScriptHash(CScriptID(opretScript));
|
txNew.vout[0].scriptPubKey = CScriptExt().PayToScriptHash(CScriptID(opretScript));
|
||||||
@@ -578,7 +578,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
nonce >>= 16;
|
nonce >>= 16;
|
||||||
pblock->nNonce = ArithToUint256(nonce);
|
pblock->nNonce = ArithToUint256(nonce);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fill in header
|
// Fill in header
|
||||||
pblock->hashPrevBlock = pindexPrev->GetBlockHash();
|
pblock->hashPrevBlock = pindexPrev->GetBlockHash();
|
||||||
pblock->hashFinalSaplingRoot = sapling_tree.root();
|
pblock->hashFinalSaplingRoot = sapling_tree.root();
|
||||||
@@ -638,7 +638,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
//fprintf(stderr,"done new block\n");
|
//fprintf(stderr,"done new block\n");
|
||||||
return pblocktemplate.release();
|
return pblocktemplate.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
boost::optional<CScript> GetMinerScriptPubKey(CReserveKey& reservekey)
|
boost::optional<CScript> GetMinerScriptPubKey(CReserveKey& reservekey)
|
||||||
@@ -661,11 +661,11 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
return boost::optional<CScript>();
|
return boost::optional<CScript>();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CScript scriptPubKey = CScript() << OP_DUP << OP_HASH160 << ToByteVector(keyID) << OP_EQUALVERIFY << OP_CHECKSIG;
|
CScript scriptPubKey = CScript() << OP_DUP << OP_HASH160 << ToByteVector(keyID) << OP_EQUALVERIFY << OP_CHECKSIG;
|
||||||
return scriptPubKey;
|
return scriptPubKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey)
|
CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey)
|
||||||
{
|
{
|
||||||
@@ -675,7 +675,7 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
{
|
{
|
||||||
boost::optional<CScript> scriptPubKey = GetMinerScriptPubKey();
|
boost::optional<CScript> scriptPubKey = GetMinerScriptPubKey();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!scriptPubKey) {
|
if (!scriptPubKey) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -703,7 +703,7 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int&
|
|||||||
CMutableTransaction txCoinbase(pblock->vtx[0]);
|
CMutableTransaction txCoinbase(pblock->vtx[0]);
|
||||||
txCoinbase.vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce)) + COINBASE_FLAGS;
|
txCoinbase.vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce)) + COINBASE_FLAGS;
|
||||||
assert(txCoinbase.vin[0].scriptSig.size() <= 100);
|
assert(txCoinbase.vin[0].scriptSig.size() <= 100);
|
||||||
|
|
||||||
pblock->vtx[0] = txCoinbase;
|
pblock->vtx[0] = txCoinbase;
|
||||||
pblock->hashMerkleRoot = pblock->BuildMerkleTree();
|
pblock->hashMerkleRoot = pblock->BuildMerkleTree();
|
||||||
}
|
}
|
||||||
@@ -783,7 +783,7 @@ static bool ProcessBlockFound(CBlock* pblock)
|
|||||||
{
|
{
|
||||||
LogPrintf("%s\n", pblock->ToString());
|
LogPrintf("%s\n", pblock->ToString());
|
||||||
LogPrintf("generated %s height.%d\n", FormatMoney(pblock->vtx[0].vout[0].nValue),chainActive.LastTip()->GetHeight()+1);
|
LogPrintf("generated %s height.%d\n", FormatMoney(pblock->vtx[0].vout[0].nValue),chainActive.LastTip()->GetHeight()+1);
|
||||||
|
|
||||||
// Found a solution
|
// Found a solution
|
||||||
{
|
{
|
||||||
if (pblock->hashPrevBlock != chainActive.LastTip()->GetBlockHash())
|
if (pblock->hashPrevBlock != chainActive.LastTip()->GetBlockHash())
|
||||||
@@ -797,11 +797,11 @@ static bool ProcessBlockFound(CBlock* pblock)
|
|||||||
for (i=31; i>=0; i--)
|
for (i=31; i>=0; i--)
|
||||||
fprintf(stderr,"%02x",((uint8_t *)&hash)[i]);
|
fprintf(stderr,"%02x",((uint8_t *)&hash)[i]);
|
||||||
fprintf(stderr," <- chainTip (stale)\n");
|
fprintf(stderr," <- chainTip (stale)\n");
|
||||||
|
|
||||||
return error("KomodoMiner: generated block is stale");
|
return error("KomodoMiner: generated block is stale");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
// Remove key from key pool
|
// Remove key from key pool
|
||||||
if ( IS_KOMODO_NOTARY == 0 )
|
if ( IS_KOMODO_NOTARY == 0 )
|
||||||
@@ -825,7 +825,7 @@ static bool ProcessBlockFound(CBlock* pblock)
|
|||||||
CValidationState state;
|
CValidationState state;
|
||||||
if (!ProcessNewBlock(1,chainActive.LastTip()->GetHeight()+1,state, NULL, pblock, true, NULL))
|
if (!ProcessNewBlock(1,chainActive.LastTip()->GetHeight()+1,state, NULL, pblock, true, NULL))
|
||||||
return error("KomodoMiner: ProcessNewBlock, block not accepted");
|
return error("KomodoMiner: ProcessNewBlock, block not accepted");
|
||||||
|
|
||||||
TrackMinedBlock(pblock->GetHash());
|
TrackMinedBlock(pblock->GetHash());
|
||||||
komodo_broadcast(pblock,16);
|
komodo_broadcast(pblock,16);
|
||||||
return true;
|
return true;
|
||||||
@@ -853,7 +853,7 @@ int32_t waitForPeers(const CChainParams &chainparams)
|
|||||||
if (fvNodesEmpty || IsNotInSync())
|
if (fvNodesEmpty || IsNotInSync())
|
||||||
{
|
{
|
||||||
int loops = 0, blockDiff = 0, newDiff = 0;
|
int loops = 0, blockDiff = 0, newDiff = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (fvNodesEmpty)
|
if (fvNodesEmpty)
|
||||||
{
|
{
|
||||||
@@ -1036,7 +1036,7 @@ void static VerusStaker(CWallet *pwallet)
|
|||||||
post.SetCompact(pblock->GetVerusPOSTarget());
|
post.SetCompact(pblock->GetVerusPOSTarget());
|
||||||
pindexPrev = get_chainactive(Mining_height - 100);
|
pindexPrev = get_chainactive(Mining_height - 100);
|
||||||
CTransaction &sTx = pblock->vtx[pblock->vtx.size()-1];
|
CTransaction &sTx = pblock->vtx[pblock->vtx.size()-1];
|
||||||
printf("POS hash: %s \ntarget: %s\n",
|
printf("POS hash: %s \ntarget: %s\n",
|
||||||
CTransaction::_GetVerusPOSHash(&(pblock->nNonce), sTx.vin[0].prevout.hash, sTx.vin[0].prevout.n, Mining_height, pindexPrev->GetBlockHeader().GetVerusEntropyHash(Mining_height - 100), sTx.vout[0].nValue).GetHex().c_str(), ArithToUint256(post).GetHex().c_str());
|
CTransaction::_GetVerusPOSHash(&(pblock->nNonce), sTx.vin[0].prevout.hash, sTx.vin[0].prevout.n, Mining_height, pindexPrev->GetBlockHeader().GetVerusEntropyHash(Mining_height - 100), sTx.vout[0].nValue).GetHex().c_str(), ArithToUint256(post).GetHex().c_str());
|
||||||
if (unlockTime > Mining_height && subsidy >= ASSETCHAINS_TIMELOCKGTE)
|
if (unlockTime > Mining_height && subsidy >= ASSETCHAINS_TIMELOCKGTE)
|
||||||
printf("- timelocked until block %i\n", unlockTime);
|
printf("- timelocked until block %i\n", unlockTime);
|
||||||
@@ -1356,15 +1356,15 @@ void static BitcoinMiner()
|
|||||||
SetThreadPriority(THREAD_PRIORITY_LOWEST);
|
SetThreadPriority(THREAD_PRIORITY_LOWEST);
|
||||||
RenameThread("komodo-miner");
|
RenameThread("komodo-miner");
|
||||||
const CChainParams& chainparams = Params();
|
const CChainParams& chainparams = Params();
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
// Each thread has its own key
|
// Each thread has its own key
|
||||||
CReserveKey reservekey(pwallet);
|
CReserveKey reservekey(pwallet);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Each thread has its own counter
|
// Each thread has its own counter
|
||||||
unsigned int nExtraNonce = 0;
|
unsigned int nExtraNonce = 0;
|
||||||
|
|
||||||
unsigned int n = chainparams.EquihashN();
|
unsigned int n = chainparams.EquihashN();
|
||||||
unsigned int k = chainparams.EquihashK();
|
unsigned int k = chainparams.EquihashK();
|
||||||
uint8_t *script; uint64_t total; int32_t i,j,gpucount=KOMODO_MAXGPUCOUNT,notaryid = -1;
|
uint8_t *script; uint64_t total; int32_t i,j,gpucount=KOMODO_MAXGPUCOUNT,notaryid = -1;
|
||||||
@@ -1395,7 +1395,7 @@ void static BitcoinMiner()
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
miningTimer.start();
|
miningTimer.start();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
||||||
fprintf(stderr,"try %s Mining with %s\n",ASSETCHAINS_SYMBOL,solver.c_str());
|
fprintf(stderr,"try %s Mining with %s\n",ASSETCHAINS_SYMBOL,solver.c_str());
|
||||||
@@ -1418,7 +1418,7 @@ void static BitcoinMiner()
|
|||||||
break;
|
break;
|
||||||
MilliSleep(15000);
|
MilliSleep(15000);
|
||||||
//fprintf(stderr,"fvNodesEmpty %d IsInitialBlockDownload(%s) %d\n",(int32_t)fvNodesEmpty,ASSETCHAINS_SYMBOL,(int32_t)IsInitialBlockDownload());
|
//fprintf(stderr,"fvNodesEmpty %d IsInitialBlockDownload(%s) %d\n",(int32_t)fvNodesEmpty,ASSETCHAINS_SYMBOL,(int32_t)IsInitialBlockDownload());
|
||||||
|
|
||||||
} while (true);
|
} while (true);
|
||||||
//fprintf(stderr,"%s Found peers\n",ASSETCHAINS_SYMBOL);
|
//fprintf(stderr,"%s Found peers\n",ASSETCHAINS_SYMBOL);
|
||||||
miningTimer.start();
|
miningTimer.start();
|
||||||
@@ -1567,7 +1567,7 @@ void static BitcoinMiner()
|
|||||||
komodo_longestchain();
|
komodo_longestchain();
|
||||||
// Hash state
|
// Hash state
|
||||||
KOMODO_CHOSEN_ONE = 0;
|
KOMODO_CHOSEN_ONE = 0;
|
||||||
|
|
||||||
crypto_generichash_blake2b_state state;
|
crypto_generichash_blake2b_state state;
|
||||||
EhInitialiseState(n, k, state);
|
EhInitialiseState(n, k, state);
|
||||||
// I = the block header minus nonce and solution.
|
// I = the block header minus nonce and solution.
|
||||||
@@ -1687,13 +1687,13 @@ void static BitcoinMiner()
|
|||||||
std::lock_guard<std::mutex> lock{m_cs};
|
std::lock_guard<std::mutex> lock{m_cs};
|
||||||
return cancelSolver;
|
return cancelSolver;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: factor this out into a function with the same API for each solver.
|
// TODO: factor this out into a function with the same API for each solver.
|
||||||
if (solver == "tromp" ) { //&& notaryid >= 0 ) {
|
if (solver == "tromp" ) { //&& notaryid >= 0 ) {
|
||||||
// Create solver and initialize it.
|
// Create solver and initialize it.
|
||||||
equi eq(1);
|
equi eq(1);
|
||||||
eq.setstate(&curr_state);
|
eq.setstate(&curr_state);
|
||||||
|
|
||||||
// Initialization done, start algo driver.
|
// Initialization done, start algo driver.
|
||||||
eq.digit0(0);
|
eq.digit0(0);
|
||||||
eq.xfull = eq.bfull = eq.hfull = 0;
|
eq.xfull = eq.bfull = eq.hfull = 0;
|
||||||
@@ -1705,7 +1705,7 @@ void static BitcoinMiner()
|
|||||||
}
|
}
|
||||||
eq.digitK(0);
|
eq.digitK(0);
|
||||||
ehSolverRuns.increment();
|
ehSolverRuns.increment();
|
||||||
|
|
||||||
// Convert solution indices to byte array (decompress) and pass it to validBlock method.
|
// Convert solution indices to byte array (decompress) and pass it to validBlock method.
|
||||||
for (size_t s = 0; s < eq.nsols; s++) {
|
for (size_t s = 0; s < eq.nsols; s++) {
|
||||||
LogPrint("pow", "Checking solution %d\n", s+1);
|
LogPrint("pow", "Checking solution %d\n", s+1);
|
||||||
@@ -1714,7 +1714,7 @@ void static BitcoinMiner()
|
|||||||
index_vector[i] = eq.sols[s][i];
|
index_vector[i] = eq.sols[s][i];
|
||||||
}
|
}
|
||||||
std::vector<unsigned char> sol_char = GetMinimalFromIndices(index_vector, DIGITBITS);
|
std::vector<unsigned char> sol_char = GetMinimalFromIndices(index_vector, DIGITBITS);
|
||||||
|
|
||||||
if (validBlock(sol_char)) {
|
if (validBlock(sol_char)) {
|
||||||
// If we find a POW solution, do not try other solutions
|
// If we find a POW solution, do not try other solutions
|
||||||
// because they become invalid as we created a new block in blockchain.
|
// because they become invalid as we created a new block in blockchain.
|
||||||
@@ -1741,7 +1741,7 @@ void static BitcoinMiner()
|
|||||||
cancelSolver = false;
|
cancelSolver = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for stop or if block needs to be rebuilt
|
// Check for stop or if block needs to be rebuilt
|
||||||
boost::this_thread::interruption_point();
|
boost::this_thread::interruption_point();
|
||||||
// Regtest mode doesn't require peers
|
// Regtest mode doesn't require peers
|
||||||
@@ -1811,7 +1811,7 @@ void static BitcoinMiner()
|
|||||||
miningTimer.stop();
|
miningTimer.stop();
|
||||||
c.disconnect();
|
c.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
void GenerateBitcoins(bool fGenerate, CWallet* pwallet, int nThreads)
|
void GenerateBitcoins(bool fGenerate, CWallet* pwallet, int nThreads)
|
||||||
#else
|
#else
|
||||||
@@ -1819,10 +1819,10 @@ void static BitcoinMiner()
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
static boost::thread_group* minerThreads = NULL;
|
static boost::thread_group* minerThreads = NULL;
|
||||||
|
|
||||||
if (nThreads < 0)
|
if (nThreads < 0)
|
||||||
nThreads = GetNumCores();
|
nThreads = GetNumCores();
|
||||||
|
|
||||||
if (minerThreads != NULL)
|
if (minerThreads != NULL)
|
||||||
{
|
{
|
||||||
minerThreads->interrupt_all();
|
minerThreads->interrupt_all();
|
||||||
@@ -1831,8 +1831,13 @@ void static BitcoinMiner()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//fprintf(stderr,"nThreads.%d fGenerate.%d\n",(int32_t)nThreads,fGenerate);
|
//fprintf(stderr,"nThreads.%d fGenerate.%d\n",(int32_t)nThreads,fGenerate);
|
||||||
if ( nThreads == 0 && ASSETCHAINS_STAKED )
|
if ( ASSETCHAINS_STAKED > 0 && nThreads == 0 )
|
||||||
nThreads = 1;
|
{
|
||||||
|
if ( pwallet != NULL )
|
||||||
|
nThreads = 1;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((nThreads == 0 || !fGenerate) && (VERUS_MINTBLOCKS == 0 || pwallet == NULL))
|
if ((nThreads == 0 || !fGenerate) && (VERUS_MINTBLOCKS == 0 || pwallet == NULL))
|
||||||
return;
|
return;
|
||||||
@@ -1861,5 +1866,5 @@ void static BitcoinMiner()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // ENABLE_MINING
|
#endif // ENABLE_MINING
|
||||||
|
|||||||
@@ -1492,13 +1492,18 @@ void ThreadOpenAddedConnections()
|
|||||||
LOCK(cs_vNodes);
|
LOCK(cs_vNodes);
|
||||||
BOOST_FOREACH(CNode* pnode, vNodes)
|
BOOST_FOREACH(CNode* pnode, vNodes)
|
||||||
for (list<vector<CService> >::iterator it = lservAddressesToAdd.begin(); it != lservAddressesToAdd.end(); it++)
|
for (list<vector<CService> >::iterator it = lservAddressesToAdd.begin(); it != lservAddressesToAdd.end(); it++)
|
||||||
|
{
|
||||||
BOOST_FOREACH(const CService& addrNode, *(it))
|
BOOST_FOREACH(const CService& addrNode, *(it))
|
||||||
if (pnode->addr == addrNode)
|
if (pnode->addr == addrNode)
|
||||||
{
|
{
|
||||||
it = lservAddressesToAdd.erase(it);
|
it = lservAddressesToAdd.erase(it);
|
||||||
it--;
|
if ( it != lservAddressesToAdd.begin() )
|
||||||
|
it--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (it == lservAddressesToAdd.end())
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
BOOST_FOREACH(vector<CService>& vserv, lservAddressesToAdd)
|
BOOST_FOREACH(vector<CService>& vserv, lservAddressesToAdd)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -344,7 +344,10 @@ UniValue setgenerate(const UniValue& params, bool fHelp)
|
|||||||
{
|
{
|
||||||
VERUS_MINTBLOCKS = 1;
|
VERUS_MINTBLOCKS = 1;
|
||||||
fGenerate = GetBoolArg("-gen", false);
|
fGenerate = GetBoolArg("-gen", false);
|
||||||
nGenProcLimit = KOMODO_MININGTHREADS;
|
if ( ASSETCHAINS_STAKED == 0 )
|
||||||
|
nGenProcLimit = KOMODO_MININGTHREADS;
|
||||||
|
else
|
||||||
|
KOMODO_MININGTHREADS = nGenProcLimit;
|
||||||
}
|
}
|
||||||
else if (!fGenerate)
|
else if (!fGenerate)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -54,9 +54,9 @@ extern uint64_t KOMODO_INTERESTSUM,KOMODO_WALLETBALANCE;
|
|||||||
extern int32_t KOMODO_LASTMINED,JUMBLR_PAUSE,KOMODO_LONGESTCHAIN;
|
extern int32_t KOMODO_LASTMINED,JUMBLR_PAUSE,KOMODO_LONGESTCHAIN;
|
||||||
extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN];
|
extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN];
|
||||||
uint32_t komodo_segid32(char *coinaddr);
|
uint32_t komodo_segid32(char *coinaddr);
|
||||||
int64_t komodo_coinsupply(int64_t *zfundsp,int32_t height);
|
int64_t komodo_coinsupply(int64_t *zfundsp,int64_t *sproutfundsp,int32_t height);
|
||||||
int32_t notarizedtxid_height(char *dest,char *txidstr,int32_t *kmdnotarized_heightp);
|
int32_t notarizedtxid_height(char *dest,char *txidstr,int32_t *kmdnotarized_heightp);
|
||||||
#define KOMODO_VERSION "0.3.0"
|
#define KOMODO_VERSION "0.3.1"
|
||||||
#define VERUS_VERSION "0.4.0g"
|
#define VERUS_VERSION "0.4.0g"
|
||||||
extern uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT;
|
extern uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT;
|
||||||
extern uint32_t ASSETCHAINS_CC;
|
extern uint32_t ASSETCHAINS_CC;
|
||||||
@@ -282,7 +282,7 @@ public:
|
|||||||
|
|
||||||
UniValue coinsupply(const UniValue& params, bool fHelp)
|
UniValue coinsupply(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
int32_t height = 0; int32_t currentHeight; int64_t zfunds,supply = 0; UniValue result(UniValue::VOBJ);
|
int32_t height = 0; int32_t currentHeight; int64_t sproutfunds,zfunds,supply = 0; UniValue result(UniValue::VOBJ);
|
||||||
if (fHelp || params.size() > 1)
|
if (fHelp || params.size() > 1)
|
||||||
throw runtime_error("coinsupply <height>\n"
|
throw runtime_error("coinsupply <height>\n"
|
||||||
"\nReturn coin supply information at a given block height. If no height is given, the current height is used.\n"
|
"\nReturn coin supply information at a given block height. If no height is given, the current height is used.\n"
|
||||||
@@ -295,7 +295,8 @@ UniValue coinsupply(const UniValue& params, bool fHelp)
|
|||||||
" \"height\" : 420, (integer) The height of this coin supply data\n"
|
" \"height\" : 420, (integer) The height of this coin supply data\n"
|
||||||
" \"supply\" : \"777.0\", (float) The transparent coin supply\n"
|
" \"supply\" : \"777.0\", (float) The transparent coin supply\n"
|
||||||
" \"zfunds\" : \"0.777\", (float) The shielded coin supply (in zaddrs)\n"
|
" \"zfunds\" : \"0.777\", (float) The shielded coin supply (in zaddrs)\n"
|
||||||
" \"total\" : \"777.777\", (float) The total coin supply, i.e. sum of supply + zfunds\n"
|
" \"sprout\" : \"0.077\", (float) The sprout coin supply (in zcaddrs)\n"
|
||||||
|
" \"total\" : \"777.777\", (float) The total coin supply, i.e. sum of supply + zfunds\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"\nExamples:\n"
|
"\nExamples:\n"
|
||||||
+ HelpExampleCli("coinsupply", "420")
|
+ HelpExampleCli("coinsupply", "420")
|
||||||
@@ -307,13 +308,14 @@ UniValue coinsupply(const UniValue& params, bool fHelp)
|
|||||||
currentHeight = chainActive.Height();
|
currentHeight = chainActive.Height();
|
||||||
|
|
||||||
if (height >= 0 && height <= currentHeight) {
|
if (height >= 0 && height <= currentHeight) {
|
||||||
if ( (supply= komodo_coinsupply(&zfunds,height)) > 0 )
|
if ( (supply= komodo_coinsupply(&zfunds,&sproutfunds,height)) > 0 )
|
||||||
{
|
{
|
||||||
result.push_back(Pair("result", "success"));
|
result.push_back(Pair("result", "success"));
|
||||||
result.push_back(Pair("coin", ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL));
|
result.push_back(Pair("coin", ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL));
|
||||||
result.push_back(Pair("height", (int)height));
|
result.push_back(Pair("height", (int)height));
|
||||||
result.push_back(Pair("supply", ValueFromAmount(supply)));
|
result.push_back(Pair("supply", ValueFromAmount(supply)));
|
||||||
result.push_back(Pair("zfunds", ValueFromAmount(zfunds)));
|
result.push_back(Pair("zfunds", ValueFromAmount(zfunds)));
|
||||||
|
result.push_back(Pair("sprout", ValueFromAmount(sproutfunds)));
|
||||||
result.push_back(Pair("total", ValueFromAmount(zfunds + supply)));
|
result.push_back(Pair("total", ValueFromAmount(zfunds + supply)));
|
||||||
} else result.push_back(Pair("error", "couldnt calculate supply"));
|
} else result.push_back(Pair("error", "couldnt calculate supply"));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1167,12 +1167,12 @@ UniValue signrawtransaction(const UniValue& params, bool fHelp)
|
|||||||
if ( txConst.IsCoinBase() != 0 )
|
if ( txConst.IsCoinBase() != 0 )
|
||||||
{
|
{
|
||||||
if ( (txpow & 2) == 0 )
|
if ( (txpow & 2) == 0 )
|
||||||
txpow == 0;
|
txpow = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( (txpow & 1) == 0 )
|
if ( (txpow & 1) == 0 )
|
||||||
txpow == 0;
|
txpow = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while ( 1 )
|
while ( 1 )
|
||||||
@@ -1274,7 +1274,7 @@ UniValue sendrawtransaction(const UniValue& params, bool fHelp)
|
|||||||
// push to local node and sync with wallets
|
// push to local node and sync with wallets
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
bool fMissingInputs;
|
bool fMissingInputs;
|
||||||
if (!AcceptToMemoryPool(mempool, state, tx, true, &fMissingInputs, !fOverrideFees)) {
|
if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)) {
|
||||||
if (state.IsInvalid()) {
|
if (state.IsInvalid()) {
|
||||||
throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason()));
|
throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason()));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1767,6 +1767,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe
|
|||||||
BOOST_FOREACH(const COutputEntry& r, listReceived)
|
BOOST_FOREACH(const COutputEntry& r, listReceived)
|
||||||
{
|
{
|
||||||
string account;
|
string account;
|
||||||
|
//fprintf(stderr,"recv iter %s\n",wtx.GetHash().GetHex().c_str());
|
||||||
if (pwalletMain->mapAddressBook.count(r.destination))
|
if (pwalletMain->mapAddressBook.count(r.destination))
|
||||||
account = pwalletMain->mapAddressBook[r.destination].name;
|
account = pwalletMain->mapAddressBook[r.destination].name;
|
||||||
if (fAllAccounts || (account == strAccount))
|
if (fAllAccounts || (account == strAccount))
|
||||||
@@ -1917,7 +1918,10 @@ UniValue listtransactions(const UniValue& params, bool fHelp)
|
|||||||
{
|
{
|
||||||
CWalletTx *const pwtx = (*it).second.first;
|
CWalletTx *const pwtx = (*it).second.first;
|
||||||
if (pwtx != 0)
|
if (pwtx != 0)
|
||||||
|
{
|
||||||
|
//fprintf(stderr,"pwtx iter.%d %s\n",(int32_t)pwtx->nOrderPos,pwtx->GetHash().GetHex().c_str());
|
||||||
ListTransactions(*pwtx, strAccount, 0, true, ret, filter);
|
ListTransactions(*pwtx, strAccount, 0, true, ret, filter);
|
||||||
|
} //else fprintf(stderr,"null pwtx\n");
|
||||||
CAccountingEntry *const pacentry = (*it).second.second;
|
CAccountingEntry *const pacentry = (*it).second.second;
|
||||||
if (pacentry != 0)
|
if (pacentry != 0)
|
||||||
AcentryToJSON(*pacentry, strAccount, ret);
|
AcentryToJSON(*pacentry, strAccount, ret);
|
||||||
@@ -4211,6 +4215,9 @@ UniValue z_sendmany(const UniValue& params, bool fHelp)
|
|||||||
if ( fromSprout || toSprout )
|
if ( fromSprout || toSprout )
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER,"Sprout usage has expired");
|
throw JSONRPCError(RPC_INVALID_PARAMETER,"Sprout usage has expired");
|
||||||
}
|
}
|
||||||
|
if ( toSapling && ASSETCHAINS_SYMBOL[0] == 0 )
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER,"Sprout usage will expire soon");
|
||||||
|
|
||||||
// If we are sending from a shielded address, all recipient
|
// If we are sending from a shielded address, all recipient
|
||||||
// shielded addresses must be of the same type.
|
// shielded addresses must be of the same type.
|
||||||
if ((fromSprout && toSapling) || (fromSapling && toSprout)) {
|
if ((fromSprout && toSapling) || (fromSapling && toSprout)) {
|
||||||
@@ -4629,14 +4636,14 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
{
|
{
|
||||||
if (!EnsureWalletIsAvailable(fHelp))
|
if (!EnsureWalletIsAvailable(fHelp))
|
||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
|
|
||||||
string enableArg = "zmergetoaddress";
|
string enableArg = "zmergetoaddress";
|
||||||
auto fEnableMergeToAddress = fExperimentalMode && GetBoolArg("-" + enableArg, true);
|
auto fEnableMergeToAddress = fExperimentalMode && GetBoolArg("-" + enableArg, true);
|
||||||
std::string strDisabledMsg = "";
|
std::string strDisabledMsg = "";
|
||||||
if (!fEnableMergeToAddress) {
|
if (!fEnableMergeToAddress) {
|
||||||
strDisabledMsg = experimentalDisabledHelpMsg("z_mergetoaddress", enableArg);
|
strDisabledMsg = experimentalDisabledHelpMsg("z_mergetoaddress", enableArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fHelp || params.size() < 2 || params.size() > 6)
|
if (fHelp || params.size() < 2 || params.size() > 6)
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
"z_mergetoaddress [\"fromaddress\", ... ] \"toaddress\" ( fee ) ( transparent_limit ) ( shielded_limit ) ( memo )\n"
|
"z_mergetoaddress [\"fromaddress\", ... ] \"toaddress\" ( fee ) ( transparent_limit ) ( shielded_limit ) ( memo )\n"
|
||||||
@@ -4685,33 +4692,33 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
+ HelpExampleCli("z_mergetoaddress", "'[\"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\"]' ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf")
|
+ HelpExampleCli("z_mergetoaddress", "'[\"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\"]' ztfaW34Gj9FrnGUEf833ywDVL62NWXBM81u6EQnM6VR45eYnXhwztecW1SjxA7JrmAXKJhxhj3vDNEpVCQoSvVoSpmbhtjf")
|
||||||
+ HelpExampleRpc("z_mergetoaddress", "[\"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\"], \"zs14d8tc0hl9q0vg5l28uec5vk6sk34fkj2n8s7jalvw5fxpy6v39yn4s2ga082lymrkjk0x2nqg37\"")
|
+ HelpExampleRpc("z_mergetoaddress", "[\"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\"], \"zs14d8tc0hl9q0vg5l28uec5vk6sk34fkj2n8s7jalvw5fxpy6v39yn4s2ga082lymrkjk0x2nqg37\"")
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!fEnableMergeToAddress) {
|
if (!fEnableMergeToAddress) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error: z_mergetoaddress is disabled.");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error: z_mergetoaddress is disabled.");
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
|
||||||
bool useAnyUTXO = false;
|
bool useAnyUTXO = false;
|
||||||
bool useAnySprout = false;
|
bool useAnySprout = false;
|
||||||
bool useAnySapling = false;
|
bool useAnySapling = false;
|
||||||
std::set<CTxDestination> taddrs = {};
|
std::set<CTxDestination> taddrs = {};
|
||||||
std::set<libzcash::PaymentAddress> zaddrs = {};
|
std::set<libzcash::PaymentAddress> zaddrs = {};
|
||||||
|
|
||||||
UniValue addresses = params[0].get_array();
|
UniValue addresses = params[0].get_array();
|
||||||
if (addresses.size()==0)
|
if (addresses.size()==0)
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, fromaddresses array is empty.");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, fromaddresses array is empty.");
|
||||||
|
|
||||||
// Keep track of addresses to spot duplicates
|
// Keep track of addresses to spot duplicates
|
||||||
std::set<std::string> setAddress;
|
std::set<std::string> setAddress;
|
||||||
|
|
||||||
// Sources
|
// Sources
|
||||||
for (const UniValue& o : addresses.getValues()) {
|
for (const UniValue& o : addresses.getValues()) {
|
||||||
if (!o.isStr())
|
if (!o.isStr())
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected string");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected string");
|
||||||
|
|
||||||
std::string address = o.get_str();
|
std::string address = o.get_str();
|
||||||
|
|
||||||
if (address == "ANY_TADDR") {
|
if (address == "ANY_TADDR") {
|
||||||
useAnyUTXO = true;
|
useAnyUTXO = true;
|
||||||
} else if (address == "ANY_SPROUT") {
|
} else if (address == "ANY_SPROUT") {
|
||||||
@@ -4731,23 +4738,23 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setAddress.count(address))
|
if (setAddress.count(address))
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ") + address);
|
throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ") + address);
|
||||||
setAddress.insert(address);
|
setAddress.insert(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useAnyUTXO && taddrs.size() > 0) {
|
if (useAnyUTXO && taddrs.size() > 0) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Cannot specify specific t-addrs when using \"ANY_TADDR\"");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Cannot specify specific t-addrs when using \"ANY_TADDR\"");
|
||||||
}
|
}
|
||||||
if ((useAnySprout || useAnySapling) && zaddrs.size() > 0) {
|
if ((useAnySprout || useAnySapling) && zaddrs.size() > 0) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Cannot specify specific z-addrs when using \"ANY_SPROUT\" or \"ANY_SAPLING\"");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Cannot specify specific z-addrs when using \"ANY_SPROUT\" or \"ANY_SAPLING\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
const int nextBlockHeight = chainActive.Height() + 1;
|
const int nextBlockHeight = chainActive.Height() + 1;
|
||||||
const bool overwinterActive = NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER);
|
const bool overwinterActive = NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER);
|
||||||
const bool saplingActive = NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_SAPLING);
|
const bool saplingActive = NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_SAPLING);
|
||||||
|
|
||||||
// Validate the destination address
|
// Validate the destination address
|
||||||
auto destaddress = params[1].get_str();
|
auto destaddress = params[1].get_str();
|
||||||
bool isToSproutZaddr = false;
|
bool isToSproutZaddr = false;
|
||||||
@@ -4769,7 +4776,7 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, unknown address format: ") + destaddress );
|
throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, unknown address format: ") + destaddress );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert fee from currency format to zatoshis
|
// Convert fee from currency format to zatoshis
|
||||||
CAmount nFee = SHIELD_COINBASE_DEFAULT_MINERS_FEE;
|
CAmount nFee = SHIELD_COINBASE_DEFAULT_MINERS_FEE;
|
||||||
if (params.size() > 2) {
|
if (params.size() > 2) {
|
||||||
@@ -4779,7 +4786,7 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
nFee = AmountFromValue( params[2] );
|
nFee = AmountFromValue( params[2] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int nUTXOLimit = MERGE_TO_ADDRESS_DEFAULT_TRANSPARENT_LIMIT;
|
int nUTXOLimit = MERGE_TO_ADDRESS_DEFAULT_TRANSPARENT_LIMIT;
|
||||||
if (params.size() > 3) {
|
if (params.size() > 3) {
|
||||||
nUTXOLimit = params[3].get_int();
|
nUTXOLimit = params[3].get_int();
|
||||||
@@ -4787,7 +4794,7 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Limit on maximum number of UTXOs cannot be negative");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Limit on maximum number of UTXOs cannot be negative");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int sproutNoteLimit = MERGE_TO_ADDRESS_DEFAULT_SPROUT_LIMIT;
|
int sproutNoteLimit = MERGE_TO_ADDRESS_DEFAULT_SPROUT_LIMIT;
|
||||||
int saplingNoteLimit = MERGE_TO_ADDRESS_DEFAULT_SAPLING_LIMIT;
|
int saplingNoteLimit = MERGE_TO_ADDRESS_DEFAULT_SAPLING_LIMIT;
|
||||||
if (params.size() > 4) {
|
if (params.size() > 4) {
|
||||||
@@ -4798,7 +4805,7 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
sproutNoteLimit = nNoteLimit;
|
sproutNoteLimit = nNoteLimit;
|
||||||
saplingNoteLimit = nNoteLimit;
|
saplingNoteLimit = nNoteLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string memo;
|
std::string memo;
|
||||||
if (params.size() > 5) {
|
if (params.size() > 5) {
|
||||||
memo = params[5].get_str();
|
memo = params[5].get_str();
|
||||||
@@ -4811,9 +4818,9 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, size of memo is larger than maximum allowed %d", ZC_MEMO_SIZE ));
|
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, size of memo is larger than maximum allowed %d", ZC_MEMO_SIZE ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MergeToAddressRecipient recipient(destaddress, memo);
|
MergeToAddressRecipient recipient(destaddress, memo);
|
||||||
|
|
||||||
// Prepare to get UTXOs and notes
|
// Prepare to get UTXOs and notes
|
||||||
std::vector<MergeToAddressInputUTXO> utxoInputs;
|
std::vector<MergeToAddressInputUTXO> utxoInputs;
|
||||||
std::vector<MergeToAddressInputSproutNote> sproutNoteInputs;
|
std::vector<MergeToAddressInputSproutNote> sproutNoteInputs;
|
||||||
@@ -4827,7 +4834,7 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
bool maxedOutUTXOsFlag = false;
|
bool maxedOutUTXOsFlag = false;
|
||||||
bool maxedOutNotesFlag = false;
|
bool maxedOutNotesFlag = false;
|
||||||
size_t mempoolLimit = (nUTXOLimit != 0) ? nUTXOLimit : (overwinterActive ? 0 : (size_t)GetArg("-mempooltxinputlimit", 0));
|
size_t mempoolLimit = (nUTXOLimit != 0) ? nUTXOLimit : (overwinterActive ? 0 : (size_t)GetArg("-mempooltxinputlimit", 0));
|
||||||
|
|
||||||
unsigned int max_tx_size = saplingActive ? MAX_TX_SIZE_AFTER_SAPLING : MAX_TX_SIZE_BEFORE_SAPLING;
|
unsigned int max_tx_size = saplingActive ? MAX_TX_SIZE_AFTER_SAPLING : MAX_TX_SIZE_BEFORE_SAPLING;
|
||||||
size_t estimatedTxSize = 200; // tx overhead + wiggle room
|
size_t estimatedTxSize = 200; // tx overhead + wiggle room
|
||||||
if (isToSproutZaddr) {
|
if (isToSproutZaddr) {
|
||||||
@@ -4835,20 +4842,20 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
} else if (isToSaplingZaddr) {
|
} else if (isToSaplingZaddr) {
|
||||||
estimatedTxSize += OUTPUTDESCRIPTION_SIZE;
|
estimatedTxSize += OUTPUTDESCRIPTION_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useAnyUTXO || taddrs.size() > 0) {
|
if (useAnyUTXO || taddrs.size() > 0) {
|
||||||
// Get available utxos
|
// Get available utxos
|
||||||
vector<COutput> vecOutputs;
|
vector<COutput> vecOutputs;
|
||||||
pwalletMain->AvailableCoins(vecOutputs, true, NULL, false, false);
|
pwalletMain->AvailableCoins(vecOutputs, true, NULL, false, false);
|
||||||
|
|
||||||
// Find unspent utxos and update estimated size
|
// Find unspent utxos and update estimated size
|
||||||
for (const COutput& out : vecOutputs) {
|
for (const COutput& out : vecOutputs) {
|
||||||
if (!out.fSpendable) {
|
if (!out.fSpendable) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
CScript scriptPubKey = out.tx->vout[out.i].scriptPubKey;
|
CScript scriptPubKey = out.tx->vout[out.i].scriptPubKey;
|
||||||
|
|
||||||
CTxDestination address;
|
CTxDestination address;
|
||||||
if (!ExtractDestination(scriptPubKey, address)) {
|
if (!ExtractDestination(scriptPubKey, address)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -4857,10 +4864,10 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
if (taddrs.size() > 0 && !taddrs.count(address)) {
|
if (taddrs.size() > 0 && !taddrs.count(address)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
utxoCounter++;
|
utxoCounter++;
|
||||||
CAmount nValue = out.tx->vout[out.i].nValue;
|
CAmount nValue = out.tx->vout[out.i].nValue;
|
||||||
|
|
||||||
if (!maxedOutUTXOsFlag) {
|
if (!maxedOutUTXOsFlag) {
|
||||||
size_t increase = (boost::get<CScriptID>(&address) != nullptr) ? CTXIN_SPEND_P2SH_SIZE : CTXIN_SPEND_DUST_SIZE;
|
size_t increase = (boost::get<CScriptID>(&address) != nullptr) ? CTXIN_SPEND_P2SH_SIZE : CTXIN_SPEND_DUST_SIZE;
|
||||||
if (estimatedTxSize + increase >= max_tx_size ||
|
if (estimatedTxSize + increase >= max_tx_size ||
|
||||||
@@ -4874,19 +4881,19 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
mergedUTXOValue += nValue;
|
mergedUTXOValue += nValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxedOutUTXOsFlag) {
|
if (maxedOutUTXOsFlag) {
|
||||||
remainingUTXOValue += nValue;
|
remainingUTXOValue += nValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useAnySprout || useAnySapling || zaddrs.size() > 0) {
|
if (useAnySprout || useAnySapling || zaddrs.size() > 0) {
|
||||||
// Get available notes
|
// Get available notes
|
||||||
std::vector<CSproutNotePlaintextEntry> sproutEntries;
|
std::vector<CSproutNotePlaintextEntry> sproutEntries;
|
||||||
std::vector<SaplingNoteEntry> saplingEntries;
|
std::vector<SaplingNoteEntry> saplingEntries;
|
||||||
pwalletMain->GetFilteredNotes(sproutEntries, saplingEntries, zaddrs);
|
pwalletMain->GetFilteredNotes(sproutEntries, saplingEntries, zaddrs);
|
||||||
|
|
||||||
// If Sapling is not active, do not allow sending from a sapling addresses.
|
// If Sapling is not active, do not allow sending from a sapling addresses.
|
||||||
if (!saplingActive && saplingEntries.size() > 0) {
|
if (!saplingActive && saplingEntries.size() > 0) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, Sapling has not activated");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, Sapling has not activated");
|
||||||
@@ -4903,12 +4910,12 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
RPC_INVALID_PARAMETER,
|
RPC_INVALID_PARAMETER,
|
||||||
"Cannot send between Sprout and Sapling addresses using z_mergetoaddress");
|
"Cannot send between Sprout and Sapling addresses using z_mergetoaddress");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find unspent notes and update estimated size
|
// Find unspent notes and update estimated size
|
||||||
for (const CSproutNotePlaintextEntry& entry : sproutEntries) {
|
for (const CSproutNotePlaintextEntry& entry : sproutEntries) {
|
||||||
noteCounter++;
|
noteCounter++;
|
||||||
CAmount nValue = entry.plaintext.value();
|
CAmount nValue = entry.plaintext.value();
|
||||||
|
|
||||||
if (!maxedOutNotesFlag) {
|
if (!maxedOutNotesFlag) {
|
||||||
// If we haven't added any notes yet and the merge is to a
|
// If we haven't added any notes yet and the merge is to a
|
||||||
// z-address, we have already accounted for the first JoinSplit.
|
// z-address, we have already accounted for the first JoinSplit.
|
||||||
@@ -4926,12 +4933,12 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
mergedNoteValue += nValue;
|
mergedNoteValue += nValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxedOutNotesFlag) {
|
if (maxedOutNotesFlag) {
|
||||||
remainingNoteValue += nValue;
|
remainingNoteValue += nValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const SaplingNoteEntry& entry : saplingEntries) {
|
for (const SaplingNoteEntry& entry : saplingEntries) {
|
||||||
noteCounter++;
|
noteCounter++;
|
||||||
CAmount nValue = entry.note.value();
|
CAmount nValue = entry.note.value();
|
||||||
@@ -4951,20 +4958,20 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
mergedNoteValue += nValue;
|
mergedNoteValue += nValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxedOutNotesFlag) {
|
if (maxedOutNotesFlag) {
|
||||||
remainingNoteValue += nValue;
|
remainingNoteValue += nValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t numUtxos = utxoInputs.size();
|
size_t numUtxos = utxoInputs.size();
|
||||||
size_t numNotes = sproutNoteInputs.size() + saplingNoteInputs.size();
|
size_t numNotes = sproutNoteInputs.size() + saplingNoteInputs.size();
|
||||||
|
|
||||||
if (numUtxos == 0 && numNotes == 0) {
|
if (numUtxos == 0 && numNotes == 0) {
|
||||||
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Could not find any funds to merge.");
|
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Could not find any funds to merge.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sanity check: Don't do anything if:
|
// Sanity check: Don't do anything if:
|
||||||
// - We only have one from address
|
// - We only have one from address
|
||||||
// - It's equal to toaddress
|
// - It's equal to toaddress
|
||||||
@@ -4972,26 +4979,26 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
if (setAddress.size() == 1 && setAddress.count(destaddress) && (numUtxos + numNotes) == 1) {
|
if (setAddress.size() == 1 && setAddress.count(destaddress) && (numUtxos + numNotes) == 1) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Destination address is also the only source address, and all its funds are already merged.");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Destination address is also the only source address, and all its funds are already merged.");
|
||||||
}
|
}
|
||||||
|
|
||||||
CAmount mergedValue = mergedUTXOValue + mergedNoteValue;
|
CAmount mergedValue = mergedUTXOValue + mergedNoteValue;
|
||||||
if (mergedValue < nFee) {
|
if (mergedValue < nFee) {
|
||||||
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
|
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
|
||||||
strprintf("Insufficient funds, have %s, which is less than miners fee %s",
|
strprintf("Insufficient funds, have %s, which is less than miners fee %s",
|
||||||
FormatMoney(mergedValue), FormatMoney(nFee)));
|
FormatMoney(mergedValue), FormatMoney(nFee)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that the user specified fee is sane (if too high, it can result in error -25 absurd fee)
|
// Check that the user specified fee is sane (if too high, it can result in error -25 absurd fee)
|
||||||
CAmount netAmount = mergedValue - nFee;
|
CAmount netAmount = mergedValue - nFee;
|
||||||
if (nFee > netAmount) {
|
if (nFee > netAmount) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the net amount to be shielded %s", FormatMoney(nFee), FormatMoney(netAmount)));
|
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the net amount to be shielded %s", FormatMoney(nFee), FormatMoney(netAmount)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep record of parameters in context object
|
// Keep record of parameters in context object
|
||||||
UniValue contextInfo(UniValue::VOBJ);
|
UniValue contextInfo(UniValue::VOBJ);
|
||||||
contextInfo.push_back(Pair("fromaddresses", params[0]));
|
contextInfo.push_back(Pair("fromaddresses", params[0]));
|
||||||
contextInfo.push_back(Pair("toaddress", params[1]));
|
contextInfo.push_back(Pair("toaddress", params[1]));
|
||||||
contextInfo.push_back(Pair("fee", ValueFromAmount(nFee)));
|
contextInfo.push_back(Pair("fee", ValueFromAmount(nFee)));
|
||||||
|
|
||||||
// Contextual transaction we will build on
|
// Contextual transaction we will build on
|
||||||
CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction(
|
CMutableTransaction contextualTx = CreateNewContextualCMutableTransaction(
|
||||||
Params().GetConsensus(),
|
Params().GetConsensus(),
|
||||||
@@ -5000,7 +5007,7 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
if (contextualTx.nVersion == 1 && isSproutShielded) {
|
if (contextualTx.nVersion == 1 && isSproutShielded) {
|
||||||
contextualTx.nVersion = 2; // Tx format should support vjoinsplit
|
contextualTx.nVersion = 2; // Tx format should support vjoinsplit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Builder (used if Sapling addresses are involved)
|
// Builder (used if Sapling addresses are involved)
|
||||||
boost::optional<TransactionBuilder> builder;
|
boost::optional<TransactionBuilder> builder;
|
||||||
if (isToSaplingZaddr || saplingNoteInputs.size() > 0) {
|
if (isToSaplingZaddr || saplingNoteInputs.size() > 0) {
|
||||||
@@ -5012,7 +5019,7 @@ UniValue z_mergetoaddress(const UniValue& params, bool fHelp)
|
|||||||
new AsyncRPCOperation_mergetoaddress(builder, contextualTx, utxoInputs, sproutNoteInputs, saplingNoteInputs, recipient, nFee, contextInfo) );
|
new AsyncRPCOperation_mergetoaddress(builder, contextualTx, utxoInputs, sproutNoteInputs, saplingNoteInputs, recipient, nFee, contextInfo) );
|
||||||
q->addOperation(operation);
|
q->addOperation(operation);
|
||||||
AsyncRPCOperationId operationId = operation->getId();
|
AsyncRPCOperationId operationId = operation->getId();
|
||||||
|
|
||||||
// Return continuation information
|
// Return continuation information
|
||||||
UniValue o(UniValue::VOBJ);
|
UniValue o(UniValue::VOBJ);
|
||||||
o.push_back(Pair("remainingUTXOs", static_cast<uint64_t>(utxoCounter - numUtxos)));
|
o.push_back(Pair("remainingUTXOs", static_cast<uint64_t>(utxoCounter - numUtxos)));
|
||||||
@@ -7268,7 +7275,7 @@ UniValue tokenfillask(const UniValue& params, bool fHelp)
|
|||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
asktxid = Parseuint256((char *)params[1].get_str().c_str());
|
asktxid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
//fillunits = atol(params[2].get_str().c_str());
|
//fillunits = atol(params[2].get_str().c_str());
|
||||||
fillunits = atoll(params[2].get_str().c_str()); // dimxy changed to prevent loss of significance
|
fillunits = atoll(params[2].get_str().c_str()); // dimxy changed to prevent loss of significance
|
||||||
if ( fillunits <= 0 )
|
if ( fillunits <= 0 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1304,6 +1304,7 @@ CWallet::TxItems CWallet::OrderedTxItems(std::list<CAccountingEntry>& acentries,
|
|||||||
{
|
{
|
||||||
CWalletTx* wtx = &((*it).second);
|
CWalletTx* wtx = &((*it).second);
|
||||||
txOrdered.insert(make_pair(wtx->nOrderPos, TxPair(wtx, (CAccountingEntry*)0)));
|
txOrdered.insert(make_pair(wtx->nOrderPos, TxPair(wtx, (CAccountingEntry*)0)));
|
||||||
|
//fprintf(stderr,"ordered iter.%d %s\n",(int32_t)wtx->nOrderPos,wtx->GetHash().GetHex().c_str());
|
||||||
}
|
}
|
||||||
acentries.clear();
|
acentries.clear();
|
||||||
walletdb.ListAccountCreditDebit(strAccount, acentries);
|
walletdb.ListAccountCreditDebit(strAccount, acentries);
|
||||||
@@ -2521,6 +2522,7 @@ void CWalletTx::GetAmounts(list<COutputEntry>& listReceived,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sent/received.
|
// Sent/received.
|
||||||
|
int32_t oneshot = 0;
|
||||||
for (unsigned int i = 0; i < vout.size(); ++i)
|
for (unsigned int i = 0; i < vout.size(); ++i)
|
||||||
{
|
{
|
||||||
const CTxOut& txout = vout[i];
|
const CTxOut& txout = vout[i];
|
||||||
@@ -2532,11 +2534,19 @@ void CWalletTx::GetAmounts(list<COutputEntry>& listReceived,
|
|||||||
{
|
{
|
||||||
// Don't report 'change' txouts
|
// Don't report 'change' txouts
|
||||||
if (!(filter & ISMINE_CHANGE) && pwallet->IsChange(txout))
|
if (!(filter & ISMINE_CHANGE) && pwallet->IsChange(txout))
|
||||||
continue;
|
{
|
||||||
|
if ( oneshot++ > 1 )
|
||||||
|
{
|
||||||
|
//fprintf(stderr,"skip change vout\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (!(fIsMine & filter))
|
else if (!(fIsMine & filter))
|
||||||
|
{
|
||||||
|
//fprintf(stderr,"skip filtered vout %d %d\n",(int32_t)fIsMine,(int32_t)filter);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
// In either case, we need to get the destination address
|
// In either case, we need to get the destination address
|
||||||
CTxDestination address;
|
CTxDestination address;
|
||||||
if (!ExtractDestination(txout.scriptPubKey, address))
|
if (!ExtractDestination(txout.scriptPubKey, address))
|
||||||
@@ -2550,10 +2560,12 @@ void CWalletTx::GetAmounts(list<COutputEntry>& listReceived,
|
|||||||
// If we are debited by the transaction, add the output as a "sent" entry
|
// If we are debited by the transaction, add the output as a "sent" entry
|
||||||
if (nDebit > 0)
|
if (nDebit > 0)
|
||||||
listSent.push_back(output);
|
listSent.push_back(output);
|
||||||
|
//else fprintf(stderr,"not sent vout %d %d\n",(int32_t)fIsMine,(int32_t)filter);
|
||||||
|
|
||||||
// If we are receiving the output, add it as a "received" entry
|
// If we are receiving the output, add it as a "received" entry
|
||||||
if (fIsMine & filter)
|
if (fIsMine & filter)
|
||||||
listReceived.push_back(output);
|
listReceived.push_back(output);
|
||||||
|
//else fprintf(stderr,"not received vout %d %d\n",(int32_t)fIsMine,(int32_t)filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ extern bool fSendFreeTransactions;
|
|||||||
extern bool fPayAtLeastCustomFee;
|
extern bool fPayAtLeastCustomFee;
|
||||||
|
|
||||||
//! -paytxfee default
|
//! -paytxfee default
|
||||||
static const CAmount DEFAULT_TRANSACTION_FEE = 10000;
|
static const CAmount DEFAULT_TRANSACTION_FEE = 0;
|
||||||
//! -paytxfee will warn if called with a higher fee than this amount (in satoshis) per KB
|
//! -paytxfee will warn if called with a higher fee than this amount (in satoshis) per KB
|
||||||
static const CAmount nHighTransactionFeeWarning = 0.01 * COIN;
|
static const CAmount nHighTransactionFeeWarning = 0.01 * COIN;
|
||||||
//! -maxtxfee default
|
//! -maxtxfee default
|
||||||
|
|||||||
Reference in New Issue
Block a user