比特币:一个示例来解释EIP-712

EIP-712是一种更高级、更安全的交易签名方法。我们可以在Uniswap V2的Periphery 合约中看到EIP-712的实现。

但对于EIP-712却很难被我们普通人所理解,本文就是根据一个示例来具体体验EIP-712,以达到对其的更好理解。

在GitHub中有许多文章和示例解释和展示了如何使用EIP-712,但在理解它作为一个整体是如何工作的以及前端代码和智能合约是如何关联的方面有很多困难。这是EIP712的一个示例(不是解释)。先决条件和使用的版本。

Solidity基础知识

npm 7.19.1

节点 16.2.0

Metamask 9.8.4

truffle 5.4.0

EIP-712是一种更高级、更安全的交易签名方法。使用该标准不仅可以签署交易并且可以验证签名,而且可以将数据与签名一起传递到智能合约中,并且可以根据该数据验证签名以了解签名者是否是实际发送该签名的人要在交易中调用的数据。

Web3视频平台Shibuya:下一部视频的每一个场景,将由NFT持有者决定:金色财经报道,Web3视频平台Shibuya宣布,其下一部网络视频“Dominion X”的每一个场景都将由NFT持有者决定,为期六周。

每周,NFT持有者都可以投票决定每个新场景的结局,然后制片人就会据此进行拍摄。所有这些加起来将成为一个定格动画短片,任何人都可以通过Shibuya平台观看,但只有NFT持有者才能在制作过程中投票。这些持有者还将根据他们在这一过程中的参与程度,获得不同稀有等级的NFT奖励。

对于Shibuya来说,“Dominion X”标志着自2022年3月该平台首次亮相以来的第二个IP发布,也是第一个外部开发的IP。

此前消息,Shibuya宣布完成690万美元融资,a16z Crypto和Variant联合领投,帕丽斯·希尔顿和NBA球星凯文·杜兰特等名人、阿里巴巴联合创始人蔡崇信、DeFi交易平台Aave创始人Stani Kulechov等参投。[2023/2/2 11:41:58]

EIP-712提出了数据的标准结构和从结构化消息生成散列的定义过程。然后使用此散列生成签名。通过这种方式,为发送交易生成的签名与为验证身份或任何其他目的生成的签名之间就有了明显的区别。EIP-712草案将签名方案背后的动机表述为:

Balaji Srinivasan:每个社交网络和消息应用程序都将获得一个web3的变体:金色财经报道,Bitcoiner Ventures以及天使投资人Balaji Srinivasan发推称,每个社交网络和消息应用程序都将获得一个web3的变体。为什么?因为DAO显然比Facebook群组、subreddits、群聊或公告板更有用。它们允许你从娱乐性讨论到资源分配的水平。当然,你可以继续只是聊天。但是,如果你想做一些事情、众筹一个活动、承认某人的贡献、投资一个社区成员、加密一个消息,让任何服务器都看不到它,或者记录一个有约束力的投票那就是DAO或者GTFO。[2022/1/6 8:28:52]

提高链上使用的链下消息签名的可用性。我们看到越来越多的人采用链下消息签名,因为它节省了gas,减少了区块链上的交易数量。

EIP-712是类型化结构化数据的哈希和签名的标准,而不仅仅是字节字符串。它包括一个

全球首个比特币ETF IPO首日第一个小时交易价值8000万美元的股票:2月19日消息,北美首只比特币ETF,即Purpose?Investments公司旗下比特币ETF交易首日非常火爆,其中,该ETF在交易的第一个小时内的交易量超过8000万美元,但此后大幅放缓。盘初一度上涨逾4.76%,最高触及11.00加元,随后破发,下跌逾1%[2021/2/19 17:28:22]

编码函数正确性的理论框架,

与solid结构相似并兼容的结构化数据规范,

安全哈希算法用于这些结构的实例,

在可签名消息集中安全包含这些实例,

一个可扩展的域分离机制,

新的RPC调用eth_signTypedData,

EVM中哈希算法的优化实现。

