📜 [專欄新文章] 可升級合約介紹 - 鑽石合約(EIP-2535 Diamond standard)
✍️ Kimi Wu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Photo by Evie S. on Unsplash
前言
可升級合約簡單來說是透過 proxy contract(代理合約)來達成,藉由代理合約去呼叫欲執行的合約,若要升級,則把代理合約中的指向的地址換為新的合約地址即可。而執行的方式則是透過 delegateCall,但 delegateCall 不會更動目標合約的狀態。所以要怎麼處理變數,就是一門學問了。
舉例來說,contract B 有個變數 uint256 x,初始值為 0, 而 function setX(uint256),可以改變 x 的值。proxy contract A 使用 delegatecall 呼叫 contract B 的 setX(10),交易結束後,contract B中的 x 依然還是 0。
OpenZeppelin 提出了三種實作方式,可以做到可升級合約,細節可參考 Proxy Patterns,而最終的實作選用了 Unstructured Storage的這個方式,這種方式對於開發較友善,開發時不需特別處理 state variables(不過升級時就需要特別注意了)。而這篇主要是介紹 Diamond standard,OpenZeppelin 的可升級合約就不多做介紹。
USDC V2 : Upgrading a multi-billion dollar ERC-20 token 詳細地介紹代理合約跟變數儲存之間的關係,不了解升級合約的原理,建議先看看。
鑽石合約
名詞介紹
diamond:合約本體,是一個代理合約,無商業邏輯
facet:延伸的合約(實際商業邏輯實作的合約)
loupe:也是一個 facet,負責查詢的功能。可查詢此 diamond所提供的 facet與facet所提供的函式
diamondCut:一組函式,用來管理(增加/取代/減少)此 diamond合約所支援的功能
Loupe
直接來看 loupe的介面,從宣告就能很清楚暸解 diamond合約的實作方式,loupe宣告了一個結構 Facet,Facet結構包含一個地址及 function selector 陣列,所以我們只需要記錄一個 Facet陣列就可以得知這個 diamond 合約有多少個延伸合約及所支援的功能(loupe只定義結構,而實際變數是存在diamon合約中的)。也就是 diamond合約中只記錄延伸合約的地址及其支援的 function selectors,及少數 diamond合約的管理邏輯,並無商業邏輯,因此可以外掛非常非常多的合約上去(就像一個Hub),也就可以突破一個合約只有24K的限制。
// A loupe is a small magnifying glass used to look at diamonds.interface IDiamondLoupe { struct Facet { address facetAddress; bytes4[] functionSelectors; } function facets() external view returns (Facet[] memory facets_); function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_); function facetAddresses() external view returns (address[] memory facetAddresses_); function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_);}
DiamondCut
至於 facet在 diamond合約上的註冊或是修改,就由 diamondCut負責,從以下程式碼可以清楚瞭解其功能(EIP中有規範,每次改變都需要發送DiamondCut事件)
interface IDiamondCut { enum FacetCutAction {Add, Replace, Remove} // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);}
Diamond合約
接下來就是最核心的部分 — diamond本體合約。以下是官方的範例,方法上跟 OpenZeppelin 一樣使用 fallback 函式跟 delegateCall 。
呼叫合約所不支援的函式,就會去執行 fallback 函式,fallback 函式中再透過 delegateCall 呼叫 facet 合約相對應的函式
fallback() external payable { address facet = selectorTofacet[msg.sig]; require(facet != address(0)); // Execute external function from facet using delegatecall and return any value. assembly { calldatacopy(0, 0, calldatasize()) let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 {revert(0, returndatasize())} default {return (0, returndatasize())} }}
主要的差異在於變數的處理,OpenZepplin 是針對單一合約設計的代理合約(也就是每個合約都有自己的代理合約),所以無法處理單一代理合約儲存多個合約的變數(state variables)的狀況(後有圖例)。先由官方的範例程式來了解是怎麼處理變數的
在官方的範例中,都是以更改合約 owner 為例子
首先看到 DimaondStorage這個結構,結構中的前面三個變數都是在維持 diamond合約的運作(同上面loupe的範例),最後一個變數 contractOwner就是我們商業邏輯中所需的變數。
接著看到 function diamondStorage(),取變數的方式就跟OpenZeppelin 儲存特定變數方式一樣(EIP-1967),是把變數存到一個遠方不會跟其他變數碰撞到的位置,在這裡就是從 DIMOND_STORAGE_POSITION 這個 storage slot 讀取。
在實作上就可以有 LibDiamond1 ,宣告DIMOND_STORAGE_POSITION1=keccak256("diamond.standard.diamond.storage1") ,負責處理另一組的變數。藉由這種方式讓每個 facet合約有屬於自己合約的變數, facet合約間就不會互相影響。而最下方的 setContractOwner 是實際使用的範例。
library LibDiamond {
bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage");
struct FacetAddressAndSelectorPosition { address facetAddress; uint16 selectorPosition; }
struct DiamondStorage { mapping(bytes4 => FacetAddressAndSelectorPosition) facetAddressAndSelectorPosition; bytes4[] selectors; mapping(bytes4 => bool) supportedInterfaces; // owner of the contract address contractOwner; }
function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } }
function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; ds.contractOwner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); }
每個 library 處理了一組或多組變數的存取, facet 合約透過 library 對變數做操作。也就是把變數存在diamond主體合約,延伸的 facet合約只處理邏輯,是透過 library 去操作變數。
下面圖中清楚地解釋了 facet合約,function selectors 與變數之間的關係,從最左上這邊有個 facets 的 map,紀錄了哪個 selector 在哪個合約中,例如func1, func2是 FacetA的函式。左下角宣告了變數,每組變數的存取如同上述 library 的方式處理。
https://eips.ethereum.org/EIPS/eip-2535#diagrams
在 diamond的設計中,每個 facet合約都是獨立的,因此可以重複使用(跟library 的概念一樣)
https://eips.ethereum.org/EIPS/eip-2535#diagrams
小結
diamond合約使用不同的設計來達成合約的可升級性,藉由這種Hub方式可隨時擴充/移除功能,讓合約不再受限於24KB的限制,此外充分的模組化,讓每次升級的範圍可以很小。最後,因為跟library一樣只處理邏輯,並無狀態儲存,所以可以重複被不同的diamond合約所使用。
雖然又不少好處,也是有些缺點。首先,術語名詞太多,facet, diamondCut, loupe等等(其實還有好幾個,不過沒有介紹到那些部分,所以沒有寫出來)。開發上不直覺,把變數跟邏輯拆開,若要再加上合約之間的繼承關係,容易搞混,不易維護。最後,gas的花費,在函式的讀取、呼叫,變數的存取、傳遞都會有不少的額外支出。Trail of Bits 專欄中有點出更多的缺陷 Good idea, bad design: How the Diamond standard falls short,不過作者也有反擊 Addressing Josselin Feist’s Concern’s of EIP-2535 Diamond Standard,有興趣的讀者可以自行看看、比較。
為了模組化及彈性,diamond合約在設計上有點太複雜(over engineering),會造成可讀性越差(這點也是Vyper誕生的原因之一),而可讀性越差就越容易產生bug、也越不容易抓到bug,而在defi專案中,一個小小的bug通常代表著大筆金額的損失 😱😱😱。
雖然如此,筆者還是覺得很酷,有些設計的思維仍然可以使用在自己的專案
ref:
EIP 2535
Diamond 實作
Addressing Josselin Feist’s Concern’s of EIP-2535 Diamond Standard
OpenZeppelin upgradeable contract
可升級合約介紹 - 鑽石合約(EIP-2535 Diamond standard) was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有8部Youtube影片,追蹤數超過11萬的網紅Moto7汽機車,也在其Youtube影片中提到,#HONDA #CRV #Nikon_Z6 #Nikon_Taiwan 車輛很多的細節透過短時間的試駕難以感受,站長透過成為車主,實際駕駛3000km與日常使用,來告訴大家愛車CR-V幾個喜歡與不喜歡的點!...
「x trail缺點」的推薦目錄:
- 關於x trail缺點 在 Taipei Ethereum Meetup Facebook 的最讚貼文
- 關於x trail缺點 在 流浪者日誌-Bikepacking diary Facebook 的最佳解答
- 關於x trail缺點 在 粗脖子Mumu Facebook 的最佳貼文
- 關於x trail缺點 在 Moto7汽機車 Youtube 的最讚貼文
- 關於x trail缺點 在 buycartv Youtube 的最佳解答
- 關於x trail缺點 在 小新新講 Youtube 的最佳解答
- 關於x trail缺點 在 [討論] X-trail其實滿好開的? - 看板car 的評價
- 關於x trail缺點 在 x-trail 2020缺點、x trail災情、x trail通病在PTT/mobile01評價 ... 的評價
- 關於x trail缺點 在 2022x trail缺點-汽車保養試乘體驗,精選在Youtube上的開箱影片 的評價
- 關於x trail缺點 在 nissan x-trail缺點的推薦與評價,MOBILE01、PTT、DCARD 的評價
- 關於x trail缺點 在 nissan x-trail缺點的推薦與評價,MOBILE01、PTT、DCARD 的評價
- 關於x trail缺點 在 [問題] NISSAN X-trail是不是不想賣了? - PTT 熱門文章Hito 的評價
- 關於x trail缺點 在 [問題] 為什麼X-TRAIL板上很少人討論? - car 的評價
- 關於x trail缺點 在 舞山林超人店長車頂架專賣店- NISSAN X-TRAIL 搭配THULE ... 的評價
- 關於x trail缺點 在 [討論] 家裡要換休旅除了XTRAIL哪台好? | car 看板 - My PTT 的評價
- 關於x trail缺點 在 x-trail 2020缺點在PTT/Dcard完整相關資訊 - 小文青生活 的評價
- 關於x trail缺點 在 x-trail 2020缺點在PTT/Dcard完整相關資訊 - 小文青生活 的評價
- 關於x trail缺點 在 X trail 2020開箱; 燒杯破解版 - 學士後ptt 的評價
- 關於x trail缺點 在 [討論] X-trail其實滿好開的? - PTT評價 的評價
x trail缺點 在 流浪者日誌-Bikepacking diary Facebook 的最佳解答
“流浪者日誌” - 2020 BIKEPACKING.com 裝備精選
不能出國的一年,少了許多流浪,少了許多冒險
這一年,我沒有太多Bikepacking的印象,
今年在日本走的路線,對我來說都像是小品
像是在家裡附近練車的感覺,沒有那種震撼到內心的感動。
我自己都快忘記自己是bikepacker。
回憶,都停留在去年的草原之中。
即便如此,世界還是在走,日子還是在過。
到了年末,BIKEPACKING.com也是推出了今年的裝備精選
看了看裡面的內容,其實Bikepacking發展至今
許多東西都有了個標準的規格或者說是型態。
就像是手機,每家廠商做出來的都差不太多
基本的功能大家都有。
但也因為如此,能夠在這樣的環境之中做出差異的都是高手中的高手。
Bikepacking的裝備之中,尾包扮演著重要的角色
今年,Bikepacking界中的創始大佬,Revelate Disign出了一款我相當看好的尾包
有著超大的容量(16L),這是我一直很想要的。(我還不夠斷捨離啊)
面對超大的容量,很多人會在意他的穩定性,騎乘時是否會左搖右晃
這點,Revelate Design聰明地透過坐墊下方的固定器以及硬挺的包體成功的穩定包身。
我在北海道禮文島的夥伴就買了這個包,整路上,他都是微笑著騎車
要說缺點,大概就是外觀稍微少了點設計感
巨大的包身裝在車上似乎顯得有點不平衡
還有不菲的價位了吧。
今年我也嘗試了非自立帳
(如何選帳篷 https://bikepackermrmao.weebly.com/bikepacking-diary/-bikepacking2682996 )
因此一些看起來很酷的帳篷也特別吸引我的目光
ZPACKS FREE DUO TENT有著獨特的骨架和營繩拉線方式
ZPacks一項有著超輕的重量,
雖然我沒有使用過,沒有摸過,因此不好說什麼
但這一定會是一頂十分好有趣的帳篷
再來就是單車了
BIKEPACKING.com今年的精選Bikepacking單車是KONA的UNIT X
稍微看了一下,似乎是台CP值很高的車
我會注意到他,主要也是因為去年騎了WOHO去昏鴉跑了一趟紐西蘭off road bikepacking
(紐西蘭BIKEPACKING: https://bikepackermrmao.weebly.com/bikepacking-diary/-st-james-cycling-trail )
那次的經驗實在太好,讓我從此對於MTB從此念念不忘
以前騎公路車看不順眼的平把,現在卻是如此性感有魅力
UNIT X我沒有騎過,但是大廠出的東西應該也不太會有問題
唯一小小的疑問是KONA UNIT X沒有前避震
搭配前避震的昏鴉在紐西蘭輾壓碎石以及下坡的感覺是在太好太順
這讓我有點無法忘懷,也對沒有前避震的車有點懷疑
有點懷疑他是否能帶果我相同的騎乘感受。
http://xn--bikepacking-zp8q42gir4eopai09eeioc2b.com/ 2020 Bikepacking裝備精選中的一先簡單感想
裡面還有許多有趣的裝備,大家可以進去看看,也歡迎大家一起討論
期待再度踏上冒險的一天。
https://bikepacking.com/gear/2020-bikepacking-gear-of-the-year/?fbclid=IwAR0Og37ifwJ3hk6Jmctij37DOukYS_4O_WO1aaknudCYxpv2gLWPmTCgFxI
x trail缺點 在 粗脖子Mumu Facebook 的最佳貼文
很多人問所以開代購有需要即可填單~滿20人成團
價格$2500(多退少補,詳細內容看表單)
https://forms.gle/i971ZAAnMpUTLkx79
\ 終於找到不再讓Mumu焦慮的汽車坐墊 /
#不是業配 #不是業配 #不是業配
Mumu坐車的時候行為是上竄下竄無法休息,嚴重的話還會出現喘氣的狀況,幾乎坐下躺下的時間很短,不管是她還是我其實都很困擾,而且她會衝入副駕是很危險的事情。
過去我買過各式各樣的汽車坐墊,包覆性高的厚的都沒有辦法讓Mumu好好的在車上休息,一開始是為了不要掉毛又可以好好包住而買,到最後是不管會不會掉毛讓她好好待著才是重點,因為無論調的多緊繃她還是會亂竄。
後來觀察後是腳踩上去的不穩定感讓她不舒適,座椅軟軟的有點往後傾斜,坐墊的寬度對她而言躺下也有些緊迫,這已經不是布類的汽車坐墊可以減緩的,於是我換成充氣型的,結果因為踩上去會凹陷比布類讓她更慌張。
車床式的也是,和朋友借了狗狗用的車床她完全不想躺,一方面是空間受限,再來她怕熱並不喜歡像睡床的模式,像熱狗堡一樣她最後縮在單人座繼續緊繃著。
-
直到我最近買了這款硬板式的的汽車墊,合成皮革的材質可以用抹布、濕紙巾擦拭,完全無需支架和布款的一樣扣著前座,而後面不需要扣,只需要頂著就可以了,中間也有硬殼的擋板,防止狗狗跳到前面有危險。
可依照後座的人數自行調配要多大的位置,重點是把前面腳踏板的位置也補起來增加休息空間,硬殼的關係踩上去也很結實,我坐在上面也不是問題(大胖子)這大概是我用過最滿意的汽車坐墊
Mumu在這整趟的嘉義行中,他除了需要下車的時候其餘時間可以穩穩的坐著,甚至趴下睡覺近一小時,中間一度出現翻肚、結果旁邊連結車經過他又醒了(可惡)
這款最好的地方是可以收納收完之後放進專屬的袋子一點也不佔空間,不過因為他不是包覆型的,怕有毛之類的影響到其他人使用,我會建議椅背那邊還是要用布類的鋪著唷,我個人是直接用車用吸塵器+皮革可用的紙巾擦拭,就沒有特別舖布。
另外腳踏墊的收納空間完全不受影響,過去用床組型或充氣款的都有下方收納阻擋的問題,布款的我已經把自己弄到夠狼狽了不討論,這款硬底的也沒有支架問題唷!
⚠️如果車子後座真的很斜的話有附兩個充氣式的軟墊可以墊高。
真的很推薦給各位想好好休息的小孩+毛孩,當然這是我自己用的感想,不保證一定就會這樣唷!只是希望給有困擾的爸媽們多一個選擇,我身邊的人都知道的Mumu坐汽車跟瘋婆子一樣,外公外婆經常很生氣🤣
-
✔️內容物:皮革、海綿、中纖板
✔️全長三人座:140*60*3cm
✔️雙人座部分:85*60*3cm
✔️單人座部分:55*60*3cm(含可拆枕頭)
✔️適用車型:轎車、SUV、MPV
🔺我家的車型:Nissan X-TRAIL
🔺重量:正套含包裝9KG
🔺價格:$2900多(全世界都貴的國際運費、手續費、整套+提袋)
-
優點:免充氣、可收納、硬底、可濕擦、有附餐桌&衛生紙放置、中間有附擋板、側邊有護頭墊
缺點:非全包覆性、休旅車款後座可以調整大小為佳
如果有一般汽車坐墊也可以混搭用,像我去海邊或山上就可以鋪著防髒,最主要是它的硬底可以讓Mumu有比較好的穩定感
x trail缺點 在 Moto7汽機車 Youtube 的最讚貼文
#HONDA #CRV #Nikon_Z6 #Nikon_Taiwan
車輛很多的細節透過短時間的試駕難以感受,站長透過成為車主,實際駕駛3000km與日常使用,來告訴大家愛車CR-V幾個喜歡與不喜歡的點!
x trail缺點 在 buycartv Youtube 的最佳解答
▲▲ 報名規章 ▲▲
1.持有車輛超過一年。
2.車輛必須為一手新車。
3.提供近期保養工單。
4.拍攝時間為平日上班日。
5.授權肖像於網路平台使用。
6.受訪人將給予2000元車馬費。
7.受訪人不得為汽車銷售代表或車廠相關之人員。
E-mail : rex@buycartv.com
【報名來信請填寫 1.車主姓名 2.車款與年份 3.聯絡手機號碼 4.簡短的養車經驗】
大家期待的『車主長期追蹤』EP.2來啦!這次邀請的三位車主的愛車是現在市面上最熱門的SUV,分別是Honda CR-V、Madza CX-5、Nissan X-Trail,趕緊來看看這些車主在長期使用他們愛車的時候,所整理出來的優缺點!
更多影片在Go車誌官網: http://www.buycartv.com/
目錄:
0:00 開頭
1:16 Honda CR-V
4:55 Mazda CX-5
8:48 Nissan X-Trail
_____________________________________________________________________________________
音樂素材:
Song: DayFox - In The Now
Music provided by Vlog No Copyright Music.
Video Link: https://youtu.be/SF2iotNMOZk
Song: INOSSI - Kind Heart
Music provided by Vlog No Copyright Music.
Creative Commons - Attribution 3.0 Unported
Video Link: https://youtu.be/ziWMYhTeDYs
Song: Amine Maxwell & Soyb - You & I
Music provided by Vlog No Copyright Music.
Creative Commons - Attribution 3.0 Unported
Video Link: https://youtu.be/Mb5_G0LBAVg
x trail缺點 在 小新新講 Youtube 的最佳解答
#車車社團請看說明 #URX #車主分享 #RAV4 #XTRAIL #CRV #U6 #LUXGEN #SONY
歡迎加入「小新新講車車」社團
https://www.facebook.com/groups/203086074081695/
最近新冠肺炎嚴重,台灣已經成了社區傳染等級,Sillen關心大家做好居家防疫,整理了樂天的防疫商品,有需要的朋友可以看看是否添購,一起對抗這次疫情!連結如下:
https://shopsquare.co/2e1rg
如果你支持Sillen訪問車主系列,請下載我的Line貼圖,收入用來請分享車主茶水費唷😍
共兩組看大家喜歡那一組,連結如下:
https://line.me/S/sticker/10084641
https://line.me/S/sticker/10096124
小新新的減肥人生
http://www.facebook.com/nusillen
小新新講二手車
https://www.facebook.com/groups/203086074081695/
Sillen哥的臉書Facebook個人頁
https://www.facebook.com/sillen.shih
歡迎來作伙交朋友~
或是加我的賴ID: sillenshih
一鍵私訊
https://m.me/sillen.shih
手機號碼
0970-750-800
email:
sillenshih@gmail.com
x trail缺點 在 x-trail 2020缺點、x trail災情、x trail通病在PTT/mobile01評價 ... 的必吃
x -trail 2020缺點在PTT/mobile01評價與討論, 提供x trail災情、x trail通病、nissan休旅車2020就來汽車零件保養懶人包,有最完整x-trail 2020缺點體驗分享訊息. ... <看更多>
x trail缺點 在 2022x trail缺點-汽車保養試乘體驗,精選在Youtube上的開箱影片 的必吃
2022x trail缺點-汽車保養試乘體驗,精選在Youtube的開箱影片,找x trail缺點,x trail通病,x-trail變速箱災情,x trail災情在Youtube開箱評測就來最 ... ... <看更多>
x trail缺點 在 [討論] X-trail其實滿好開的? - 看板car 的必吃
最近試駕了X-trail 2.0,沒力歸沒力,但這底盤的感覺開起來其實滿不像日本車的,回
饋其實不錯,也不會太鬆散,就是隔音差了點。
前面的對手RAV4底盤開起來還略輸一籌,但新科技跟世代虐爆。
Kuga的馬力虐歪但開起來的舒適跟回饋也是略勝rav4跟x-trail差不多
想請教是我的感覺錯了,還是我試駕這台有特調過。
對日產印象原本是軟趴趴賣沙發,但試駕完真的不太一樣。
各位有開過的心得可以分享嗎?
不然這台空間折價過後其實以國產80萬初開到爛買到感覺還行。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.166.85.239 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/car/M.1616157587.A.E83.html
... <看更多>