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 wallethttps://docs.metamask.io/guide/signing-data.htmlDraft EIPs - OpenZeppelin Docshttps://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 <0.9.0;import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol";
import "@openzeppelin/contracts/access/Ownable.sol";contract Demo is EIP712, Ownable {//签名人address private _signer;constructor(string memory name, string memory version) EIP712(name, version) {}//设置签名人function setSigner(address signer) public onlyOwner {_signer = signer;}//获取签名人(V4)function recoverV4(address from,address to,uint256 value,bytes memory signature) public view returns (address) {bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(keccak256("Mail(address from,address to,uint256 value)"),from,to,value)));return ECDSA.recover(digest, signature);}//验签function verify(address from,address to,uint256 value,bytes memory signature) public view returns (bool) {address signer = recoverV4(from, to, value, signature);return signer == _signer;}function getChainId() public view returns(uint256) {return block.chainid;}
}

EIP712以太坊签名和验签相关推荐

  1. 以太坊签名,验证签名, EIP712domain Permit授权并转账

    文章目录 一.Dapp 验签登录 web3.eth.accounts.recover(signtxt,sig) 具体实现过程 golang的实现 二.token EIP712Domain Domain ...

  2. Web3j签名与验签

    闲时,给大家讲讲本人在做项目过程中涉及到的区块链签名相关业务,希望对做区块链行业的同行有所帮助. 主要是针对Java程序员围绕web3j库进行区块链以太坊开发,本地签名与验签. 代码实例: /*** ...

  3. 数字证书应用综合揭秘(包括证书生成、加密、解密、签名、验签)

    引言 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件.为现实网络安全化标准如今大部分的 B2B.B2C.P2P.O2O 等商业网站含有重要企业资料个人资料的信息资信网站 ...

  4. PHP SHA1withRSA加密生成签名及验签

    最近公司对接XX第三方支付平台的代付业务,由于对方公司只有JAVA的demo,所以只能根据文档自己整合PHP的签名加密,网上找过几个方法,踩到各种各样的坑,还好最后算是搞定了,话不多说,代码分享出来. ...

  5. ASP VBSCRIPT VBA RSA 公钥加密 私钥解密 私钥签名 公钥验签

    <% '@title: Class_Crypt_Rsa '@author: ekede.com '@date: 2020-10-28 '@description: RSA 公钥加密->私钥 ...

  6. asp版 vbscript RSA公钥加密 / 私钥解密 / 私钥签名 / 公钥验签(支持中文)分段加密解密

    最近有空在把自己的asp站点后端函数全部整理了下,在弄RSA的时候遇到了坑了,然后找到下面这位兄弟刚好发布的文章: https://blog.csdn.net/todaygods/article/de ...

  7. 支付宝支付API之签名与验签

    支付宝开发平台支付API文档: https://docs.open.alipay.com/291/106130 对接支付API出现问题的主要原因:数据被转义,所以在调试时先把数据可以写死 注意:在调试 ...

  8. 使用RSA、MD5对参数生成签名与验签

    在日常的工作中,我们对外提供的接口或调用三方的接口往往有一步生成签名或验签的步骤,这个步骤主要是验证调用方是 不是合法的以及内容是否被修改.比如:对于某些网上公开下载的软件,视频,尤其是镜像文件.如果 ...

  9. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

    测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...

最新文章

  1. NeurIPS TAPE | 用于评估蛋白质表示学习性能的多任务平台
  2. MySQL 行子查询
  3. python装饰器作用和功能_这是我见过最全面的Python装饰器详解!没有学不会这种说法!...
  4. ubuntu系统操作常见错误
  5. pom.xml详细说明
  6. lynda ux_如何进入UX领域
  7. Java 7:使用NIO.2进行文件过滤-第1部分
  8. 第十节: EF的三种追踪实体状态变化方式(DBEntityEntry、ChangeTracker、Local)
  9. c语言怎么写贪吃蛇,刚学C语言,想写一个贪吃蛇的代码
  10. oracle以10个记录为一页查询,SQL查询前10条记录(SqlServermysqloracle)语法分析
  11. using namespace std;的陷阱
  12. java 二分搜索获得大于目标数的第一位_Java后端架构师技术图谱,你都了解多少?...
  13. Router OS 全攻略
  14. nodejs cluster_认识node核心模块--全局对象及Cluster
  15. 推荐几个代码自动生成器,神器!!!
  16. ansys16.0安装教程
  17. excel导入,用反射匹配字段名
  18. js的document对象及操作
  19. Chrome浏览器占用CPU资源过高(Software Reporter Tool)
  20. 【Linux】进程间通讯

热门文章

  1. RDKit 操作分子对象
  2. python 单词拆音节_新手求大神carry!关于单词音节问题!求救!
  3. SpringCloud—笔记(一)零基础篇
  4. CRF原理介绍(以BILSTM-CRF模型为例)
  5. 《微服务系列:Eureka服务注册发现中心》
  6. centos5部署open***
  7. MySQL数据库——MySQL数据表添加字段(三种方式)
  8. 吴恩达深度学习第一课第三周编程作业(上)
  9. c++11:std::default_delete
  10. ElasticSearch索引基本操作POST PUT GET DELETE