📜 [專欄新文章] 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影片,追蹤數超過11萬的網紅鐵道事務所,也在其Youtube影片中提到,↓影片中所介紹的品牌↓ 官方臉書粉絲專頁: https://www.facebook.com/MondaineTW 官方IG帳號: https://www.instagram.com/mondaine_taiwan/?hl=zh-tw 粉絲專屬的蝦皮折扣碼:WRITTRAIN(滿2500現折30...
「data mapping」的推薦目錄:
data mapping 在 Might Electronic 邁特電子 Facebook 的最佳貼文
📢 Mighty Tech🚩
🔑 Use drones to observe forest fires🔥
#RouteScene uses #LiDAR surveying and mapping technology to observe forest fires. The most breakthrough part of this technology is that it can overcome the limitations of the past, collect data of different vegetation layers, and can also establish #3D #PointCloud data of the forest canopy to more comprehensively detect the vegetation profile. 🌲光達(LiDar)測繪技術
3D點雲(point cloud)資料
📌Source 👉https://bit.ly/34TBvMP
--------------------
📢邁特新知🚩
🔑 用無人機觀測森林大火🔥
RouteScene利用光達測繪技術,來觀測森林火災🌳此技術最具突破的部分在於,可以克服過去的限制,採集不同植被層的數據,也能建立林冠的 #3D點雲資料,更全面的檢測植被概況🌲
📌更多資訊看這裡 👉https://bit.ly/34TBvMP
data mapping 在 Facebook 的最佳貼文
英格蘭的規劃改革(Planning Reform)——數位規劃(Digital Planning)
去年首相發佈加速開發的演說後(‘Build, Build, Build’),規劃白皮書和相關文件陸續浮出檯面,碰上脫歐和新冠疫情,是時機整頓早就過時許久的規劃系統。政府邀請各界審視提案,學/業界都積極回應,當中也包含建築協會RIBA、景觀協會LI、都計RTPI專業協會。
撇除政治法規、經濟發展等比較複雜的部分,其中較有趣的重點是 「數位規劃」。
英國政府的開放資料(Open Data)和圖資早已成熟,各單位運用線上圖台展示地區的發展願景(Local Plan)也很普遍,民眾也早在用圖台查看各地即時的規劃案申請等,但各地區的數位化進度以及圖資資源仍存在差距。
平台業者如ESRI或3D VuCity等,也都積極連結政府的開放資料。這週自己工作上藉由專案認識到Bentley研發的雲端iTwin協作模式更是大開眼界!算傳統BIM模型的躍進,而開發類似產品的公司不勝枚舉!新技術帶來好處的背後,人們更被網路綁架、網路隱私安全問題等,也急需被討論解決。
延伸閱讀👉
1️⃣倫敦規劃圖台 - 對圖資展示的色系、介面設計放了心思
https://maps.london.gov.uk/planning/
2️⃣地區政府空汙政策的展示圖台 - 彙整圖資、影片、報告書等資訊
https://www.arcgis.com/apps/MapJournal/index.html?appid=c91838f3f37e428a89bc743948a3e929
3️⃣VuCity - 區域政府使用雲端3D展示系統檢視規劃案
https://vu.city/portfolio-items/canada-water-interactive-3d-consultation-application
Article credit: @haowenl
#駐英台 #景觀設計駐台派 #規劃 #設計師日常 #景觀人生 #法規討論 #開放資料 #數位時代 #地圖 #都市設計 #都市計畫 #倫敦
#twuklandarchnote #opendata #landarch #landscapearchitecture #vucity #london #mapping #urbanplanning #buildbuildbuild #arcgis
data mapping 在 鐵道事務所 Youtube 的最佳貼文
↓影片中所介紹的品牌↓
官方臉書粉絲專頁:
https://www.facebook.com/MondaineTW
官方IG帳號:
https://www.instagram.com/mondaine_taiwan/?hl=zh-tw
粉絲專屬的蝦皮折扣碼:WRITTRAIN(滿2500現折300元)
↓商品購買連結↓
https://shopee.tw/writek86?page=0&shopCollection=7824132
•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••
00:00 Intro
00:45 瑞士鐵路簡介
02:20 世界最陡鐵路
04:08 世界最長鐵路隧道
05:54 歐洲海拔最高車站
07:05 瑞士國鐵鐘
08:37 Mondaine瑞士國鐵(你又被業配啦)
10:07 Ending
•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••
圖片來源(含維基百科版權聲明):
Google Map
By de:Benutzer:Pechristener - Own workMap was created using Open Street Map, CC BY-SA 2.0, https://commons.wikimedia.org/w/index.php?curid=38375849
By Pechristener, Plutowiki - Wikimedia-Bild mit CC-SA-2.0-Lizenz:Map was created using Open Street Map, CC BY-SA 2.0, https://commons.wikimedia.org/w/index.php?curid=56823876
By Kabelleger / David Gubler (http://www.bahnbilder.ch) - Own work: http://www.bahnbilder.ch/picture/7458, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=14027421
By Eric Gaba (Sting - fr:Sting) and NordNordWest - Background relief map (relief, lakes and rivers): own work by uploaderSource of data: NASA SRTM3v2 (public domain)All other data (rivers, lakes and boundaries) taken from File:Switzerland_location_map.svg created by NordNordWest under CC-BY-SA-3.0United States National Imagery and Mapping Agency dataWorld Data Base II dataBundesamt für Umwelt BAFU, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=8670093
By Kabelleger / David Gubler (http://www.bahnbilder.ch) - Own work: http://www.bahnbilder.ch/picture/11844, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=24456772
By Scott Davis - Own work, CC BY 2.5, https://commons.wikimedia.org/w/index.php?curid=1282693
By No machine-readable author provided. AHEMSLTD~commonswiki assumed (based on copyright claims). - No machine-readable source provided. Own work assumed (based on copyright claims)., CC BY 2.5, https://commons.wikimedia.org/w/index.php?curid=396364
By Pechristener (rendering with Maperitive, text and integrationFile:SBB 2015.svg: Pechristener - Map was created using Open Street Map DataMap was created using:Open Street MapSBB 2015.svg for location map, CC BY-SA 2.0, https://commons.wikimedia.org/w/index.php?curid=43423641
By Kabelleger / David Gubler (http://www.bahnbilder.ch) - Own work: http://www.bahnbilder.ch/picture/10895, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=20634362
By Hannes Ortlieb (Diskussion) - Own work (Original text: selbst fotografiert), CC BY-SA 3.0 de, https://commons.wikimedia.org/w/index.php?curid=41678371
By Svein-Magne Tunli - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=29905355
By Salamanamanjaro at English Wikipedia, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=18562109
By Хрюша - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=5024939
By Adrian Sulc - Own work (Original text: Eigene Fotografie), CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=6015864
By Martin Hawlisch - My own photo (dewp: "von Martin Hawlisch fotografiert" = Own work (photo)), CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=455917
音樂來源:
「Kevin MacLeod」創作的「Cold Funk - Funkorama」是根據「Creative Commons Attribution」(https://creativecommons.org/licenses/by/4.0/) 授權使用
來源:http://incompetech.com/music/royalty-free/index.html?isrc=USUAN1100499
演出者:http://incompetech.com/
•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••🌙•••
鐵道事務所 - Tetsudo Jimusho:https://www.facebook.com/TetsudoJimusho/
合作邀約:tetsudojimusho@gmail.com
#鐵道事務所 #海外鐵道 #鐵道事務所海外系列 #瑞士 #瑞士國鐵 #瑞士國鐵鐘 #歐洲
data mapping 在 逼呿 Youtube 的精選貼文
#伽勒爾 #精靈寶可夢 #POKEMON
【逼呿集團】AR Mapping為主題的田野調查課題登場&近期蛋池變化以及官方暗示伽勒爾小火馬跟蔥遊兵即將登場!?
文中圖檔引用:https://twitter.com/poke_miners
蛋池參考:https://9db.jp/pokemongo/data/1974
data mapping 在 A better way to map data in multiple datasets ... - Stack Overflow 的推薦與評價
... <看更多>