= keccak256(abi.encodePacked(prefix, hash)); return ecrecover(prefixedHash, v, r, s); } /** * @notice Checks if the recovered address from an ECDSA signature is equal to the address `signer` provided. * @return valid Whether the provided address matches with the signature */ function isValid (address signer, bytes32 hash, uint8 v, bytes32 r, bytes32 s) external pure returns (bool) { return recoverAddress(hash, v, r, s) == signer; } }
该合约仅用于验证签名,本身没有任何用处,因为签名验证也可以在没有智能合约的情况下完成。 这种方式的用处在于,用户可以通过免信任方式向智能合约发送某些指令,而无需发送交易。例如,用户可以签署一条消息:「请从我的地址向该地址发送 1 个以太币。」 智能合约可以使用 EIP-712 和 / 或 EIP-1077 标准来验证签名者并执行该指令。智能合约中的签名验证可用于以下应用:
但是,如果你想通过正在使用的智能合约钱包签署消息怎么办?我们显然不能让钱包智能合约访问私钥对吧。ERC 1271 提议了一个标准,可以让智能合约验证其它智能合约的签名。其规范非常简单: pragma solidity ^0.7.0; contract ERC1271 { bytes4 constant internal MAGICVALUE = 0x1626ba7e; function isValidSignature( bytes32_hash, bytes memory_signature ) public view returns (bytes4 magicValue); }
合约必须实现 |