/**
* @notice 验证签名者是否为签名合约的所有者。
*/functionisValidSignature(bytes32_hash,bytescalldata_signature)externaloverrideviewreturns(bytes4){// Validate signatures
if(recoverSigner(_hash,_signature)==owner){return0x1626ba7e;}else{return0xffffffff;}}/**
* @notice 恢复哈希的签名者,假设它是一个 EOA 账户
* @dev 仅适用于 EthSign 签名
* @param _hash 已签名消息的哈希值
* @param _signature 签名编码为 (bytes32 r, bytes32 s, uint8 v)
*/functionrecoverSigner(bytes32_hash,bytesmemory_signature)internalpurereturns(addresssigner){require(_signature.length==65,"SignatureValidator#recoverSigner: invalid signature length");// Variables are not scoped in Solidity.
uint8v=uint8(_signature[64]);bytes32r=_signature.readBytes32(0);bytes32s=_signature.readBytes32(32);// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
//
// Source OpenZeppelin
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/cryptography/ECDSA.sol
if(uint256(s)>0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0){revert("SignatureValidator#recoverSigner: invalid signature 's' value");}if(v!=27&&v!=28){revert("SignatureValidator#recoverSigner: invalid signature 'v' value");}// Recover ECDSA signer
signer=ecrecover(_hash,v,r,s);// Prevent signer from being 0x0
require(signer!=address(0x0),"SignatureValidator#recoverSigner: INVALID_SIGNER");returnsigner;}