本文系Vitalik在以太坊研究者論壇里提出的一個最新討論,該討論是繼以太坊研究科學家BarnabéMonnot提出的關于EIP1559切實實施的思路進行的再次結合。
作者:Vitalik Burerin
編譯:白計劃團隊
特別感謝 @barnabe 在早期提出了類似的想法。
正如我在此前的《關于資源定價的立場文件》中詳細討論的那樣,以太坊中的Gas實際上是支付三種不同的資源:
1.帶寬(必須下載的事務數據)
2.計算(驗證和執行交易的時間)
3.存儲(歷史記錄,但更重要的是狀態陳述,例如帳戶余額,隨機數,約代碼,合約存儲)
白計劃批注:《關于資源定價的立場文件》是一份區塊鏈資源定價的草案,其中Vitalik通過數學演算推論了相應的定價方式。
該草案內容包含:價格與數量、社會成本曲線、首次和二次拍賣、可調整收費計劃、存儲維護費,以及包含為什么固定費用并未得到充分利用?
帶寬和計算是短暫的成本,存儲不像這兩個成本,它會超出短暫的限制。
在一個塊的時間內,一個節點可以進行多少次計算或下載數據是有限度的,一旦該塊通過,下載和驗證所需的量就達到了極限,塊的大部分都消失了(將來只有少數同步節點需要對其進行處理),
而存儲是持續的成本,如果一個單獨的塊狀態增加了100MB,該塊當下可以處理好,但是一系列的塊將使以太坊無法使用,狀態增長的“爆發”影響可以忽略不計,但長期影響是最嚴重的,一旦建立的一個超大狀態就永遠給網路增添了負擔,
不過,隨著狀態變為無狀態(白計劃注:即無狀態以太坊方案),(超大)狀態的長期影響會大大減少:狀態不會給網路造成永久負擔,它只會負擔大約一年的時間,在那一年中,只有一小部分節點需要實際存儲那個(超大)狀態,但這種長期(一年)成本仍然是真實存在的,并且需要將其定價,
平均大小與最壞情況的存儲大小
在當前(狀態)協議(普遍認為是不可持續的)和狀態到期的改進協議中,對狀態建模的不足之一是平均狀態增長與最壞情況狀態增長之間的巨大差異,
考慮當前的協議,如今,該狀態的總大小約為5.5億個對象,約32GB(不包括trie開銷)。如果我們剔除上一年所有not touched的狀態,那總量很容易下降一半以上。
現在,最壞的情況是什么?
合同代碼的創建按每字節200Gas的費用收費,因此,如果將一個區塊分成3個事務,每個事務創建一個合同,我們可以為12334800Gas+3*55000Gas來制作3個20558字節的合同,以增加合同創建的開銷,
這樣,在單個塊中,存儲大小可以增加20600*3=61800字節。
假設平均出塊時間為13.1秒 1個,每年都有31556925/13.1=2408925塊,總的來說,狀態可以按61800*2408925=148871600381.67938字節增長,即約138 GB。
這個差異約為10倍,(白計劃注:下文數據16GB根據上下文理解是以太坊目前一年的狀態總量大小)
非常重要的是,消費者硬件RAM可以容納實際大小可能是16GB(如果不能,我們可以調整Gas價格或狀態有效期以使其適合),而138GB則不能被存儲。
如果我們可以使最壞的情況接近平均情況,那就太好了,
雙軌EIP-1559
解決此問題的自然方法是對臨時成本和永久成本使用EIP-1559定價,但調整期有所不同,
對于臨時成本,價格可以一次調整10%以上,但是,對于永久性成本,將使價格調整慢得多,
如果我們采用AMM成本曲線機制作為基礎,對于存儲,我們可以考慮一條曲線,目標速率為每月1GB,而成本的增加取決于我們比目標高出多少:
例如,每超出目標1GB,存儲成本就可能翻倍。在這種情況下,存儲塊價格可能需要3天左右的才能翻一番。如果存儲增長超過10GB,則存儲成本將是正常價格的1000倍,在經濟上無法繼續存儲。
有兩種方法可以實現此目的:
1.用Gas購買存儲,也就是說,使用SSTORE創建新的存儲插槽,像現在一樣消耗Gas,但是消耗的Gas量將是可變的,這樣做的缺點是,它會形成(變相)激勵措施,用戶寧愿在Gas價格較低的周末補充存儲空間。
2.用ETH購買存儲。交易(和調用)除了需要Gas外,還需要提供另一種資源(我們可以稱其為mana),該資源將采用與Gas相似的機制,但參數不同。這樣做的缺點是使調用規則變得復雜,并且需要添加新的CALL操作碼,
請注意,這里有一個混合選項:
3.可以以ETH定價存儲,但以Gas收費(因此,如果基本費用上漲了2倍,則填充存儲插槽所需的Gas將自動減半)。我們可以將用于擴展存儲的ETH排除在EIP 1559 Gas價格更新規則甚至是區塊限制范圍之外。
4.將Gas更全面地改造為三個概念:Gas,執行點和存儲點。1Gas=1wei; 分配Gas的交易只是意味著它正在將其某些wei轉換為可用于支付資源的特殊形式。就call和subcall之間的傳遞方式而言,此形式的工作方式與Gas相同,
但是,AMM現在管理兩項成本:執行點成本和存儲點成本。當執行過程處理當前消耗N個Gas的操作碼時,它將花費N個執行點,這意味著需要N* execution_point_cost支付Gas,填充存儲槽需要1個存儲點,因此需要storage_point_cost充入Gas,
最后,還要注意,狀態限期的路線圖里有望刪除退款。這是因為技術原因:存儲插槽無法“變空”且資格獲得退款,因此只能將它們設置為零,并且零記錄必須保持該狀態,直到該時期結束并且該狀態可以到期為止。這大大降低了早期在存儲租金嘗試時遇到的復雜性問題。