在 EIP-712 下签名的每个数据必须有一个 EIP712Domain 和另一个数据。这两者的结构可以是任何东西,但必须在 JS 代码和 SC 代码上相同。 当使用该提案时,EIP712Domain 的结构是一个被广泛接受的标准。 EIP-712 数据标准 EIP712Domain 有一些参数,这些参数指定在哪个网络和哪个特定合约上将用于验证签名。另一份具有相同代码的合同将无法验证该签名。 步骤 3让我们添加一个按钮,当单击该按钮时,将弹出元掩码,使用 eth_signTypedData_v3 方法对数据进行签名。 步骤 4一旦签署了上面定义的数据使用 eth_signTypedData_v3 方法我们得到了签名和签名分割成其 r, s, 和 v 组件并将其发送到智能合约将使用 ercrecover 这些参数和数据哈希恢复签名者的公钥。 拆分签名 步骤 5编写智能合约。 就像我们定义了包含 EIPdomain 和要签名的数据的 JS 代码一样,智能合约也需要两个变量来表示每个 EIPdomain 的散列数据和我们的数据 (在本例中是设置数据)。 使用 ercrecover 在 UI 端,我们对数据进行签名,并将 r、s 和 v 发送给智能合约。 上面的代码做了两件事,首先它散列数据并生成它们的散列。接下来,它使用该数据的散列 (在 SC 中称为散列) 和签名,使用 ercrecover 方法生成签名者的公钥。 上面显示的数据的两个 kecak 哈希值应该类似于在 out JS 代码中定义的数据结构。如果两者不同,则无法恢复签名者的地址。 签名数据的结构 步骤 6将 infura 中的助记符添加到 truffle-config.js 文件 (第 3 行),并指定部署者的地址 (第 18 行)。上面的例子使用了 rinkeby testnet,但是任何测试都可以使用,并查看 truffle 文档来部署到其他测试网。 然后部署合同。部署后复制 simplestorage 的地址,替换为 verifyingContract 下 app.js 第 76 行的地址。 部署代码片段 步骤 7进入 client 目录,运行 npm run start 启动 react 应用。 按下「Press to sign」按钮,然后在元掩码弹出的签名请求上签名。接下来,确认交易以设置智能合约上的值。 (责任编辑:admin) |