Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Upgradable Contractについてわかりやすく解説

cardene
March 23, 2023

Upgradable Contractについてわかりやすく解説

Upgrade可能なコントラクトについてわかりやすく解説しています。
以下の勉強会で使用します。
https://cryptogames.connpass.com/event/277513/

リンクにアクセスするには以下の資料をご覧ください。
https://www.canva.com/design/DAFdypqQDDc/vrJlc_08PUXih_G7Qkgs6A/view?utm_content=DAFdypqQDDc&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink

cardene

March 23, 2023
Tweet

More Decks by cardene

Other Decks in Technology

Transcript

  1. についてわかりやすく解説
    Upgradable
    Contract

    View full-size slide

  2. 自己紹介

    View full-size slide

  3. 自己紹介
    Cardene(かるでね)
    2021年後半からNFTに興味を持ち、2023
    年1月からCryptoGamesに参画。
    OasChoiceというGameFiを先月末にリリ
    ース。
    https://oaschoice.com/
    ■ 名前
    ■ 経歴

    View full-size slide

  4. 目次
    コントラクトのアップグレードとは?
    ストレージスロット
    Delegatecall
    Proxyコントラクト
    アップグレードの仕組み
    その他のアップグレードパターン
    参考文献

    View full-size slide

  5. コントラクトの
    アップグレードとは?

    View full-size slide

  6. ■ コントラクトは更新できないのではないか?
    コントラクトのアップグレードとは?
    コントラクト自体を更新することはできません。

    View full-size slide

  7. ■ コントラクトは更新できないのではないか?
    コントラクトのアップグレードとは?
    コントラクトを置き換えることで更新しています。

    View full-size slide

  8. ■ アップグレードする具体的な場面
    コントラクトのアップグレードとは?
    資金を入出金できるコントラクト。
    実は脆弱性がある...
    2ETH 5ETH 3ETH

    View full-size slide

  9. ■ アップグレードする具体的な場面
    コントラクトのアップグレードとは?
    アップグレード
    できるから安心!
    アップグレード
    できない...

    View full-size slide

  10. ■ CEIパターン
    コントラクトのアップグレードとは?
    Check
    引き出せる資金が幾らかなど実行に必要な条件をチェック。
    Effects
    コントラクト内のデータを更新(引き出せる金額など)。
    Interaction
    資金を送る。
    Reentrancy Attackを1からわかりやすく解説

    View full-size slide

  11. 機能追加
    コントラクトに長期的価値
    脆弱性の修正
    ■ コントラクトをアップグレードできるメリット
    コントラクトのアップグレードとは?
    ユーザーからの信頼性

    View full-size slide

  12. ■ コントラクトをアップグレードできるデメリット
    コントラクトのアップグレードとは?
    セキュリティリスク
    互換性の問題
    信頼性の低下
    ガス代向上

    View full-size slide

  13. ストレージスロット

    View full-size slide

  14. ■ ストレージスロットとは?
    ストレージスロット
    コントラクト内に保存しているデータのこと。

    View full-size slide

  15. 2^256
    ■ ストレージスロットの説明
    ストレージスロット
    スロットという箇所に割り当てられている。
    32Byte
    32Byte
    32Byte

    View full-size slide

  16. 2^256
    ■ ストレージスロットの説明
    ストレージスロット
    1スロット32Byteでデータごとに分割して格納できます。
    16Byte 8Byte
    8Byte
    32Byte
    32Byte

    View full-size slide

  17. ■ ストレージスロットの具体例
    ストレージスロット
    定義されている変数の順に格納されている。
    name
    ATK DEF
    HP
    WalletAddress
    0
    1
    2

    View full-size slide

  18. ■ ストレージスロットのより詳しく解説
    ストレージスロット
    以下の記事を参考にしてください。
    Private Dataへのアクセスを1からわかりや
    すく解説
    [Solidity]実例から学ぶ、ガス最適化のTips

    View full-size slide

  19. Delegatecall

    View full-size slide

  20. ■ Delegatecallの特徴
    Delegatecall
    他のコントラクトを呼び出せる。
    呼び出し元のコントラクトのデータを使用。

    View full-size slide

  21. ■ Delegatecallの仕組み
    Delegatecall
    別のコントラクトのアドレスを指定して呼び出す。

    View full-size slide

  22. ■ Delegatecallの仕組み
    Delegatecall
    呼び出し先で処理を行い、
    呼び出し元のデータを使用。
    データ 処理

    View full-size slide

  23. Proxyコントラクト

    View full-size slide

  24. ■ Proxyコントラクトの特徴
    Proxyコントラクト
    他のコントラクトを呼び出す。
    Proxy = 代理
    データ 処理

    View full-size slide

  25. アップグレードの仕組み

    View full-size slide

  26. ■ Upgradableの仕組み
    アップグレードの仕組み
    Proxy

    View full-size slide

  27. ■ Upgradableの仕組み
    アップグレードの仕組み
    Proxy

    View full-size slide

  28. ■ Upgradableの仕組み
    アップグレードの仕組み
    0xabc123
    Storage
    0xabc123
    0xdef456
    Logic

    View full-size slide

  29. ■ Upgradableの仕組み
    アップグレードの仕組み
    直接切り替えた方が早くない?

    View full-size slide

  30. ■ Upgradableの仕組み
    アップグレードの仕組み
    「こっちのコントラクト使ってください!」
    と告知しないといけない。
    古いコントラクトに資金を送ると、誰も取り
    出せなくなる可能性がある。
    データの移行ににガス代が結構かかる。

    View full-size slide

  31. ■ Upgradableの仕組み
    アップグレードの仕組み
    Proxy
    処理を実行するコントラクト
    のことを考えなくて良い。

    View full-size slide

  32. ■ Upgradableの注意点
    アップグレードの仕組み
    ストレージの衝突 関数の衝突
    constructor
    が使えない

    View full-size slide

  33. ■ Upgradableの注意点 - ストレージの衝突
    アップグレードの仕組み
    変数定義の順番は同じ。
    name
    WalletAddress
    HP DEF
    ATK
    name
    WalletAddress
    HP DEF
    ATK
    Storage Storage

    View full-size slide

  34. アップグレードの仕組み
    HP DEF
    ATK
    name
    WalletAddress
    HP DEF
    ATK
    WalletAddress
    name
    ■ Upgradableの注意点 - ストレージの衝突
    定義順が変わると、予想外の挙動をする。
    Storage Logic

    View full-size slide

  35. ■ Upgradableの注意点 - 関数の衝突
    アップグレードの仕組み
    実行される関数はハッシュ値の先頭4Byteで判別される。
    46c98f3e d68b3ca2 6b4a5c9f

    View full-size slide

  36. ■ Upgradableの注意点 - 関数の衝突
    アップグレードの仕組み
    時たま先頭4Byteが一致してしまうことがある...。
    46c98f3e 46c98f3e 6b4a5c9f

    View full-size slide

  37. ■ Upgradableの注意点 - 関数の衝突
    アップグレードの仕組み
    Storageコントラクトの方の関数が呼ばれてしまう。
    46c98f3e 46c98f3e
    実行!

    View full-size slide

  38. ■ Upgradableの注意点 - constructorが使えない
    アップグレードの仕組み
    コントラクトがデプロイされた時に1回だけ実行
    される関数のことです。
    Logicコントラクトでは処理を実行するだけで、
    データはStorageコントラクトが持っています。
    デプロイ時にデータをLogicコントラクトに保存
    しても意味がない。

    View full-size slide

  39. ■ Upgradableの注意点 - constructorが使えない
    アップグレードの仕組み
    実行!
    1回だけ実行される関数を
    Proxy(Storage)コントラクトから呼び出す。

    View full-size slide

  40. その他のアップグレード
    パターン

    View full-size slide

  41. ■ Transparent Proxy Pattern
    その他のアップグレードパターン
    Proxy Logic
    ユーザー
    管理者 ユーザーはLogicコントラクト
    内の関数のみ実行できる。
    管理者はProxyコントラクト内
    の関数のみ実行できる。

    View full-size slide

  42. ■ UUPS Proxy Pattern
    その他のアップグレードパターン
    Proxy Logic
    ユーザー
    管理者 アップグレード機能をLogicコ
    ントラクトに持たせている。
    アップグレード機能をある時
    点で無効にできる。

    View full-size slide

  43. ■ Diamond Pattern
    その他のアップグレードパターン
    Proxy Logic
    ユーザー
    処理ごとに複数のLogicコント
    ラクトを作成する。
    コントラクトの更新のガス代
    が下がる。

    View full-size slide

  44. ■ コントラクトのアップグレードとは?
    まとめ
    コントラクトを置き換えることで更新しています。

    View full-size slide

  45. ■ ストレージスロット
    まとめ
    定義されている変数の順に格納されている。
    name
    ATK DEF
    HP
    WalletAddress
    0
    1
    2

    View full-size slide

  46. ■ Delegatecall
    まとめ
    呼び出し先で処理を行い、
    呼び出し元のデータを使用。
    データ 処理

    View full-size slide

  47. ■ Delegatevcall
    まとめ
    呼び出し先で処理を行い、
    呼び出し元のデータを使用。
    データ 処理

    View full-size slide

  48. ■ Upgradableの仕組み
    アップグレードの仕組み
    Proxy

    View full-size slide

  49. ■ Upgradableの仕組み
    アップグレードの仕組み
    Proxy

    View full-size slide

  50. ■ Upgradableの注意点
    アップグレードの仕組み
    ストレージの衝突 関数の衝突
    constructor
    が使えない

    View full-size slide

  51. 色々記事にまとめているので、ぜひ読んでみて
    ください。
    https://chaldene.net/
    OasChoiceぜひ触ってみてください!
    https://oaschoice.com/
    ■ 記事
    最後に

    View full-size slide

  52. 参考文献

    View full-size slide

  53. アップグレード可能なスマートコントラクトを実現する
    具体的なアプローチ
    [Ethereum] スマートコントラクトをProxyパターンで
    更新可能にする方法
    スマートコントラクトをアップグレードできる
    Upgradable Contractsを1からわかりやすく解説
    UPGRADING SMART CONTRACTS
    参考文献

    View full-size slide