レッスン1

合成資産コントラクトの管理とアップグレード

このレッスンでは、合成資産契約の管理とアップグレードに必要な専門知識を習得し、契約の整合性とセキュリティを維持しながら、進化する要件に適応できるようにします。 この基礎知識は、その後のレッスンで合成資産管理のより高度な側面を深く掘り下げる際に役立ちます。

このコースの上級セグメントに着手するにあたり、第1部で開発した合成資産契約について少し振り返ってみましょう。 このコントラクトは、スマートコントラクトの管理とアップグレードに関する理解を深めるための基盤となります。

合成資産契約のまとめ

以下は、以前に実装した合成資産契約です。 このコントラクトは、ブロックチェーン上の合成資産の作成、管理、および相互作用を容易にします。

硬度
SPDX-ライセンス識別子: MIT
プラグマの堅実さ^0.8.0;

コントラクト SyntheticAsset {
    uint256 public underlyingAssetPrice;
    uint256 公開担保
    公共の所有者に宛てます。
    mapping(address => uint256) public syntheticBalance;
    uint256 public totalSyntheticSupply;

constructor() {
        owner = msg.sender;
    }

修飾子 onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

function updatePrice(uint256 _price) public onlyOwner {
        underlyingAssetPrice = _price;
    }

function depositCollateral(uint256 _amount) 公開 {
        collateral += _amount;
    }

function withdrawCollateral(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        collateral -= _amount;
    }

関数 getSyntheticAssetPrice() public view の戻り値 (uint256) {
        return underlyingAssetPrice;
    }

function mintSyntheticAsset(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        syntheticBalance[msg.sender] += _amount;
        totalSyntheticSupply += _amount;
        collateral -= _amount;
    }

function redeemSyntheticAsset(uint256 _amount) public {
        require(syntheticBalance[msg.sender] >= _amount, "Insufficient synthetic balance");
        syntheticBalance[msg.sender] -= _amount;
        totalSyntheticSupply -= _amount;
        collateral += _amount;
    }
}

さて、基本契約について改めて理解した上で、合成資産契約の管理とアップグレードの側面を掘り下げてみましょう。

契約の所有権

  • 契約の所有権を確立すると、許可されたエンティティのみが契約を変更できるようになります。
  • 特定の関数へのアクセスを制限するような onlyOwner 修飾子を実装することは、一般的な方法です。

アップグレード パターン

  • Proxy、Eternal Storage、DelegateCall などのさまざまなアップグレード パターンを理解する。
  • 各パターンの長所と短所を探り、契約に最も適したものを選択します。

プロキシ契約

  • プロキシコントラクトを掘り下げて、データをそのまま維持しながらコントラクトのロジックを更新できるようにします。
  • アップグレード プロセスを示すための単純なプロキシ コントラクトの実装。
硬度
契約プロキシ {
    公開実装に取り組む;

function upgradeImplementation(address _newImplementation) public onlyOwner {
        implementation = _newImplementation;
    }

fallback() 外部買掛金 {
        アドレスimpl = implementation;
        アセンブリ {
            ptr := mload(0x40)とします
            calldatacopy(ptr, 0, calldatasize())
            結果:= delegatecall(gas()、impl、ptr、calldatasize()、0、0)
            let size := returnDataSize()
            returnDataCopy(ptr, 0, サイズ)
            スイッチ結果
            ケース 0 { revert(ptr, size) }
            デフォルト { return(ptr, size) }
        }
    }
}

バージョン管理

  • 契約のアップグレードを追跡するためのバージョン管理の実装。
  • セマンティック バージョニングを使用して、各アップグレードの変更の種類を示す。

アップグレードのテスト

  • アップグレードによってバグが発生したり、意図した機能が変更されたりしないようにします。
  • メインネットに展開する前に、制御された環境でアップグレードをテストします。
    以下は、アップグレードのプロキシ契約を組み込んだ後のシステムです。
硬度
SPDX-ライセンス識別子: MIT
プラグマの堅実さ^0.8.0;

契約プロキシ {
    公開実装に取り組む;
    公共の所有者に宛てます。

constructor() {
        owner = msg.sender;
    }

修飾子 onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

function upgradeImplementation(address _newImplementation) public onlyOwner {
        implementation = _newImplementation;
    }

fallback() 外部買掛金 {
        アドレスimpl = implementation;
        アセンブリ {
            ptr := mload(0x40)とします
            calldatacopy(ptr, 0, calldatasize())
            結果:= delegatecall(gas()、impl、ptr、calldatasize()、0、0)
            let size := returnDataSize()
            returnDataCopy(ptr, 0, サイズ)
            スイッチ結果
            ケース 0 { revert(ptr, size) }
            デフォルト { return(ptr, size) }
        }
    }
}

