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:
5
.changeset/thin-dragons-report.md
Normal file
5
.changeset/thin-dragons-report.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'openzeppelin-solidity': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
`ECDSA`: optimize bytes32 computation by using assembly instead of `abi.encodePacked`.
|
||||||
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user