From 90f669ed38bc58de2b3619638497f33e643030bc Mon Sep 17 00:00:00 2001 From: Steven Roose Date: Wed, 1 May 2019 14:15:58 +0100 Subject: [PATCH 01/17] Change trusted subkey for Steven Roose New subkey signed with same master key: -----BEGIN PGP PUBLIC KEY BLOCK----- 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 =29Ta -----END PGP PUBLIC KEY BLOCK----- --- contrib/verify-commits/trusted-keys | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/verify-commits/trusted-keys b/contrib/verify-commits/trusted-keys index 6d430b508d..bfe9d3d766 100644 --- a/contrib/verify-commits/trusted-keys +++ b/contrib/verify-commits/trusted-keys @@ -1,2 +1,2 @@ 11D43A27826A421212108BF66BE2CED14A9917BC -85758DBCF05A48A4DE9EAA127FC91380BB4CE800 +DE10E82629A8CAD55B700B972F2A88D7F8D68E87 From cdb33e5214f8a766ca2e7679f386f8486b38083d Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Wed, 1 May 2019 10:53:48 -0400 Subject: [PATCH 02/17] createrawpegin should look for wpkh addresses, not nested --- src/wallet/rpcwallet.cpp | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 23b11c69b8..fb01e00a36 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5116,7 +5116,7 @@ static UniValue createrawpegin(const JSONRPCRequest& request, T_tx_ref& txBTCRef if (txHashes.size() != 1 || txHashes[0] != txBTC.GetHash()) throw JSONRPCError(RPC_INVALID_PARAMETER, "The txoutproof must contain bitcoinTx and only bitcoinTx"); - CScript witnessProgScript; + CScript witness_script; unsigned int nOut = txBTC.vout.size(); if (request.params.size() > 2) { const std::string claim_script = request.params[2].get_str(); @@ -5125,26 +5125,19 @@ static UniValue createrawpegin(const JSONRPCRequest& request, T_tx_ref& txBTCRef } // If given manually, no need for it to be a witness script std::vector witnessBytes(ParseHex(claim_script)); - witnessProgScript = CScript(witnessBytes.begin(), witnessBytes.end()); - nOut = GetPeginTxnOutputIndex(txBTC, witnessProgScript); + witness_script = CScript(witnessBytes.begin(), witnessBytes.end()); + nOut = GetPeginTxnOutputIndex(txBTC, witness_script); if (nOut == txBTC.vout.size()) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Given claim_script does not match the given Bitcoin transaction."); } } else { - // Look through address book for pegin contract value by extracting the unlderlying witness program from p2sh-p2wpkh + // Look for known wpkh address in wallet for (std::map::const_iterator iter = pwallet->mapAddressBook.begin(); iter != pwallet->mapAddressBook.end(); ++iter) { - CTxDestination sidechainAddress(CTxDestination(iter->first)); - CScript witnessProgramScript = GetScriptForWitness(GetScriptForDestination(sidechainAddress)); - int version; - std::vector witnessProgram; - // Only process witness v0 programs - if (!witnessProgramScript.IsWitnessProgram(version, witnessProgram) || version != 0) { - continue; - } - nOut = GetPeginTxnOutputIndex(txBTC, witnessProgramScript); + CScript dest_script = GetScriptForDestination(iter->first); + nOut = GetPeginTxnOutputIndex(txBTC, dest_script); if (nOut != txBTC.vout.size()) { - witnessProgScript = witnessProgramScript; + witness_script = dest_script; break; } } @@ -5152,12 +5145,12 @@ static UniValue createrawpegin(const JSONRPCRequest& request, T_tx_ref& txBTCRef if (nOut == txBTC.vout.size()) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Failed to find output in bitcoinTx to the mainchain_address from getpeginaddress"); } - assert(witnessProgScript != CScript()); + assert(witness_script != CScript()); int version = -1; - std::vector witnessProgram; - if (!witnessProgScript.IsWitnessProgram(version, witnessProgram)) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Given or recovered script is not a witness program."); + std::vector witness_program; + if (!witness_script.IsWitnessProgram(version, witness_program) || version != 0) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Given or recovered script is not a v0 witness program."); } CAmount value = 0; @@ -5207,7 +5200,7 @@ static UniValue createrawpegin(const JSONRPCRequest& request, T_tx_ref& txBTCRef stack.push_back(value_bytes); stack.push_back(std::vector(Params().GetConsensus().pegged_asset.begin(), Params().GetConsensus().pegged_asset.end())); stack.push_back(std::vector(genesisBlockHash.begin(), genesisBlockHash.end())); - stack.push_back(std::vector(witnessProgScript.begin(), witnessProgScript.end())); + stack.push_back(std::vector(witness_script.begin(), witness_script.end())); stack.push_back(txData); stack.push_back(txOutProofData); From a9cbe553095c4c2f3c61f7705de37450f33c03e9 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Wed, 1 May 2019 09:30:03 -0400 Subject: [PATCH 03/17] refactor getpeginaddress to not call getnewaddress RPC --- src/wallet/rpcwallet.cpp | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index fb01e00a36..942e7e191e 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4503,33 +4503,34 @@ UniValue getpeginaddress(const JSONRPCRequest& request) + HelpExampleRpc("getpeginaddress", "") ); - //Creates new address for receiving unlocked utxos - JSONRPCRequest req; - CTxDestination address = DecodeDestination(getnewaddress(req).get_str()); - - Witnessifier w(pwallet); - bool ret = boost::apply_visitor(w, address); - if (!ret) { - throw JSONRPCError(RPC_WALLET_ERROR, "Public key or redeemscript not known to wallet, or the key is uncompressed"); + if (!pwallet->IsLocked()) { + pwallet->TopUpKeyPool(); } - pwallet->SetAddressBook(w.result, "", "receive"); + // Generate a new key that is added to wallet + CPubKey newKey; + if (!pwallet->GetKeyFromPool(newKey)) { + throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first"); + } - CScript destScript = GetScriptForDestination(address); - CScript witProg = GetScriptForWitness(destScript); + // Use native witness destination + CTxDestination dest = GetDestinationForKey(newKey, OutputType::BECH32); + + pwallet->SetAddressBook(dest, "", "receive"); + + CScript dest_script = GetScriptForDestination(dest); // Also add raw scripts to index to recognize later. - pwallet->AddCScript(witProg); - pwallet->AddCScript(destScript); + pwallet->AddCScript(dest_script); - //Call contracthashtool, get deposit address on mainchain. - CTxDestination destAddr(ScriptHash(GetScriptForWitness(calculate_contract(Params().GetConsensus().fedpegScript, witProg)))); + // Get P2CH deposit address on mainchain. + CTxDestination mainchain_dest(ScriptHash(GetScriptForWitness(calculate_contract(Params().GetConsensus().fedpegScript, dest_script)))); - UniValue fundinginfo(UniValue::VOBJ); + UniValue ret(UniValue::VOBJ); - fundinginfo.pushKV("mainchain_address", EncodeParentDestination(destAddr)); - fundinginfo.pushKV("claim_script", HexStr(witProg)); - return fundinginfo; + ret.pushKV("mainchain_address", EncodeParentDestination(mainchain_dest)); + ret.pushKV("claim_script", HexStr(dest_script)); + return ret; } //! Derive BIP32 tweak from master xpub to child pubkey. From b919ca3d938de4ac51553afb64c884d39a17c353 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Wed, 1 May 2019 10:30:04 -0400 Subject: [PATCH 04/17] fedpeg test makes sure claim_script is wpkh --- test/functional/feature_fedpeg.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/functional/feature_fedpeg.py b/test/functional/feature_fedpeg.py index 0914edf65b..7bbc5316a7 100755 --- a/test/functional/feature_fedpeg.py +++ b/test/functional/feature_fedpeg.py @@ -173,6 +173,7 @@ class FedPegTest(BitcoinTestFramework): addrs = sidechain.getpeginaddress() addr = addrs["mainchain_address"] + assert_equal(sidechain.decodescript(addrs["claim_script"])["type"], "witness_v0_keyhash") txid1 = parent.sendtoaddress(addr, 24) # 10+2 confirms required to get into mempool and confirm parent.generate(1) From f7cc37cb1109be8c28dda7406192e0cf6099216e Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Wed, 1 May 2019 15:55:43 -0400 Subject: [PATCH 05/17] Rename liquid windows installer to liquid --- contrib/gitian-descriptors/gitian-liquid-win.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/gitian-descriptors/gitian-liquid-win.yml b/contrib/gitian-descriptors/gitian-liquid-win.yml index 09fc0d934e..057c8ee603 100644 --- a/contrib/gitian-descriptors/gitian-liquid-win.yml +++ b/contrib/gitian-descriptors/gitian-liquid-win.yml @@ -185,6 +185,9 @@ script: | cd $BUILD_DIR/windeploy mkdir unsigned cp $OUTDIR/elements-*setup-unsigned.exe unsigned/ + cd unsigned + rename 's/elements-/liquid-/s' *-setup-unsigned.exe + cd .. find . | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-win-unsigned.tar.gz mv ${OUTDIR}/${DISTNAME}-x86_64-*-debug.zip ${OUTDIR}/${DISTNAME}-win64-debug.zip mv ${OUTDIR}/${DISTNAME}-i686-*-debug.zip ${OUTDIR}/${DISTNAME}-win32-debug.zip From 90926a5e57f92f0ee8a5a5ae9053176b11b64a62 Mon Sep 17 00:00:00 2001 From: Jonas Schnelli Date: Thu, 18 Oct 2018 20:44:22 +0200 Subject: [PATCH 06/17] [macOS] Remove DS_Store WindowBounds bytes object --- contrib/macdeploy/custom_dsstore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/macdeploy/custom_dsstore.py b/contrib/macdeploy/custom_dsstore.py index 6fa134972a..c29f83a91e 100755 --- a/contrib/macdeploy/custom_dsstore.py +++ b/contrib/macdeploy/custom_dsstore.py @@ -13,7 +13,7 @@ package_name_ns = sys.argv[2] ds = DSStore.open(output_file, 'w+') ds['.']['bwsp'] = { 'ShowStatusBar': False, - 'WindowBounds': b'{{300, 280}, {500, 343}}', + 'WindowBounds': '{{300, 280}, {500, 343}}', 'ContainerShowSidebar': False, 'SidebarWidth': 0, 'ShowTabView': False, From c8525c93870c7510f04a8df9f765c5d083089b5c Mon Sep 17 00:00:00 2001 From: Steven Roose Date: Thu, 2 May 2019 16:52:22 +0100 Subject: [PATCH 07/17] Fix bug in converttopsbt --- src/rpc/rawtransaction.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index a69db61faa..3b2cbb9a7e 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -1765,13 +1765,13 @@ UniValue converttopsbt(const JSONRPCRequest& request) // Remove all scriptSigs and scriptWitnesses from inputs for (CTxIn& input : tx.vin) { - if ((!input.scriptSig.empty()) && (request.params[1].isNull() || (!request.params[1].isNull() && request.params[1].get_bool()))) { + if (!input.scriptSig.empty() && !permitsigdata) { throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Inputs must not have scriptSigs"); } input.scriptSig.clear(); } for (CTxInWitness& witness: tx.witness.vtxinwit) { - if ((!witness.scriptWitness.IsNull()) && (request.params[1].isNull() || (!request.params[1].isNull() && request.params[1].get_bool()))) { + if (!witness.scriptWitness.IsNull() && !permitsigdata) { throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Inputs must not have scriptWitnesses"); } } From 794c305cdda1fe1d2ae0454e6809170eb63386ea Mon Sep 17 00:00:00 2001 From: Steven Roose Date: Fri, 3 May 2019 14:42:53 +0100 Subject: [PATCH 08/17] Test that default `permitsigdata` is false --- test/functional/rpc_psbt.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py index ec52bfdcc0..9bdaa5311d 100755 --- a/test/functional/rpc_psbt.py +++ b/test/functional/rpc_psbt.py @@ -106,6 +106,7 @@ class PSBTTest(BitcoinTestFramework): # Make sure that a psbt with signatures cannot be converted signedtx = self.nodes[0].signrawtransactionwithwallet(rawtx['hex']) + assert_raises_rpc_error(-22, "Inputs must not have scriptWitnesses", self.nodes[0].converttopsbt, signedtx['hex'], False) assert_raises_rpc_error(-22, "Inputs must not have scriptWitnesses", self.nodes[0].converttopsbt, signedtx['hex']) # Explicitly allow converting non-empty txs From 9d4097dca2e714347d8331b9a07653d210b1ed51 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Mon, 6 May 2019 09:38:58 -0400 Subject: [PATCH 09/17] Only schedule mainchain RPC checks after initial check succeeds --- src/init.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index fd0d02af64..24d323521f 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1866,11 +1866,6 @@ bool AppInitMain() SetRPCWarmupFinished(); // ELEMENTS: - CScheduler::Function f2 = boost::bind(&MainchainRPCCheck, false); - unsigned int check_rpc_every = gArgs.GetArg("-recheckpeginblockinterval", 120); - if (check_rpc_every) { - scheduler.scheduleEvery(f2, check_rpc_every); - } uiInterface.InitMessage(_("Awaiting mainchain RPC warmup")); if (!MainchainRPCCheck(true)) { //Initial check, fail immediately return InitError(_("ERROR: elementsd is set to verify pegins but cannot get valid response from the mainchain daemon. Please check debug.log for more information.") @@ -1878,6 +1873,12 @@ bool AppInitMain() + strprintf(_("If you haven't setup a %s please get the latest stable version from %s or if you do not need to validate pegins set in your elements configuration %s"), "bitcoind", "https://bitcoincore.org/en/download/", "validatepegin=0")); } + CScheduler::Function f2 = boost::bind(&MainchainRPCCheck, false); + unsigned int check_rpc_every = gArgs.GetArg("-recheckpeginblockinterval", 120); + if (check_rpc_every) { + scheduler.scheduleEvery(f2, check_rpc_every); + } + uiInterface.InitMessage(_("Done loading")); g_wallet_init_interface.Start(scheduler); From ad43f9c60f31734654b9e5b19b725e0875840fa0 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Mon, 6 May 2019 09:39:29 -0400 Subject: [PATCH 10/17] Only spin-wait MainchainRPCCheck on initial loading with warmup code --- src/validation.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/validation.cpp b/src/validation.cpp index 2609ad31e9..0c611e3684 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -5161,7 +5161,8 @@ bool MainchainRPCCheck(const bool init) if (!error.isNull()) { // On the first call, it's possible to node is still in // warmup; in that case, just wait and retry. - if (error["code"].get_int() == RPC_IN_WARMUP) { + // If this is not the initial call, just report failure. + if (init && error["code"].get_int() == RPC_IN_WARMUP) { MilliSleep(1000); continue; } From 50c557083dc93b8dc72fc18c0eef97fb6f4c86e9 Mon Sep 17 00:00:00 2001 From: Steven Roose Date: Tue, 7 May 2019 20:13:42 +0100 Subject: [PATCH 11/17] Report IsValidPeginWitness error message --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 942e7e191e..b442265440 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5209,7 +5209,7 @@ static UniValue createrawpegin(const JSONRPCRequest& request, T_tx_ref& txBTCRef // We re-check depth before returning with more descriptive result std::string err; if (!IsValidPeginWitness(pegin_witness, mtx.vin[0].prevout, err, false)) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Constructed peg-in witness is invalid."); + throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Constructed peg-in witness is invalid: %s", err)); } // Put input witness in transaction From af2264665e1ec519ce3dabaa0792d186eafc67fb Mon Sep 17 00:00:00 2001 From: Steven Roose Date: Tue, 7 May 2019 20:14:12 +0100 Subject: [PATCH 12/17] Prevent pegin double spends from entering the mempool This bug got introduced with the 0.17 rebase. In 0.14.1 the double pegin claim check was done in the beginning of the validation logic, where the coins view was the actual UTXO set. In 0.17, Core moved several checks because the intermediate method CheckInputs was removed and some logic moved to tx_verify.cpp, where we also put the pegin check. In the mempool acceptance check, however (as opposed to the ConnectBlock check), CheckTxInputs is called with only a partial UTXO view for optimization reasons. This commit adds an extra pegin check in the beginning of the mempool code where we have a full UTXO view. --- src/validation.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 2609ad31e9..c18eb77ebc 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -681,10 +681,27 @@ static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool } // do all inputs exist? - for (const CTxIn& txin : tx.vin) { + for (unsigned int i = 0; i < tx.vin.size(); i++) { + const CTxIn& txin = tx.vin[i]; + // ELEMENTS: - // Don't look for coins that only exist in parent chain + // For pegin inputs check whether the pegins have already been claimed before. + // This only checks the UTXO set for already claimed pegins. For mempool conflicts, + // we rely on the GetConflictTx check done above. if (txin.m_is_pegin) { + // Quick sanity check on witness first. + if (tx.witness.vtxinwit.size() <= i || + tx.witness.vtxinwit[i].m_pegin_witness.stack.size() < 6 || + uint256(tx.witness.vtxinwit[i].m_pegin_witness.stack[2]).IsNull() || + tx.vin[i].prevout.hash.IsNull()) { + return state.Invalid(false, REJECT_INVALID, "pegin-no-witness"); + } + + std::pair pegin = std::make_pair(uint256(tx.witness.vtxinwit[i].m_pegin_witness.stack[2]), tx.vin[i].prevout); + // This assumes non-null prevout and genesis block hash + if (view.IsPeginSpent(pegin)) { + return state.Invalid(false, REJECT_INVALID, "pegin-already-claimed"); + } continue; } From 48a82fa9939cf76eb97ff0e9bf9a46dea781541b Mon Sep 17 00:00:00 2001 From: Steven Roose Date: Wed, 8 May 2019 12:12:14 +0100 Subject: [PATCH 13/17] Make claimpegin fail in the case of a double claim Currently it will commit to the transaction without it being able to enter the mempool. This makes the block creation code include the tx into the block and create an invalid block. --- src/wallet/rpcwallet.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index b442265440..360651ebbb 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5317,6 +5317,15 @@ UniValue claimpegin(const JSONRPCRequest& request) throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); } + // To check if it's not double spending an existing pegin UTXO, we check mempool acceptance. + CValidationState acceptState; + bool accepted = ::AcceptToMemoryPool(mempool, acceptState, MakeTransactionRef(mtx), nullptr /* pfMissingInputs */, + nullptr /* plTxnReplaced */, false /* bypass_limits */, maxTxFee, true /* test_accept */); + if (!accepted) { + std::string strError = strprintf("Error: The transaction was rejected! Reason given: %s", FormatStateMessage(acceptState)); + throw JSONRPCError(RPC_WALLET_ERROR, strError); + } + // Send it CValidationState state; mapValue_t mapValue; From 52ef28305faa16472cf026f431e4965033559eec Mon Sep 17 00:00:00 2001 From: Steven Roose Date: Wed, 8 May 2019 14:48:23 +0100 Subject: [PATCH 14/17] Improve the fedpeg test with extra double claim tests - changes the expected behavior of claimpegin to fail on double spend - adds extra test to make sure a block with a double spend is also not accepted: 1. a tx with two identical pegin inputs (mempool & block) 2. a tx claiming a pegin that another mempool tx also claims 3. a tx claiming a pegin that a confirmed tx already claimed (mempool & block) --- test/functional/feature_fedpeg.py | 54 +++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/test/functional/feature_fedpeg.py b/test/functional/feature_fedpeg.py index 7bbc5316a7..134986c951 100755 --- a/test/functional/feature_fedpeg.py +++ b/test/functional/feature_fedpeg.py @@ -12,12 +12,18 @@ from test_framework.util import ( p2p_port, assert_raises_rpc_error, assert_equal, + bytes_to_hex_str, ) +from test_framework import util from test_framework.messages import ( + CBlock, CTransaction, CTxInWitness, FromHex, ) +from test_framework.blocktools import ( + add_witness_commitment, +) from decimal import Decimal def get_new_unconfidential_address(node, addr_type="p2sh-segwit"): @@ -167,6 +173,7 @@ class FedPegTest(BitcoinTestFramework): #parent2 = self.nodes[1] sidechain = self.nodes[2] sidechain2 = self.nodes[3] + util.node_fastmerkle = sidechain parent.generate(101) sidechain.generate(101) @@ -214,6 +221,22 @@ class FedPegTest(BitcoinTestFramework): # 12 confirms allows in mempool parent.generate(1) + + # Make sure that a tx with a duplicate pegin claim input gets rejected. + raw_pegin = sidechain.createrawpegin(raw, proof)["hex"] + raw_pegin = FromHex(CTransaction(), raw_pegin) + raw_pegin.vin.append(raw_pegin.vin[0]) # duplicate the pegin input + raw_pegin = sidechain.signrawtransactionwithwallet(raw_pegin.serialize().hex())["hex"] + assert_raises_rpc_error(-26, "bad-txns-inputs-duplicate", sidechain.sendrawtransaction, raw_pegin) + # Also try including this tx in a block manually and submitting it. + doublespendblock = FromHex(CBlock(), sidechain.getnewblockhex()) + doublespendblock.vtx.append(FromHex(CTransaction(), raw_pegin)) + doublespendblock.hashMerkleRoot = doublespendblock.calc_merkle_root() + add_witness_commitment(doublespendblock) + doublespendblock.solve() + block_hex = bytes_to_hex_str(doublespendblock.serialize(True)) + assert_raises_rpc_error(-25, "bad-txns-inputs-duplicate", sidechain.testproposedblock, block_hex, True) + # Should succeed via wallet lookup for address match, and when given raw_pegin = sidechain.createrawpegin(raw, proof)['hex'] signed_pegin = sidechain.signrawtransactionwithwallet(raw_pegin) @@ -225,6 +248,9 @@ class FedPegTest(BitcoinTestFramework): sample_pegin_witness = sample_pegin_struct.wit.vtxinwit[0].peginWitness pegtxid1 = sidechain.claimpegin(raw, proof) + # Make sure a second pegin claim does not get accepted in the mempool when + # another mempool tx already claims that pegin. + assert_raises_rpc_error(-4, "txn-mempool-conflict", sidechain.claimpegin, raw, proof) # Will invalidate the block that confirms this transaction later self.sync_all(self.node_groups) @@ -254,6 +280,21 @@ class FedPegTest(BitcoinTestFramework): sidechain.invalidateblock(blockhash[0]) if sidechain.gettransaction(pegtxid1)["confirmations"] != 0: raise Exception("Peg-in didn't unconfirm after invalidateblock call.") + + # Create duplicate claim, put it in block along with current one in mempool + # to test duplicate-in-block claims between two txs that are in the same block. + raw_pegin = sidechain.createrawpegin(raw, proof)["hex"] + raw_pegin = sidechain.signrawtransactionwithwallet(raw_pegin)["hex"] + raw_pegin = FromHex(CTransaction(), raw_pegin) + doublespendblock = FromHex(CBlock(), sidechain.getnewblockhex()) + assert(len(doublespendblock.vtx) == 2) # coinbase and pegin + doublespendblock.vtx.append(raw_pegin) + doublespendblock.hashMerkleRoot = doublespendblock.calc_merkle_root() + add_witness_commitment(doublespendblock) + doublespendblock.solve() + block_hex = bytes_to_hex_str(doublespendblock.serialize(True)) + assert_raises_rpc_error(-25, "bad-txns-double-pegin", sidechain.testproposedblock, block_hex, True) + # Re-enters block sidechain.generate(1) if sidechain.gettransaction(pegtxid1)["confirmations"] != 1: @@ -262,6 +303,19 @@ class FedPegTest(BitcoinTestFramework): if sidechain.gettransaction(pegtxid1)["confirmations"] != 6: raise Exception("Peg-in should be back to 6 confirms.") + # Now the pegin is already claimed in a confirmed tx. + # In that case, a duplicate claim should (1) not be accepted in the mempool + # and (2) not be accepted in a block. + assert_raises_rpc_error(-4, "pegin-already-claimed", sidechain.claimpegin, raw, proof) + # For case (2), manually craft a block and include the tx. + doublespendblock = FromHex(CBlock(), sidechain.getnewblockhex()) + doublespendblock.vtx.append(raw_pegin) + doublespendblock.hashMerkleRoot = doublespendblock.calc_merkle_root() + add_witness_commitment(doublespendblock) + doublespendblock.solve() + block_hex = bytes_to_hex_str(doublespendblock.serialize(True)) + assert_raises_rpc_error(-25, "bad-txns-double-pegin", sidechain.testproposedblock, block_hex, True) + # Do multiple claims in mempool n_claims = 6 From 2aac2290ad495ba91dd40a568788d97a35afe104 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Thu, 9 May 2019 10:07:53 -0400 Subject: [PATCH 15/17] Bump elements version --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 2baa241238..e0eec72cef 100644 --- a/configure.ac +++ b/configure.ac @@ -3,9 +3,9 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 0) define(_CLIENT_VERSION_MINOR, 17) define(_CLIENT_VERSION_REVISION, 0) -define(_CLIENT_VERSION_BUILD, 0) +define(_CLIENT_VERSION_BUILD, 1) define(_CLIENT_VERSION_IS_RELEASE, true) -define(_COPYRIGHT_YEAR, 2018) +define(_COPYRIGHT_YEAR, 2019) define(_COPYRIGHT_HOLDERS,[The %s developers]) define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Elements Project]]) AC_INIT([Elements Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/ElementsProject/elements/issues],[elements],[https://elementsproject.org/]) From 868270a301ef6a9e7a7ba54d17adf398e79f2d55 Mon Sep 17 00:00:00 2001 From: Mike Schmidt Date: Thu, 9 May 2019 12:53:30 -0500 Subject: [PATCH 16/17] changed example text to include updated pubkey/sig fields --- src/rpc/mining.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 2023520ead..85ace5b906 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -1037,7 +1037,7 @@ UniValue combineblocksigs(const JSONRPCRequest& request) " \"complete\": true|false (numeric) If block is complete \n" "}\n" "\nExamples:\n" - + HelpExampleCli("combineblocksigs", " [\"signature1\", \"signature2\", ...]") + + HelpExampleCli("combineblocksigs", " '[{\"pubkey\":\"hex\",\"sig\":\"hex\"}, ...]'") ); if (!g_signed_blocks) { From 2939b5d41e360ae3d1160344f9b6e2c1cbc52b3f Mon Sep 17 00:00:00 2001 From: Steven Roose Date: Fri, 3 May 2019 16:56:54 +0100 Subject: [PATCH 17/17] Make fedpeg test compatible with bitcoind v0.18.0 parent --- test/functional/feature_fedpeg.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/functional/feature_fedpeg.py b/test/functional/feature_fedpeg.py index 134986c951..ba4ba4bb50 100755 --- a/test/functional/feature_fedpeg.py +++ b/test/functional/feature_fedpeg.py @@ -187,7 +187,7 @@ class FedPegTest(BitcoinTestFramework): time.sleep(2) proof = parent.gettxoutproof([txid1]) - raw = parent.getrawtransaction(txid1) + raw = parent.gettransaction(txid1)["hex"] print("Attempting peg-ins") # First attempt fails the consensus check but gives useful result @@ -330,7 +330,7 @@ class FedPegTest(BitcoinTestFramework): txid = parent.sendtoaddress(addrs["mainchain_address"], 1) parent.generate(1) proof = parent.gettxoutproof([txid]) - raw = parent.getrawtransaction(txid) + raw = parent.gettransaction(txid)["hex"] if i % 2 == 0: parent.generate(11) pegtxs += [sidechain.claimpegin(raw, proof)] @@ -411,7 +411,7 @@ class FedPegTest(BitcoinTestFramework): txid = parent.sendtoaddress(addr, 1) parent.generate(12) proof = parent.gettxoutproof([txid]) - raw = parent.getrawtransaction(txid) + raw = parent.gettransaction(txid)["hex"] sidechain.claimpegin(raw, proof) # stuck peg sidechain.generate(1) print("Waiting to ensure block is being rejected by sidechain2")