Truffle

在主網上部署合約的真實價格是多少?

  • May 21, 2021

我正在嘗試在主網上部署合約,但在使用 Truffle 部署時遇到了一些問題。

➜  ballot git:(master) ✗ truffle migrate --network mainnet --dry-run
Using network 'mainnet' (dry run).

Running migration: 1_initial_migration.js
 Deploying Migrations...
Error encountered, bailing. Network state unknown. Review successful transactions manually.
sender doesn't have enough funds to send tx. The upfront cost is: 670197500000000000 and the sender's account only has: 120000000000000000

根據這個錯誤,部署合約將花費 0.67 ETH(約 750 美元)。我覺得這很難相信。

程式碼複雜度會影響部署價格嗎?不知道還會是什麼。

您的部署成本基於 5 個因素,其中第 6 個因素會影響估計的部署成本:

  1. 32k gas 的固定費用。在合約創建期間呼叫的 CREATE 操作碼花費固定的 32k gas。這當然是在正常 tx 的 21k gas 之上。注意:在從 EOA(非合約地址)創建合約期間,不會顯式呼叫 CREATE 操作碼。tx 的返回值實際上是用來創建合約的,但是固定的 32k 費用是一樣的。
  2. 已編譯合約中的字節碼數量。更多的字節碼意味著更多的儲存空間,每個字節需要 200 gas。這加起來很快。請注意,繼承的父合約也包含在字節碼中。
  3. 發送數據。您作為 tx 數據發送的所有字節碼都需要 68 個非零字節和 4 個零字節。
  4. 程式碼在合約創建之前實際執行,例如合約的建構子。如果建構子需要大量計算來生成字節碼,那麼它會非常昂貴。
  5. 天然氣價格。你使用的gas價格越高,它的成本就越高。請參閱 ethgasstation.info,了解現在可以使用的良好汽油價格。在撰寫本文時,2 gwei 是一個快速使用的 gas 價格。
  6. 氣體限制。讓您用於部署的任何工具為您估計這一點,然後將其提高一些。它會返回未使用的gas,但只要確保至少提供了它需要的gas,否則它會失敗,你仍然需要支付gas。

總體而言,如果您使用簡單的建構子和 5k 字節的編譯字節碼部署合約,您將大致支付:

創建 32k

德克薩斯州 21k

契約程式碼 5k*200

估計非零發送字節 5.5k*(.95*68)

估計零發送字節 5.5k*(.05*4)

建設者 1k

這大約是 141 萬氣體,小於 $ 5 USD right now. Gas prices were 20x what they are now a couple weeks ago, so you could have paid $ 100 用於創建相同的契約。

您可以在黃皮書中閱讀有關基於字節碼的成本的更多資訊

如果您需要幫助優化契約,我願意提供幫助,但不是免費的。

編輯:在 #2 和 #4 之間添加了 #3

編輯 2:非零 txdata 成本(64 => 68)的固定數字和後續數學

如果你的合約成本那麼高,那麼你必須做一堆儲存初始化。到目前為止,儲存的讀/寫成本最高。

具有諷刺意味的是,在記憶體中重做事情的成本更低,因此如果您有一些變數可以重新初始化和重新計算,那麼每次呼叫合約方法時最好在記憶體中這樣做。

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