📜 [專欄新文章] Solidity Data Collision
✍️ Wias Liaw
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
這是一篇關於 Proxy Contract 和 delegatecall 的注意事項。
Delegatecall
當 A 合約對 B 合約執行 delegatecall 時,B 合約的函式會被執行,但是對 storage 的操作都會作用在 A 合約上。舉例如下:
但是假如多加了一個 other 欄位在 _value 之前,執行合約之後反而是 other 欄位被更改了。
Storage Layout
了解上面的合約之前要先了解 Solidity 怎麼儲存 State Variables。Solidity Storage 以 Slot 為單位,每個 Slot 可以儲存 32 bytes 的資訊,一個 Contract 擁有 2**256 個 Slot。上述可以寫成一個映射關係 mapping(uint256 => bytes32) slots。
Solidity 會從 Slot Index 為零開始分配給 State Variable。
除了 mapping 和 dynamically-sized array,其他的 State Variable 會從 index 為零的 slot 開始被分配。
沒有宣告確切大小的 Array 會以 Slot Index 計算出一個雜湊值並將其作為 Slot Index。透過計算 keccak256(slot) 可以得知 _arr[0] 被存在哪裡,如果要取得 _arr[1] 則將計算出來的雜湊加上 Array 的 index 即可。
Mapping 則是以 Slot Index 和 Key 計算出一個雜湊值並將其作為 Slot Index。透過計算 keccak256(key, slot) 可以得到 mapping(key => value) 被存在哪。
Storage Collision
回到 DelegateExample_v2 的合約,對 B 來說, add 最後儲存加法的 Slot Index 為零,所以使用 A 的 Storage 執行 B 的函式結果自然會儲存在 A 的 other 裡,其 Slot Index 為 0。
這個問題也發生在 Proxy Contract,Layout 如下,當有需要更改 _owner 的操作,就會順帶把 _implementation 也更改了。
|Proxy |Implementation ||--------------------------|-------------------------||address _implementation |address _owner | <= collision|... |mapping _balances || |uint256 _supply || |... |
OpenZeppelin 處理的手法也很簡單,就是將 _implementation 換地方擺。以特定字串的雜湊值作為 Slot Index,儲存 Implementation 的地址。
|Proxy |Implementation ||--------------------------|-------------------------||... |address _owner ||... |mapping _balances ||... |uint256 _supply ||... |... ||address _implementation | | <= specified|... | |
openzeppelin-contracts/ERC1967Upgrade.sol at 83644fdb6a9f75a652d2fe2d96cb26073a14f6f8 · OpenZeppelin/openzeppelin-contracts
hardhat-storage-layout
如何知道合約的 Storage Layout 呢?這邊推薦一個 Hardhat Plugin,按照文件就能得到合約的 Storage Layout。
Ethereum development environment for professionals by Nomic Labs
Reference
Understanding Ethereum Smart Contract Storage
Collisions of Solidity Storage Layouts
Proxy Upgrade Pattern - OpenZeppelin Docs
Solidity Data Collision was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有2部Youtube影片,追蹤數超過6萬的網紅江林公子,也在其Youtube影片中提到,信星科技 - 飛智FLYDIG 官方網址: https://flydigi.waca.tw 飛智黃蜂單手手柄產品心得分享: 首先左手大拇指移動按鍵非常舒適,不像以往按螢幕產生手汗導致失誤,或者手指乾的玩久會非常不舒服,另外能輕鬆達成四指連動,這讓原本未安裝吃雞神器的我,在安裝後操作上能更...
「映射mapping」的推薦目錄:
- 關於映射mapping 在 Taipei Ethereum Meetup Facebook 的精選貼文
- 關於映射mapping 在 軟體開發學習資訊分享 Facebook 的最讚貼文
- 關於映射mapping 在 軟體開發學習資訊分享 Facebook 的最佳貼文
- 關於映射mapping 在 江林公子 Youtube 的最佳貼文
- 關於映射mapping 在 Post76影音玩樂 Youtube 的最佳解答
- 關於映射mapping 在 Desiring Clicks - 「映射(mapping)」是設計介面的時候一個 ... 的評價
- 關於映射mapping 在 4.3-Linear Mapping 線性映射 - YouTube 的評價
映射mapping 在 軟體開發學習資訊分享 Facebook 的最讚貼文
NT 430 特價中
課程已於 2021 年 6 月更新
Spring 是一個企業 Java 框架。 其功能在簡化 Java EE 開發並提高開發人員的工作效率。 Spring 使用 Inversion of Control 和相依性注入( Dependency Injection )來促進良好的軟體程式設計實踐,並加快開發速度。
Hibernate 是一個物件到關係映射(Object-to-Relational-Mapping,ORM)框架。 它簡化了Java 應用程式的資料庫訪問。 經由運用這框架,你可以通過設置一些簡單的配置映射來輕鬆儲存和檢索 Java 物件。
https://softnshare.com/spring-hibernate-tutorial/
映射mapping 在 軟體開發學習資訊分享 Facebook 的最佳貼文
NT 330 特價中
課程已於 2021 年 5 月更新
Spring 是一個企業 Java 框架。 其功能在簡化 Java EE 開發並提高開發人員的工作效率。 Spring 使用 Inversion of Control 和相依性注入( Dependency Injection )來促進良好的軟體程式設計實踐,並加快開發速度。
Hibernate 是一個物件到關係映射(Object-to-Relational-Mapping,ORM)框架。 它簡化了Java 應用程式的資料庫訪問。 經由運用這框架,你可以通過設置一些簡單的配置映射來輕鬆儲存和檢索 Java 物件。
本課程涵蓋了Spring 和 Hibernate 的最新版本!
https://softnshare.com/spring-hibernate-tutorial/
映射mapping 在 江林公子 Youtube 的最佳貼文
信星科技 - 飛智FLYDIG
官方網址: https://flydigi.waca.tw
飛智黃蜂單手手柄產品心得分享:
首先左手大拇指移動按鍵非常舒適,不像以往按螢幕產生手汗導致失誤,或者手指乾的玩久會非常不舒服,另外能輕鬆達成四指連動,這讓原本未安裝吃雞神器的我,在安裝後操作上能更舒適的做出多指操作,這邊推薦給玩家們可以去購買進行使用。
飛智黃蜂單手手柄產品資訊:
1.創新電容隔空映射 物理信號模擬觸屏
飛智自研 CapAir Mapping 電容隔空映射,顛覆行業連接技術,通過發射電容信號隔空模擬人手觸屏,免藍牙連接,蘋果手機插入手柄即可使用
2.秀出"蜂騷"走位ALPS日本進口搖桿.ALPS日本進口搖桿小巧精準,使用壽命長,強耐磨性消除手汗帶來的失誤煩惱,王者走A,吃雞跑位,極致體驗遠勝觸屏
3.輕鬆舒適多指操作,走位射擊蜂馳電掣,人體工程學按鍵結構設計,直接上手省去艱辛練習,輕鬆實現三指、四指操作,走位射擊“蜂馳”電掣
4.持久續航,從白天戰到黑夜,20小時超長續航,你的精力有多旺盛,它的精力就有多充沛,可以陪伴你從白天的第一縷陽光酣戰到子夜的漫天星辰
5.矽脂+石墨烯雙重散熱,遠離發熱降頻,矽脂+石墨烯雙重散熱材料,將手機熱量快速導到手柄後背散發,避免系統發熱降頻、遊戲卡頓,暢享夏日競技狂歡
6.創新擠壓式結構,裝卸從未如此炫酷,擠壓式裝卸結構,一鍵彈開拉桿,回按多檔可調,1秒裝卸方便快捷,卡槽上的精細鋸齒適配每款手機型號微小的尺寸變化,貼合天衣無縫,一撥、一插、一按,裝卸從未如此炫酷
7.時尚輕巧 "蜂"度翩翩,活力黃與經典黑的結合,賦予了黃蜂獨特的時尚魅力。手掌般大小,小巧而便攜。地鐵上、午休時、聚會間隨時來一局遊戲,格調十足,“蜂”度翩翩
映射mapping 在 Post76影音玩樂 Youtube 的最佳解答
早在上個月都係 Youtube 上左睇好多美國 Review, 呢日終於都有機會可以親身上手試玩, Samsung Galaxy S10 是首款配備最新 Dynamic AMOLED 屏幕, 小小的19:9屏幕可提供影院級效果, 的確係非常靚仔. 而且 Galaxy S10 仲支持HDR10+和動態色調映射(Dynamic Tone Mapping)技術, 聲稱可以呈現更生動銳利的畫質及更廣闊的色域同對比度,而且仲自動為大家減低屏幕的藍光, 即使在黑暗環境中睇片, 都唔會對眼睛造成負擔。小瑟有機會一試, 一定要試下佢影相同睇片既效果先, 至於聽歌就.............!^^"
圖文報道 : https://post76.hk/news/2019/03/samsung-s10-s10plus/
討論區帖子 : https://post76.hk/thread-287705-1-1.html
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
?Marvel Studios《Marvel 隊長》導讀 – 入場前你要留意的 5 個彩蛋位
https://post76.hk/news/2019/03/captain-marvel-preview/
?♂️?全民投票出爐了! 最受Post76影音玩家喜愛的十大香港電影院係邊十大呢?
https://post76.hk/thread-286507-1-1.html
?電視評測 : Sony MASTER Series Z9F 4K LED 電視 : 迎戰不同光暗環境的影像大師
https://post76.hk/…/2…/01/sony-master-series-4k-hdr-led-z9f/
?看完片支持我們一下點按"搶先看"/"訂閱"呀!!
我們的網站 : https://post76.hk
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
看完片支持我們一下點按"搶先看"/"訂閱"呀!!
我們的網站 : https://post76.hk
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
#Post76玩樂網 #samsung #s10 #s10plus #
-~-~~-~~~-~~-~-
Please watch: "【好熱戲特備】全港首試『#FOLLOWMi 鄭秀文世界巡迴演唱會』4K UHD 藍光碟 | 實試4K/60p HDR | DTS 24/96 Auro 3D升頻效果 "
https://www.youtube.com/watch?v=OchTYVe4Nz8
-~-~~-~~~-~~-~-
映射mapping 在 4.3-Linear Mapping 線性映射 - YouTube 的推薦與評價
量子基礎線性代數授課教師:國立中正大學資訊工程學系游寶達教授課程包括六大主題:單元1:代數系統單元2:向量空間(Vector Space)單元3:矩陣計算及 ... ... <看更多>
映射mapping 在 Desiring Clicks - 「映射(mapping)」是設計介面的時候一個 ... 的推薦與評價
「映射(mapping)」是設計介面的時候一個非常重要的思考方式! 所謂「映射」就是操作方式與介面和要操作的對象和結果有著相似的外觀或行為,如此一來,才能讓使用者 ... ... <看更多>