Aptos Labs 於10 月14 日公佈了Aptos 的GAS 計劃,因為MOVE 語言的上一個版本其實是打算在沒有GAS 的前提下運行的,所以並沒有為GAS 計劃做好準備,所以Aptos labs 此次為Aptos 建立的GAS 計劃是MOVE 語言首個GAS 設計,被官方稱為「一場冒險」。
在Aptos 的GAS 計劃中,Aptos Labs 表明了自己制定GAS 的原則、流程、如何計算GAS、後期GAS 費調整以及積極接受Aptos 社區的建議。
GAS 計量是Aptos 和其他很多區塊鏈的基本概念,它定義了執行和存儲鏈上交易平台需的計算和存儲資源量的抽象計算。 GAS 計劃將鏈上所有執行所消耗的成本確定,用於計算執行交易期間使用的GAS 花費。
流程
為了有效的執行,我們在Aptos 鏈上的流程是:
1)定義我們的原則;
2)準備一個評估框架,以確定每個執行的價格;
3)為Move 建立GAS 計量系統和安全GAS 代數;
4)將上游GAS 框架導入Aptos;
5)使GAS 框架具有存儲意識;
6)最後,進一步細化GAS 計劃。
原則
我們的定義原則是:
1、操作的成本應該與網絡上的可用資源直接相關(例如CPU、內存、網絡、存儲I/O 和空間使用等)。此外,當技術和流程改進後,GAS 所需的成本應該要隨之降低。
2、Gas 應該由鏈上治理設置,並且可以無縫配置。
3、Gas 可以防止對網絡中固定資源集的DoS 攻擊,並且可能需要根據網絡情況通過治理建議迅速進行調整。
4、Aptos 的GAS 價格反映了Aptos 基金會加速增長和保持區塊鏈人人可及的願望。
5、鼓勵在設計中做出好的選擇——例如優先考慮安全性、模塊化、斷言等事件。
計算GAS
當用戶提交交易時,他們還必須在事務中指定兩個數量:
Max gas amount:以GAS 單位計量。這是用戶(即,交易發送者) 願意為執行交易花費的最大GAS 單位數。
Gas unit price:以每單位GAS 的八進制計算,其中1 八進制=0.00000001 APT(=$10^{-8}$)。這是用戶願意支付的GAS 價格。
在執行過程中,交易將被收取:
1)固定成本,固定基數加上大額交易的額外費用。
2)執行成本,用於執行Move 指令。
3)讀取成本,用於從持久存儲讀取數據。
4)寫入成本,用於將數據寫入持久存儲。
最終的交易費用可以用消耗的GAS 總量(以GAS 單位計算) 乘以GAS 單價來計算。例如,如果一筆交易消耗670 個GAS 單位,而用戶在交易中指定的天然氣單位價格為每單位100 Octa,那麼最終的交易費用為670 * 100 = 67000 Octa = 0.00067 APT。
如果一個交易在執行過程中耗盡了gas,那麼發送方將根據最大gas 量收取費用,並且該交易平台做的所有更改都將被恢復。
建立一個GAS 計劃表
1、基本配置
GAS 計劃中有幾個組成部分與單個操作的細節無關,包括交易大小和最大GAS 單位(不同於用戶在交易中指定的最大GAS 量)。
2、交易規模
對於大多數交易,交易規模可能在千字節的數量級。然而,Move 模塊的發布很容易就有幾千字節,而Aptos 框架大約有100 KB。大多數用戶模塊的大小一般在4KB 到40KB 之間。最初,我們將交易規模的值設置為32KB,但根據社區的反應,要求提供更多空間以簡化應用程序開發,因此我們將交易規模調整為64KB。
非常大規模的交易會導致整個網絡的帶寬成本提高,並可能對性能產生負面影響。如果被濫用,內存池會被鼓勵忽略規模更大的交易,因此我們的方法是在最大規模交易的大小和可訪問性之間取得平衡。
3、最大GAS 單位
GAS 計劃中的的最大GAS 單位定義了一個交易最多可以執行多少操作。注意!這不同於用戶在交易中指定的最大GAS 量。
GAS 計劃的最大GAS 單位直接影響到一個交易可以執行多長時間,將其設置過高可能會導致對區塊鏈產生負面性能影響交易。例如,用戶可能忘記在while 循環中有一個增量,從而導致無限循環,這是一個常見錯誤。我們發現,即使我們進行了最大的框架升級,我們仍然不到gas 計劃的最大gas 單位(設定為1,000,000)的90%。
4、執行
為了評估執行成本,我們構建了一個基準框架,並在執行該框架時使用。
Valgrind 來分析Move VM。它的輸出是一組帶註釋的源代碼,它告訴我們每行代碼產生了多少機器指令。
在上述分析的幫助下,我們粗略估計了所有Move 指令和本機函數的相對成本。然而,我們注意到這個方法與內聯函數存在一些問題:它們不會自動包含在調用者的計數中。我們還看到,這只發生在我們分析某些Move 指令時,我們可以通過將數字相加來解決這個問題。
隨後,通過考慮增強系統穩健性和安全性的編碼範例,團隊得出了最終執行的機器指令數量。這個數字依次與存儲和最大GAS 單位進行權衡,以確定它們在GAS 計劃中的當前值。
5、存儲
每當訪問存儲在持久存儲中的賬本狀態項或數據時,Aptos 節點都會向存儲設備發出讀取或寫入。每秒的數據訪問總數取決於存儲設備的帶寬和IOPS 容量。與gas 調度計算部分的CPU 週期類似,數據訪問是區塊鏈用戶在系統負載時通過費用市場競爭的瞬時稀缺性,此外,寫入數據的磁盤佔用成本在鏈上是永久的。 Aptos 團隊通過考慮這些成本來設計存儲GAS 計劃。
訪問和存儲任何狀態項都會產生與驗證整個區塊鏈狀態的數據結構
水母默克爾樹相關的成本:
此成本與不同狀態項的基數有關($2^{256}$)。還有一個成本與每個項目的大小成正比。要對一個狀態項進行操作,費用為(下一節中描述的例外情況除外):
存儲GAS 費= item_fee + (byte_fee * bytes)
讀、創建和寫
對狀態項的任何訪問都屬於以下三種類型之一:讀、創建或寫。訪問按項目費和字節費收費,如上面的等式所示。
讀操作是最常見的操作,它只受瞬時資源稀缺的限制。因此,讀取費用是根據磁盤IOPS(項目費用) 和參考硬件規範的帶寬容量進行校準的。
create 是在狀態存儲中添加一個新項。因此,create 增加了身份驗證數據結構,使一切都變得更昂貴,因此成本最高。創建費用是根據網絡擁有的參考磁盤空間進行校準的。因此,用項目(item_fee) 和字節(byte_fee) 填滿磁盤需要大量的GAS。
寫操作更新狀態存儲中的現有項。因此,寫操作不會在身份驗證數據結構中產生額外的開銷。然而,通過修改現有的條目到更大的字節,仍然可以破壞磁盤。因此,我們對更新項中的字節收取與創建時相同的費用。
應該注意的是,與存儲相關的成本是基於每一筆交易進行評估的:即使您多次讀取/寫入相同的資源,也只需要支付一次費用。
基於上述考慮,我們定義了6 個GAS 參數,它們構成了GAS 總費用的組成部分。見以下:
per_item_read:根據IOPs 進行校正
per_byte_read:根據實際帶寬校準
per_item_create:根據目標總項目進行校準
per_byte_create:根據目標總大小進行校準-每個項目包含的第一個1KB
per_item_write:與per_item_read 相同
per_byte_write:與per_byte_create 相同
更多信息,請訪問此處。
穩定的GAS 單位成本
無論以APT 或法定貨幣的市場價值計算執行操作的成本如何,每個操作和交易本身都需要相對於存儲和執行成本的固定單位成本。固定的gas 單位成本有助於保持gas 計劃不變,並與APT 的自由市場價值脫鉤。此外,正確選擇GAS 單位的精確位數有助於保持GAS 計劃不變。考慮到這一點,Aptos 團隊以大約3 位數的精度來表示GAS 單位。因此,轉賬交易的成本大約是700 個gas 單位。
社區參與
即使我們對GAS 計劃投入了大量的精力,但是它還遠遠不夠完善。作為一個社區項目,Aptos 社區成員可以選擇:
1)根據你的經驗,找出GAS 計劃不合理的地方;
2)說出你對GAS 計劃的擔憂,並參與社區討論。
3)就Aptos 上與GAS 相關的治理提案進行投票。
如何調整GAS 成本?
GAS 計劃作為鏈上配置被存儲,但是可以通過Aptos 治理提案進行更改,並且可以無縫添加新指令或原生功能。
GAS 計劃被設計為可擴展的,允許通過治理提案對其進行升級。隨著Aptos 和Aptos 社區不斷改進Move VM 並納入用戶反饋,GAS 參數可以隨著時間的推移進行調整。
有時,GAS 公式可能需要超出鏈上配置的複雜更改。這些GAS 公式通常用Rust 編碼,並通過鏈上GAS 特徵標誌來區分。要升級這些公式,必須使用新公式更新節點軟件,並以不同的GAS 特徵標誌進行區分。然後必鬚髮布節點軟件並為節點運營商大量採用,最後,必鬚髮布並批准治理提案才能使用新的gas 版本。
未來的工作
這是Move 的第一個可行的GAS 框架。它需要對Move VM 和Aptos-Core 進行大量修改。我們希望這項工作為今後的工作鋪平道路:
1)降低執行成本,擁有一個真實的GAS 模型表明編譯器和虛擬機在哪裡有效率,團隊可以改進其中的大部分以降低執行成本。
2)多維GAS 計算,允許用戶為執行和存儲指定單獨的預算。這樣,用戶就不必為因為代碼編寫不佳的應用程序花費過長的執行時間,支付高昂的gas 價格。它還將允許對區塊鏈端交易的最大Gas 價格進行更細粒度的定義;
3)緩解臃腫狀態,目前沒有簡單的方法來縮小狀態集,除了合約(或用戶)顯式刪除事物。用戶付錢刪除數據可能會帶來套利機會,用戶在便宜的時候創建存儲,在昂貴的時候刪除它。 Aptos 推遲了解決這一挑戰,這可能會削弱開發人員刪除鏈上數據的動力。該團隊正在探索每個項目TTL 的概念,該概念將在TTL 到期時刪除未訪問的狀態項目。