📜 [專欄新文章] EIP2929, EIP2930 簡介
✍️ Anton Cheng
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Opcode 加油Proposal,會不會讓以太坊變更貴呢
昨天在同事的推薦下發現了這個YouTube系列:Peep an EIP,也聽了Vitalik和Martin介紹EIP2929 + 2930的這一期。這兩個EIP都已經被列入下一次的硬分岔(Berlin Hardfork),所以我就來寫個學習筆記。先打個預防針,本人對EVM可以說是非常不熟,但也希望藉著這個機會逼自己學習,如果有錯誤的話也希望懂的更多的各路大神可以不吝賜教。
Berlin without hardfork. (By Claudio Schwarz on Unsplash)
EIP2929: Gas cost increases for state access opcodes
乍看之下這是一個極為恐怖的Proposal。在Gas已經高到爆炸的2021年,理論上不應該再通過這種「加油」類的方案。不過不用緊張,其實這個EIP真正改變的是第一次access的價格,如果一筆交易內要執行一樣Opcode動作輛次,那麼gas cost 將降低為100。
Increases gas cost for SLOAD, *CALL, BALANCE, EXT* and SELFEDESTRUCT when used for the first time in a transaction.
大家都知道,合約最終會被Compile成一堆Opcode,這些Opcode也是用來計算最終交易手續費的依據:理論上越是花時間的的Opcode,應該要收越高的手續費。
但是一直以來,state access opcode 太便宜都是一個已知的問題:在2016年的上海DOS攻擊中,其中幾個攻擊的手法就是透過惡意交易大量讀取帳戶資訊、大量的創造合約再銷毀,或是不斷用 EXTCODESIZE 來讀合約大小等等,讓Client必須花大量的IO資源處理交易(需要讀寫disk的動作特別慢),最終使Client程式Crash或是延長出塊時間。儘管大部分的弱點已經透過EIP150中大量提升gas cost獲得改善(還有其後的EIP1884),但在EIP2929中,也引用的這篇Paper的數據:現在replay所有以太坊上的交易,當時那些惡意交易中的worst case還會需要~80秒才能完成。這跟以太坊所定義的13秒出塊時間有著很大的差距,也代表這個潛在的攻擊是可行的。
透過增加這些opcode所需要的gas cost,可以降低每個區塊最大可能的讀取數。以下是偷抄Vitalik PPT 的數據:(12,500,000 為gas limit上限)
Pre-EIP 2929:
BALANCE spam: 12,500,000 / (400 cost + 320 address size + 50 boilerplate) = 16,233 accesses per block
CALL spam: 12,500,000 / (700 + 320 + 50) = 11,682 accesses per block
SLOAD spam: 12,500,000 gas / (800 + 25 boilerplate) = 15,151 accesses per block (but of a smaller tree)
Post-EIP 2929:
BALANCE spam: 12,500,000 / (2,600 + 320 + 50) = 4,280 accesses per block
CALL spam: 12,500,000 / (2,600 + 320 + 50) = 4,280 accesses per block
SLOAD spam: 12,500,000 / (2,100 + 25) = 5,882 accesses per block
說實在的這個數據的解釋也很廢話,就是把Opcode變得用貴,能Spam的數量越少。平均來說Gas cost 變高3倍,所以之前worst case的80秒執行時間可以被下降到大概 ~27秒。
SSTORE changes
在實作層,EVM會維繫一個本筆交易讀取過所有交易的 Set。每次有尚未讀取過的slot時,就會先收取一筆 CLOD_SLOAD_COST (2100) ,然後把這個slot加入這個set中,下次讀寫就會比較便宜。
對於已經讀取過的Slot,再次寫入的Opcode SSTORE 之gas cost為會降低為
5000 — COLD_SLOAD_COST (2100) = 2900
簡單的說,單純只操作一次 SSTORE 的總gas 會維持一樣在 5000 。但如果這個slot是之前有讀過的,則寫入的gas cost就會降低。近一步來說,一個 x += 100 ,其實會變得更便宜:
Pre-EIP-2929: 800 SLOAD + 5000 SSTORE = 5800
Post-EIP-2929: 2100 SLOAD + 2900 warm SSTORE = 5000
其他Side effects
這個改動除了降低了最高能夠spam的次數以外,也降低了以太坊想要做到stateless client,理論上最大的witness 大小。其實這裡的原理跟前面很類似,下圖的表格比較的是目前使用hexary tree所需要的witness大小:若12.5M的區塊全部塞滿該Opcode的witness,理論上最大會佔多少空間。在EIP2929之後由於gas cost增加,就壓縮了最大可能的witness size.
這裡單純只比較增加gas cost後,對於max witness size的影響。影片中有提到其他許多方法旨在減少Witness bytes,包括使用binary tree而不是hexary tree,以及用Code Merklization等等。這些其他方法也能夠降低最後的Max Witness size,但跟這個EIP沒有直接相關。不過可以注意的一點是,這些其他在witness size上面的優化跟 gas cost 所帶來的優化的效果是可以相乘的,例如 SLOAD,更改gas price已經能夠讓max size 縮小2.6倍,若是改用Binary tree可以將 Witness bytes降低到 288 bytes,就會是再3~倍的優化。
對用戶的影響
依照Martin Swende 給出的數據,這個EIP對於一般交易的影響僅有提高0.3~0.4%。理由很簡單,雖然第一次access storage變貴了,但是後面幾次讀寫就會變得便宜。大部分應用的程式邏輯都是類似的幾個變數進行讀寫,因此可能有不少的動作反而會變得更便宜。一個最簡單的例子就是ERC20 Transfer,兩個餘額的 +=和 -= 都會變便宜,所以總共的花費也是變便宜的。
這其中也會對於Solidity的開發pattern有著一定程度的影響,我目前想到的影響可能有兩個:
由於多次的storage access變便宜,永遠cache state variables不再是一個最佳策略。以前我們會盡量想辦法減少寫入state storage的次數,現在可能會基於coding style考量減少一些的memory cache。
之前寫合約都會盡量避免external call,甚至會寫一些一次把所有 variable都回傳回來的笨函示,來避免多次的external calls。這有一部分原因是因為每次external call都會需要使用到 EXTCODESIZE 這個Opcode所以很貴。但如果 EXT 系列的Opcode也變得越call越便宜,那麼這個一次全部call 回來cache 住的pattern也可能改變。
以上兩個想法都還沒有經過實證,如果之後看到更有證據的分析的話,也會來這裡分享。
EIP2930: Optional access lists
EIP2929可能會影響一些鏈上的合約,因為有些合約有hardcode external call的gas 上限。對於這方面的問題,EIP2930提出一個新的交易類型,讓交易中多帶一個access list,即所有這筆交易即將讀寫的storage slot,並且先幫忙付掉第一次讀寫的gas,而真正交易讀寫該storage時,只會被要求付100 gas。
這不但可以避免這次EIP2929帶來的副作用,也可以被使用在其他因為gas price 改變的硬分岔升級而壞掉的合約,例如在EIP1184 增加 SLOAD gas price 時影響到的 Aragon 和Kyber 等等。儘管當時升級前各大專案都有幫助用戶提出migration 方案,但如果有人曾經卡錢在裡面,也可以Follow一下這次柏林Hardfork。
小結
新的一年就用一篇簡單的文章來開頭。最近發現自己以前的學習習慣有點亂無章法,所以新年整理了reading list,逼自己做筆記,順便發想一些想要寫的主題。今年的期許就是學更多Ethereum底層一點的知識,當然還有上層一點Defi的知識。也歡迎大家分享一下自己都是怎麼follow這麼多東西的><
EIP2929, EIP2930 簡介 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
一般預防理論例子 在 心靈僻靜花園 Facebook 的最佳貼文
今天來到了雙子滿月搭配半影月食,來分享個占星手札好了。
星盤中的水星代表了我們的思維、表達及溝通方式,而水星所守護的雙子座也代表著學習、知識交流及訊息傳遞。一個人的思維方式會影響著他學習及表達、溝通及交流的方式。前幾天與朋友談話時有一個挺有趣的觀察,當時友人剛好說到12月政府規定娛樂場所要開始戴口罩了,因為我沒有在看電視所以對這則新聞很不解,我順口問了:「為何?」。這二位友人異口同聲地回:「哪有為何!就政府規定啊!」,語氣中也帶有一股像是被冒犯般的回擊。聽他們這麼回,我還是陷在我的思維不理解中,因為我問為何是不清楚為什麼政府要開始規定戴罩了,疫情不是已過了一段時間嗎?後來友人解釋因為冬天會使疫情開始高漲,所以預防擴散請國人戴口罩。一個很簡單的「為何」,我有我「因為不理解原由」所問的為什麼,你也有可能因為「這有什麼好問的就政府規定」的被冒犯感,而若沒有多作解釋,很有可能會因為情緒的高漲而挑中彼此的地雷。
另一個例子也很有趣,有天友人試圖說一個小故事大啓發,友人是這麼說的:有一天有一個窮人和一個富人去餐廳吃飯,當一個切了七塊的披薩端上來後,窮人拿了一片吃,跟著富人也拿了一片吃。但窮人心裡嘀咕著,這明明就是我點的你幹嘛吃我的,但強忍著不說。後來當富人要吃第二片時,窮人忍不住就說「這是我點的耶!」,沒想到此時服務生又端上了另一個披薩,富人就說:「這才是你點的,剛剛那個是我點的。」這個故事的寓意想必大家都知道,但我聽到一開頭時就無法再專心聽故事,我滿腦子思考著:為何披薩可以切成七片?這不符合邏輯啊,怎麼切的?當然後續友人大概認為我的思維方式與一般人不同吧!
上述兩則故事若以星盤來觀察,我水星魔羯十宮,思維及講話方式很有魔羯的架構、制度、專業、理論、邏輯特質,甚至有時候用字譴詞也會讓我卡住。當然水魔羯在事業宮又與象徵金錢財運的木星在二宮呈三分相,想必今生就是靠專業的嘴吃喝。只是我個人常對無法真實表達出內在的原始意思感到很困擾,常常我想表達的意思聽在他人耳朵裡會變成另一種意思。因此他人愈是不理解,我就愈急於解釋我的真實意思,而愈解釋就會愈糟,因為焦慮的情緒會帶動關係的緊繃度。
從星盤來看因為我水魔羯與在一宮的月牡羊刑克,所以愈是講不清時情緒會跟著飛揚,然後他人就會因為我的情緒而噴張,更無法真正聆聽我所表達的內容。這我從小就很有感觸,常常與我母親陷入此種境況,而代表母親的正是我的月亮。再加上水星也與象徵前世傷痛的凱龍刑克,所以我想前世可能有因為表達或說法,造成他人或觸發自己受害的狀況,所以此生要來學會如何過濾掉傷痛所引發的情緒,而如實地表達自己的需求或想法。另外,水魔羯與其定位星土獅子在五宮也有寛鬆的梅花相,這也難怪在語言及表達間有種百口難言的無奈感。
你們的水星在哪個星座呢?哪個行星落在雙子座呢?
#月雙子滿月
#占星手札
#特定議題以靈魂心理占星方式理解私
#大叔雙子男
一般預防理論例子 在 公民不健忘-台灣主權和平獨立 Facebook 的最佳貼文
恩,逆風一下好了.
.
關於長榮外籍女學生命案,我想有幾點神父可以說一下.
.
1. 此事屬於跨區犯案,高雄市的梁嫌跑到台南市歸仁區犯案,性侵勒死被害人後,棄置棄屍在高雄阿蓮山區,台南縱使有治安問題,但不用講得好像犯罪之都一樣.
.
2. 葉毓蘭稱什麼「他有病,在台灣絕對不會死刑」,說什麼兇嫌因為有偷內褲的前科,所以是一種「特殊性偏好症」,所以不會判死刑,這基本上是一種無知,部分精神病患者犯罪之所以免死,是因為「心神喪失」,也就是犯案當下因精神疾病發作,影響其自主性,喪失判斷能力,並不是有精神疾病就會免除死刑,或者嫌犯偷內褲就等於一種精神疾病,這種連結是很偏差的,就算是戀物癖,也應該是針對偷內褲的案件而言,頂多是「無法控制自己偷內褲的衝動」,而不是推到他會因此去性侵殺人,或什麼因為他偷內褲所以殺人無罪,基本上,他是否屬於戀物癖還有待商榷,他可能是無法克制自己的慾望,本身就對異性有不正常的想像,或對性抱持惡意觀點,他比較像是一個性侵犯,追求一般女性未成,就拿內褲來滿足自己,然後開始犯案,內褲只是一種手段,而不是固著性或心理障礙,比起探討偷內褲的人心理狀態,應該探討的是對於女性的暴力心理,例如,之前網路風傳「盆栽要剪,女人要扁」,或者「男生的動物性」、「女人穿得少,就等於把生肉放在獅子面前」,「女人就是要打才會乖」,這種戲謔偷渡暴力的偏差觀點,釀成的風氣,反而是比較值得探討的現象.
.
講難聽點,同一批人可能覺得這種梗這樣很好玩,一邊又會嘲諷台灣沒死刑.
.
3. 「台灣社會很安全,安全到殺人犯也會很安全」,這不是事實,沒記錯的話,今年初才有一位死刑犯被槍決,台灣不是沒有死刑,而且有在執行,文明國家抓到殺人犯,仍然必須讓他經過公正審判,在此期間,嫌犯的確是安全的沒錯,但他的人身安全是因為要經過司法程序並且付出代價,如果在被抓捕後施予凌虐或急於判死,這才是很奇怪的事,此案該兇嫌性侵殺人又盜取財物,甚至隨機找人犯案,對象是無差別的,應有很高的機率判死,至於說什麼「世界都在看」,世界或許在關注這案件,不過關注的方式可能不是有沒有判死,例如之前翁仁賢判處死刑,德國政府跑來關注,說對台灣執行死刑感到十分遺憾.並表示,德國政府認為死刑是殘忍而且不人道的刑罰,無論在什麼情況下都反對死刑,德國與其它歐盟國家多年來在世界各地推動廢除死刑.
.
台灣的態度是,「仍會依法審慎執行死刑,實現社會正義」,那時,仍有人在酸什麼「民進黨政績+1」、「社會正義自助餐」、「有悔意可教化」等等.
.
4. 就算主張死刑,主張的理由也會是永久杜絕犯罪者再犯的危害,為被害者討公道,但部分人的觀點,反映出的是對死刑的執著,以及沒有執行死刑的焦慮與私憤,從關心事實以及譴責加害者,同情被害者家屬,直接跳到關注死刑會不會發生,這是很顯著的失焦,媒體方面應該多採訪一些專業人士的意見,而不是老是以葉毓蘭、吳宗憲、館長等人的意見佔據主軸,這對探討事件沒幫助,反而只會引起更多的混淆和更大的恐慌.
.
5. 在性侵殺人案件下提馬來西亞人來台讀大學的原因,其中之一是因為「以為滿街都是美女」,這很奇怪.
.
6. 黃偉哲在事發之後,執著於「路燈只有壞兩盞」,這是嚴重的失言,案發現場的路燈昏暗,學生歸校的路不安全,這是市政上的嚴重疏失,不應該強辯,這違背社會觀感,應該馬上道歉修正,但如果因此要提罷免,則太過,黃偉哲上任不滿兩年,因為單一案件就要求罷免,這對民主政治來說,很不健康,無論在輿論上加以譴責敦促其修正,或者監察院加以糾正,有很多政治手段可以使其付出政治責任,或加以制裁,但不是沒做兩年就提罷免,以台北市柯文哲的例子來看,在錢櫃大火時,稱「業者偷施工,政府不會知道」,指責人民「國家法律訂在那裡,老百姓有遵守義務,不是變成說政府沒去抓到,他犯法好像沒責任」或者講什麼乳酪理論「每片有乳酪有洞可以川過去」,並歸咎一切都是制度的問題,我想這是更嚴重的失言,政治是相對的,如果這麼一個極端偏差的例子在前,台灣社會容許他存在,還稱讚「阿北說的對」,對柯文哲前一天跑到高雄跑政治行程,事發後不在現場,氣喘吁吁趕回台北,對於他推銷石斑魚讚不絕口,不只沒罷免,還讓他連任,這種政治文化根本比例失衡.
.
7. 派出所沒發三聯單,縱使後續有實行調查,但燈光昏暗找不到車牌,這是發生在該兇手先前擄人未遂的另一起案件,種種跡象顯示,這是一件可以預防的災難,而這的確屬於吃案,校方獲通知後竟然不依規定進行校安通報,警方的事實認知居然對於另一名女大生的反應是未報案,這就是吃案的後遺症,訊息混淆,乃至於市長以為只有兩盞路燈沒亮,這都可以反映出螺絲鬆了,以及卸責的政治文化,必須加以嚴厲究責以建立起政治道標.
.
8. 對於馬來西亞僑生感到恐慌,台灣政府難辭其咎,總統和行政院長道歉是正確決定,疫情後,馬來西亞僑生取代陸生,成為留學生最大宗,原以為台灣是安全的地方,結果卻有人遭到性侵殺害,這起事件是今年的第二起,今年初,台北市即有大馬女華僑遭到分屍,台灣方面真的要好好重新檢視僑生的安全問題,重拾馬來西亞對台灣安全的信任,此案件發生,最痛苦的,應該是被害者家屬,原本要參加女兒的畢業典禮,卻變成認屍.
.
我由衷地感到抱歉,因為死者是相信台灣安全,所以才選擇台灣,但我們卻無法回應她的這一份期待,最基本的生命安全的期待.
.
請馬來西亞人接受台灣的道歉,儘管失去的生命是怎樣也不能挽回的,但請相信,台灣會重新建立起一個更好更安全的地方,brother.