From 7c7e23b898d58951c507a3adb77879d07d10dc41 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Tue, 7 Nov 2017 17:16:39 -0500 Subject: [PATCH] HF: peg-in outputs in parent chain are p2sh-pw2sh --- src/consensus/params.h | 1 + src/test/pegin_witness_tests.cpp | 12 ++++++------ src/validation.cpp | 8 +++----- src/wallet/rpcwallet.cpp | 4 ++-- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/consensus/params.h b/src/consensus/params.h index 9fed70b535..0763ff5d2f 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -65,6 +65,7 @@ struct Params { int64_t nPowTargetTimespan; int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespan / nPowTargetSpacing; } uint256 nMinimumChainWork; + // The redeemscript that the peg uses. Uses p2sh-p2wsh CScript fedpegScript; CAsset pegged_asset; uint256 defaultAssumeValid; diff --git a/src/test/pegin_witness_tests.cpp b/src/test/pegin_witness_tests.cpp index b1b86fbab4..5c86ff4e52 100644 --- a/src/test/pegin_witness_tests.cpp +++ b/src/test/pegin_witness_tests.cpp @@ -28,14 +28,14 @@ std::vector > witness_stack = { ParseHex("00ca9a3b00000000"), ParseHex("e48a1a02a8f799892fda58347c2d794144311d4307dbfd10f77ffe28088c60be"), ParseHex("06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f"), - ParseHex("001490d2639f54fe5ef68765e6436fdcd026d373f6a2"), - ParseHex("0200000001ddd30904ddd0876eb39c718615257cb18685dccf1ca729476c01fdb1ac81bc76000000006a473044022060210291ad3cc5ce4dcfde66f9f2e838bd1f99035630902c4e839c6e8a90cb1002205c63da2b84ba624faf3d349d35a637f50b071dfe008ca2bff1cc91be8c77b1c00121029d2bc6d7ca682460e19ffc7a5bb4ec644015e4a4eef2e69706cc25869ddbf0f9feffffff0200ca9a3b0000000017a914a7b4a529506168a41ffb6de37c001fbf50086fbc87802675e8000000001976a9144a51d6e1deaee9a8d1d9e9ff9667af617c5bbb9d88ac65000000"), - ParseHex("00000020370e2e1744d6a7737760a613785ca4c2e63859bbe496a4debc856474bd0a2a52d9d53f142aaeeacf803cd244bb00d505bbc3ef56868fe12f79c843a4fcd68e898172fb59ffff7f20010000000300000002b10cff03945bc3d0efd5c7228367c2b4b015dc94595e22ef8d09712ffca39df3c63123fe899e560e5b1060cb0cb16555acf166fa060cc4e8bfc22a812bbd3616010d") + ParseHex("00141eef6361cd1507a303834285d1521d6baf1b19ae"), + ParseHex("0200000001b399292c8100b8a1b66eb23896f799c1712390d560af0f70e81acd2d17a3b06e0000000049483045022100c3c749623486ea57ea93dfaf78d85590d78c7590a25768fe80f0ea4d6047419002202a0a00a90392b86c53c0fdda908c4591ba28040c16c25734c23b7df3c8b70acd01feffffff0228196bee000000001976a914470dd41542ee1a1bd75f1a838878648c8d65622488ac00ca9a3b0000000017a914cb60b1d7f76ba12b45a116c482c165a74c5d7e388765000000"), + ParseHex("000000205e3913a320cd2e3a2efa141e47419f54cb9e82320cf8dbc812fc19b9a1b2413a57f5e9fb4fa22de191454a241387f5d10cc794ee0fbf72ae2841baf3129a4eab8133025affff7f20000000000200000002f9d0be670007d38fceece999cb6144658a99c307ccc37f6d8f69129ed0f4545ff321df9790633bc33c67239c4174df8142ee616ee6a2e2788fe4820fe70e9bce0105") }; -std::vector pegin_transaction = ParseHex("020000000101c63123fe899e560e5b1060cb0cb16555acf166fa060cc4e8bfc22a812bbd36160000004000ffffffff0201e48a1a02a8f799892fda58347c2d794144311d4307dbfd10f77ffe28088c60be01000000003b9ab240001976a914e642eae0e083e8d2dfacd626a7aedd07ee454a2688ac01e48a1a02a8f799892fda58347c2d794144311d4307dbfd10f77ffe28088c60be0100000000000017c00000000000000000024830450221009ed9f3ae842b4fef4f47e64699d5ef6b7d647208751fdfe76c884f418a2582330220233a39e6cf24b716809dd6ef4beecc62e2ac8036fd66b03fd48a40a0e279062f0121033e00debbdcbe0f42f855fa64099a8984fba6f60d639a577f35c8bbf60d3d9a27060800ca9a3b0000000020e48a1a02a8f799892fda58347c2d794144311d4307dbfd10f77ffe28088c60be2006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f16001490d2639f54fe5ef68765e6436fdcd026d373f6a2df0200000001ddd30904ddd0876eb39c718615257cb18685dccf1ca729476c01fdb1ac81bc76000000006a473044022060210291ad3cc5ce4dcfde66f9f2e838bd1f99035630902c4e839c6e8a90cb1002205c63da2b84ba624faf3d349d35a637f50b071dfe008ca2bff1cc91be8c77b1c00121029d2bc6d7ca682460e19ffc7a5bb4ec644015e4a4eef2e69706cc25869ddbf0f9feffffff0200ca9a3b0000000017a914a7b4a529506168a41ffb6de37c001fbf50086fbc87802675e8000000001976a9144a51d6e1deaee9a8d1d9e9ff9667af617c5bbb9d88ac650000009700000020370e2e1744d6a7737760a613785ca4c2e63859bbe496a4debc856474bd0a2a52d9d53f142aaeeacf803cd244bb00d505bbc3ef56868fe12f79c843a4fcd68e898172fb59ffff7f20010000000300000002b10cff03945bc3d0efd5c7228367c2b4b015dc94595e22ef8d09712ffca39df3c63123fe899e560e5b1060cb0cb16555acf166fa060cc4e8bfc22a812bbd3616010d00000000"); +std::vector pegin_transaction = ParseHex("020000000101f321df9790633bc33c67239c4174df8142ee616ee6a2e2788fe4820fe70e9bce0100004000ffffffff0201e48a1a02a8f799892fda58347c2d794144311d4307dbfd10f77ffe28088c60be01000000003b9ab2e0001976a914809326f7628dc976fbe63806479a1b8dfcc8c4b988ac01e48a1a02a8f799892fda58347c2d794144311d4307dbfd10f77ffe28088c60be010000000000001720000000000000000002483045022100ae17064745d80650a6a5cbcbe15c8c45ba498d1c6f45a7c0f5f32d871b463fc60220799f2836471702c21f7cfe124651727b530ad41f7af4dc213c65f5030a2f6fc4012103a9d3c6c7c161a565a76113632fe13330cf2c0207ba79a76d1154cdc3cb94d940060800ca9a3b0000000020e48a1a02a8f799892fda58347c2d794144311d4307dbfd10f77ffe28088c60be2006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f1600141eef6361cd1507a303834285d1521d6baf1b19aebe0200000001b399292c8100b8a1b66eb23896f799c1712390d560af0f70e81acd2d17a3b06e0000000049483045022100c3c749623486ea57ea93dfaf78d85590d78c7590a25768fe80f0ea4d6047419002202a0a00a90392b86c53c0fdda908c4591ba28040c16c25734c23b7df3c8b70acd01feffffff0228196bee000000001976a914470dd41542ee1a1bd75f1a838878648c8d65622488ac00ca9a3b0000000017a914cb60b1d7f76ba12b45a116c482c165a74c5d7e38876500000097000000205e3913a320cd2e3a2efa141e47419f54cb9e82320cf8dbc812fc19b9a1b2413a57f5e9fb4fa22de191454a241387f5d10cc794ee0fbf72ae2841baf3129a4eab8133025affff7f20000000000200000002f9d0be670007d38fceece999cb6144658a99c307ccc37f6d8f69129ed0f4545ff321df9790633bc33c67239c4174df8142ee616ee6a2e2788fe4820fe70e9bce010500000000"); -COutPoint prevout(uint256S("1636bd2b812ac2bfe8c40c06fa66f1ac5565b10ccb60105b0e569e89fe2331c6"), 0); +COutPoint prevout(uint256S("ce9b0ee70f82e48f78e2a2e66e61ee4281df74419c23673cc33b639097df21f3"), 1); // Needed for easier parent PoW check, and setting fedpegscript struct RegtestingSetup : public TestingSetup { @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE(witness_valid) // Test mismatched but valid nOut to proof COutPoint fake_prevout = prevout; - fake_prevout.n = 1; + fake_prevout.n = 0; BOOST_CHECK(!IsValidPeginWitness(witness, fake_prevout)); // Test mistmatched but valid txid diff --git a/src/validation.cpp b/src/validation.cpp index 93f69ae3bf..2c62dedfcb 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2462,12 +2462,10 @@ bool IsValidPeginWitness(const CScriptWitness& pegin_witness, const COutPoint& p return false; } - // Check that the witness program matches the p2ch on the transaction output + // Check that the witness program matches the p2ch on the p2sh-p2wsh transaction output CScript tweaked_fedpegscript = calculate_contract(Params().GetConsensus().fedpegScript, claim_script); - - // Check against expected p2sh output - CScriptID expectedP2SH(tweaked_fedpegscript); - CScript expected_script(CScript() << OP_HASH160 << ToByteVector(expectedP2SH) << OP_EQUAL); + CScript witness_output(GetScriptForWitness(tweaked_fedpegscript)); + CScript expected_script(CScript() << OP_HASH160 << ToByteVector(CScriptID(witness_output)) << OP_EQUAL); if (pegtx->vout[prevout.n].scriptPubKey != expected_script) { return false; } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 18ed6f4c34..300eb26250 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3426,7 +3426,7 @@ UniValue getpeginaddress(const JSONRPCRequest& request) CScript witProg = GetScriptForWitness(destScript); //Call contracthashtool, get deposit address on mainchain. - CParentBitcoinAddress destAddr(CScriptID(calculate_contract(Params().GetConsensus().fedpegScript, witProg))); + CParentBitcoinAddress destAddr(CScriptID(GetScriptForWitness(calculate_contract(Params().GetConsensus().fedpegScript, witProg)))); UniValue fundinginfo(UniValue::VOBJ); @@ -3502,7 +3502,7 @@ unsigned int GetPeginTxnOutputIndex(const Sidechain::Bitcoin::CTransaction& txn, { unsigned int nOut = 0; //Call contracthashtool - CScript mainchain_script = GetScriptForDestination(CScriptID(calculate_contract(Params().GetConsensus().fedpegScript, witnessProgram))); + CScript mainchain_script = GetScriptForDestination(CScriptID(GetScriptForWitness(calculate_contract(Params().GetConsensus().fedpegScript, witnessProgram)))); for (; nOut < txn.vout.size(); nOut++) if (txn.vout[nOut].scriptPubKey == mainchain_script) break;