rust ethers-rs 签名与solidity验证签名例子
第一段代码是一个 Solidity 智能合约,用于验证基于 EIP712 格式的签名。它包括了定义常量、结构体、函数和验证逻辑的实现。第二段代码是一个 Rust 测试函数,用于测试基于 EIP712 格式的签名的生成和验证过程。它使用了 `ethers` 和 `ethers-signers` 库来创建钱包、定义签名数据结构、生成签名并进行验证,最后打印相关信息以验证签名的正确性。
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.6.0;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
contract DeriveEip712Test {
uint256 constant chainId = 1;
bytes32 constant salt = keccak256("eip712-vault-23x8Dek33kgD");
bytes32 constant EIP712_DOMAIN_TYPEHASH =
keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"
);
bytes32 constant FOOBAR_DOMAIN_TYPEHASH =
keccak256(
"SignedStruct(uint256 id,string extra,uint256 amount,uint256 timestamp,address contract,address token)"
);
address signer ;
mapping(bytes => bool) private usedSignature;
constructor(address _signer) {
signer = _signer;
}
struct SignedStruct {
uint256 id;
string extra;
uint256 amount;
uint256 timestamp;
address token;
}
function domainSeparator() public view returns (bytes32) {
return
keccak256(
abi.encode(
EIP712_DOMAIN_TY