可以从以太坊的另一个账户支付交易费吗?

问题描述 投票:0回答:7

我想从账户A进行以太坊交易,但交易费用应从账户B支付。 在以太坊中可能吗?

blockchain ethereum web3js geth
7个回答
2
投票

目前,没有任何内置条款允许其他用户为特定交易支付天然气费。然而,通过退还用户来支付 Gas 费的合约概念是存在并且可以实现的。当然,这开启了对该功能进行攻击以耗尽资金的可能性。

这里正在对未来版本(Serenity)进行讨论,该版本可以解决仅发送交易的帐户支付费用的概念。


2
投票

以太坊没有对该功能的内置支持。但有一种流行的方法可以解决这个问题,称为加油站网络(又名 GSN)。 OpenGSN (https://opengsn.org/) 提供了一个实现。 要快速掌握这个想法,请阅读(现已弃用)https://docs.openzeppelin.com/learn/sending-gasless-transactions

让我引用OZ文档中的相关部分:

这是一个简单想法的奇特名称:第三方(称为 中继者)可以发送另一个用户的交易并自行支付 天然气成本。在此方案中,用户签署消息(而不是交易) 包含有关他们想要执行的交易的信息。 然后中继者负责签署有效的以太坊交易 将此信息发送到网络,支付费用 天然气成本。基础合约保留用户的身份 最初请求交易。这样用户就可以进行交互了 直接使用智能合约,无需拥有钱包或自己的 乙醚。

这意味着,为了支持您的元交易 应用程序,您需要保持中继器进程运行 - 或利用 去中心化的中继网络。


0
投票

不,gas 始终由发送交易的帐户支付。


0
投票

以太坊网络对此没有原生支持。
然而,这个特定问题现在已经被积极讨论了一段时间。
虽然上面的问题主要讨论的是

account B
account A
进行代币转账并为
account B
赚取一些代币作为费用。

用户甚至在 http://lavawallet.io

提到了完整的工作示例

0
投票

到目前为止,可以使用

Permit
功能。这种交易也称为
gasless transaction

使用erc20为了发送代币,我们必须首先批准交易以允许地址转移,然后我们调用

transferFrom
。有了许可,我们将只调用一个函数,而不是调用两个函数。

对于无gas交易,我们将在链外签署交易,这样我们就不会支付任何gas费用。然后我们将签名的

v,r,s
发送到Permit函数,经过一些检查,如果我们通过了所有检查,
permit()
将调用
approve
进行交易,然后消费者就可以执行交易了。

这来自 Uniswap ERC721Permit.sol

  function permit(address spender,uint256 tokenId,uint256 deadline,uint8 v,bytes32 r,bytes32 s
    ) external payable override {
        // set a deadline for the transaction
        require(_blockTimestamp() <= deadline, 'Permit expired');
        bytes32 digest =
            keccak256(
                abi.encodePacked(
                    '\x19\x01',
                    // DOMAIN_SEPARATOR a hash value that calculated to ensure uniquness of the signature
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, spender, tokenId, _getAndIncrementNonce(tokenId), deadline))
                )
            );
        address owner = ownerOf(tokenId);
        require(spender != owner, 'ERC721Permit: approval to current owner');
        // this function uses assembly extcodesize func to check if the adddress is a contract 
        if (Address.isContract(owner)) {
            require(IERC1271(owner).isValidSignature(digest, abi.encodePacked(r, s, v)) == 0x1626ba7e, 'Unauthorized');
        } else {
            address recoveredAddress = ecrecover(digest, v, r, s);
            require(recoveredAddress != address(0), 'Invalid signature');
            require(recoveredAddress == owner, 'Unauthorized');
        }
         // after passing all the checks,we approve the spender to transfer the token
        _approve(spender, tokenId);
    }
}

您可以阅读EIP712


0
投票

只有当钱包是合约时才可以这样做。一般来说有2种类型的账户

  1. 有私钥的账户(普通钱包)
  2. 没有私钥的账户(合约钱包)

我们可以通过合约地址来实现你的目标,用户存款并可以做任何事情,之后如果我们想要进行提现或转账交易,用户支付交易费用,结果资金从合约钱包转移到其他钱包。


0
投票

任何人给我代码或任何我可以控制我的钱包A的东西,但是如果我转移任何硬币,它会自动发送到黑客钱包,所以我需要将nfts从我的钱包发送到钱包B,并且汽油费也将由钱包B支付有可能吗?

© www.soinside.com 2019 - 2024. All rights reserved.