W3Schools



合同是否有可能支付因调用合同而产生的天然气成本(或部分成本)?或者消息的发送者是否总是支付由此产生的天然气费用?

contract-designtransactionsgascontract-invocation
7个回答
30

目前,发起交易的用户必须支付费用。然而,Serenity可能会实现“合同支付”计划。 (见Vitalik的博客文章这里) A possible work around is a contract which refunds the sender however this would still require the user to hold some Ether and might allow malicious parties to repeatedly call the contract to deplete its funds.


5

并非所有合同上的电话都需要燃气。这就是所谓的“干跑”。HTTPS://GitHub.com/ether EU M/go-ether EU M/wiki/contracts-安定-transactions#interacting-with-contracts

现在,所有在abi中指定的函数调用都可用   合同实例。您可以在合同上调用这些方法   实例和链sendTransaction(3,{from:address})或call(3)to   它。两者之间的区别在于呼叫执行“干运行”   在本地,在您的计算机上,而sendTransaction实际上将提交   您的交易是否包含在区块链中以及结果中   它的执行最终将成为全球共识的一部分。在   换句话说,如果您只对返回值感兴趣,请使用call   如果您只关心“副作用”,请使用sendTransaction   合同状态。

因此,有可能在合同中向用户提供零气体成本的方法 - 在上面的例子中它是乘法函数。


1

目前尚未与EIP进行讨论。加文伍德说现在有办法做到这一点,但从我的理解来看,这是一种黑客行为。


1

首先,我想感谢@eth和@ medvedev1088的回答。 @eth表示

这就像你可以开车到银行取钱,但你需要先加油才能开车去银行:银行在你开车去银行之前不能给你发油。

我认为每个研究实用代币的人都面临着这个初始问题。我非常关心开发人员,因为要求用户从交易所或当地人那里购买以太坊是不方便用户的。因此,我寻找解决'第一令牌问题'的可能解决方案。 @ medvedev1088的答案似乎是第一眼的解决方案。在测试之前我没有意识到,但经过我已经完成的测试后,我可以很容易地说出来

收件人通过向智能合约提交签名的邮件来申请付款。智能合约验证其真实性,然后释放资金。

他的博客 is a bit misleading. Because anyone who wants to interact with smart contract for the first time needs gas.

如果您有自己的专用网络,可以使用以下代码进行测试。 (在执行之前,您需要部署至少6个以太的合同,并从您的coinbase帐户部署它)

代码可以在中找到这个小提琴

我希望,我没有误解@ medvedev1088的第一个方法。


0

刚刚发布了一个小型库,可以添加委派交易创建的能力(费用支付):HTTPS://GitHub.com/比特clave/fee less

你只需要:

  1. 继承您的智能合约Feeless smart contract
  2. feeless modifier for any methods you wanna allow to call indirectly
  3. 使用msgSender instead of msg.sender in these methods and methods internally called by them

任何人都可以以完全不信任的方式为任何其他人支付费用。例如,服务可以为用户交易支付费用,并用自己的代币费来补偿这笔费用。