Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
についてわかりやすく解説 Upgradable Contract
Slide 2
Slide 2 text
自己紹介
Slide 3
Slide 3 text
自己紹介 Cardene(かるでね) 2021年後半からNFTに興味を持ち、2023 年1月からCryptoGamesに参画。 OasChoiceというGameFiを先月末にリリ ース。 https://oaschoice.com/ ■ 名前 ■ 経歴
Slide 4
Slide 4 text
目次
Slide 5
Slide 5 text
目次 コントラクトのアップグレードとは? ストレージスロット Delegatecall Proxyコントラクト アップグレードの仕組み その他のアップグレードパターン 参考文献
Slide 6
Slide 6 text
コントラクトの アップグレードとは?
Slide 7
Slide 7 text
■ コントラクトは更新できないのではないか? コントラクトのアップグレードとは? コントラクト自体を更新することはできません。
Slide 8
Slide 8 text
■ コントラクトは更新できないのではないか? コントラクトのアップグレードとは? コントラクトを置き換えることで更新しています。
Slide 9
Slide 9 text
■ アップグレードする具体的な場面 コントラクトのアップグレードとは? 資金を入出金できるコントラクト。 実は脆弱性がある... 2ETH 5ETH 3ETH
Slide 10
Slide 10 text
■ アップグレードする具体的な場面 コントラクトのアップグレードとは? アップグレード できるから安心! アップグレード できない...
Slide 11
Slide 11 text
■ CEIパターン コントラクトのアップグレードとは? Check 引き出せる資金が幾らかなど実行に必要な条件をチェック。 Effects コントラクト内のデータを更新(引き出せる金額など)。 Interaction 資金を送る。 Reentrancy Attackを1からわかりやすく解説
Slide 12
Slide 12 text
機能追加 コントラクトに長期的価値 脆弱性の修正 ■ コントラクトをアップグレードできるメリット コントラクトのアップグレードとは? ユーザーからの信頼性
Slide 13
Slide 13 text
■ コントラクトをアップグレードできるデメリット コントラクトのアップグレードとは? セキュリティリスク 互換性の問題 信頼性の低下 ガス代向上
Slide 14
Slide 14 text
ストレージスロット
Slide 15
Slide 15 text
■ ストレージスロットとは? ストレージスロット コントラクト内に保存しているデータのこと。
Slide 16
Slide 16 text
2^256 ■ ストレージスロットの説明 ストレージスロット スロットという箇所に割り当てられている。 32Byte 32Byte 32Byte
Slide 17
Slide 17 text
2^256 ■ ストレージスロットの説明 ストレージスロット 1スロット32Byteでデータごとに分割して格納できます。 16Byte 8Byte 8Byte 32Byte 32Byte
Slide 18
Slide 18 text
■ ストレージスロットの具体例 ストレージスロット 定義されている変数の順に格納されている。 name ATK DEF HP WalletAddress 0 1 2
Slide 19
Slide 19 text
■ ストレージスロットのより詳しく解説 ストレージスロット 以下の記事を参考にしてください。 Private Dataへのアクセスを1からわかりや すく解説 [Solidity]実例から学ぶ、ガス最適化のTips
Slide 20
Slide 20 text
Delegatecall
Slide 21
Slide 21 text
■ Delegatecallの特徴 Delegatecall 他のコントラクトを呼び出せる。 呼び出し元のコントラクトのデータを使用。
Slide 22
Slide 22 text
■ Delegatecallの仕組み Delegatecall 別のコントラクトのアドレスを指定して呼び出す。
Slide 23
Slide 23 text
■ Delegatecallの仕組み Delegatecall 呼び出し先で処理を行い、 呼び出し元のデータを使用。 データ 処理
Slide 24
Slide 24 text
Proxyコントラクト
Slide 25
Slide 25 text
■ Proxyコントラクトの特徴 Proxyコントラクト 他のコントラクトを呼び出す。 Proxy = 代理 データ 処理
Slide 26
Slide 26 text
アップグレードの仕組み
Slide 27
Slide 27 text
■ Upgradableの仕組み アップグレードの仕組み Proxy
Slide 28
Slide 28 text
■ Upgradableの仕組み アップグレードの仕組み Proxy
Slide 29
Slide 29 text
■ Upgradableの仕組み アップグレードの仕組み 0xabc123 Storage 0xabc123 0xdef456 Logic
Slide 30
Slide 30 text
■ Upgradableの仕組み アップグレードの仕組み 直接切り替えた方が早くない?
Slide 31
Slide 31 text
■ Upgradableの仕組み アップグレードの仕組み 「こっちのコントラクト使ってください!」 と告知しないといけない。 古いコントラクトに資金を送ると、誰も取り 出せなくなる可能性がある。 データの移行ににガス代が結構かかる。
Slide 32
Slide 32 text
■ Upgradableの仕組み アップグレードの仕組み Proxy 処理を実行するコントラクト のことを考えなくて良い。
Slide 33
Slide 33 text
■ Upgradableの注意点 アップグレードの仕組み ストレージの衝突 関数の衝突 constructor が使えない
Slide 34
Slide 34 text
■ Upgradableの注意点 - ストレージの衝突 アップグレードの仕組み 変数定義の順番は同じ。 name WalletAddress HP DEF ATK name WalletAddress HP DEF ATK Storage Storage
Slide 35
Slide 35 text
アップグレードの仕組み HP DEF ATK name WalletAddress HP DEF ATK WalletAddress name ■ Upgradableの注意点 - ストレージの衝突 定義順が変わると、予想外の挙動をする。 Storage Logic
Slide 36
Slide 36 text
■ Upgradableの注意点 - 関数の衝突 アップグレードの仕組み 実行される関数はハッシュ値の先頭4Byteで判別される。 46c98f3e d68b3ca2 6b4a5c9f
Slide 37
Slide 37 text
■ Upgradableの注意点 - 関数の衝突 アップグレードの仕組み 時たま先頭4Byteが一致してしまうことがある...。 46c98f3e 46c98f3e 6b4a5c9f
Slide 38
Slide 38 text
■ Upgradableの注意点 - 関数の衝突 アップグレードの仕組み Storageコントラクトの方の関数が呼ばれてしまう。 46c98f3e 46c98f3e 実行!
Slide 39
Slide 39 text
■ Upgradableの注意点 - constructorが使えない アップグレードの仕組み コントラクトがデプロイされた時に1回だけ実行 される関数のことです。 Logicコントラクトでは処理を実行するだけで、 データはStorageコントラクトが持っています。 デプロイ時にデータをLogicコントラクトに保存 しても意味がない。
Slide 40
Slide 40 text
■ Upgradableの注意点 - constructorが使えない アップグレードの仕組み 実行! 1回だけ実行される関数を Proxy(Storage)コントラクトから呼び出す。
Slide 41
Slide 41 text
その他のアップグレード パターン
Slide 42
Slide 42 text
■ Transparent Proxy Pattern その他のアップグレードパターン Proxy Logic ユーザー 管理者 ユーザーはLogicコントラクト 内の関数のみ実行できる。 管理者はProxyコントラクト内 の関数のみ実行できる。
Slide 43
Slide 43 text
■ UUPS Proxy Pattern その他のアップグレードパターン Proxy Logic ユーザー 管理者 アップグレード機能をLogicコ ントラクトに持たせている。 アップグレード機能をある時 点で無効にできる。
Slide 44
Slide 44 text
■ Diamond Pattern その他のアップグレードパターン Proxy Logic ユーザー 処理ごとに複数のLogicコント ラクトを作成する。 コントラクトの更新のガス代 が下がる。
Slide 45
Slide 45 text
まとめ
Slide 46
Slide 46 text
■ コントラクトのアップグレードとは? まとめ コントラクトを置き換えることで更新しています。
Slide 47
Slide 47 text
■ ストレージスロット まとめ 定義されている変数の順に格納されている。 name ATK DEF HP WalletAddress 0 1 2
Slide 48
Slide 48 text
■ Delegatecall まとめ 呼び出し先で処理を行い、 呼び出し元のデータを使用。 データ 処理
Slide 49
Slide 49 text
■ Delegatevcall まとめ 呼び出し先で処理を行い、 呼び出し元のデータを使用。 データ 処理
Slide 50
Slide 50 text
■ Upgradableの仕組み アップグレードの仕組み Proxy
Slide 51
Slide 51 text
■ Upgradableの仕組み アップグレードの仕組み Proxy
Slide 52
Slide 52 text
■ Upgradableの注意点 アップグレードの仕組み ストレージの衝突 関数の衝突 constructor が使えない
Slide 53
Slide 53 text
最後に
Slide 54
Slide 54 text
色々記事にまとめているので、ぜひ読んでみて ください。 https://chaldene.net/ OasChoiceぜひ触ってみてください! https://oaschoice.com/ ■ 記事 最後に
Slide 55
Slide 55 text
参考文献
Slide 56
Slide 56 text
アップグレード可能なスマートコントラクトを実現する 具体的なアプローチ [Ethereum] スマートコントラクトをProxyパターンで 更新可能にする方法 スマートコントラクトをアップグレードできる Upgradable Contractsを1からわかりやすく解説 UPGRADING SMART CONTRACTS 参考文献