mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Actually better to return zero on error.
This commit is contained in:
parent
034d436933
commit
d731225d02
@ -286,7 +286,7 @@ Global Variables
|
||||
- ``sha3(...) returns (bytes32)``: compute the Ethereum-SHA-3 (KECCAK-256) hash of the (tightly packed) arguments
|
||||
- ``sha256(...) returns (bytes32)``: compute the SHA-256 hash of the (tightly packed) arguments
|
||||
- ``ripemd160(...) returns (bytes20)``: compute the RIPEMD-160 hash of the (tightly packed) arguments
|
||||
- ``ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)``: recover address associated with the public key from elliptic curve signature
|
||||
- ``ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)``: recover address associated with the public key from elliptic curve signature, return zero on error
|
||||
- ``addmod(uint x, uint y, uint k) returns (uint)``: compute ``(x + y) % k`` where the addition is performed with arbitrary precision and does not wrap around at ``2**256``
|
||||
- ``mulmod(uint x, uint y, uint k) returns (uint)``: compute ``(x * y) % k`` where the multiplication is performed with arbitrary precision and does not wrap around at ``2**256``
|
||||
- ``this`` (current contract's type): the current contract, explicitly convertible to ``address``
|
||||
|
@ -95,7 +95,7 @@ Mathematical and Cryptographic Functions
|
||||
``ripemd160(...) returns (bytes20)``:
|
||||
compute RIPEMD-160 hash of the (tightly packed) arguments
|
||||
``ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)``:
|
||||
recover the address associated with the public key from elliptic curve signature
|
||||
recover the address associated with the public key from elliptic curve signature or return zero on error
|
||||
|
||||
In the above, "tightly packed" means that the arguments are concatenated without padding.
|
||||
This means that the following are all identical::
|
||||
|
@ -1571,8 +1571,6 @@ void ExpressionCompiler::appendExternalFunctionCall(
|
||||
m_context << u256(32);
|
||||
utils().fetchFreeMemoryPointer();
|
||||
m_context << Instruction::SUB << Instruction::MLOAD;
|
||||
m_context << Instruction::DUP1 << Instruction::ISZERO;
|
||||
m_context.appendConditionalJumpTo(m_context.errorTag());
|
||||
}
|
||||
else if (!_functionType.returnParameterTypes().empty())
|
||||
{
|
||||
|
@ -6855,11 +6855,9 @@ BOOST_AUTO_TEST_CASE(create_dynamic_array_with_zero_length)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(failing_ecrecover_invalid_input)
|
||||
{
|
||||
// ecrecover should throw for malformed input
|
||||
// ecrecover should return zero for malformed input
|
||||
// (v should be 27 or 28, not 1)
|
||||
// This is quite hard to test because the precompiled does NOT throw, instead it just
|
||||
// does not write to its output area, we have to check that and currently do it
|
||||
// by checking whether ecrecover "returns" zero.
|
||||
// Note that the precompile does not return zero but returns nothing.
|
||||
char const* sourceCode = R"(
|
||||
contract C {
|
||||
function f() returns (address) {
|
||||
@ -6868,7 +6866,7 @@ BOOST_AUTO_TEST_CASE(failing_ecrecover_invalid_input)
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "C");
|
||||
BOOST_CHECK(callContractFunction("f()") == encodeArgs());
|
||||
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(0)));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
Loading…
Reference in New Issue
Block a user