mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-14 12:43:40 +02:00
Add support for signed-blocks parent chains
This commit is contained in:
parent
b56f7da6d6
commit
d8885400fb
8 changed files with 37 additions and 28 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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&);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <consensus/consensus.h>
|
||||
#include <consensus/validation.h>
|
||||
#include <mainchainrpc.h>
|
||||
#include <merkleblock.h>
|
||||
#include <pow.h>
|
||||
#include <primitives/transaction.h>
|
||||
#include <primitives/bitcoin/merkleblock.h>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <amount.h>
|
||||
#include <block_proof.h>
|
||||
#include <chain.h>
|
||||
#include <consensus/validation.h>
|
||||
#include <core_io.h>
|
||||
|
|
@ -11,6 +12,7 @@
|
|||
#include <validation.h>
|
||||
#include <key_io.h>
|
||||
#include <mainchainrpc.h>
|
||||
#include <merkleblock.h>
|
||||
#include <net.h>
|
||||
#include <outputtype.h>
|
||||
#include <pegins.h>
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue