EIP712旨在提高链下消息签名对链上的可用性。我们可以看到,因为节省gas以及减少链上交易的原因,采用链下消息签名的需求日益增长。现在已经被签名的消息,展示给用户的是一串难以理解的16进制的字符串,附带一些组成这个消息的项目的上下文。
EIP-712: Ethereum typed structured data hashing and signinghttps://eips.ethereum.org/EIPS/eip-712Signing Data | MetaMask DocsDeveloper documentation for the MetaMask Ethereum wallet
https://docs.metamask.io/guide/signing-data.htmlDraft EIPs - OpenZeppelin Docs
https://docs.openzeppelin.com/contracts/3.x/api/draftsV4签名的js示例:
//创建web3对象
var Web3 = require('web3');
var sigUtil = require("eth-sig-util")
var provider = new Web3.providers.HttpProvider("http://localhost:7545");
var web3 = new Web3(provider);
var json = require("../build/contracts/Demo.json");
var contractAddr = '';
var account = "";
var account_to = "";
//签名人的私钥
var privateKey = "";
var privateKeyHex = Buffer.from(privateKey, 'hex')
var demoContract = new web3.eth.Contract(json['abi'], contractAddr);
//获取链ID
demoContract.methods.getChainId().call({from: account}, function(error, result){
if (error) {
console.log(error);
}
console.log("getChainId:", result);
});
//V4签名
const typedData = {
types: {
EIP712Domain: [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' },
],
Mail: [
{ name: 'from', type: 'address' },
{ name: 'to', type: 'address' },
{ name: 'value', type: 'uint256' },
],
},
domain: {
name: 'Demo',
version: '1.0',
chainId: 1,
verifyingContract: contractAddr,
},
primaryType: 'Mail',
message: {
from: account,
to: account_to,
value: 12345,
},
}
//V4签名
var signature = sigUtil.signTypedData_v4(privateKeyHex, { data: typedData })
console.log("signature:", signature)
//V4验签
const recovered = sigUtil.recoverTypedSignature_v4({
data: typedData,
sig: signature,
});
console.log("recovered:", recovered)
//合约V4验签
demoContract.methods.verify(typedData.message.from, typedData.message.to, typedData.message.value, signature).call({from: account}, function(error, result){
if (error) {
console.log(error);
}
console.log("verify:", result);
});
V4验签的sol示例:
pragma solidity >=0.6.0
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?