コントラクト SyntheticAsset {
    uint256 public underlyingAssetPrice;
    uint256 公開担保
    公共の所有者に宛てます。
    mapping(address => uint256) public syntheticBalance;
    uint256 public totalSyntheticSupply;

constructor() {
        owner = msg.sender;
    }

修飾子 onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

function updatePrice(uint256 _price) public onlyOwner {
        underlyingAssetPrice = _price;
    }

function depositCollateral(uint256 _amount) public {
        collateral += _amount;
    }

function withdrawCollateral(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        collateral -= _amount;
    }

    関数 getSyntheticAssetPrice() public view returns (uint256) {
        return underlyingAssetPrice;
    }

function mintSyntheticAsset(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        syntheticBalance[msg.sender] += _amount;
        totalSyntheticSupply += _amount;
        collateral -= _amount;
    }

function redeemSyntheticAsset(uint256 _amount) public {
        require(syntheticBalance[msg.sender] >= _amount, "Insufficient synthetic balance");
        syntheticBalance[msg.sender] -= _amount;
        totalSyntheticSupply -= _amount;
        collateral += _amount;
    }
}

この設定では、コントラクトは Proxy コントラクトの SyntheticAsset ゲートウェイとして機能し、コントラクトの状態(つまり、データ)を失うことなく、の実装(つまり、 SyntheticAsset ロジック)をアップグレードできます。 これは、 の現在の実装に呼び出しを委任する のProxy関数とupgradeImplementation、所有者が実装SyntheticAssetアドレスを変更して の新しいバージョンSyntheticAssetを指すようにできるようにする関数によってfallback実現されます。

このレッスンでは、合成資産契約の管理とアップグレードに必要な専門知識を習得し、契約の整合性とセキュリティを維持しながら、進化する要件に適応できるようにします。 この基礎知識は、その後のレッスンで合成資産管理のより高度な側面を深く掘り下げる際に役立ちます。 乞うご期待!

免責事項
* 暗号資産投資には重大なリスクが伴います。注意して進めてください。このコースは投資アドバイスを目的としたものではありません。
※ このコースはGate Learnに参加しているメンバーが作成したものです。作成者が共有した意見はGate Learnを代表するものではありません。
カタログ
レッスン1

合成資産コントラクトの管理とアップグレード

このレッスンでは、合成資産契約の管理とアップグレードに必要な専門知識を習得し、契約の整合性とセキュリティを維持しながら、進化する要件に適応できるようにします。 この基礎知識は、その後のレッスンで合成資産管理のより高度な側面を深く掘り下げる際に役立ちます。

このコースの上級セグメントに着手するにあたり、第1部で開発した合成資産契約について少し振り返ってみましょう。 このコントラクトは、スマートコントラクトの管理とアップグレードに関する理解を深めるための基盤となります。

合成資産契約のまとめ

以下は、以前に実装した合成資産契約です。 このコントラクトは、ブロックチェーン上の合成資産の作成、管理、および相互作用を容易にします。

硬度
SPDX-ライセンス識別子: MIT
プラグマの堅実さ^0.8.0;

コントラクト SyntheticAsset {
    uint256 public underlyingAssetPrice;
    uint256 公開担保
    公共の所有者に宛てます。
    mapping(address => uint256) public syntheticBalance;
    uint256 public totalSyntheticSupply;

constructor() {
        owner = msg.sender;
    }

修飾子 onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

function updatePrice(uint256 _price) public onlyOwner {
        underlyingAssetPrice = _price;
    }

function depositCollateral(uint256 _amount) 公開 {
        collateral += _amount;
    }

function withdrawCollateral(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        collateral -= _amount;
    }

関数 getSyntheticAssetPrice() public view の戻り値 (uint256) {
        return underlyingAssetPrice;
    }

function mintSyntheticAsset(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        syntheticBalance[msg.sender] += _amount;
        totalSyntheticSupply += _amount;
        collateral -= _amount;
    }

function redeemSyntheticAsset(uint256 _amount) public {
        require(syntheticBalance[msg.sender] >= _amount, "Insufficient synthetic balance");
        syntheticBalance[msg.sender] -= _amount;
        totalSyntheticSupply -= _amount;
        collateral += _amount;
    }
}

さて、基本契約について改めて理解した上で、合成資産契約の管理とアップグレードの側面を掘り下げてみましょう。

契約の所有権

  • 契約の所有権を確立すると、許可されたエンティティのみが契約を変更できるようになります。
  • 特定の関数へのアクセスを制限するような onlyOwner 修飾子を実装することは、一般的な方法です。

