Web3js

如何優化合約 send() 函式中的 gasPrice 和 gas 選項?

  • September 9, 2018

關於估計消耗的氣體量有很多問題和答案。這個問題是關於如何處理這個估計。

我們應該在選項中實際提供什麼價值gas,以確保交易順利進行,但我們不會支付太多:gasPricesend()

myContract.methods.myMethod(123).send({
   from: myAddress,
   gas: myGasLimit,
   gasPrice: myGasPrice
   }, function(error, transactionHash){
   ...
});

大多數人似乎建議將gas選項設置為 10-20% 以上estimatedGas(可以通過 web3 界面檢索)。

但是估計錯誤的情況呢?因為未使用的氣體被退回,為什麼不將最大值設置為巨大的呢?怎麼樣gasPrice,我們應該把它留給礦工還是實際設置一個值?

到目前為止,我沒有為發送選項gasgasPrice在發送選項中提供任何值,這導致錢包之間實際支付的 gas 數量差異很大。在帶有 MetaMask 的瀏覽器中,合約部署成本為 0.000633134 Ether (在 Rinkeby 上),而在CoinbaseWallet中的相同部署成本為 0.01268828 Ether(也在 Rinkeby 上)。顯然gasPrice,CoinbaseWallet 的交易是 20 GWei,而 MetaMask 交易是 1 GWei。

編輯:澄清這個問題:

為了讓我的問題更清楚:我上面連結的問題是關於 getEstimate 函式的局限性,我在這裡詢問使用此函式進行估算後的最佳實踐。

有一個估計,我為gasgasPrice欄位提供什麼值來限制支付過多和在即將到來的第一個區塊中被拾取的風險?

讓我們在這裡假設該方法是我們自己的,並且我們知道估計或多或少是正確的(不可能有狀態變化使氣體消耗大大增加)。

從目前的答案我可以得出結論:不要將氣體限制設置得太高(所以 10-20%-higher-than-the-estimate-rule 聽起來不錯?)

關於gasPrice:我做了一些實驗,發現 MetaMask 使用了 dapp 設置的值,而 CoinBaseWallet 忽略了它。所以也許讓錢包(如果可能的話,最終使用者)決定是要走的路嗎?

設置上限的利弊gas

  • pro:交易不太可能耗盡gas。
  • pro:由於它是估計的 gas 使用量的代表,礦工可能會被說服優先考慮此交易,因為它暗示了高回報(特別是結合 gas 價格,見下文),而未使用的 gas 無論如何都會被退回(但見下文)。
  • con : 交易的實際使用量可能比您準備花費的多,例如由於某些循環或其他意外數量的操作執行。
  • con:在一個out of gas事件中,所有的gas都將被沒收:當gas用完時,交易失敗,但不會退還花費在gas上的乙太幣。
  • 缺點:理論上我認為你可以找到一個為某些 EVM 操作分配更高gas使用量的礦工,從而比標準礦工使用更多的gas。

設置(願意支付)高的利弊gasPrice

  • :您的交易將更有可能被包含在下一個區塊中,因為礦工通常會首先選擇天然氣價格高的交易,特別是如果相關的天然氣限制(估計天然氣使用的代理)很大。
  • 缺點:即使沒有多少交易競爭包含在下一個區塊中,你實際上也會支付這個 gas 價格。

因此,對於 gas 限制,您希望根據交易的實際參數以及您的交易訪問和使用的目前儲存狀態進行良好的估計,並確實增加一點餘量來解釋所述估計之間的狀態變化以及交易的實際執行,因為您不想因為那裡的輕微增加而耗盡氣體(因此將所有氣體都花在失敗的交易上)。

至於gas價格,理想情況下,您會讓最終使用者根據“快速”(下一個區塊)交易、“平均”交易(在一分鐘內?)和“便宜”的目前執行平均值來選擇交易。對於這些執行平均值,您可以參考ETH Gas Station

Coinbase 錢包似乎將 gas 價格設置為 20 GWei,這相當高。轉移乙太幣或購買代幣時很好,但在呼叫合約的某些功能時,交易成本可能會令人望而卻步。錢包應該讓他們的使用者可以選擇設置 gas 價格,並具有良好的相關使用者體驗。

我認為這是一個重要的話題。

不投入大量資金的原因是交易可能會恢復,並且在某些情況下會消耗你所有的 gas。

此外,如果函式以某種方式與時間相關,估計也會發生變化,這意味著要執行的程式碼取決於先前的指令。也就是說,如果您知道您正在執行的功能,您可以確定讓節點決定必要的氣體是否方便。

希望這有幫助

引用自:https://ethereum.stackexchange.com/questions/58334