我想从账户A进行以太坊交易,但交易费用应从账户B支付。 在以太坊中可能吗?
目前,没有任何内置条款允许其他用户为特定交易支付天然气费。然而,通过退还用户来支付 Gas 费的合约概念是存在并且可以实现的。当然,这开启了对该功能进行攻击以耗尽资金的可能性。
这里正在对未来版本(Serenity)进行讨论,该版本可以解决仅发送交易的帐户支付费用的概念。
以太坊没有对该功能的内置支持。但有一种流行的方法可以解决这个问题,称为加油站网络(又名 GSN)。 OpenGSN (https://opengsn.org/) 提供了一个实现。 要快速掌握这个想法,请阅读(现已弃用)https://docs.openzeppelin.com/learn/sending-gasless-transactions
让我引用OZ文档中的相关部分:
这是一个简单想法的奇特名称:第三方(称为 中继者)可以发送另一个用户的交易并自行支付 天然气成本。在此方案中,用户签署消息(而不是交易) 包含有关他们想要执行的交易的信息。 然后中继者负责签署有效的以太坊交易 将此信息发送到网络,支付费用 天然气成本。基础合约保留用户的身份 最初请求交易。这样用户就可以进行交互了 直接使用智能合约,无需拥有钱包或自己的 乙醚。
这意味着,为了支持您的元交易 应用程序,您需要保持中继器进程运行 - 或利用 去中心化的中继网络。
不,gas 始终由发送交易的帐户支付。
以太坊网络对此没有原生支持。
然而,这个特定问题现在已经被积极讨论了一段时间。
虽然上面的问题主要讨论的是
account B
为account A
进行代币转账并为account B
赚取一些代币作为费用。
用户甚至在 http://lavawallet.io
提到了完整的工作示例到目前为止,可以使用
Permit
功能。这种交易也称为gasless transaction
。
使用erc20为了发送代币,我们必须首先批准交易以允许地址转移,然后我们调用
transferFrom
。有了许可,我们将只调用一个函数,而不是调用两个函数。
对于无gas交易,我们将在链外签署交易,这样我们就不会支付任何gas费用。然后我们将签名的
v,r,s
发送到Permit函数,经过一些检查,如果我们通过了所有检查,permit()
将调用approve
进行交易,然后消费者就可以执行交易了。
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
只有当钱包是合约时才可以这样做。一般来说有2种类型的账户
我们可以通过合约地址来实现你的目标,用户存款并可以做任何事情,之后如果我们想要进行提现或转账交易,用户支付交易费用,结果资金从合约钱包转移到其他钱包。
任何人给我代码或任何我可以控制我的钱包A的东西,但是如果我转移任何硬币,它会自动发送到黑客钱包,所以我需要将nfts从我的钱包发送到钱包B,并且汽油费也将由钱包B支付有可能吗?