アップグレード パターン

  • Proxy、Eternal Storage、DelegateCall などのさまざまなアップグレード パターンを理解する。
  • 各パターンの長所と短所を探り、契約に最も適したものを選択します。

プロキシ契約

  • プロキシコントラクトを掘り下げて、データをそのまま維持しながらコントラクトのロジックを更新できるようにします。
  • アップグレード プロセスを示すための単純なプロキシ コントラクトの実装。
硬度
契約プロキシ {
    公開実装に取り組む;

function upgradeImplementation(address _newImplementation) public onlyOwner {
        implementation = _newImplementation;
    }

fallback() 外部買掛金 {
        アドレスimpl = implementation;
        アセンブリ {
            ptr := mload(0x40)とします
            calldatacopy(ptr, 0, calldatasize())
            結果:= delegatecall(gas()、impl、ptr、calldatasize()、0、0)
            let size := returnDataSize()
            returnDataCopy(ptr, 0, サイズ)
            スイッチ結果
            ケース 0 { revert(ptr, size) }
            デフォルト { return(ptr, size) }
        }
    }
}

バージョン管理

  • 契約のアップグレードを追跡するためのバージョン管理の実装。
  • セマンティック バージョニングを使用して、各アップグレードの変更の種類を示す。

アップグレードのテスト

  • アップグレードによってバグが発生したり、意図した機能が変更されたりしないようにします。
  • メインネットに展開する前に、制御された環境でアップグレードをテストします。
    以下は、アップグレードのプロキシ契約を組み込んだ後のシステムです。
硬度
SPDX-ライセンス識別子: MIT
プラグマの堅実さ^0.8.0;

契約プロキシ {
    公開実装に取り組む;
    公共の所有者に宛てます。

constructor() {
        owner = msg.sender;
    }

修飾子 onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

function upgradeImplementation(address _newImplementation) public onlyOwner {
        implementation = _newImplementation;
    }

fallback() 外部買掛金 {
        アドレスimpl = implementation;
        アセンブリ {
            ptr := mload(0x40)とします
            calldatacopy(ptr, 0, calldatasize())
            結果:= delegatecall(gas()、impl、ptr、calldatasize()、0、0)
            let size := returnDataSize()
            returnDataCopy(ptr, 0, サイズ)
            スイッチ結果
            ケース 0 { revert(ptr, size) }
            デフォルト { return(ptr, size) }
        }
    }
}

コントラクト SyntheticAsset {
    uint256 public underlyingAssetPrice;
    uint256 公開担保
    公共の所有者に宛てます。
    mapping(address => uint256) public syntheticBalance;
    uint256 public totalSyntheticSupply;

constructor() {
        owner = msg.sender;
    }

修飾子 onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

function updatePrice(uint256 _price) public onlyOwner {
        underlyingAssetPrice = _price;
    }

function depositCollateral(uint256 _amount) public {
        collateral += _amount;
    }

function withdrawCollateral(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        collateral -= _amount;
    }

    関数 getSyntheticAssetPrice() public view returns (uint256) {
        return underlyingAssetPrice;
    }

function mintSyntheticAsset(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        syntheticBalance[msg.sender] += _amount;
        totalSyntheticSupply += _amount;
        collateral -= _amount;
    }

function redeemSyntheticAsset(uint256 _amount) public {
        require(syntheticBalance[msg.sender] >= _amount, "Insufficient synthetic balance");
        syntheticBalance[msg.sender] -= _amount;
        totalSyntheticSupply -= _amount;
        collateral += _amount;
    }
}

この設定では、コントラクトは Proxy コントラクトの SyntheticAsset ゲートウェイとして機能し、コントラクトの状態(つまり、データ)を失うことなく、の実装(つまり、 SyntheticAsset ロジック)をアップグレードできます。 これは、 の現在の実装に呼び出しを委任する のProxy関数とupgradeImplementation、所有者が実装SyntheticAssetアドレスを変更して の新しいバージョンSyntheticAssetを指すようにできるようにする関数によってfallback実現されます。

このレッスンでは、合成資産契約の管理とアップグレードに必要な専門知識を習得し、契約の整合性とセキュリティを維持しながら、進化する要件に適応できるようにします。 この基礎知識は、その後のレッスンで合成資産管理のより高度な側面を深く掘り下げる際に役立ちます。 乞うご期待!

免責事項
* 暗号資産投資には重大なリスクが伴います。注意して進めてください。このコースは投資アドバイスを目的としたものではありません。
※ このコースはGate Learnに参加しているメンバーが作成したものです。作成者が共有した意見はGate Learnを代表するものではありません。
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.