Modified client testing for cold-staking v4.5.0
Date: 2018-12-03, 2018-12-04, 2018-12-05
1. Modified spending wallet to stake inputs
Aim:
To test whether a modified wallet holding a spending key (but not staking key) can stake cold-staking inputs.
Wallet setup:
The subject wallet holds:
The spending private key to a cold-staking address.
Coins are held in the cold-staking address only. There are no other coins in any other addresses held by the wallet.
Modifications:
changed CreateCoinStake() in wallet.cpp (line 384) GetKey() from staking address to spending address, i.e. from
if (!keystore.GetKey(uint160(vSolutions[0]), key))
toif (!keystore.GetKey(uint160(vSolutions[1]), key))
changed IsMine() in ismine.cpp (line 76 to 81) all conditional branches to return
ISMINE_SPENDABLE_STAKABLE
when case isTX_COLDSTAKING
changed SignStep() in sign.cpp (line 106) CKeyID() from staking address to spending address, i.e. from
keyID = CKeyID(uint160(fCoinStake ? vSolutions[0] : vSolutions[1]));
tokeyID = CKeyID(uint160(fCoinStake ? vSolutions[1] : vSolutions[1]));
This will still return false from ProduceSignature() and cause the staking to fail because it will fail the checks in VerifyScript(), namely OP_EQUALSVERIFY, so - changed EvalScript() in interpreter.cpp (line 732) when entering conditional statement
if (opcode == OP_EQUALVERIFY)
, alwayspopstack(stack);
instead ofreturn set_error(serror, SCRIPT_ERR_EQUALVERIFY);
At the time of writing, the changes can be viewed here:
https://github.com/matt-auckland/navcoin-core/compare/cold-staking…marcus290:modified-spending-wallet
Result:
The modified spending wallet will stake the cold-staking address inputs and broadcast blocks found to other nodes.
But other nodes will reject these blocks and ban the peer (i.e. our wallet) from the network.
The modified spending wallet will continue to stake and create its own blockchain.
Log record:
2018-12-05 02:07:28 CheckStake() : new proof-of-stake block found hash: 9ec735c1ea6c020fe5b55de17898b4fbd67091eefd27f5afde8797e7612ecb06
2018-12-05 02:07:28 UpdateTip: new best=9ec735c1ea6c020fe5b55de17898b4fbd67091eefd27f5afde8797e7612ecb06 height=69274 version=0x710171f1 log2_work=85.821494 tx=134912 date='2018-12-05 02:07:28' progress=1.000000 cache=0.0MiB(29tx)
2018-12-05 02:07:28 AddToWallet 597c8f7bdb79c7d906b0fd15bda4f8039fdc2e01d07e9381f1d83359650bc548 new
2018-12-05 02:07:29 connect() to [2403:4d00:301:10:d99a:d453:b9cf:6196]:15556 failed: Network is unreachable (101)
2018-12-05 02:07:29 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
2018-12-05 02:07:31 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
2018-12-05 02:07:32 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-05 02:07:33 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
2018-12-05 02:07:37 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-05 02:07:40 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
2018-12-05 02:07:50 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-05 02:07:52 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
2018-12-05 02:07:53 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-05 02:07:54 connect() to [2403:4d00:301:10:d99a:d453:b9cf:6196]:15556 failed: Network is unreachable (101)
2018-12-05 02:07:55 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-05 02:07:57 connect() to [2403:4d00:301:10:d99a:d453:b9cf:6196]:15556 failed: Network is unreachable (101)
2018-12-05 02:08:01 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-05 02:08:02 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-05 02:08:04 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-05 02:08:05 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
2018-12-05 02:08:05 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
2018-12-05 02:08:06 connect() to [2403:4d00:301:10:d99a:d453:b9cf:6196]:15556 failed: Network is unreachable (101)
2018-12-05 02:08:07 connect() to [2403:4d00:301:10:d99a:d453:b9cf:6196]:15556 failed: Network is unreachable (101)
2018-12-05 02:08:09 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-05 02:08:09 connect() to [2403:4d00:301:10:d99a:d453:b9cf:6196]:15556 failed: Network is unreachable (101)
2018-12-05 02:08:11 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
2018-12-05 02:08:12 socket recv error Connection reset by peer (104)
2018-12-05 02:08:14 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
2018-12-05 02:08:14 connect() to [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556 failed: Network is unreachable (101)
Conclusion:
Based on the modifications above, blocks staked by the modified wallet will be rejected by the network.
2. Modified staking wallet to send staking outputs to another address
Aim:
To test whether a modified wallet holding a staking key (but not spending key) can send staking outputs to another address.
Wallet setup:
The subject wallet holds:
The staking private key to a cold-staking address.
The private key to another address, not related to the cold-staking address (“Address X”).
Coins are held in the cold-staking address only. There are no other coins in any other addresses held by the wallet.
Modifications:
changed CreateCoinStake() in wallet.cpp (line 390) scripting for cold-staking from
scriptPubKeyOut = scriptPubKeyKernel;
toscriptPubKeyOut = CScript(ToByteVector([newkey].GetPubKey())); scriptPubKeyOut << OP_CHECKSIG;
where[newkey]
is the key to Address X.changed CheckProofOfStake() in main.cpp (lines 8655-8659) removing all checks for when IsColdStaking() is true.
At the time of writing, the changes can be viewed here:
https://github.com/matt-auckland/navcoin-core/compare/cold-staking…marcus290:modified-staking-wallet-stake
Result:
The modified staking wallet will continue to stake.
At the first successful stake by the wallet, the staking output (i.e. staking reward + cold-staking balance) will be sent to Address X, and the stake will be broadcast to other nodes.
But other nodes will reject these stakes.
The modified staking wallet will re-sync with the network and all its stakes will be orphaned.
Log record:
2018-12-04 03:44:00 CheckStake() : new proof-of-stake block found hash: ba0484285df2c38def7581a989ebb00ef784bc7652526d9a92bc39fc8c91d764
2018-12-04 03:44:00 UpdateTip: new best=ba0484285df2c38def7581a989ebb00ef784bc7652526d9a92bc39fc8c91d764 height=66629 version=0x7101f1f1 log2_work=85.821494 tx=129619 date='2018-12-04 03:44:00' progress=1.000000 cache=0.0MiB(136tx)
2018-12-04 03:44:00 AddToWallet 88de5054da44fc8ad4f3e9f3cd1d9aa5b84c018df52d6f788869e89fd9892b66 new
2018-12-04 03:44:49 UpdateTip: new best=d647c2fbb9f0be80ba064a7c68a30f7a3ada9d68e95c57ed2506e0def4a5d7fb height=66628 version=0x710171f1 log2_work=85.821494 tx=129617 date='2018-12-04 03:43:44' progress=0.999959 cache=0.0MiB(136tx)
2018-12-04 03:44:49 SyncTransaction : Refunding inputs of orphan tx 88de5054da44fc8ad4f3e9f3cd1d9aa5b84c018df52d6f788869e89fd9892b66
2018-12-04 03:44:49 AddToWallet 88de5054da44fc8ad4f3e9f3cd1d9aa5b84c018df52d6f788869e89fd9892b66
2018-12-04 03:44:49 SyncTransaction : Removing tx 88de5054da44fc8ad4f3e9f3cd1d9aa5b84c018df52d6f788869e89fd9892b66 from mapTxSpends
2018-12-04 03:44:49 UpdateTip: new best=2c6fbcf8d9fe08e7b34d8aeffd552c321d3d807e135fdea5d3470e93578ed8c8 height=66627 version=0x710171f1 log2_work=85.821494 tx=129615 date='2018-12-04 03:43:12' progress=0.999939 cache=0.0MiB(135tx)
2018-12-04 03:44:49 UpdateTip: new best=7fb237026243f2736cdd40435130d576a6b3104406c9be0e79a648bc7c20c018 height=66628 version=0x710171f1 log2_work=85.821494 tx=129617 date='2018-12-04 03:43:44' progress=0.999959 cache=0.0MiB(137tx)
2018-12-04 03:44:50 UpdateTip: new best=310d44343a977ae806b57130d91ab884c54b4af720578abc4c75770f29c87473 height=66629 version=0x710171f1 log2_work=85.821494 tx=129619 date='2018-12-04 03:44:00' progress=0.999969 cache=0.0MiB(139tx)
2018-12-04 03:44:50 UpdateTip: new best=dab8fa0bf6b0f8e2a1e9d01f75912413af99788bdd43f7f32088c7410ff3951c height=66630 version=0x710171f1 log2_work=85.821494 tx=129621 date='2018-12-04 03:44:48' progress=0.999999 cache=0.0MiB(142tx)
2018-12-04 03:45:04 CheckStake() : new proof-of-stake block found hash: 0b26c39e07b56ab8cea0e74a6d2cdbda1f15bc6a98054b93187e3ec1bef1feed
2018-12-04 03:45:04 UpdateTip: new best=0b26c39e07b56ab8cea0e74a6d2cdbda1f15bc6a98054b93187e3ec1bef1feed height=66631 version=0x7101f1f1 log2_work=85.821494 tx=129623 date='2018-12-04 03:45:04' progress=1.000000 cache=0.0MiB(143tx)
2018-12-04 03:45:04 AddToWallet 11cc895db90b260933718e05e3d2ef4783a70208f24f5a326abf03803ce36b33 new
2018-12-04 03:45:36 CheckStake() : new proof-of-stake block found hash: ca29e549b6afecd87b39847ace6e9b73cc8ceed7049e6b5e013f41a18f94bb6a
2018-12-04 03:45:36 UpdateTip: new best=ca29e549b6afecd87b39847ace6e9b73cc8ceed7049e6b5e013f41a18f94bb6a height=66632 version=0x7101f1f1 log2_work=85.821494 tx=129625 date='2018-12-04 03:45:36' progress=1.000000 cache=0.0MiB(145tx)
2018-12-04 03:45:36 AddToWallet 0c9503ec50c3cdf297ee7818cd6e9d20d1187e3289725573b3decef0319791f9 new
2018-12-04 03:45:53 UpdateTip: new best=0b26c39e07b56ab8cea0e74a6d2cdbda1f15bc6a98054b93187e3ec1bef1feed height=66631 version=0x7101f1f1 log2_work=85.821494 tx=129623 date='2018-12-04 03:45:04' progress=0.999969 cache=0.0MiB(144tx)
2018-12-04 03:45:53 SyncTransaction : Refunding inputs of orphan tx 0c9503ec50c3cdf297ee7818cd6e9d20d1187e3289725573b3decef0319791f9
2018-12-04 03:45:53 AddToWallet 0c9503ec50c3cdf297ee7818cd6e9d20d1187e3289725573b3decef0319791f9
2018-12-04 03:45:53 SyncTransaction : Removing tx 0c9503ec50c3cdf297ee7818cd6e9d20d1187e3289725573b3decef0319791f9 from mapTxSpends
2018-12-04 03:45:53 UpdateTip: new best=dab8fa0bf6b0f8e2a1e9d01f75912413af99788bdd43f7f32088c7410ff3951c height=66630 version=0x710171f1 log2_work=85.821494 tx=129621 date='2018-12-04 03:44:48' progress=0.999959 cache=0.0MiB(144tx)
2018-12-04 03:45:53 SyncTransaction : Refunding inputs of orphan tx 11cc895db90b260933718e05e3d2ef4783a70208f24f5a326abf03803ce36b33
2018-12-04 03:45:53 AddToWallet 11cc895db90b260933718e05e3d2ef4783a70208f24f5a326abf03803ce36b33
2018-12-04 03:45:53 SyncTransaction : Removing tx 11cc895db90b260933718e05e3d2ef4783a70208f24f5a326abf03803ce36b33 from mapTxSpends
2018-12-04 03:45:53 UpdateTip: new best=0faf8ff5b51df87d382de126b17b1871d03d7b52e43dc26363f6d35654faab95 height=66631 version=0x710171f1 log2_work=85.821494 tx=129623 date='2018-12-04 03:45:04' progress=0.999969 cache=0.0MiB(146tx)
2018-12-04 03:45:54 UpdateTip: new best=f62850ba69ea4b5d9ca2111a71190bdaf9c673d0a1af2c8ae03cc1a8af5a298c height=66632 version=0x710171f1 log2_work=85.821494 tx=129625 date='2018-12-04 03:45:36' progress=0.999989 cache=0.0MiB(148tx)
Conclusion:
Based on the modifications above, blocks staked by the modified wallet will be rejected by the network.
3. Modified staking wallet to spend inputs
Aim:
To test whether a modified wallet with a staking key can spend cold-staking inputs.
Wallet setup:
The subject wallet holds:
The staking private key to a cold-staking address.
Coins are held in the cold-staking address only. There are no other coins in any other addresses held by the wallet.
Modifications:
changed SelectCoinsMinConf() and SelectCoins() in wallet.cpp (lines 2518-2519, 2612-2613) removed
if (!output.fSpendable) continue;
changed IsMine() in ismine.cpp (lines 63, 76-81) all conditional branches to return
ISMINE_SPENDABLE_STAKABLE
when case isTX_COLDSTAKING
andTX_PUBKEY
changed SignStep() in sign.cpp (line 106) CKeyID() from spending address to staking address, i.e. from
keyID = CKeyID(uint160(fCoinStake ? vSolutions[0] : vSolutions[1]));
tokeyID = CKeyID(uint160(fCoinStake ? vSolutions[0] : vSolutions[0]));
This will still return false from ProduceSignature() and cause the staking to fail because it will fail the checks in VerifyScript(), namely OP_EQUALSVERIFY, so
changed EvalScript() in interpreter.cpp (line 732) when entering conditional statement
if (opcode == OP_EQUALVERIFY)
, alwayspopstack(stack);
instead ofreturn set_error(serror, SCRIPT_ERR_EQUALVERIFY);
At the time of writing, the changes can be viewed here:
https://github.com/matt-auckland/navcoin-core/compare/cold-staking…marcus290:modified-staking-wallet-spend
Result:
The modified staking wallet can spend the cold-staking address inputs and broadcast these transactions to other nodes.
But other nodes will reject these transactions and ban the peer (i.e. our wallet) from the network.
The modified staking wallet will continue to stake and create its own blockchain.
Log record:
2018-12-04 04:13:40 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-04 04:13:52 UpdateTip: new best=0012bb917db9e27c7705e31bb428f4f9f4620814d3ca2f5f7b0ec217ee4aee9e height=66689 version=0x710171f1 log2_work=85.821494 tx=129739 date='2018-12-04 04:13:52' progress=1.000000 cache=0.0MiB(19tx)
2018-12-04 04:14:01 keypool reserve 4
2018-12-04 04:14:01 CommitTransaction:
CTransaction(hash=0e86a8f71b8a3b580935cb790c1fce039d9243b867f29564a76ee316f3c8f593, nTime=1543896841, ver=3, vin.size=1, vout.size=2, nLockTime=66689), strDZeel=fQgWJaM0usxdF8p1zediWS6yiqCYiT)
CTxIn(COutPoint(b71b2409fb, 1), scriptSig=47304402202a9db7180af8a9, nSequence=4294967294)
CTxOut(nValue=48011.64988460, scriptPubKey=OP_DUP OP_HASH160 de88eb286c4e9cab6e772f488b52ddc596ba55d7 OP_EQUALVERIFY OP_CHECKSIG)
CTxOut(nValue=100000.00000000, scriptPubKey=OP_DUP OP_HASH160 9194ae60493f6492a4662133eb3b05894830c3f7 OP_EQUALVERIFY OP_CHECKSIG)
2018-12-04 04:14:01 keypool keep 4
2018-12-04 04:14:01 AddToWallet 0e86a8f71b8a3b580935cb790c1fce039d9243b867f29564a76ee316f3c8f593 new
2018-12-04 04:14:02 AddToWallet 0e86a8f71b8a3b580935cb790c1fce039d9243b867f29564a76ee316f3c8f593
2018-12-04 04:14:02 Relaying wtx 0e86a8f71b8a3b580935cb790c1fce039d9243b867f29564a76ee316f3c8f593
2018-12-04 04:14:04 socket recv error Connection reset by peer (104)
2018-12-04 04:14:09 UpdateTip: new best=6157ee14743db35d1de569c1a39cc4e1b1137f3b87c9fb75dc74fa7d72133c06 height=66690 version=0x710171f1 log2_work=85.821494 tx=129741 date='2018-12-04 04:14:08' progress=0.999999 cache=0.0MiB(22tx)
2018-12-04 04:18:25 receive version message: /NavCoin:4.4.0/: version 70020, blocks=66690, us=[2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556, peer=5
2018-12-04 04:18:25 AdvertiseLocal: advertising address [2403:4d00:301:10:7ee3:755a:be36:a5c0]:15556
2018-12-04 04:18:26 CheckStake() : new proof-of-stake block found hash: 7679f66ced702c32db7f20227f56fae863a4d093758458daf3643a84976962ee
2018-12-04 04:18:26 UpdateTip: new best=7679f66ced702c32db7f20227f56fae863a4d093758458daf3643a84976962ee height=66691 version=0x7101f1f1 log2_work=85.821494 tx=129744 date='2018-12-04 04:18:24' progress=0.999999 cache=0.0MiB(25tx)
2018-12-04 04:18:26 AddToWallet 641c0f39d60eb92661b65b413db56122d32562576c7ad77a1a04745eab52ac78 new
2018-12-04 04:18:26 AddToWallet 0e86a8f71b8a3b580935cb790c1fce039d9243b867f29564a76ee316f3c8f593 update
2018-12-04 04:23:22 socket recv error Connection reset by peer (104)
2018-12-04 04:23:40 connect() to 103.247.155.206:15556 failed after select(): Connection refused (111)
2018-12-04 04:24:04 socket recv error Connection reset by peer (104)
Conclusion:
Based on the modifications above, coins spent by the modified wallet will be rejected by the network.