引介 | 剖析以太坊的儲存成本
當我們開發智慧合約時,我們有幾種不同型別的可用儲存:
- 易失性棧訪問:堆疊(Stack)
- 易失性儲存器訪問:記憶體(Memory)
- 非易失性:儲存(Storage)
此外,我們還提供了背景資訊:
- 與合約相關的程式碼
- 訪問交易的資料欄位
如何使用不同的儲存型別
堆疊
除了 STOP,JUMPDEST 和 INVALID 操作以外,所有以太坊虛擬機器操作(EVM 操作碼)都使用堆疊來讀取或寫入。但是,還有能夠在不執行任何計算的情況下進行讀取或寫入資料的操作:
堆疊深度範圍從 0 到最大值 1024
- POP:獲取棧頂的值(級別 0)
- PUSH1...PUSH32 (PUSHX):在棧頂插入 X 個位元組
- DUP1…DUP16 (DUPX):複製棧頂 X 處的值
- SWAP1…SWAP16 (SWAPX):交換 X 處和棧頂的值
記憶體
訪問此記憶體(讀取或寫入)的操作有:
- CALLDATACOPY :讀取交易的資料欄位並將其載入到記憶體中
- CODECOPY :讀取與 當前合約 相關聯的程式碼並將其載入到記憶體中
- EXTCODECOPY :讀取與 外部合約 相關聯的程式碼並將其載入到記憶體中
- M LOAD :從記憶體讀取一個值
- M STORE :在記憶體中儲存一個詞或 32 位元組的值
- M STORE8 :在記憶體中儲存一個 8 位元組的值
儲存
與堆疊和記憶體不同,儲存在此記憶體中的資料在交易訪問的合約地址上是永久的。維護此記憶體的操作有:
- S LOAD
- S STORE
要注意分別代表儲存(Storage)和記憶體(Memory)的“S”和“M”。
成本
上述所有的操作都有以 Gas 為單位的操作成本。當用戶發起一筆交易時,他/她都會以 ETH 計價給出單位 Gas 的價格。礦工已經配置了最低的 Gas 價格,較高的最低 Gas 價格會給礦工帶來更多的利潤,但是會需要放棄更多的交易。這就形成了一個用單位 Gas 來交易 ETH 的市場。程式碼消耗的 Gas 越少,執行程式碼所需的資源就會越有效率。下表根據資料的大小,展示了不同操作碼的 Gas 開銷:
其中最昂貴的是非易失性儲存。當資料大小為幾 KB 時,使用記憶體操作與使用堆疊操作的 Gas 成本是差不多的,但當資料大小增加時,成本呈指數級增加。這種關係如下圖所示:
如果我們基於 ofollow,noindex">https://ethgasstation.info 網站設定 Gas 的 ETH 價格:
我們就可以用 ETH 價格來估算出每種儲存型別的成本:
上表的值是以 ETH 為單位的價格。礦工將打包價格更高的交易,因此當用戶為單位 Gas 支付更多的 ETH 時,他/她的交易就會被更快地打包進區塊中。
最後,我們可以設定一個美元對 ETH 的匯率,例如,1356.30 美元:
結論
將資料永久儲存在以太坊中是極其昂貴的。使用以太坊儲存資料沒有任何意義。以太坊應該只儲存正常執行所需要的資料,並將資料儲存委託給其他解決方案:如 Swarm、Filecoin、IPFS 等等。一個不錯的主意是將 默克爾樹 的根雜湊值作為資料篡改證明儲存在外部伺服器中。
此外,ETH 價格不可預知,可能的快速增長會導致操作的開銷(以法定貨幣為單位)增長到更高的級別。如果發生這種情況,礦工必須調整單位 Gas 的最低 ETH 價格,以重新調整開銷。
通過分析智慧合約的 Gas 開銷來控制操作的成本是非常重要的。
相關資料
- https://ethereum.github.io/yellowpaper/paper.pdf
- https://www.coindesk.com/ethereum-price/
- https://remix.ethereum.org
原文連結: https://medium.com/coinmonks/storing-on-ethereum-analyzing-the-costs-922d41d6b316
作者:Albert Palau
翻譯&校對:劉亞輝 Dev & Elisa
本文由作者授權 EthFans 翻譯及再出版。