diff options
author | Remco Bloemen <remco@wicked.ventures> | 2018-06-14 00:13:17 +0800 |
---|---|---|
committer | Remco Bloemen <remco@wicked.ventures> | 2018-06-23 19:53:38 +0800 |
commit | 4bf4f96f478ba8e08bf2d44817294ddd5fe895c5 (patch) | |
tree | 083706667bbd51da211dce187b66b5b012b7e923 | |
parent | 384cd2f6059bba994a6af2992a7df4909e24897c (diff) | |
download | dexon-0x-contracts-4bf4f96f478ba8e08bf2d44817294ddd5fe895c5.tar.gz dexon-0x-contracts-4bf4f96f478ba8e08bf2d44817294ddd5fe895c5.tar.zst dexon-0x-contracts-4bf4f96f478ba8e08bf2d44817294ddd5fe895c5.zip |
Fix LibBytes.equals
-rw-r--r-- | packages/contracts/src/contracts/current/utils/LibBytes/LibBytes.sol | 25 |
1 files changed, 4 insertions, 21 deletions
diff --git a/packages/contracts/src/contracts/current/utils/LibBytes/LibBytes.sol b/packages/contracts/src/contracts/current/utils/LibBytes/LibBytes.sol index 2862ee3dd..3149a47e5 100644 --- a/packages/contracts/src/contracts/current/utils/LibBytes/LibBytes.sol +++ b/packages/contracts/src/contracts/current/utils/LibBytes/LibBytes.sol @@ -270,27 +270,10 @@ library LibBytes { pure returns (bool equal) { - assembly { - // Get the number of words occupied by <lhs> - let lenFullWords := div(add(mload(lhs), 0x1F), 0x20) - - // Add 1 to the number of words, to account for the length field - lenFullWords := add(lenFullWords, 0x1) - - // Test equality word-by-word. - // Terminates early if there is a mismatch. - for {let i := 0} lt(i, lenFullWords) {i := add(i, 1)} { - let lhsWord := mload(add(lhs, mul(i, 0x20))) - let rhsWord := mload(add(rhs, mul(i, 0x20))) - equal := eq(lhsWord, rhsWord) - if eq(equal, 0) { - // Break - i := lenFullWords - } - } - } - - return equal; + // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare. + // We early exit on unequal lengths, but keccak would also correctly + // handle this. + return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs); } /// @dev Reads an address from a position in a byte array. |