我可以將我所有的 Ether 發送到 Payable 功能嗎?還是應該節省一點來支付Gas?
我對 EVM 的工作原理有很大的疑問,
假設我在 Wei (1 Ether) 中有1000000000000000000的 Ether 餘額,我想將其全部傳遞給應付函式,讓我們呼叫函式 buy():
Contract.buy({ from: '0x0...', value: 1000000000000000000 });
那會奏效嗎?意義; 這本身會扣除 GAS 成本嗎?
或者,相反…我必須自己估算 Gas 成本並從我發送的 Ether 中扣除?例如,如果我估計 50000 的 Gas,我會這樣做:
Contract.buy({ from: '0x0...', value: 999999999999950080, gas: 50000 });
哪種方法是正確的,為什麼?
提前致謝!
編輯(Swift 中的程式碼):
var options = Veev.options(gas: nil, from: addressFrom) let contract = web3.contract(contractABI, at: EthereumAddress(Rinkeby.address)) let parameters = [EthereumAddress("0x0.."), amountToBuy] as [AnyObject] guard let estimatedGas = web3.contract(contractABI, at: EthereumAddress(Rinkeby.address))?.method("buy", parameters: parameters, options: options)?.estimateGas(options: nil) else { return } options.gas = estimatedGas let value: BigUInt = BigUInt(ether) - BigUInt(estimatedGas) * BigUInt(5000000000) - 1 // 5000000000 is gas Price options.value = value
後者。進行交易所需的總乙太幣是
amount + gasLimit * gasPrice
(amount
即您發送的乙太幣數量)。因此,您需要留出足夠的乙太幣來支付交易可能花費的最大天然氣成本。在您需要 50000 天然氣的範例中,您希望發送
1 ether - 50000 * 1 gwei
並指定 1 gwei 的天然氣價格。
我可以將我所有的 Ether 發送到 Payable 功能嗎?還是應該節省一點來支付Gas?
可以,通過將gasPrice 設置為0。但實時我們不知道執行需要多少時間,這取決於具體情況。我在 etherscan 中看到一些交易的價值是 0。
請參閱以下連結: https ://etherscan.io/tx/0x173fd250d63a62bb407f214ff924b49e1c90593572eab1a8c523783f2aa58ba3
在您的範例中,您可以估計購買()函式的氣體,使用
Contract. buy.estimateGas({ from: '0x0...', value: 1000000000000000000})
將告訴方法將消耗多少氣體。所以沒有必要假設,但一些開發者抱怨它沒有返回準確的值。最好增加 5-10% 的額外價值。那是為了在上述方法中更安全的一面,假設您為 exec buy() 估計的 55000 氣體,那麼您需要向方法發送值是
1 ether - 55000 * 1 gwei