From 1122fc28afdd6dd3ce32b63fc14523306cc8d364 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Mon, 17 Jun 2019 16:34:29 -0400 Subject: [PATCH] Add dynafed proposal restrictions --- src/validation.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/validation.cpp b/src/validation.cpp index fb1fe21b2a..f4919a45e6 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3485,6 +3485,40 @@ static bool ContextualCheckDynaFedHeader(const CBlockHeader& block, CValidationS return state.Invalid(false, REJECT_INVALID, "invalid-dyna-fed", "dynamic block header's current parameters do not match expected"); } + // Lastly, enforce rules on proposals. + const DynaFedParamEntry& proposed = dynafed_params.m_proposed; + if (!proposed.IsNull()) { + + // signblockscript proposals *must* be segwit versions + int block_version = 0; + std::vector block_program; + if (!proposed.m_signblockscript.IsWitnessProgram(block_version, block_program)) { + return state.Invalid(false, REJECT_INVALID, "invalid-dyna-fed", "proposed signblockscript must be native segwit scriptPubkey"); + } + + int fedpeg_version = 0; + std::vector fedpeg_program; + if (!proposed.m_fedpegscript.IsWitnessProgram(fedpeg_version, fedpeg_program)) { + return state.Invalid(false, REJECT_INVALID, "invalid-dyna-fed", "proposed fedpegscript must be native segwit scriptPubkey"); + } + + // for v0, fedpegscript's scriptPubKey must match. v1+ is unencumbered. + if (fedpeg_version == 0) { + CScript computed_program = CScript() << ToByteVector(WitnessV0ScriptHash(proposed.m_fedpegscript)); + if (computed_program != proposed.m_fedpeg_program) { + return state.Invalid(false, REJECT_INVALID, "invalid-dyna-fed", "proposed v0 segwit fedpegscript must match proposed fedpeg witness program"); + } + + // fedpegscript proposals *must not* start with OP_DEPTH + // This forbids the first Liquid watchman script which is a hack. + // Use miniscript, which doesn't even have OP_DEPTH. + // We don't encumber future segwit versions as opcodes may change. + if (!proposed.m_fedpegscript.empty() && + proposed.m_fedpegscript.front() == OP_DEPTH) { + return state.Invalid(false, REJECT_INVALID, "invalid-dyna-fed", "Proposed fedpegscript starts with OP_DEPTH, which is illegal"); + } + } + } return true; }