Index: src/script/interpreter.cpp =================================================================== --- src/script/interpreter.cpp +++ src/script/interpreter.cpp @@ -337,8 +337,8 @@ if (opcode == OP_CAT || opcode == OP_SUBSTR || opcode == OP_LEFT || opcode == OP_RIGHT || opcode == OP_INVERT || opcode == OP_2MUL || - opcode == OP_2DIV || opcode == OP_MUL || opcode == OP_DIV || - opcode == OP_MOD || opcode == OP_LSHIFT || opcode == OP_RSHIFT) { + opcode == OP_2DIV || opcode == OP_MUL || opcode == OP_MOD || + opcode == OP_LSHIFT || opcode == OP_RSHIFT) { // Disabled opcodes. return set_error(serror, SCRIPT_ERR_DISABLED_OPCODE); } @@ -893,6 +893,7 @@ case OP_ADD: case OP_SUB: + case OP_DIV: case OP_BOOLAND: case OP_BOOLOR: case OP_NUMEQUAL: @@ -909,6 +910,7 @@ return set_error( serror, SCRIPT_ERR_INVALID_STACK_OPERATION); } + // first two inputs must be minimally encoded numbers CScriptNum bn1(stacktop(-2), fRequireMinimal); CScriptNum bn2(stacktop(-1), fRequireMinimal); CScriptNum bn(0); @@ -921,6 +923,15 @@ bn = bn1 - bn2; break; + case OP_DIV: + // 2nd operand must not be 0 + if (bn2 == 0) { + return set_error( + serror, SCRIPT_ERR_DIV_BY_ZERO); + } + bn = bn1 / bn2; + break; + case OP_BOOLAND: bn = (bn1 != bnZero && bn2 != bnZero); break; Index: src/script/script.h =================================================================== --- src/script/script.h +++ src/script/script.h @@ -273,6 +273,13 @@ return operator-(rhs.m_value); } + inline CScriptNum operator/(const int64_t &rhs) const { + return CScriptNum(m_value / rhs); + } + inline CScriptNum operator/(const CScriptNum &rhs) const { + return operator/(rhs.m_value); + } + inline CScriptNum &operator+=(const CScriptNum &rhs) { return operator+=(rhs.m_value); } Index: src/script/script_error.h =================================================================== --- src/script/script_error.h +++ src/script/script_error.h @@ -34,6 +34,7 @@ SCRIPT_ERR_INVALID_ALTSTACK_OPERATION, SCRIPT_ERR_UNBALANCED_CONDITIONAL, SCRIPT_ERR_INVALID_BITWISE_OPERATION, + SCRIPT_ERR_DIV_BY_ZERO, /* CHECKLOCKTIMEVERIFY and CHECKSEQUENCEVERIFY */ SCRIPT_ERR_NEGATIVE_LOCKTIME, Index: src/script/script_error.cpp =================================================================== --- src/script/script_error.cpp +++ src/script/script_error.cpp @@ -48,6 +48,8 @@ return "Invalid OP_IF construction"; case SCRIPT_ERR_INVALID_BITWISE_OPERATION: return "Invalid bitwise operation (check length of inputs)"; + case SCRIPT_ERR_DIV_BY_ZERO: + return "Invalid division operation"; case SCRIPT_ERR_NEGATIVE_LOCKTIME: return "Negative locktime"; case SCRIPT_ERR_UNSATISFIED_LOCKTIME: