Improve gas efficiency in ECDSA (#3853)

Signed-off-by: Pascal Marco Caversaccio <pascal.caversaccio@hotmail.ch>
Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
Co-authored-by: Pascal Marco Caversaccio <pcaversaccio@users.noreply.github.com>
This commit is contained in:
TheGreatHB
2023-02-08 10:18:33 +09:00
committed by GitHub
parent 4d3e423443
commit 8177c4620e
2 changed files with 21 additions and 4 deletions

View File

@ -0,0 +1,5 @@
---
'openzeppelin-solidity': minor
---
`ECDSA`: optimize bytes32 computation by using assembly instead of `abi.encodePacked`.

View File

@ -162,10 +162,15 @@ library ECDSA {
* *
* See {recover}. * See {recover}.
*/ */
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {
// 32 is the length in bytes of hash, // 32 is the length in bytes of hash,
// enforced by the type signature above // enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); /// @solidity memory-safe-assembly
assembly {
mstore(0x00, "\x19Ethereum Signed Message:\n32")
mstore(0x1c, hash)
message := keccak256(0x00, 0x3c)
}
} }
/** /**
@ -189,7 +194,14 @@ library ECDSA {
* *
* See {recover}. * See {recover}.
*/ */
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); /// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(ptr, "\x19\x01")
mstore(add(ptr, 0x02), domainSeparator)
mstore(add(ptr, 0x22), structHash)
data := keccak256(ptr, 0x42)
}
} }
} }