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 参考文献