当前位置:太原热线 > 新闻 > 国际

日本avav币交易所

2024-01-18 14:01:51

  译文出自:登链翻译计划译者:Tiny熊本文永久链接:learnblockchain.cn/article…

  每个人都在谈论 “无gas” 的以太坊交易,因为没有人喜欢支付gas费用。 但是以太坊网络的运行正是因为交易是付费的。 那么,你怎么才能“无gas”交易呢? 这是什么法术?

  在本文中,我将展示如何使用 “无 gas” 交易背后的模式。 你会发现,尽管以太坊没有免费的午餐之类的东西,但是你可以通过有趣的方式改变 gas 成本。

  通过运用本文中的知识,你的用户将节省大量 gas,享受更好的用户体验,甚至可以在你的智能合约中构建新颖的委派模式。

  可是等等! 还有更多! 为方便起见,我将所需的所有工具都放在了此存储库中。 因此,现在你实现 “无 gas” 代币的障碍就突然降低了很多。

  让我们开始吧。

  我不得不承认,即使我知道如何在智能合约中实现“无 gas”交易,但对于使它们成为可能的密码学我也知之甚少。 那对我来说不是障碍,所以对你也不应该是。

  据我所知,私钥用于签署发送给以太坊的交易,一些密码学魔术用于将我(签名者)识别为msg.sender。 这支撑了以太坊中所有访问控制。 “无 gas” 交易背后的法宝是,我可以使用我的私钥和要执行的智能合约交易进行签名。

  签名是在链下进行的,而无需花费任何 gas。 然后,我可以将此签名交给其他人,以他们的名义代表我执行交易。

  签名函数通常就是常规合约方法,但会使用其他签名参数进行扩展。 例如,在dai.sol中,我们有授权()函数:

  我们还具有许可函数,该功能与函数相同,但是将签名作为参数。

  不用担心所有这些额外的参数,我们将介绍它们。 你需要注意的是这两个函数都使用映射执行的操作:

  如果使用,则允许最多使用个代币。

  如果你给某人提供有效的签名,则该人可以调用以允许 使用你的代币。

  因此,基本上,“无 gas”交易背后的模式是制作可以提供给某人的签名,以便他们可以安全地执行特殊交易。 这就像授予某人执行函数的权限。

  这是一种授权模式。

  如果你像我一样,那么你要做的第一件事就是深入研究代码。 我立即注意到此注释:

  有了这个,我钻进了兔子洞,却无望地迷路了。 现在,我已经理解了,我可以用简单的方式来解释它。

  EIP712描述了如何以通用方式构建函数签名。 其他EIP描述了如何将EIP712应用。 例如,EIP2612描述了如何使用EIP712的签名应用于函数,其功能应与ERC20代币中的功能相同。

  如果你只想实现之前提到的签名功能,例如将签名批准添加到自己的MetaCoin,则可以阅读EIP2612 ,你甚至可以继承实现过的合约,并减轻生活压力。

  在本文中,我们将研究dai.sol中“无 gas”交易的实现。 这将使事情变得清晰。 dai.sol实现发生在EIP2612之前,会略有不同。 那不会有问题。

  EIP712签名的早期实现可以在dai.sol源码中找到 。 它允许Dai持有人通过计算链下签名并将其提供给支出者(spender)来批准转账交易,而不是自己调用approve函数。

  它包含下面几个部分:一个 . 一个 . 一个 变量. 一个 函数.

  这是,和相关变量:

  只不过是唯一标识智能合约的哈希。 它是由EIP712域(EIP712Domain)的字符串,包含代币合约的名称,版本,所在的chainId以及合约部署的地址构成。

  所有这些信息都在构造函数上进行hash 运算赋值到变量中,该变量在创建线下签名时由持有人使用,并且在执行时需要匹配。 这样可以确保签名仅对一个合约有效。

  这是:

  是函数名称(大写开头)和所有参数(包括类型和名称)的哈希。 目的是清楚地标志签名的函数。

  签名将在函数中处理,如果使用的不是该特定函数的签名,它将回退交易。 这样可以确保仅将签名用于预期的功能。

  然后是映射:

  该映射记录了特定持有人已使用了多少次签名。 创建签名时,需要包含一个值。 执行时,所包含的nonce 值必须与该持有人到目前为止使用的签名数完全匹配。 这样可以确保每个签名仅使用一次。

  所有这三个条件,即,和,确保每个签名仅用于预期的合约,预期的函数,并且仅使用一次。

  现在,让我们看看如何在智能合约中处理签名。

  permit是dai.sol里实现的函数,允许使用签名来修改持有人的 对spender授权的数量。

  如你所见,有很多参数。 它们是计算签名所需的所有参数,加上签名本身就是,和。

  你需要用参数创建签名似乎很愚蠢,但是你确实需要。 因为仅能从签名中恢复签名的地址。 我们将使用所有参数和恢复的地址来确保签名有效。

  首先,我们使用确保安全性所需的所有参数来计算。 作为签名创建的一部分,将需要在链下计算出完全相同的:

  使用和签名,我们可以恢复地址。 如果它是的地址,我们知道所有参数都匹配,,,,,和。 哪怕是任何一点内容没匹配,则签名被拒绝:

  请注意这里。 签名中有许多参数,其中一些参数有点模糊,例如 (它是 的一部分)。 它们中的任何一个不匹配都会导致签名被拒绝,并带有完全相同的错误提示,这让链下调试签名很困难。

  现在我们知道 批准了这个函数调用。 接下来,我们将证明签名没有被滥用。 我们检查当前时间是否在 (过期)之前,这保证了仅在特定时间内许可有效。

  我们还会检查签名中的 ,以便每个签名只能使用一次。

  这些检查都通过了! dai.sol使可以使用的的代币数量设置为最大值(即设置为最大),并触发一个事件,仅此而已。

  dai.sol合约对 使用的是二分法设置(译者注:要么是最大,要么是 0), 在代码库,有更传统的方法。

  创建签名也许需要通过一些实践才可以掌握它。 我们将分三步复制智能合约中的功能:生成 生成 创建交易签名

  以下函数将生成 。 它与dai.sol构造函数中的代码相同,但在JavaScript中实现,并使用ethers.js的,和,它需要代币名称和部署地址,以及。 假定代币版本为“1”。

  以下函数将为特定的调用生成。 注意,,, 和 作为参数传递。 为了清楚起见,它还传递了一个 参数,尽管你可以将其始终设置为 ,否则签名将被拒绝。从刚刚dai.sol复制。

  一旦我们有了,对其进行签名就相对容易了。 我们从[digest]中删除0x前缀后,使用ethereumjs-util中的。 请注意,我们需要用户私钥才能执行此操作。

  在代码中,我们将按以下方式调用这些函数:

  请注意,对的调用需要重用用于创建的所有参数。 只有在这种情况下,签名才有效。

  还要注意的是,此代码段中仅有的两个交易是由调用的。 是,是创建并签名的用户。 但是,并没有花费任何gas。

  将签名提供给,后者使用它来执行授权的 和。

  从 的角度来看,这是一次“无 gas”交易, 他没有花一分钱。

  本文介绍了如何使用“无Gas”交易,阐明了“无Gas”实际上意味着将Gas成本转移给其他人。 为此,我们需要一个智能合约中的功能,该功能可以处理预先签署的交易,并且需要进行大量的数据检验以确保一切安全。

  但是,使用此模式有很多好处,因此,它被广泛使用。 签名允许将交易 gas 成本从用户转移到服务提供商,从而在许多情况下消除了相当大的障碍。 它还允许实现更高级的委派模式,通常会对UX进行相当大的改进。

  已为您提供入门代码库,请使用它。

  本翻译由 Cell Network 赞助支持。

  原文链接:https://hackernoon.com/how-to-code-gas-less-tokens-on-ethereum-43u3ew4


本文标题:日本avav币交易所 - 国际
本文地址:www.0351net.com/news/guoji/253441.html

标签