本文档是关于 Gas Station Network (GSN) 的常见问题解答,GSN 是一个去中心化的 Relayer 网络,允许用户在无需支付 Gas 费的情况下与以太坊应用交互。开发者需要集成 GSNRecipient 合约到他们的智能合约中,并通过 RelayHub 支付用户的 Gas 费用。GSN 旨在解决用户加入以太坊应用的难题,并提供多种支付策略和安全保障。
GSN Provider 已弃用。我们不再开发新功能或解决问题。阅读此处以获取更多信息。
GSN 代表 Gas Station Network。GSN 最初由 TabooKey 构思和设计,现已发展到包括以太坊领域的许多公司,他们希望共同努力解决用户加入以太坊应用程序的问题。
Gas Station Network 是一个中继器的去中心化网络,可用于签名和发送以太坊交易,而无需原始发送者(最终用户)支付 gas 费用。
用户签署消息(不是交易),其中包含他们想要的交易的信息以及他们想要传递的参数。然后,中继器负责使用此信息签署有效的以太坊交易,并且继承的 GSNRecipient
合约保留最初请求交易的用户的身份。这样,用户可以直接与智能合约交互,而无需拥有钱包或拥有 ETH。
由于 GSN 的主要目的是解决用户加入问题,因此预计 (d)app 开发者本身将负责支付用户的 gas 费用。在这种情况下,gas 费用应被视为用户获取的成本。
或者,GSN 可以用于更具体的情况,例如从 DAO 金库账户支付 DAO 用户的交易费用,或者用户通过反事实部署的智能合约支付交易费用的合约。
通常,在与以太坊网络和智能合约交互时,用户需要以 ETH 的形式支付 gas 费用,以补偿网络处理交易的成本。
使用 GSN 时,以太坊网络仍然需要 gas 作为支付费用来签署交易,但用户不再需要支付。相反,中继器网络通过以用户的名义签署交易来支付 gas 费用,然后中继器直接由用户希望与之交互的合约退款。
为了让中继器支付签署交易的 gas 费用,需要用户与之交互的合约启用 GSN。要启用 GSN,合约必须从 OpenZeppelin Contracts 库中的 GSNRecipient
合约继承。
不,中继器只能支付符合 GSN 规范的已启用 GSN 合约的交易签署 gas 费用。目前不支持对非 GSN 启用合约的任意合约调用,或诸如发送 ETH 或挖掘 ETH 等任务。
虽然中继器为用户支付 gas 费用,但这并不意味着他们可以访问用户的私钥。GSNRecipient
合约有一个名为 \_msgSender()
的实用函数,该函数用于代替 solidity 系统变量 msg.sender
,并返回用户的真实地址 - 即使交易是由中继器的私钥签名的。
用户私钥永远不会共享或暴露给中继器。
GSN 网络和智能合约已经过 OpenZeppelin 的审计,被认为是安全的。由于中继器无法访问用户的私钥,因此不存在通过被盗私钥窃取用户资金的危险。
最初的 Gas Station Network EIP: 1613 列出了针对中继网络的几种理论攻击,这些攻击已通过软件实现得到解决,中继网络应被认为是安全的。
与往常一样,打算存储大量价值的应用程序应仔细考虑其软件架构设计,以最大程度地减少未考虑的边缘情况的机会,这些情况可能导致安全性降低和资金损失。
GSNRecipient
合约有一个名为 \_msgSender()
的实用函数,该函数返回进行合约调用的用户的真实地址。函数 \_msgSender()
应代替 solidity 系统变量 msg.sender
使用。
GSN 网络的构建是为了与当前状态的以太坊网络兼容。这意味着对于中继交易,msg.sender
将返回签名交易的中继器的地址,而不是请求交易的用户。使用 msg.sender
的合约与 Gas Station Network 本身不兼容。如果你的合约需要识别 GSN 驱动的交易的发起者,则必须从 OpenZeppelin Contracts 库中的 RelayHub
合约继承 \_msgSender()
函数。
(D)app 所有者可以选择基本预定义的支付策略或构建自己的支付策略。OpenZeppelin Contracts GSNRecipient
合约提供了预先和事后支付Hook,可用于验证合约函数和用户是否有资格获得中继支付的交易成本,并允许用户以token而不是 ETH 支付中继费用。
在决定支付多少以及支付多少时,(d)app 所有者应考虑他们期望的总支付成本是多少,以及他们将如何识别谁是他们的用户。由 (d)app 所有者决定他们将如何识别谁是有资格的用户。
要使用 GSN,用户无需拥有 ETH,甚至无需拥有像 Metamask 这样的钱包。这使其成为创建可在移动设备和桌面上同样通用的 (d)app 的理想选择。
使用 GSN,私钥(密钥对)仅用于签署消息以供中继器处理为正常的以太坊交易。用户无需在此密钥对上存储价值,因此可以调整此密钥对所需的安全性以匹配 (d)应用程序的要求。
预计在大多数用例中,用户的密钥对将在浏览器中临时生成。对于持久密钥对,(d)app 可以将此密钥对存储在本地存储中,或利用传统的 web2 技术向用户呈现典型的 web2 登录体验。
虽然 GSN 不需要像 Metamask 这样的钱包提供商,但可以将钱包提供商与 GSN 结合使用以实现新颖的用例。一个例子是应用程序要求用户通过正常的(非 gsn)以太坊交易注册,然后在一段时间之后,他们不需要使用 Metamask 签署每笔交易,而是交易将由 GSN 中继处理。对于需要大量交易的应用程序来说,这可能非常方便,并且每次交易的确认弹出窗口都会分散注意力或提供不良的用户体验。
OpenZeppelin 将制作多个指南和教程,以帮助开发人员将 GSN 集成到他们的智能合约和 (d)应用程序中。该过程非常简单,仅涉及在智能合约中继承 GSNRecipient
合约。由开发人员决定他们希望用户何时以及如何通过 GSN 网络发送交易。
GSN 网络的一个有趣的用例是允许用户通过信用卡支付交易费用。一个可能的工作方式的示例是直接向用户收取token费用,然后token用于通过 (d)应用程序访问服务。这些token可以保存在表示用户余额的合约中,并且在使用 GSN 进行交易时,可以减少他们的token余额以支付每笔交易的“成本”。
GSN 网络是开源的,任何人都可以免费运行中继器。设想会有许多独立的中继器,每个中继器都提供不同的正常运行时间保证和服务定价。启用 GSN 的应用程序可以自由使用他们选择的任何中继器,(d)应用程序不需要运行中继器。
中继提供商在 RelayHub
中存入抵押品,而 (d)app 所有者存入余额。
(D)app 所有者存入的余额用于报销中继器中继交易的成本以及少量费用,以便他们能够支付其费用并有望获利。
中继提供商需要将抵押品存入 RelayHub
以确保良好行为。如果中继器的行为不当(例如,尝试重复使用 nonce),则他们的押金可能会被削减并由其他中继器收取,然后这些中继器可以在链上证明中继器的不良行为。这种制衡系统是保持 GSN 安全并确保对网络的一些形式的攻击不会升级的功能之一。
不需要。智能合约应用程序用于支付用户 gas 费用的资金存储在经过审计的 RelayHub
合约中。此合约已部署在每个网络(测试网、主网等)上的相同地址,不需要由 (d)app 开发人员管理。
开发人员需要确保存储在 RelayHub 上的余额足以支付用户交易的成本。如果没有足够的余额来支付中继交易的成本,则在余额增加之前,不会为智能合约应用程序处理任何交易。
OpenZeppelin 创建了多个方便的基于 Web 的工具来管理你的应用程序的 GSN 交易。有一个用于 (d)app 开发人员 的工具,以及用于 中继器 的工具。
由于 GSN 不需要用户提供的提供商,例如 Metamask,因此它可以在有或没有用户提供的提供商的情况下正常工作。开发人员仍然需要将 (d)app 连接到 web3 提供商,例如通过 Infura 接收事件或查询以太坊区块链。
- 原文链接: docs.openzeppelin.com/gs...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!