Truffle
在主網上部署合約的真實價格是多少?
我正在嘗試在主網上部署合約,但在使用 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 個因素會影響估計的部署成本:
- 32k gas 的固定費用。在合約創建期間呼叫的 CREATE 操作碼花費固定的 32k gas。這當然是在正常 tx 的 21k gas 之上。注意:在從 EOA(非合約地址)創建合約期間,不會顯式呼叫 CREATE 操作碼。tx 的返回值實際上是用來創建合約的,但是固定的 32k 費用是一樣的。
- 已編譯合約中的字節碼數量。更多的字節碼意味著更多的儲存空間,每個字節需要 200 gas。這加起來很快。請注意,繼承的父合約也包含在字節碼中。
- 發送數據。您作為 tx 數據發送的所有字節碼都需要 68 個非零字節和 4 個零字節。
- 程式碼在合約創建之前實際執行,例如合約的建構子。如果建構子需要大量計算來生成字節碼,那麼它會非常昂貴。
- 天然氣價格。你使用的gas價格越高,它的成本就越高。請參閱 ethgasstation.info,了解現在可以使用的良好汽油價格。在撰寫本文時,2 gwei 是一個快速使用的 gas 價格。
- 氣體限制。讓您用於部署的任何工具為您估計這一點,然後將其提高一些。它會返回未使用的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)的固定數字和後續數學
如果你的合約成本那麼高,那麼你必須做一堆儲存初始化。到目前為止,儲存的讀/寫成本最高。
具有諷刺意味的是,在記憶體中重做事情的成本更低,因此如果您有一些變數可以重新初始化和重新計算,那麼每次呼叫合約方法時最好在記憶體中這樣做。