在以下情况下,谁将支付天然气?
假设我们有以下简单的函数。将合同中的金额发还给发件人。举个例子。
function withdraw() public payable
{
address member = msg.sender;
member.transfer(msg.value);
}方法的发件人显然将支付将事务发送到该方法并执行语句的费用。但是,谁将为将从该代码中创建的结果事务支付天然气?
其次,通常关于transfer()方法,默认参数是什么。我知道它使用的汽油上限是2100年,但是汽油价格呢?另外,这种气体是从合同余额中传递的价值还是从合同余额中传递出来的,整个价值都会被转移。
不要反对-投票的问题‘缺乏研究’,我知道通常的条件气体来自平衡,在交易价值的区别。特别是对transfer()方法的好奇。由于没有大量关于它的实现的文档,因为它与send()不同,所以我可以找到。
发布于 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://ethereum.stackexchange.com/a/38642/18932中找到更多的细节。
发布于 2018-02-05 19:18:53
方法的发件人显然将支付将事务发送到该方法并执行语句的费用。但是,谁将为将从该代码中创建的结果事务支付天然气?
也许我看得不对,但你基本上回答了,然后问这个问题。寄件人将支付煤气费。
其次,通常关于transfer()方法,默认参数是什么。我知道它使用的汽油上限是2100年,但是汽油价格呢?另外,这种气体是从合同余额中传递的价值还是从合同余额中传递出来的,整个价值都会被转移。
实际上,transfer()可以根据实体代码本身中的实际内容而有所不同。它不一定默认为21000。实际上,由于转账实际上是发送数据,而不仅仅是直接的应付交易,所以您必须设置一个更高的气体限额。
至于汽油价格和汽油限值,您的实际函数调用已经有了根据代码本身的复杂性,它将使用的气体的范围或级别,其中大部分来自添加/更改存储。
默认的天然气价格是由您用来发送呼叫本身的介质决定的。例如,web3检查使用的网络的现状,并在5-10秒内得到确认的基础上动态地设定汽油价格。
气体限制也是由web3根据预期的气体使用量来动态设定的。21000通常用于没有额外数据的应付转帐。
发布于 2018-02-03 11:06:00
好样的,来到你的拳头杯里:
方法的发件人显然将支付将事务发送到该方法并执行语句的费用。但是,谁将为将从该代码中创建的结果事务支付天然气?
msg.sender会付煤气费。即提取()方法调用者将支付交易成本。一旦您的交易被验证并添加到区块链矿工将得到奖励。
来到你的第二关:
您可以通过指定gas和gasPrice以及sendTransaction()函数的from和to值来设置天然气和天然气价格值。
web3.eth.sendTransaction({from: 'myWallet', to: 'coinbaseWallet', value: web3.toWei(0.1,'ether'),gas: 5000, gasPrice: web3.toWei(40,'gwei')});https://ethereum.stackexchange.com/questions/38387
复制相似问题