动态 | 新华日报:比特币是区块链技术的第一个成功应用 有总量有限性等四个特性:新华日报今日刊文《比特币:区块链技术 首个成功应用》。文章提到,比特币是区块链技术的第一个成功应用。传统金融体系的交易记录都被保存在银行中心的数据库中,而区块链则是比特币的账本,任何时刻产生的比特币的所有权以及交易记录,都记录在区块链账本中。任何人只要下载了客户端,就能接收相关信息。总体而言,比特币有以下几个特性:1.总量有限性,发行不会失控。2.良好的匿名性,账户拥有者的身份不会被任何人知晓。3.比特币的生产和维持耗用了大量能源。4.比特币的价格容易大幅波动。[2019/11/11]

EIP-712的实现可以在Uniswap V2的Periphery 合约中看到,它通过许可移除流动性,最终调用Uniswap V2 Core中的方法来完成这一操作。

澳大利亚第一个以比特币支付的房产在悉尼出现:澳大利亚第一个以比特币支付的房产在悉尼出现。澳大利亚Sky Property Blacktown房产中介主管Riza Kamerakkas以及在其交易平台上挂出了该国第一个用比特币交易的房产信息,整套房子位于悉尼朱雀山(Mount Druitt),据悉房东希望以46-50比特币的价格出售这套房产。[2018/1/12]

前端的签名被传递给Periphery 中的方法,签名被用来代表Core中使用该方法的用户批准Router合约。

我们的示例将使用EIP-721提案用数据(地址、storedData的值和截止日期)签署交易,这些数据用于更改合约中变量的值。

如果签名和散列给出了签署人的地址,并且没有超过截止日期,则更改storedData的值。

这是一个无用的例子,但理解了它将确保您可以在其他地方使用该标准。正确使用 EIP-712 是创建一个 ERC20 许可证,就像 Uniswap 团队所做的那样。

继续克隆 truffle 的react box。

我们将根据需要简单地调整和添加代码,以使EIP-712正常工作。

数据是EIP-712中最关键的部分。这些要签名的数据必须符合预定义的格式。它必须有一个EIP712Domain和要签名的数据(在我们的示例中设置)。两者的组合将被签名并发送给智能合约进行验证。

在EIP-712下签名的每个数据必须有一个EIP712Domain和另一个数据。这两者的结构可以是任何东西,但必须在JS代码和SC代码上相同。

当使用该提案时,EIP712Domain的结构是一个被广泛接受的标准。

 EIP-712 数据标准

EIP712Domain有一些参数,这些参数指定在哪个网络和哪个特定合约上将用于验证签名。另一份具有相同代码的合同将无法验证该签名。

让我们添加一个按钮,当单击该按钮时,将弹出元掩码,使用eth_signTypedData_v3方法对数据进行签名。

一旦签署了上面定义的数据使用eth_signTypedData_v3方法我们得到了签名和签名分割成其r, s,和v组件并将其发送到智能合约将使用ercrecover这些参数和数据哈希恢复签名者的公钥。

拆分签名

编写智能合约。

就像我们定义了包含EIPdomain和要签名的数据的JS代码一样,智能合约也需要两个变量来表示每个EIPdomain的散列数据和我们的数据(在本例中是设置数据)。

使用 ercrecover

在UI端,我们对数据进行签名,并将r、s和v发送给智能合约。

上面的代码做了两件事,首先它散列数据并生成它们的散列。接下来,它使用该数据的散列(在SC中称为散列)和签名,使用ercrecover方法生成签名者的公钥。

上面显示的数据的两个kecak哈希值应该类似于在out JS代码中定义的数据结构。如果两者不同,则无法恢复签名者的地址。

签名数据的结构

将infura中的助记符添加到truffle-config.js文件(第3行),并指定部署者的地址(第18行)。上面的例子使用了rinkeby testnet,但是任何测试都可以使用,并查看truffle文档来部署到其他测试网。

然后部署合同。部署后复制simplestorage的地址,替换为verifyingContract下app.js第76行的地址。

部署代码片段

进入client目录,运行npm run start启动react应用。

按下' Press to sign '按钮,然后在元掩码弹出的签名请求上签名。接下来,确认交易以设置智能合约上的值。

交易完成后,刷新webapp以查看所反映的变化。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

[0:15ms0-0:969ms