以太坊協議所面臨的一個最為長久且尚未解決的挑戰,就是由于狀態數據規模不斷增長而帶來的問題。以太坊區塊鏈上的許多操作都會給以太坊添加狀態內容,而所有全節點都必須存儲全量的狀態數據,這樣才能驗證新區塊以及制造新區塊。這些操作只需事務的發送者一次性繳交按gas用量來計量的手續費,但會給整個網絡造成永久的持續性成本,因為節點需要存儲這些新數據。
這是系統設計中的一個顯著的失衡,可能會讓以太坊系統變得越來越難用,因為狀態中充斥著不再有用處的“垃圾數據”。本文的目的是詳細解釋問題產生的根源,以及一些解決該問題的方法。如果我們能實現某個解決方案,這將為安全地大幅提高區塊Gas上限鋪平道路。
本文所論述的研究領域仍在推進中,隨時有可能出現更新、更好的想法和更優雅的權衡。
引言:問題出在哪?
“狀態”指的是節點若想處理新產生的區塊和事務就必須存有的信息。狀態與“歷史”完全不同,后者是關于過去時間的信息,節點可以保存這些信息以便日后重新廣播或歸檔,但并不是處理區塊鏈所必需的。
在以太坊協議中,狀態信息包括:
賬戶的ETH余額和nonce
智能合約的代碼
智能合約的存儲項
與共識機制相關的數據
歷史信息則由舊的區塊和收據組成。EVM中沒有操作碼可以讓你訪問舊區塊、舊事務和內容和收據輸出,所以節點丟棄這些數據也仍然能驗證新區塊,所以這些是歷史信息。
上述狀態信息列表中的最后一項——共識機制相關數據——在設計上已經精心限制了其規模,因此我們不太需要為此困擾。但前面三項,就令人頭大了。這三類狀態信息的規模會隨著時間推移而不斷增大,因為不斷會有新用戶加入網絡,他們會創建新的賬戶、新的合約,還會加入合約、收到token什么的。
難辦的是,許多狀態用過之后就會靜靜地躺在那里;一旦某個用戶停用某個應用之后,就會產生一些“垃圾狀態”——不會再派上用場,但會永遠存在那里。
ChatGPT 推出 6 項更新,包括提示示例、推薦回復、保持登錄狀態等功能:8月5日消息,OpenAI 針對 ChatGPT 推出一系列更新以改善用戶使用體驗,包括 1.提示示例,當用戶打開 ChatGPT 聊天界面時,入欄上方將出現一些預設提示示例,例如推薦生日禮物、建議周末活動、比較商業策略等;2. 推薦回復,對話過程中,ChatGPT 會根據聊天內容和語境,提供相關的回復建議,幫助推進對話,用戶只需點擊一下,即可進入更深入豐富的話題探索;3. 默認使用 GPT-4,對于所有 Plus 用戶,新建對話時將默認選擇 GPT-4 模型,而不是原來的 GPT-3.5;4. 可上傳多個文件,用戶可以上傳多達 10 個文件,來命令 ChatGPT 分析整理數據,并生成觀點;5. 保持登錄狀態,不再受每兩周被強制下線的限制。只要自己不退出賬號,就可一直保持在登錄狀態;6. 新增 8 個快捷鍵,用戶將可以在 ChatGPT 中使用快捷鍵,例如用? (Ctrl) + Shift + 來復制最后一個代碼塊,用? (Ctrl) + / 查看整個列表等。[2023/8/5 16:20:40]
理論上,用戶可以做到“垃圾不落地”。用戶可以僅發布帶有SELFDESTRUCT條件的合約,等他們再也用不上這個合約的時候,就調用這個操作碼移除這個合約、清空其token余額;他們還可以使用智能合約錢包,通過一個已有的外部持有賬戶來發送交易,而無需生成一個新的EOA。
但是在實踐中,這樣的激勵非常少,而適當的狀態清理的技術復雜性又太大了。在許多合約中,給任何人賦予這樣調用SELFDESTRUCT的權限都是不合適的,而且,也會給用戶體驗和代碼上也會增加很多復雜性。實際上,由于SELFDESTRUCT用處極其有限而副作用極大,我更傾向于永遠移除這個操作碼。如果我們真想控制狀態數據的規模,我們需要的是一個網絡中的節點可以默認丟棄不再被使用的“垃圾狀態”的方法。
無狀態客戶端
這個問題的一類解決方案基于“無狀態客戶端”的觀念。
數據:中心化交易所比特幣7日流入量呈萎縮狀態:Tokenview鏈上數據監測,經歷了兩周前的比特幣大幅流入之后,近日中心化交易所比特幣趨于流出狀態,且流出量日漸增大。Binance交易所近7日流入量萎縮為兩周前的1/3,Bitfinex近7日流出量是兩周前的4倍。且近兩日各交易所均呈現凈流出狀態,6/27日流出量突破近1個月來最大的流出量,以Bitfinex和Binance排名1、2,Huobi冷錢包流入至Huobi熱錢包約4000枚BTC。[2021/6/29 0:14:51]
基本原理是,讓區塊驗證不再以持有全局狀態為前提。相反,區塊會自帶證據”),證明其所訪問狀態的值。就跟現在的設計一樣,區塊內會包含一個“狀態根”,所訪問的值可以對應著狀態根得到證明。以太坊現在的狀態樹方案支持這樣的證明技術,像二進制樹或者VerkleTrie這樣更高效的方案也可以。見證數據也會證明處理完該塊后新狀態根的正確性。
無狀態性有兩種形式:
弱無狀態性:出塊者仍然需要完整的狀態,以為區塊生成見證數據;但驗證區塊的階段可以是無狀態的;
強無狀態性:沒有任何節點需要完整的轉臺。反過來,是交易發送者需要提供見證數據,而出塊者可以聚合這些數據。交易發送者自己負責存儲為所關切的賬戶生成見證數據所需的部分狀態樹。
強無狀態性是一個非常“優雅”的解決方案,因為它把責任完全轉移給了用戶,雖然為了保證實踐中的良好用戶體驗,我們需要創造某些類型的協議來幫助不運行個人節點的用戶維護狀態、并處理用戶需要與意料之外的賬戶交互的情形。打造這樣的協議非常難。
此外,所有類型的無狀態性都提高了網絡所需的數據帶寬;而強無狀態性還需要交易聲明其所交互的賬戶及存儲項的鍵。
一個更溫和的解決方案:狀態過期
更溫和的解決方案可以歸結為不同形式的“狀態過期”方案。必須持續得到訪問的狀態才能保持“激活狀態”;而長期無人問津的狀態會變成“失活”。具體用什么機制來更新狀態,有很多選擇,但一般原則是,除非某個狀態對象被顯式地更新,否則就以某種形式處于失活狀態。因此,任何創建新狀態對象的活動,都只能成為節點在一段時間內的負擔,而不像現在這樣變成永久負擔。
TrustBase中國區負責人爾爾:在波卡生態愈加豐富狀態下更看好DeFi領域:據官方消息,幣贏CoinW《共識52》第十五期《Polkadot的進化之路——奠定波卡生態繁榮的基礎設施》主題AMA中爾爾表示,
長期來看,我們知道DeFi這兩年之所以很火,主要是因為流動性挖礦帶來的流量引入。但事實上,目前的DeFi帶來流動性價值的同時也帶來了泡沫,一些真正的大方向,比如大數據、物聯網、VR和人工智能等主流產業還沒有與DeFi有機結合,形成“去中心化的供應鏈金融”。波卡生態已經有一些項目覺察到了這點并開始嘗試,包括TrustBase(我們自己把它稱作DeFi2.0)。我希望能夠在波卡國度看到這種更為宏觀的、全面的、建設性的DeFi,那將是未來社會影響力最大的領域。[2021/3/10 18:33:12]
失活狀態,故名思義,就不是“狀態”的一部分;想要處理區塊或創建區塊的節點無需存儲失活狀態。不過,失活狀態不是被完全刪除了!在所有類型的狀態過期提案中,都預設了某種方法可以“復活”已經失活的狀態。
一般原則是,激活狀態的使用與當前相同,而失活狀態則需通過上述無狀態客戶端的機制來使用。復活一個過期狀態對象的事務需要提供一個證據,來證明該對象是失活狀態的一部分。為了能夠生成這樣的證據,用戶自己需要存儲和維護至少一部分失活狀態。
何時過期
決定過期條件的設計也有很多種。最常見的幾種是:
直接租金:逐塊逐塊收取“租金”,直接以每個賬戶的余額來支付;狀態對象的余額降到了零,該賬戶就過期了。
剩余存活時間值:每個狀態對象都存儲一個”剩余存活時間“值,這個值可以通過支付費用來增加
觸達即刷新:每個狀態對象都存儲一個”剩余存活時間“值,并且每逢讀取或寫入該賬戶都會增加該值
所有狀態對象定期過期:也就是ReGenesis提案
我自己越來越喜歡”觸達即刷新“方案,因為它避免了應用需要創造復雜的經濟模型來讓用戶承擔狀態租金;以及它保證了激活狀態的規模有一個清晰的上限。讓大量狀態按照規律的時間間隔過期的方案也有同樣的好處,但也有一些有趣的權衡:關鍵好處是,過期方案更簡單,但關鍵不足是,跨過一個過期時點后,你再激活自己的狀態對象時,需要多少見證數據會跟你觸達狀態對象的時間點有關。
OKEx研究員:BTC若跌破螞蟻S17關機價位,BTC將進入休克或死亡狀態:OKExResearch研究員對《證券日報》記者分析稱,一方面,很多礦場仍在使用螞蟻S9礦機進行挖礦,如今比特幣價格大跌,挖礦獲得的比特幣收益已遠低于損耗的電費,像螞蟻S9等老舊機型基本都需要關機,而廠房租金、礦機設備折舊等成本卻仍然存在,因此礦場主的損失相當大。另一方面,前段時間受業內‘減半行情’影響,很多礦場主都預期比特幣價格將迎來上漲,因此有部分礦場主會加杠桿買現貨。比特幣價格崩盤后,加杠桿的礦場主損失會更加巨大。如果幣價繼續下跌,跌破目前性能最優的螞蟻S17的關機價位(約2600美元),那么比特幣網絡將要陷入停頓,從技術上說,比特幣將進入休克或死亡狀態。OKExResearch研究員強調稱,盡管比特幣現已逐漸被大眾所熟知,但目前仍是一個小眾的、高風險的另類投資品。它的市值甚至沒有很多科技股公司的市值大,但波動率卻高出正常股票的幾倍。因此,對普通投資者而言,最好的建議是不要投資比特幣。(證券日報)[2020/3/23]
賬戶層面的過期vs.存儲槽層面的過期
狀態過期的邏輯既可以運營到賬戶層面,也可以運用到單個存儲槽層面。當前,我強烈偏向于在存儲槽層面實現狀態過期方案。因為很多合約賬戶的存儲槽數量是不受限制的,任意用戶都能加入合約并增加合約名下的存儲槽的數量。不管使用什么樣的賬戶層過期方案,想要實際限制狀態的規模,租金的數量都必須與合約內存儲槽的數量成比例。結果是,用戶還是能夠僅支付一次性的費用就給合約及其用戶施加永久的持續性成本。
要解決這個問題,合約要么加入復雜的內部邏輯,將存儲操的租金“轉嫁”給用戶,要么重新設計自己合約的模式,轉向使用CREATE2操作碼創建新的合約并使用這些合約來充當存儲槽。不管是哪種辦法,最后都會變成等價于存儲槽層面的過期方案。因此,我個人認為,我們應該僅在合約存儲槽層面實現狀態過期方案。
但是,存儲槽層面的過期方案也有自己的缺點:每個存儲槽都要增加一個元數據,指明它何時過期,這也意味著“復活沖突問題”不僅會影響賬戶,也會影響存儲槽。
金色相對論 | 陳昊芝:區塊鏈游戲仍處于早期的游戲運營狀態:在本期金色相對論中,針對“區塊鏈游戲”Cocos-BCX發起人陳昊芝發言指出:目前的區塊鏈游戲還是基于主鏈生態以持幣者為基礎的運營基礎。而這類游戲無論ETH、還是EOS上都是偏概率類,總體規模依然很小。
目前區塊鏈游戲的游戲性還比較薄弱,運營模式較為單一,可以說還處于比較早期的游戲運營狀態,目前區塊鏈游戲還有一定的準入門檻,很難吸引到對區塊鏈游戲0基礎的玩家。傳統游戲在春節期間,大量的運營、拉新、推廣是目前區塊鏈游戲團隊沒法完全模仿的,但是傳統游戲團隊在微信小游戲的玩法、傳播、產品進化方面都非常值得區塊鏈游戲行業學習。[2020/2/13]
從狀態樹上移除vs.給狀態樹安排一個“退休”部分
另一個區分不同狀態過期提議的技術角度是“一樹流”和“二樹流”。也就是說,我們到底是像現在這樣,只有一棵狀態樹,只不過把某些狀態標記為過期;還是直接把失活的狀態從主狀態樹上移除,轉移到另一棵專門的樹上?
一樹流
激活節點以白色標記,失活節點以灰色標記
注意,即使是樹上的中間節點,也會被標記為激活或者失火;標記工作可以在狀態樹上的每個節點處完成。
二樹流
白色的樹包含激活狀態;灰色的樹存儲失活狀態
一樹流的好處是,最起碼,其工作方式看起來會跟當前的狀態樹相似,失活和復活的流程也比較簡單:復活流程只需刷新樹上相關節點的“過期日期”參數,而失活則是自動化的。但它的缺點在于:它需要一種能夠在節點中以此種方式存儲過渡信息的樹結構,而且不能很好地擴展到Verkle樹。此外,它還需要額外的默克爾證明元件,不僅要能夠下沉到葉子節點,還要能夠停在中間節點處。
二樹流的好處是:當前的、形式純粹的狀態累加器就能支持這類方案,而無需為每個節點增加元數據。缺點是,它需要對整個協議做一些更深層次的變更,而且需要一個顯式的流程來滅活狀態。另外,它也沒有為復活沖突兩難提供內置的解決方案,所以需要在兩種辦法中作出選擇。
注意,在二樹流中,存儲失活狀態的數據結構不是非樹不可。事實上,完全有可能出現這樣一種設計:需要復活一個狀態對象時,只需提供一個指向該對象失活時候收據的默克爾樹,再附上一些密碼學證據,證明此前該對象未被復活過,即可。
復活沖突
然后我們就到了狀態過期方案的一個關鍵難題上:“復活沖突”。復活沖突的概念如下。假設某個賬戶由地址A生成;這個賬戶過期了;然后,地址A又創建了一個新的賬戶;最后,地址A再嘗試復活那個最開始的賬戶。這時候會出現什么情況?
這里有幾種可能的解決方案:
顯式的“賬戶合并”流程:類似于規定“除了兩個賬戶的ETH余額相累加以外,以舊賬戶的狀態為準”或者“除了累加ETH之外,以新賬戶的狀態為準”;甚至于,可以由舊賬戶的合約代碼來規定特殊的合并流程
通過消除同一地址重復部署的功能來確保復活沖突不會發生:也就是調整CREATE2的功能,比如在最終哈希成地址的數據原像中包含當前時間,因此即使未來使用同樣的數據來生成,也無法得到同樣的地址
向狀態對象增加一個“存根”,以防止在同一位置生成新賬戶
要求生成新賬戶時都必須附帶該賬戶此前未過期的證明:某種意義上等價于存根方案,只不過這種辦法是把存根放在狀態的一個單獨部分中,所以任何想要創建合約賬戶的用戶都必須跟蹤這部分狀態
主要的擔憂有:會給應用增加很多復雜性,他們需要加入合并的邏輯;這樣做了之后,除非在鏈上“注冊”一個地址,否則用戶就沒法再輕易獲得可以與之交互、可以積累資產的地址了。未注冊的地址是很重要的:任何第一次收到ETH的用戶都是在使用一個尚未注冊的地址。這第的擔憂的根源是:未注冊的地址實際上有了時間限制,如果用戶生成了一個地址、收到了資金,但在接下來一年里忘了發送交易,那他的資金就會被鎖住。
注意,EOA也不能幸免。雖然看起來能夠,因為EOA的合并流程比較簡單這樣的方案。不過,這里也有兩個問題。首先,賬戶抽象的目標是用合約來替代EOA,而賬戶抽象化的合約的合并流程可能并不簡單。其次,會受過期和復活事件影響的不僅有EOA本身,還有該EOA所參與的應用中的相關存儲建,所以還是需要復雜的合并邏輯。
因此,從我的角度來看,破壞性最小的是某種形式的存根方案。不過,存根方案里存在一個信息理論問題,會導致一些奇怪的結果。為了防止新的狀態對象在N個已經過期的狀態對象位置處創建,一個覆蓋了這N個地址的集合必須是狀態的一部分。如果這個集合是信息最小化的,那么這個集合的大小會是O(N),因此其狀態規模也是O(N);那么,激活狀態的規模就將與失活狀態的規模成比例,所以實際上我們并沒有解決這個問題。
Treerot
解決這個問題的唯一辦法就是覆蓋超過那N個賬戶的信息;實際上,我們將不得不讓整棵樹都變得不可訪問)。
而這里還有一個問題:這產生了一種形式的“樹發霉”,隨著時間推移,對于新帳戶的創建來說,狀態樹的所有部分都是不可訪問的,至少對那些沒有跟蹤該區域過期狀態的用戶來說是這樣的。
而樹發霉導致的次生問題也必須解決。舉個例子:如果一個合約要創建子合約,它必須能夠在要么未發霉,要么用戶具有見證數據的狀態區域創建合約。數發霉問題的一個解決方案見此處:持續地開放狀態的新區域以供賬戶創建。另一種思路是每個用戶都選擇狀態的某些區域,跟蹤該區域的變化以便能創建見證消息,并且只在該區域創建帳戶。
樹發霉的另一個問題是,它需要一個顯式的數據結構來存儲和檢查范圍。如果一棵樹有能夠放在節點中、指明該節點以下的哪些部分已經過期的數據,那是最好的,但一個鍵值對存儲要做到這一點還是相當有難度的。
回頭再看強無狀態性
在狀態過期方案中使用樹結構所產生的許多問題,都可以被追溯到這樣一個事實:我們需要對哪些狀態是活躍的、哪些狀態是失活的,達成共識。在二樹流模式中,這一點更加明顯;但即使是在一樹流模式中,狀態樹上也需要有顯式的標記,以便近期使用快速同步下載了狀態的以太坊節點能夠確定一筆嘗試訪問某個賬戶、但又沒有提供見證消息的交易,應該成功還是失敗。那我們能不能做到不需要明確這個區別呢?
如果我們實現了完全的無狀態性,然后能幫助交易發送者和區塊生產者可靠地獲得見證消息生成所需的狀態,不就解決這個問題了嗎?那什么辦法能幫助交易發送者和區塊生產者做到這些呢?
一種自然而然的辦法是:網絡中的節點都僅保存狀態樹的一部分,例如,在過去一年中訪問到的那部分。只需在客戶端設定中加入一個自愿的設定即可。如果我們想要更可靠一些,我們可以通過引入一種proofofcustody方案,強制至少礦工存儲一些數據。
有一點需要注意:如果共識層不能感知哪些狀態是活躍的、哪些狀態是失活的,那訪問近期狀態和老舊狀態的Gas開銷就是一樣的。這會導致兩個結果:
訪問近期狀態的Gas開銷也需要進一步提高
包含了見證消息的區塊大小上限可能非常之大,如果一個區塊里滿是訪問老舊狀態的事務的話
如果我們想避免這些不利因素,就需要在共識中跟蹤哪些狀態對象是活躍狀態,這又會讓我們回到接近于狀態過期方案的屬性。這再一次地說明了,“無狀態性vs.狀態過期”是一條光譜,是一個復雜的權衡空間,而不是一個非此即彼的選擇。
Rollup也需要,也可以,使用同樣的解決方案
以太坊的一種重要的中期可擴展性解決方案是rollups。不過,rollup本身并非不再需要擔憂狀態數據規模問題;實際上,rollup系統的狀態規模問題,與以太坊鏈本身的,性質完全相同。
幸運的是,如果我們能推出一種解決方案,則至少EVMrollup能夠使用同樣的解決方案,來解決其內部狀態的規模問題。因此,狀態規模管理方案,與rollup和分片等可擴展性方案是互補的。
結論
狀態規模是一個日益惡化的問題,而狀態規模的解決方案也能為大幅提高區塊Gas上限鋪平道路。我們應該對某種形式的狀態過期方案達成共識并加以實現。不過,不同的解決方案之間存在重大技術權衡,尤其如果我們還想要保持當前設計的一些重要屬性的話。
一些我們可能需要犧牲的屬性包括:
用戶可以離線生成賬戶并以該地址接收資金、并且在使該地址在鏈上顯明之前可以靜默任意時長的屬性
地址保持20字節的長度
狀態可以被視為“純粹的”鍵值對存儲的屬性,以及無需在狀態樹上每個節點內存儲元數據的屬性
現有的應用需要程度不等的重寫,以保證用戶無需存儲全部失活狀態就能生成見證數據
Gas消耗量;或者創建新合約、寫入新存儲槽的難度
我們如果已經準備好作出犧牲,有些方案可以很快開始著手實現。另一方面,也許假以時日,我們能修補或者更好地匯總這些觀念,減少問題,尤其是使它們在技術上更容易實現。我們應該更深入地理解我們更愿意/更不愿意接受哪些方面的犧牲,并繼續積極研究改進提案。
作者:?VitalikButerin翻譯:?阿劍?寫于2021年2月12日
根據Glassnode的比特幣MVRV-Z評分指標顯示,比特幣即將跨越紅線。上一次看到這種趨勢,比特幣的價格上漲了兩倍多.
1900/1/1 0:00:00比特幣熱度不斷攀升,正受到越來越多機構資金的青睞,大摩資管或也將成為其中重量級的一員。彭博援引知情人士報道,摩根士丹利旗下資管部門CounterpointGlobal正在考慮是否押注比特幣,并尋.
1900/1/1 0:00:00金色早報|V神提出以太坊信標鏈第一個硬分叉提案“HF1” 金色早8點 剛剛 21 頭條 ▌V神提出以太坊信標鏈第一個硬分叉提案“HF1”以太坊創始人V神剛剛在推特上提出了以太坊信標鏈第一個硬分叉.
1900/1/1 0:00:00DeFi流動性挖礦火爆一時,吸引了大量投資者參與。為了方便投資者及時了解DeFi挖礦項目的相關信息和挖礦流程,金色財經推出了“金色說明書”系列挖礦教程.
1900/1/1 0:00:00據Medium2月19日報道,去中心化跨鏈交易機槍池代幣化協議APYSwap宣布完成180萬美元的私募輪融資.
1900/1/1 0:00:00Ripple在周一的預審會議上要求法院駁回美國證券交易委員會對其發起的訴訟,而在法庭之外,Ripple此前的合作伙伴速匯金宣布暫停與Ripple的合作.
1900/1/1 0:00:00