首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合同address.transfer法煤气成本

合同address.transfer法煤气成本
EN

Ethereum用户
提问于 2018-02-03 06:55:45
回答 3查看 14.5K关注 0票数 18

在以下情况下,谁将支付天然气?

假设我们有以下简单的函数。将合同中的金额发还给发件人。举个例子。

代码语言:javascript
复制
    function withdraw() public payable 
    {
       address member = msg.sender;
       member.transfer(msg.value);
    }

方法的发件人显然将支付将事务发送到该方法并执行语句的费用。但是,谁将为将从该代码中创建的结果事务支付天然气?

其次,通常关于transfer()方法,默认参数是什么。我知道它使用的汽油上限是2100年,但是汽油价格呢?另外,这种气体是从合同余额中传递的价值还是从合同余额中传递出来的,整个价值都会被转移。

不要反对-投票的问题‘缺乏研究’,我知道通常的条件气体来自平衡,在交易价值的区别。特别是对transfer()方法的好奇。由于没有大量关于它的实现的文档,因为它与send()不同,所以我可以找到。

EN

回答 3

Ethereum用户

回答已采纳

发布于 2018-02-05 19:10:46

谁将为由此产生的事务支付天然气,该事务将由该代码创建?

transfer()函数不会产生事务。它在由一个讯息呼叫发起的原始事务中产生一个外部帐户。不管代码中有多少transfer()call()调用,区块链都会记录单个事务。天然气成本将从启动交易的外部账户中扣除。

我知道它使用的汽油上限是2100年,但是汽油价格呢?

使用启动交易的外部帐户所有者指定的天然气价格。

另外,这种气体是从合同余额中传递的价值还是从合同余额中传递出来的,整个价值都会被转移。

天然气成本不会从合同中扣除,而是从启动交易的外部账户中扣除。天然气成本是在传递的价值的基础上增加的。外部帐户的余额必须大于或等于value + gaslimit * gasprice

只是对transfer()方法非常好奇。由于没有关于它的实现的大量文档,因为它与send()不同,所以我可以找到。

发送以太时,请注意使用someAddress.send()someAddress.transfer()someAddress.call.value()()之间的相对权衡:

  • someAddress.send()someAddress.transfer()被认为对重入是安全的。虽然这些方法仍然触发代码执行,但被调用的合同只给2,300名gas的津贴,这目前仅足以记录一个事件。
  • x.transfer(y)等同于require(x.send(y)),如果发送失败,它将自动恢复。
  • someAddress.call.value(y)()将发送所提供的以太并触发代码执行。被执行的代码被赋予用于执行的所有可用气体,使得这种类型的值传输不安全,不容易重入。

使用send()transfer()将防止重入,但这样做的代价是不符合任何回退功能需要超过2300个气体的合同。也可以使用someAddress.call.value(ethAmount).gas(gasAmount)()来传送一个定制的气体量。

试图平衡这一权衡的一种模式是同时实现推拉机制,使用send()transfer()作为push组件,使用call.value()()处理拉组件。

值得指出的是,单独使用send()transfer()进行价值转移本身并不能使合同免受重入的威胁,而只是使这些特定的价值转移不受重入的影响。

可以在这里阅读更多https://consensys.github.io/smart-contract-best-practices/recommendations/#be-aware-of-the-tradeoffs-between-send-transfer-and-callvalue

您可以在这个答案https://ethereum.stackexchange.com/a/38642/18932中找到更多的细节。

票数 24
EN

Ethereum用户

发布于 2018-02-05 19:18:53

方法的发件人显然将支付将事务发送到该方法并执行语句的费用。但是,谁将为将从该代码中创建的结果事务支付天然气?

也许我看得不对,但你基本上回答了,然后问这个问题。寄件人将支付煤气费。

其次,通常关于transfer()方法,默认参数是什么。我知道它使用的汽油上限是2100年,但是汽油价格呢?另外,这种气体是从合同余额中传递的价值还是从合同余额中传递出来的,整个价值都会被转移。

实际上,transfer()可以根据实体代码本身中的实际内容而有所不同。它不一定默认为21000。实际上,由于转账实际上是发送数据,而不仅仅是直接的应付交易,所以您必须设置一个更高的气体限额。

至于汽油价格和汽油限值,您的实际函数调用已经有了根据代码本身的复杂性,它将使用的气体的范围或级别,其中大部分来自添加/更改存储。

默认的天然气价格是由您用来发送呼叫本身的介质决定的。例如,web3检查使用的网络的现状,并在5-10秒内得到确认的基础上动态地设定汽油价格。

气体限制也是由web3根据预期的气体使用量来动态设定的。21000通常用于没有额外数据的应付转帐。

票数 2
EN

Ethereum用户

发布于 2018-02-03 11:06:00

好样的,来到你的拳头杯里:

方法的发件人显然将支付将事务发送到该方法并执行语句的费用。但是,谁将为将从该代码中创建的结果事务支付天然气?

msg.sender会付煤气费。即提取()方法调用者将支付交易成本。一旦您的交易被验证并添加到区块链矿工将得到奖励。

来到你的第二关:

您可以通过指定gas和gasPrice以及sendTransaction()函数的from和to值来设置天然气和天然气价格值。

代码语言:javascript
复制
web3.eth.sendTransaction({from: 'myWallet', to: 'coinbaseWallet', value: web3.toWei(0.1,'ether'),gas: 5000, gasPrice: web3.toWei(40,'gwei')});
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/38387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档