LoginSignup
6
6

More than 5 years have passed since last update.

solidity-proxyでcontractコードをupgradeする

Last updated at Posted at 2018-08-07

はじめに

コントラクトコードは一度ブロックチェーンにdeployされると変更ができません。
サービスのアップデートと共に、機能追加やバグの改修などの必要性に迫られた場合、
コントラクトを新しく作り直し、向き先を変更する必要がありますが、
solidity-proxyというproxyコントラクトを間に挟むことで、update可能なコントラクトを作ることができます。

イメージ

proxy.png

クライアントは、proxyのcontractに向けて、メソッドをcallしますが、実際には、deleatecallで、
ロジックを記述したコントラクトを制御しています。
このため、クライアントの向き先は常にproxy contractをcallし、proxyの向き先をver.1からvers.2に変更することで、新しいロジックをclientに提供することができます。

実践

remixを用いて、これらの一連の流れを確認することができます。

使用するコードはこちらから利用させていただきました。
https://hackernoon.com/ethereum-smart-contract-upgradeability-hands-on-ceaf98be070f

一応全体抜き出したもの。
https://gist.github.com/oggata/02a86fd43a45ddc4e5bf4df103f7393f

1.TokenVersion1をdeployします.

スクリーンショット 2018-08-07 21.20.25.png

2.TokenVersion2をdeployします

スクリーンショット 2018-08-07 21.20.30.png

3.Proxyをdeployして、TokenVersion1のcontractAddressをupgradeToに入れて実行します.

スクリーンショット 2018-08-07 21.20.39.png

4.ProxyのcontractAddressをAtAddressに入力して、TokenVersion1を読み込みます。

これでProxyとTokenVersion1が紐づけられます.
スクリーンショット 2018-08-07 21.22.55.png

5.mintにアドレス、100と入力して、balanceOfを見ると200となっています.

(元の解説では、これはVersion1のバグと言う設定で、本来は100入力すると100と出てくるのが正しく、Version2でこれを改修すると言う流れになっています。)
スクリーンショット 2018-08-07 21.24.24.png

6.次に、ProxyのupgradeToに、TokenVersion2のcontractaddressを入力します。

implementationを見ると、TokenVersion1のコントラクトアドレスから、2のアドレスに変わっていることがわかります。
スクリーンショット 2018-08-07 21.26.28.png

7.proxyのcontractaddressをTokenVersion2で実行します

スクリーンショット 2018-08-07 21.28.41.png

8.balanceOfをすると、先ほどVersion1で実行した200が残高として残っています。

スクリーンショット 2018-08-07 21.28.05.png

9.アドレス、30とmintに入力して実行すると、残高に30足されています。

これはVersion1のバグで、入力値が2倍に増えていたと言うバグが修正され、入力値がそのままaddされると言う正常の挙動に戻っていることを意味しています。
スクリーンショット 2018-08-07 21.30.24.png

おしまい

参考

「Ethereum Smart Contract Upgradeability: Hands-On」
https://hackernoon.com/ethereum-smart-contract-upgradeability-hands-on-ceaf98be070f

「アップグレード可能なスマートコントラクトを実現する具体的なアプローチ」
https://zoom-blc.com/how-to-develop-upgradable-contracts

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6