mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 12:32:48 +01:00
Merge pull request #5000
0391423
Discourage NOPs reserved for soft-fork upgrades (Peter Todd)
This commit is contained in:
commit
3ba5ebc065
@ -329,8 +329,14 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
|
|||||||
// Control
|
// Control
|
||||||
//
|
//
|
||||||
case OP_NOP:
|
case OP_NOP:
|
||||||
|
break;
|
||||||
|
|
||||||
case OP_NOP1: case OP_NOP2: case OP_NOP3: case OP_NOP4: case OP_NOP5:
|
case OP_NOP1: case OP_NOP2: case OP_NOP3: case OP_NOP4: case OP_NOP5:
|
||||||
case OP_NOP6: case OP_NOP7: case OP_NOP8: case OP_NOP9: case OP_NOP10:
|
case OP_NOP6: case OP_NOP7: case OP_NOP8: case OP_NOP9: case OP_NOP10:
|
||||||
|
{
|
||||||
|
if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS)
|
||||||
|
return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_IF:
|
case OP_IF:
|
||||||
|
@ -57,7 +57,18 @@ enum
|
|||||||
// any other push causes the script to fail (BIP62 rule 3).
|
// any other push causes the script to fail (BIP62 rule 3).
|
||||||
// In addition, whenever a stack element is interpreted as a number, it must be of minimal length (BIP62 rule 4).
|
// In addition, whenever a stack element is interpreted as a number, it must be of minimal length (BIP62 rule 4).
|
||||||
// (softfork safe)
|
// (softfork safe)
|
||||||
SCRIPT_VERIFY_MINIMALDATA = (1U << 6)
|
SCRIPT_VERIFY_MINIMALDATA = (1U << 6),
|
||||||
|
|
||||||
|
// Discourage use of NOPs reserved for upgrades (NOP1-10)
|
||||||
|
//
|
||||||
|
// Provided so that nodes can avoid accepting or mining transactions
|
||||||
|
// containing executed NOP's whose meaning may change after a soft-fork,
|
||||||
|
// thus rendering the script invalid; with this flag set executing
|
||||||
|
// discouraged NOPs fails the script. This verification flag will never be
|
||||||
|
// a mandatory flag applied to scripts in a block. NOPs that are not
|
||||||
|
// executed, e.g. within an unexecuted IF ENDIF block, are *not* rejected.
|
||||||
|
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS = (1U << 7)
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType);
|
uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType);
|
||||||
|
@ -59,6 +59,8 @@ const char* ScriptErrorString(const ScriptError serror)
|
|||||||
return "Non-canonical signature: S value is unnecessarily high";
|
return "Non-canonical signature: S value is unnecessarily high";
|
||||||
case SCRIPT_ERR_SIG_NULLDUMMY:
|
case SCRIPT_ERR_SIG_NULLDUMMY:
|
||||||
return "Dummy CHECKMULTISIG argument must be zero";
|
return "Dummy CHECKMULTISIG argument must be zero";
|
||||||
|
case SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS:
|
||||||
|
return "NOPx reserved for soft-fork upgrades";
|
||||||
case SCRIPT_ERR_UNKNOWN_ERROR:
|
case SCRIPT_ERR_UNKNOWN_ERROR:
|
||||||
case SCRIPT_ERR_ERROR_COUNT:
|
case SCRIPT_ERR_ERROR_COUNT:
|
||||||
default: break;
|
default: break;
|
||||||
|
@ -43,6 +43,9 @@ typedef enum ScriptError_t
|
|||||||
SCRIPT_ERR_SIG_HIGH_S,
|
SCRIPT_ERR_SIG_HIGH_S,
|
||||||
SCRIPT_ERR_SIG_NULLDUMMY,
|
SCRIPT_ERR_SIG_NULLDUMMY,
|
||||||
|
|
||||||
|
/* softfork safeness */
|
||||||
|
SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS,
|
||||||
|
|
||||||
SCRIPT_ERR_ERROR_COUNT
|
SCRIPT_ERR_ERROR_COUNT
|
||||||
} ScriptError;
|
} ScriptError;
|
||||||
|
|
||||||
|
@ -47,7 +47,8 @@ static const unsigned int MANDATORY_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH;
|
|||||||
static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS |
|
static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS |
|
||||||
SCRIPT_VERIFY_STRICTENC |
|
SCRIPT_VERIFY_STRICTENC |
|
||||||
SCRIPT_VERIFY_MINIMALDATA |
|
SCRIPT_VERIFY_MINIMALDATA |
|
||||||
SCRIPT_VERIFY_NULLDUMMY;
|
SCRIPT_VERIFY_NULLDUMMY |
|
||||||
|
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS;
|
||||||
|
|
||||||
/** For convenience, standard but not mandatory verify flags. */
|
/** For convenience, standard but not mandatory verify flags. */
|
||||||
static const unsigned int STANDARD_NOT_MANDATORY_VERIFY_FLAGS = STANDARD_SCRIPT_VERIFY_FLAGS & ~MANDATORY_SCRIPT_VERIFY_FLAGS;
|
static const unsigned int STANDARD_NOT_MANDATORY_VERIFY_FLAGS = STANDARD_SCRIPT_VERIFY_FLAGS & ~MANDATORY_SCRIPT_VERIFY_FLAGS;
|
||||||
|
@ -163,6 +163,23 @@ nSequences are max.
|
|||||||
["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 2 EQUAL", "P2SH,STRICTENC"],
|
["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 2 EQUAL", "P2SH,STRICTENC"],
|
||||||
["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_11' EQUAL", "P2SH,STRICTENC"],
|
["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_11' EQUAL", "P2SH,STRICTENC"],
|
||||||
|
|
||||||
|
["Ensure 100% coverage of discouraged NOPS"],
|
||||||
|
["1", "NOP1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
["1", "NOP2", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
["1", "NOP3", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
["1", "NOP4", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
["1", "NOP5", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
["1", "NOP6", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
["1", "NOP7", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
["1", "NOP8", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
["1", "NOP9", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
["1", "NOP10", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
|
||||||
|
|
||||||
|
["NOP10", "1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in scriptSig"],
|
||||||
|
|
||||||
|
["1 0x01 0xb9", "HASH160 0x14 0x15727299b05b45fdaf9ac9ecf7565cfe27c3e567 EQUAL",
|
||||||
|
"P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in redeemScript"],
|
||||||
|
|
||||||
["0x50","1", "P2SH,STRICTENC", "opcode 0x50 is reserved"],
|
["0x50","1", "P2SH,STRICTENC", "opcode 0x50 is reserved"],
|
||||||
["1", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
|
["1", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
|
||||||
["1", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"],
|
["1", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"],
|
||||||
|
@ -235,6 +235,11 @@ nSequences are max.
|
|||||||
["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL", "P2SH,STRICTENC"],
|
["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL", "P2SH,STRICTENC"],
|
||||||
["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_10' EQUAL", "P2SH,STRICTENC"],
|
["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_10' EQUAL", "P2SH,STRICTENC"],
|
||||||
|
|
||||||
|
["1", "NOP", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", "Discourage NOPx flag allows OP_NOP"],
|
||||||
|
|
||||||
|
["0", "IF NOP10 ENDIF 1", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS",
|
||||||
|
"Discouraged NOPs are allowed if not executed"],
|
||||||
|
|
||||||
["0", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
|
["0", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
|
||||||
["0", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"],
|
["0", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"],
|
||||||
["0", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC"],
|
["0", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC"],
|
||||||
|
@ -37,7 +37,8 @@ static std::map<string, unsigned int> mapFlagNames = boost::assign::map_list_of
|
|||||||
(string("LOW_S"), (unsigned int)SCRIPT_VERIFY_LOW_S)
|
(string("LOW_S"), (unsigned int)SCRIPT_VERIFY_LOW_S)
|
||||||
(string("SIGPUSHONLY"), (unsigned int)SCRIPT_VERIFY_SIGPUSHONLY)
|
(string("SIGPUSHONLY"), (unsigned int)SCRIPT_VERIFY_SIGPUSHONLY)
|
||||||
(string("MINIMALDATA"), (unsigned int)SCRIPT_VERIFY_MINIMALDATA)
|
(string("MINIMALDATA"), (unsigned int)SCRIPT_VERIFY_MINIMALDATA)
|
||||||
(string("NULLDUMMY"), (unsigned int)SCRIPT_VERIFY_NULLDUMMY);
|
(string("NULLDUMMY"), (unsigned int)SCRIPT_VERIFY_NULLDUMMY)
|
||||||
|
(string("DISCOURAGE_UPGRADABLE_NOPS"), (unsigned int)SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS);
|
||||||
|
|
||||||
unsigned int ParseScriptFlags(string strFlags)
|
unsigned int ParseScriptFlags(string strFlags)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user