Bitget下载

注册下载Bitget下载,邀请好友,即有机会赢取 3,000 USDT

APP下载   官网注册

如上所述,普通ETH交易可以';t让用户免气费,需要在事务中嵌入一个事务,也就是元事务,实现免气费。

本文将分析开源库openzeppelin/openzeppelin-contracts中元事务契约的实现,让你快速进入元事务实现的细节,从而深入探索更多的相关技术。

MetaFair涉及ECDSA、EIP712等知识。如果熟悉,可以跳过这一节,直接浏览具体的实现分析部分。

也称为哈希、散列和数字摘要。通过哈希函数,您可以将不同长度的信息转换成任意长度的可预测(确定性)结果。这是一种神奇的功能,可以把大量的信息变成简短的"指纹"可以用作摘要的数据。对于给定的输入,生成的"指纹"始终如一。。如果您的原始数据有任何细微的变化,生成的哈希值将会非常不同。以太坊采用Keccak-256算法。密码学中的

Ecdsa(椭圆曲线数字签名算法)是使用椭圆曲线密码的数字签名算法(dsa)的变体。

主要用于为数据(如文件)创建数字签名,以便您可以在不破坏其安全性的情况下验证其真实性。把它想象成一个真实的签名。你可以认出一些人';的签名,但你可以';不要在别人不知道的情况下伪造它们。

您不要将ECDSA与用于加密数据的AES(高级加密标准)混淆。ECDSA不会加密数据或阻止他人查看或访问您的数据。它可以防止的是确保数据没有被篡改。

如图所示,在以太坊中,ECDSA用于签名和恢复原始数据的哈希值。

用户A通过hash函数从原始数据中得到自己的hash值后,用自己的私钥对hash值进行签名,得到签名。有了这个签名和散列值任何人都可以从中恢复签名者的钱包地址,这里用户B可以恢复用户A的钱包地址.

EIP712

suggestionsforimprovementofethereum(EIPs).YoucanviewallEIPshere.。Eip712(以太坊类型的结构化数据哈希和签名)以太坊类型的结构化数据哈希和签名。

如果我们只关心字节串。签名数据是一个已经解决的问题。遗憾的是,在现实世界中,我们关注的是复杂的、有意义的信息,对结构化数据进行哈希处理非常重要,错误会导致系统安全属性的丢失。

该EIP旨在提高链上使用的离线消息签名的可用性。我们看到越来越多的人采用离线消息签名,因为它节省了汽油费,减少了区块链上的交易数量。当前签名消息是显示给用户的不透明的十六进制字符串。,关于组成消息的项目的上下文很少。

EIP712概述了一种编码数据及其结构的方案,该方案允许在签名时向用户显示数据以供验证。以下是用户签署EIP712消息时显示的示例。

Thisanalysisisaimedatopenzeppelin-version4.3.2ofthecontract

ECDsaisasolid-statelibraryimplementedbyopenzeppelin.它实现了从哈希值中恢复钱包地址的方法。当recover方法应用于bytes32时,可以直接在bytes32上调用它。.Recoveryfunctionsignature:thefunctionrecover(byte32hash,bytememorysignature)returnstheaddressinternally.。

[

forwardrequest结构定义了用于事务中签名的基本组件。不像以太坊交易,没有气价,因为智能合约的执行只关心气的消耗。。ForwardRequest中nonce的概念和以太坊中的类似,都是为了避免双花攻击。但是这里的nonce只由智能合约维护,与普通以太坊交易中的nonce无关。

EIP712的构造函数直接用于初始化。ThesignatureoftheconstructorofEIP712is:constructor(stringmemoryname,stringmemoryversion),wherethenameisthecontractnameandtheversionisthecontractversion.,它将用作EIP712签名验证的一部分。部署时会自动获取契约的地址、chainId等信息。这意味着即使有相同的ForwardRequest结构数据,合同地址或区块链网络也是不同的。,也会导致签名无效。

为了避免双花攻击,有必要在智能合约中维护nonce。

看到verify函数,我们知道需要恢复钱包地址。,至少需要ECDSA签名和用于签名的原始数据,而这里,,ECDSA签名的原始数据就是经过abi编码的keccak256(abi.encode(_TYPEHASH,req.from,req.to,req.value,req.gas,req.nonce,keccak256(req。数据))转发请求结构体数据的哈希值。然后通过调用ECDSA库中的recover函数,传入签名,就可以恢复签名人的钱包地址。

确保通过_nonce[req.from]==req.nonce按顺序调用事务。而且不会被双花攻击。Signer==req.from避免了实际元事务的签名者和发送者之间的不匹配。

接下来,让';让我们看看如何执行元事务。

当使用Address.call方法时。根据元事务参数,指定调用的gas和值。需要注意的是,这里元事务的数据字段并不直接作为调用操作的数据。相反,data和from是abi编码的,并用作调用操作的参数,这些参数将在目标契约(即req.to)中解析,以获得事务的发送方,下面将详细解释。

assert(gasleft()

req。gas/63)简单理解为防止中继器(代表它执行元交易的人)恶意或无意地使用足够低的gas使交易成功而元交易失败。。详情可在以太坊毒气危险中了解。

要支持元事务,仅仅实现元事务智能契约是不够的,因为目标契约无法知道实际的元事务来自谁。没有额外的措施,它将只能从msg.sender中获得,因为它是在元事务契约的实现中通过Address.call调用的,所以发送方将是元事务契约的地址。ERC2771解决了这个问题。

ERC2771Context继承了Context,从机msg.sender和msg.data只是简单的封装在Context中,以规范这两个函数的使用,并使它们能够修改自己在分包合同中的行为。。需要使用上下文契约来获取msg相关的数据,而不是直接使用msg.sender。

ERC2771Context修改上下文协定的方法。

首先通过isTrustedForwarder(msg.sender)验证元事务的调用方是元事务契约的预期地址。。汇编代码获取由req编码的数据部分的req.from。敬。呼叫{…}(ABI。已编码(请求。数据,请求。从))在上面的元交易契约中。,然后返回值。

Let';让我们尝试简单地使用元事务契约。为了支持元事务,您编写的契约必须继承ERC2771Context。在部署之前,只需在这里实现一个NFT契约。您必须首先部署元事务契约,并将元事务契约的地址作为参数传递给NFT契约构造函数。

在这个例子中,如果爱丽丝没有';如果你没有足够的钱来付煤气费,就要铸造一个NFT。,她可以签署一个元事务,元事务的数据由ABI获得。EncodewithSignature(函数选择器,Parmas…)。,用足够的ETH将元事务提交给Bob,Bob调用元事务契约minimalforwarder。execute(req,signature),以便Alice'的元事务可以成功执行。

以上就是如何实现元交易契约。实践中的智能合同开发:元交易系列2的细节关于元交易契约实现的更多信息,请关注dadaqq.coM其他相关文章(www.dadaqq.coM)!

本站提醒投资有风险,入市需谨慎。此内容不作为投资理财建议。

标签:智能合约元交易