原文鏈接:
https://hackmd.io/@HWeNw8hNRimMm2m2GH56Cw/selfdestruct
作者:Vitalik
翻譯&校對:戡亂&?阿劍
原標題:《Vitalik:務實地取消SELFDESTRUCT》
本文將介紹?SELFDESTRUCT?對以太坊生態弊大于利的一些理由,正是因為這些理由,我們應該以某種方式移除?SELFDESTRUCT?。鑒于有些合約已經使用了?SELFDESTRUCT?,我提出了一些只需要付出最小的代價就能消除?SELFDESTRUCT?危害的方法。
一段歷史:?SELFDESTRUCT?已經沒有必要了
SELFDESTRUCT?早在以太坊的極早期便已引入。實際上,它在2013年12月發布的以太坊協議“規范”預告中就已經出現了。那時候,幾乎沒人仔細考慮過狀態規模管理的長遠問題。但是,有個想法我大概還有些印象,為了防止沒用的垃圾狀態不受限制地膨脹,我們需要讓任何創建出來的對象都可以被銷毀。具體的思路是,當外部賬戶的余額為零時觸發自毀,而合約在沒用后可以調用代碼里的一行自毀語句觸發自毀。還有一個gas退款機制用于激勵大家銷毀沒用的狀態。
Vitalik Buterin:中心化的任何東西都是有風險的:金色財經報道,以太坊創始人Vitalik Buterin在社交媒體上稱,“默認情況下,中心化的任何東西都是有風險的,使用“DeFi和自我托管的精神”在本周表現非常好,但請記住它也有風險,智能合約代碼中的錯誤。”
Vitalik表示“重要的是要防范它,保持代碼簡單、審計、形式驗證等、深度防御。我最擔心的是,如果我們在兩年后的ZK-rollup中擁有100億美元,并且由于電路約束代碼或其周圍的EVM封裝器中的錯誤而被黑掉。對于后者,保持簡單并進行形式驗證。”[2022/11/16 13:13:32]
2014年1月,AndrewMiller指出了一個非常嚴重的問題:在2013年12月的規范設計中,EOA很容易被重放攻擊。如果我有100個幣,我通過一筆交易發給你10個幣,你可以簡單地在鏈上重放這筆交易十次,從而轉走我的全部余額。這個問題很快就修復了,為此我們增加了nonce字段。然而,nonce字段的引入讓刪除EOA的愿望徹底破滅了:nonce是不能被重置為零的一旦該賬戶被再次使用,nonce又要從零開始,就會被重放攻擊)。
Vitalik Buterin提出“L3愿景”:不能通過在Rollups上堆疊Rollups來擴展網絡:金色財經報道,以太坊聯合創始人 Vitalik Buterin 發文《什么樣的Layer 3有意義?》(What kind of layer 3s make sense?),文章指出不能通過在Rollups上堆疊Rollups來擴展網絡,比如SNARK幾乎可以無限擴展,可以繼續制作“許多SNARK的 SNARK”, 以將更多計算縮減為單個證明。但數據不一樣,數據可以壓縮一次,但不能再次壓縮,因此“在Rollups上再Rollups” ”實際上并不能在可擴展性方面提供巨大效益。因此,Vitalik Buterin提出了“L3愿景”,主要包括:
1、L2 用于擴展,L3 用于定制功能,例如隱私。
2、L2 用于通用擴展,L3 用于自定義擴展。
3、L2 用于無信任擴展(Rollups),L3 用于弱信任擴展(驗證)。[2022/9/17 7:03:27]
2015年,有人提出了一些方案試圖繞過這個問題,使余額為零的賬戶可以被安全地刪除。然而,當時很明顯,幾乎沒有合約開發者真正使用自毀功能:因為要弄清楚什么時候自毀太難了,而獎勵也太少了。
Vitalik:未來2到3年,以太坊將更便宜、生態系統更有趣:7月24日,“2021世界區塊鏈大會·杭州”在杭州未來科技城學術交流中心開幕。
在今天上午的開幕式上,以太坊創始人Vitalik Buterin受邀出席并發表主題演講《以太坊進入2.0之后,會發生什么?》。他講到,以太坊的基本技術愿景是試圖在短期內快速改進,并在長期內穩定下來。因為從長遠來看,我認為區塊鏈確實需要安定下來,變得更加穩定,確實需要向用戶做出更多的保證,保證事情不會發生變化,這樣用戶才能感到安全并在此基礎上做出發展。但在短期內,這些技術都已經被開發出來了。我認為在未來的2到3年里,我們會看到使用以太坊會變得更加便宜,我們將會看到更多不同種類的應用使用以太坊,以太坊生態系統將變得更加有趣。[2021/7/24 1:12:54]
到2019-21年,事情已經變得很明顯了,我們需要的是其他形式的狀態管理,比如租金機制或者是長期未動的狀態“到期作廢””)。而如果我們采用這兩個方案中的任何一個,只要它是有效的,那么合約是否有能力主動刪除自己就一點兒也不重要了。
動態 | Stellar發布公告提醒用戶警惕欺詐性空投活動Stellar-Activity:Stellar官方Reddit發布公告,提醒用戶警惕欺詐性空投活動。最初是StellarShade然后變成Stellar Dolphin Fork,現在叫Stellar-Activity(XLA)。此類騙局使用相同的運作模板進行詐騙——先是在bitcointalk.org發帖稱將在某一特定日期進行大空投,然后開始發放贈品,推行營銷策略以在社交媒體上吸引不知情的粉絲來傳播這一消息,粉絲們在不知情的情況下間接地進行二次傳播,致使更多的人上當。騙子們聲稱將會以2:1的比例給你提供XLA(每持有1XLM就給予2XLA),然后誘使你在他們的賬戶查看器里輸入私鑰,之后盜取你所有的賬戶存款。[2018/12/2]
SELFDESTRUCT?是唯一一個破壞重要恒常性質的操作碼
SELFDESTRUCT?不僅沒什么用,還會產生危害。它破壞了一些重要的恒常性質,這些性質本來是很好的,但是僅僅因為這一個操作碼,我們就失去了這些性質。
金融廳限制泰國Tavitt公司ICO活動,“在日居住者無法購買”:日前,泰國Tavitt公司發布與日本金融廳協商結果,在日居住者不可以參加ICO活動。非在日居住者(在海外居住的日本人)可以參加ICO。根據引用的金融廳郵件,總結出以下幾點意見:1 、在日居住者將不能參加未在日本注冊的海外法人實施的ICO活動;2、非在日居住者(在海外居住的日本人)可以參加ICO;3、未在日本金融廳注冊加密貨幣交易所資格的海外法人實施的ICO活動,如果不明確“在日居住者無法購買”的話,將無法實施ICO。4、金融廳目前對該公司的技術WAVES無法理解,如果繼續存在這種“在日居住者可以買進ICO“的狀態的情況,將涉嫌違反資金決算法。5、在日居住者將不能通過WAVES等未在日本金融廳注冊的海外法人的加密貨幣交易所購入加密貨幣。[2018/3/7]
SELFDESTRUCT?是唯一一個能在單個區塊中變更無限個狀態對象的操作碼
其他所有的操作碼都只能操作賬戶中的單個值或者存儲樹上的單個key,所以它們能變更多少固定大小的對象是有限制的。但是,SELFDESTRUCT可以刪除整棵存儲樹。
在目前的狀態樹結構中,這是可以容忍的。但是,考慮一種特殊的情況:當調用SELFDESTRUCT刪除許多存儲插槽后,下一個事務又在同一個地址上創建一個合約并訪問同一些存儲槽。為了處理這種情況,需要額外設計復雜的緩存機制。此外,SELFDESTRUCT還阻礙了我們變更狀態存儲格式。
以SELFDESTRUCT會阻礙的兩類狀態存儲格式為例:
任意的“單層”方案
存儲槽可以存儲在一些地址“附近”,而不是存儲在合約里的方案有用,比如在ERC20轉賬或Uniswap交易的場景下)
請注意,這不是在空想,從根本上變更狀態存儲格式的討論已經開始了,如果狀態存儲的數據結構能夠接近單一的的鍵/值存儲結構,并且單個區塊中可以變更的狀態數量有一個較低的上限,那將大大擴展我們的選擇空間。
SELFDESTRUCT?是唯一一個會導致合約代碼變動的操作碼
如果在一個特定的地址上存儲了一段代碼,那么這段代碼就會永遠保留在鏈上。這樣的恒常性質是有用的,因為在構建應用時不需要擔心這些代碼會出現變動。
賬戶抽象化非常依賴該恒常性質用以支持庫調用。因為代碼存在變動的可能,還會導致應用的安全性變得復雜很多:2017年Parity的多簽錢包就曾因為其引用的庫代碼合約被偶然刪除而徹底癱瘓。
而唯一破壞代碼不變性的操作碼就是?SELFDESTRUCT?。
SELFDESTRUCT?是唯一一個可以未經賬戶同意就能修改賬戶余額的操作碼
SELFDESTRUCT?有一個內置的“轉賬”的功能,其并不走正常的轉賬流程,因而可以繞過避免合約地址接收Ether的守護功能,以及對轉賬事件的日志記錄。這為智能合約錢包埋下了隱患,讓一些潛在有用的技巧沒法使用,加重了開發者和審計者的心智負擔。
SELFDESTRUCT?當前的用例
如今?SELFDESTRUCT?有兩類重要的應用:
GasToken:當gas價格低時通過創建合約用掉gas,當gas價格高時通過調用?SELFDESTRUCT?獲得gas退款。
利用SELFDESTRUCT實現代碼的動態變更:這可用于dApp或DAO及其他類似用例的“升級”。
可以被安全地銷毀。GasToken的開發者已經發出了警告“雖然對以太坊網絡的變更會導致GasToken無法使用、不可贖回、不能互換以及/或毫無價值,但是GasToken的開發者極可能會擁護該變更”。移除selfdestruct退款只會導致有些操作的費用變得更貴。
從長遠來看,是沒必要的,還有其他一些被廣泛使用的范式可用于支持動態代碼變更。最容易實現的是?DELEGATECALL?轉發器,合約從一個存儲插槽中獲取一個代碼地址,然后調用對應地址的代碼;修改這個存儲插槽就能更新代碼。不過,從短期來看,有少數應用已經使用了。
提案1:完全移除?SELFDESTRUCT
從某個區塊開始,完全停用?SELFDESTRUCT?。在這個及之后的區塊里,如果EVM在執行時遇到?0xff?操作碼,只要拋出異常直接退出即可,就像EVM執行時遇到不存在的操作碼一樣。
在完全停用前,為了警示用戶避免使用?SELFDESTRUCT?,我們可以漸進式地增加其gas費用:如果?block.number+10**6>=FLAG_BLOCK?,則?SELFDESTRUCT?的gas費用增加到?10**10//(FLAG_BLOCK-block.number)?。
提案2:閹割?SELFDESTRUCT
我們也可以保留這個操作碼,但是改變其行為,一方面消除其對狀態樹的破壞,另一方面增加一個新特性,讓合約可以標識為不可自毀,從而確保代碼不可變。
暫時提議新增的行為包括:
當一個合約調用?SELFDESTRUCT?時,并不會刪除合約賬戶,而是清空代碼,并且將nonce值增加?2**40?。沒有退款。
通過調用將合約中的ETH轉移到目標地址。
可以在代碼為空的地址上創建合約。
在合約里調用?SSTORE?和?SLOAD?操作地址?A?時,實際操作的是?A_offset=(A+A.nonce//2**40)%2**160?的存儲樹。
注意,從EIP-2929的角度來看,?A_offset?需要“可達”。如果該賬戶不在可達賬戶集合中,則需要額外支付2600gas以加入可達集合。
另一種選擇是調整將storagekey轉換為treekey的哈希函數,用?sha3(storage_key+contract_nonce//2**40)?代替?sha3(storage_key)?。需要注意的是,無論如何都需要做一些類似的調整,以方便合約級別的無狀態key空間擴展。
合約可以在代碼中指定?0xA8?作為第一個字節,EVM會將其識別為無操作,但使用它來開啟一個標志,在執行過程中完全禁用?SELFDESTRUCT?的功能。
這兩種解決方案也可以結合起來:當前立即閹割,將來完全移除。或者,這個操作碼也可以永遠不被完全移除,但是最終只保留一個功能,即向目標地址發送合約當前的全部ETH余額,我們可以將這個操作碼重命名為?CLEAR?。
白銀帶來的金融革命 我們在電視劇中經常看到,水滸英雄或者俠客經常甩一枚銀錠去購買商品。但是實際上,白銀作為貨幣在中國的廣泛使用從元代才開始——原因是中國本土并不盛產“銀”這一貴金屬.
1900/1/1 0:00:00摘要: 泰國央行將穩定幣分成兩類:泰銖支持的穩定幣和其他穩定幣;該行宣布尋求監管咨詢意見,這對泰國加密行業的政策制定有一定影響。泰國央行公布了有關穩定幣的指導意見,并呼吁業界就監管咨詢提供意見.
1900/1/1 0:00:00在經歷了幾乎失去理性的瘋狂后,近日,整個DeFi領域迎來了平靜期。還記得幾月前,一大批加密貨幣投機者像掮客一樣涌入新的DeFi項目,頭礦是其竭力追逐的目標,投機者們像爭紅了眼的猛獸一樣,尋找新的.
1900/1/1 0:00:00研究公司Santiment指出,交易所的以太坊供應量處于28個月來的最低點。其ETH的儲量占以太坊總供應量的20.1%,上一次達到類似水平是在2018年11月.
1900/1/1 0:00:00來源:金色財經,原題《金色觀察|如何展示加密藝術品?》,作者:子木你的NFT非常好看,向全世界展示它們吧!展示加密藝術品最好的方式是什么呢?這個問題問得好,無論是NFT新還是老玩家.
1900/1/1 0:00:00原標題:《相比于FIP-14提案,我更想談談Filecoin的長期主義!》近日,Filecoin官方人員jennijuju在slack頻道發文稱:“Filecoin社區目前正在考慮一項Filec.
1900/1/1 0:00:00