diff --git a/src/block_proof.cpp b/src/block_proof.cpp index 8465a781e1..2a73c862a0 100644 --- a/src/block_proof.cpp +++ b/src/block_proof.cpp @@ -56,6 +56,11 @@ bool CheckProof(const CBlockHeader& block, const Consensus::Params& params) } } +bool CheckProofSignedParent(const CBlockHeader& block, const Consensus::Params& params) +{ + return CheckProofGeneric(block, params, params.parent_chain_signblockscript); +} + void ResetProof(CBlockHeader& block) { block.proof.solution.clear(); diff --git a/src/block_proof.h b/src/block_proof.h index f0dcd6a8e8..256d57d5f8 100644 --- a/src/block_proof.h +++ b/src/block_proof.h @@ -19,6 +19,7 @@ class CScript; /** Check on header proof, depending on chain type, PoW or signed **/ bool CheckProof(const CBlockHeader& block, const Consensus::Params&); +bool CheckProofSignedParent(const CBlockHeader& block, const Consensus::Params&); void ResetProof(CBlockHeader& block); bool CheckChallenge(const CBlockHeader& block, const CBlockIndex& indexLast, const Consensus::Params&); void ResetChallenge(CBlockHeader& block, const CBlockIndex& indexLast, const Consensus::Params&); diff --git a/src/chainparams.cpp b/src/chainparams.cpp index e1855ddd11..e8da22fe69 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -547,6 +547,7 @@ class CCustomParams : public CRegTestParams { const bool parent_genesis_is_null = parentGenesisBlockHash == uint256(); assert(consensus.has_parent_chain != parent_genesis_is_null); consensus.parentChainPowLimit = uint256S(args.GetArg("-con_parentpowlimit", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); + consensus.parent_chain_signblockscript = StrHexToScriptWithDefault(args.GetArg("-con_parent_chain_signblockscript", ""), CScript()); consensus.pegin_min_depth = args.GetArg("-peginconfirmationdepth", DEFAULT_PEGIN_CONFIRMATION_DEPTH); const CScript default_script(CScript() << OP_TRUE); diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index d9338b3ff0..20397e53f0 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -35,6 +35,7 @@ void SetupChainParamsBaseOptions() gArgs.AddArg("-con_has_parent_chain", "Whether or not there is a parent chain.", false, OptionsCategory::CHAINPARAMS); gArgs.AddArg("-parentgenesisblockhash", "The genesis blockhash of the parent chain.", false, OptionsCategory::CHAINPARAMS); gArgs.AddArg("-con_parentpowlimit", "The proof-of-work limit value for the parent chain.", false, OptionsCategory::CHAINPARAMS); + gArgs.AddArg("-con_parent_chain_signblockscript", "Whether parent chain uses pow or signed blocks. If the parent chain uses signed blocks, the challenge (scriptPubKey) script. If not, an empty string. (default: empty script [ie parent uses pow])", false, OptionsCategory::CHAINPARAMS); gArgs.AddArg("-fedpegscript", "The script for the federated peg.", false, OptionsCategory::CHAINPARAMS); } diff --git a/src/consensus/params.h b/src/consensus/params.h index 400bb1bb70..e762402c9e 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -87,7 +87,7 @@ struct Params { bool has_parent_chain; uint256 parentChainPowLimit; uint32_t pegin_min_depth; - CScript parent_chain_signblockscript; //TODO(rebase) change when implementing parents with signed blocks + CScript parent_chain_signblockscript; bool ParentChainHasPow() const { return parent_chain_signblockscript == CScript();} CScript fedpegScript; // g_con_blockheightinheader global hack instead of proper arg due to circular dep diff --git a/src/pegins.cpp b/src/pegins.cpp index 4c9bd9dcc4..d2f6ffeeec 100644 --- a/src/pegins.cpp +++ b/src/pegins.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -299,22 +300,21 @@ bool IsValidPeginWitness(const CScriptWitness& pegin_witness, const COutPoint& p num_txs = merkle_block_pow.txn.GetNumTransactions(); } else { - //TODO(rebase) parent signed blocks - //CMerkleBlock merkle_block; - //if (!GetBlockAndTxFromMerkleBlock(block_hash, tx_hash, merkle_block, stack[5])) { - // return false; - //} + CMerkleBlock merkle_block; + if (!GetBlockAndTxFromMerkleBlock(block_hash, tx_hash, merkle_block, stack[5])) { + return false; + } - //if (!CheckProofSignedParent(merkle_block.header, Params().GetConsensus())) { - // return false; - //} + if (!CheckProofSignedParent(merkle_block.header, Params().GetConsensus())) { + return false; + } - //CTransactionRef pegtx; - //if (!CheckPeginTx(stack[4], pegtx, prevout, value, claim_script)) { - // return false; - //} + CTransactionRef pegtx; + if (!CheckPeginTx(stack[4], pegtx, prevout, value, claim_script)) { + return false; + } - //num_txs = merkle_block.txn.GetNumTransactions(); + num_txs = merkle_block.txn.GetNumTransactions(); } // Check that the merkle proof corresponds to the txid diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index cfe005c05f..9cd0b53dbb 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -2249,12 +2249,12 @@ UniValue getsidechaininfo(const JSONRPCRequest& request) obj.pushKV("min_peg_diff", consensus.parentChainPowLimit.GetHex()); obj.pushKV("parent_blockhash", parent_blockhash.GetHex()); obj.pushKV("parent_chain_has_pow", consensus.ParentChainHasPow()); - //TODO(rebase) signed blocks - //if (!consensus.ParentChainHasPow()) { - // obj.pushKV("parent_chain_signblockscript_asm", ScriptToAsmStr(consensus.parent_chain_signblockscript)); - // obj.pushKV("parent_chain_signblockscript_hex", HexStr(consensus.parent_chain_signblockscript)); - // obj.pushKV("parent_pegged_asset", HexStr(consensus.parent_pegged_asset)); - //} + if (!consensus.ParentChainHasPow()) { + obj.pushKV("parent_chain_signblockscript_asm", ScriptToAsmStr(consensus.parent_chain_signblockscript)); + obj.pushKV("parent_chain_signblockscript_hex", HexStr(consensus.parent_chain_signblockscript)); + //TODO(stevenroose) rebase CA + //obj.pushKV("parent_pegged_asset", HexStr(consensus.parent_pegged_asset)); + } return obj; } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index e43d157eff..f838d17cef 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4,6 +4,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include +#include #include #include #include @@ -11,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -5197,14 +5199,13 @@ UniValue createrawpegin(const JSONRPCRequest& request) throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid tx out proof"); } } else { - //TODO(rebase) parent signed blocks - //CTransactionRef txBTCRef; - //CTransaction tx_aux; - //CMerkleBlock merkleBlock; - //ret = createrawpegin(request, txBTCRef, tx_aux, merkleBlock); - //if (!CheckProofSignedParent(merkleBlock.header, Params().GetConsensus())) { - // throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid tx out proof"); - //} + CTransactionRef txBTCRef; + CTransaction tx_aux; + CMerkleBlock merkleBlock; + ret = createrawpegin(request, txBTCRef, tx_aux, merkleBlock); + if (!CheckProofSignedParent(merkleBlock.header, Params().GetConsensus())) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid tx out proof"); + } } return ret; }