From c221b05a6811e62836f944270e094c3fe9074e06 Mon Sep 17 00:00:00 2001 From: smallfu6 Date: Sat, 2 Nov 2024 22:01:41 +0800 Subject: [PATCH 1/3] feat: add a description(#602) --- 52_EIP712/readme.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/52_EIP712/readme.md b/52_EIP712/readme.md index a6249560f..387c2640f 100644 --- a/52_EIP712/readme.md +++ b/52_EIP712/readme.md @@ -182,16 +182,23 @@ contract EIP712Storage { } ``` -## Remix 复现 +## 部署复现 -1. 部署 `EIP712Storage` 合约。 +1. 在 `Remix` 部署 `EIP712Storage` 合约。 -2. 运行 `eip712storage.html`,将 `Contract Address` 改为部署的 `EIP712Storage` 合约地址,然后依次点击 `Connect Metamask` 和 `Sign Permit` 按钮签名。签名要使用部署合约的钱包,比如 Remix 测试钱包: +2. 运行 `eip712storage.html`,根据 MetaMask 的内容安全策略([Content Security Policy](https://github.com/MetaMask/faq/blob/9257d7d52784afa957c12166aff20682cf692ae5/DEVELOPERS.md#requirements-nut_and_bolt))的要求,MetaMask 不能通过打开的本地文件(file:// 协议)与 DApp 通信。 可以使用 Node 静态文件服务器 `http-server` 启动本地服务,在包含 `eip712storage.html` 文件的目录下执行以下命令: - ```js - public_key: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 - private_key: 503f38a9c967ed597e47fe25643985f032b072db8075426a92110f82df48dfcb - ``` +```sh +npm install -g http-server +http-server +``` + +在浏览器中打开 `http://127.0.0.1:8080` 就可以访问了。 然后将 `Contract Address` 改为部署的 `EIP712Storage` 合约地址,然后依次点击 `Connect Metamask` 和 `Sign Permit` 按钮签名。签名要使用部署合约的钱包,比如 Remix 测试钱包: + +```js +public_key: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 +private_key: 503f38a9c967ed597e47fe25643985f032b072db8075426a92110f82df48dfcb +``` 3. 调用合约的 `permitStore()` 方法,输入相应的 `_num` 和签名,修改 `number` 的值。 From 0989ece3e7cdb46e8d2a16ec3d7e82ec72da55e4 Mon Sep 17 00:00:00 2001 From: Alan Xu Date: Wed, 6 Nov 2024 23:13:12 +0800 Subject: [PATCH 2/3] Update readme.md fix markdown warnings --- 52_EIP712/readme.md | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/52_EIP712/readme.md b/52_EIP712/readme.md index 387c2640f..3eb5169c0 100644 --- a/52_EIP712/readme.md +++ b/52_EIP712/readme.md @@ -25,11 +25,11 @@ tags: 之前我们介绍了 [EIP191 签名标准(personal sign)](https://github.com/AmazingAng/WTF-Solidity/blob/main/37_Signature/readme.md) ,它可以给一段消息签名。但是它过于简单,当签名数据比较复杂时,用户只能看到一串十六进制字符串(数据的哈希),无法核实签名内容是否与预期相符。 -![](./img/52-1.png) +![image1](./img/52-1.png) [EIP712类型化数据签名](https://eips.ethereum.org/EIPS/eip-712)是一种更高级、更安全的签名方法。当支持 EIP712 的 Dapp 请求签名时,钱包会展示签名消息的原始数据,用户可以在验证数据符合预期之后签名。 -![](./img/52-2.png) +![image2](./img/52-2.png) ## EIP712 使用方法 @@ -37,7 +37,7 @@ EIP712 的应用一般包含链下签名(前端或脚本)和链上验证( ### 链下签名 -1. EIP712 签名必须包含一个 `EIP712Domain` 部分,它包含了合约的 name,version(一般约定为 “1”),chainId,和 verifyingContract(验证签名的合约地址)。 +1. EIP712 签名必须包含一个 `EIP712Domain` 部分,它包含了合约的 name,version(一般约定为 “1”),chainId 和 verifyingContract(验证签名的合约地址)。 ```js EIP712Domain: [ @@ -69,6 +69,7 @@ EIP712 的应用一般包含链下签名(前端或脚本)和链上验证( ], }; ``` + 3. 创建一个 `message` 变量,传入要被签名的类型化数据。 ```js @@ -77,7 +78,8 @@ EIP712 的应用一般包含链下签名(前端或脚本)和链上验证( number: "100", }; ``` - ![](./img/52-3.png) + + ![image3](./img/52-3.png) 4. 调用钱包对象的 `signTypedData()` 方法,传入前面步骤中的 `domain`,`types`,和 `message` 变量进行签名(这里使用 `ethersjs v6`)。 @@ -88,7 +90,8 @@ EIP712 的应用一般包含链下签名(前端或脚本)和链上验证( const signature = await signer.signTypedData(domain, types, message); console.log("Signature:", signature); ``` - ![](./img/52-4.png) + + ![image4](./img/52-4.png) ### 链上验证 @@ -188,17 +191,17 @@ contract EIP712Storage { 2. 运行 `eip712storage.html`,根据 MetaMask 的内容安全策略([Content Security Policy](https://github.com/MetaMask/faq/blob/9257d7d52784afa957c12166aff20682cf692ae5/DEVELOPERS.md#requirements-nut_and_bolt))的要求,MetaMask 不能通过打开的本地文件(file:// 协议)与 DApp 通信。 可以使用 Node 静态文件服务器 `http-server` 启动本地服务,在包含 `eip712storage.html` 文件的目录下执行以下命令: -```sh -npm install -g http-server -http-server -``` + ```sh + npm install -g http-server + http-server + ``` -在浏览器中打开 `http://127.0.0.1:8080` 就可以访问了。 然后将 `Contract Address` 改为部署的 `EIP712Storage` 合约地址,然后依次点击 `Connect Metamask` 和 `Sign Permit` 按钮签名。签名要使用部署合约的钱包,比如 Remix 测试钱包: + 在浏览器中打开 `http://127.0.0.1:8080` 就可以访问了。 然后将 `Contract Address` 改为部署的 `EIP712Storage` 合约地址,然后依次点击 `Connect Metamask` 和 `Sign Permit` 按钮签名。签名要使用部署合约的钱包,比如 Remix 测试钱包: -```js -public_key: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 -private_key: 503f38a9c967ed597e47fe25643985f032b072db8075426a92110f82df48dfcb -``` + ```js + public_key: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 + private_key: 503f38a9c967ed597e47fe25643985f032b072db8075426a92110f82df48dfcb + ``` 3. 调用合约的 `permitStore()` 方法,输入相应的 `_num` 和签名,修改 `number` 的值。 From 714b246c89c5b6ab7c29b17fd8922b5c7534c080 Mon Sep 17 00:00:00 2001 From: Alan Xu Date: Fri, 8 Nov 2024 12:25:35 +0800 Subject: [PATCH 3/3] Update readme.md --- 52_EIP712/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/52_EIP712/readme.md b/52_EIP712/readme.md index 3eb5169c0..dc2c4d358 100644 --- a/52_EIP712/readme.md +++ b/52_EIP712/readme.md @@ -189,7 +189,7 @@ contract EIP712Storage { 1. 在 `Remix` 部署 `EIP712Storage` 合约。 -2. 运行 `eip712storage.html`,根据 MetaMask 的内容安全策略([Content Security Policy](https://github.com/MetaMask/faq/blob/9257d7d52784afa957c12166aff20682cf692ae5/DEVELOPERS.md#requirements-nut_and_bolt))的要求,MetaMask 不能通过打开的本地文件(file:// 协议)与 DApp 通信。 可以使用 Node 静态文件服务器 `http-server` 启动本地服务,在包含 `eip712storage.html` 文件的目录下执行以下命令: +2. 运行 `eip712storage.html`,根据浏览器的内容安全策略([Content Security Policy](https://github.com/MetaMask/faq/blob/9257d7d52784afa957c12166aff20682cf692ae5/DEVELOPERS.md#requirements-nut_and_bolt))的要求,MetaMask 不能通过打开的本地文件(file:// 协议)与 DApp 通信。 可以使用 Node 静态文件服务器 `http-server` 启动本地服务,在包含 `eip712storage.html` 文件的目录下执行以下命令: ```sh npm install -g http-server