Bài học 1

Управління та оновлення контрактів на синтетичні активи

За допомогою цього уроку ви отримаєте досвід, необхідний для керування та оновлення контрактів на синтетичні активи, гарантуючи, що вони залишатимуться адаптованими до змінних вимог, зберігаючи при цьому цілісність і безпеку контракту. Ці фундаментальні знання будуть корисними, коли ми глибше заглибимося в більш просунуті аспекти управління синтетичними активами в наступних уроках.

Приступаючи до цього складного сегменту нашого курсу, давайте приділимо хвилинку, щоб повернутися до контракту на синтетичні активи, який ми розробили в першій частині. Цей контракт служить основою, на якій ми будуватимемо наше розуміння управління та оновлення розумних контрактів.

Резюме контракту на синтетичні активи

Нижче наведено контракт на синтетичні активи, який ми реалізували раніше. Цей контракт полегшує створення, керування та взаємодію з синтетичними активами в блокчейні.

Solidity 
 // SPDX-License-Identifier: прагма MIT 
 solidity ^0.8.0; 

 контракт SyntheticAsset { 
 uint256 public underlyingAssetPrice; 
 uint256 державна застава; 
 адреса державного власника; 
 відображення (адреса => uint256) public syntheticBalance; 
 uint256 public totalSyntheticSupply; 

 constructor() {
        owner = msg.sender;
    }

    модифікатор onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

    функція updatePrice(uint256 _price) public onlyOwner {
        underlyingAssetPrice = _price;
    }

    функція depositCollateral(uint256 _amount) public {
        collateral += _amount;
    }

    функція removeCollateral(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        collateral -= _amount;
    }

    функція getSyntheticAssetPrice() public view повертає (uint256) {
        return underlyingAssetPrice;
    }

    функція mintSyntheticAsset(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        syntheticBalance[msg.sender] += _amount;
        totalSyntheticSupply += _amount;
        collateral -= _amount;
    }

    функція 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.
  • Вивчіть переваги та недоліки кожного шаблону, щоб вибрати найбільш підходящий для вашого контракту.

Контракти проксі

  • Заглиблення в проксі-контракти, які дозволяють оновлювати логіку контракту, зберігаючи дані недоторканими.
  • Реалізація простого проксі-контракту для демонстрації процесу оновлення.
Solidity 
 contract Proxy { 
 адреса публічної реалізації; 

 функція upgradeImplementation(address _newImplementation) public onlyOwner {
        implementation = _newImplementation;
    }

    fallback() external payable { 
 address impl = implementation; 
 збірка { 
 let ptr := mload(0x40) 
 calldatacopy(ptr, 0, calldatasize()) 
 let result := delegatecall(gas(), impl, ptr, calldatasize(), 0, 0) 
 let size := returndatasize() 
 returndatacopy(ptr, 0, size) 
 результат перемикання 
 case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

Керування версіями

  • Впровадження контролю версій для відстеження оновлень контракту.
  • Використання семантичного керування версіями для вказівки типу змін у кожному оновленні.

Тестування оновлень

  • Забезпечення того, щоб оновлення не створювали помилок і не змінювали призначені функції.
  • Тестування оновлень у контрольованому середовищі перед їх розгортанням у мережі.
    Нижче показано, як виглядатиме наша система після включення проксі-контракту для оновлень:
Solidity 
 // SPDX-License-Identifier: прагма MIT 
 solidity ^0.8.0; 

 договір Проксі { 
 адреса публічної реалізації; 
 адреса державного власника; 

 constructor() {
        owner = msg.sender;
    }

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

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

    fallback() external payable { 
 address impl = implementation; 
 збірка { 
 let ptr := mload(0x40) 
 calldatacopy(ptr, 0, calldatasize()) 
 let result := delegatecall(gas(), impl, ptr, calldatasize(), 0, 0) 
 let size := returndatasize() 
 returndatacopy(ptr, 0, size) 
 результат перемикання 
 case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

contract SyntheticAsset { 
 uint256 public underlyingAssetPrice; 
 uint256 державна застава; 
 адреса державного власника; 
 відображення (адреса => uint256) public syntheticBalance; 
 uint256 public totalSyntheticSupply; 

 constructor() {
        owner = msg.sender;
    }

    модифікатор onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

    функція updatePrice(uint256 _price) public onlyOwner {
        underlyingAssetPrice = _price;
    }

    функція depositCollateral(uint256 _amount) public {
        collateral += _amount;
    }

    функція removeCollateral(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        collateral -= _amount;
    }

    функція getSyntheticAssetPrice() public view повертає (uint256) {
        return underlyingAssetPrice;
    }

    функція mintSyntheticAsset(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        syntheticBalance[msg.sender] += _amount;
        totalSyntheticSupply += _amount;
        collateral -= _amount;
    }

    функція redeemSyntheticAsset(uint256 _amount) public {
        require(syntheticBalance[msg.sender] >= _amount, "Insufficient synthetic balance");
        syntheticBalance[msg.sender] -= _amount;
        totalSyntheticSupply -= _amount;
        collateral += _amount;
    }
}

У цьому налаштуванні контракт Proxy діє як шлюз для контракту SyntheticAsset , що дозволяє оновити реалізацію (тобто логіку) SyntheticAsset без втрати стану (тобто даних) контракту. Це досягається за допомогою fallback функції в Proxy, яка делегує виклики поточній реалізації SyntheticAsset, і функції upgradeImplementation , яка дозволяє власнику змінити адресу реалізації, щоб вказувати на нову версію SyntheticAsset.

За допомогою цього уроку ви отримаєте досвід, необхідний для керування та оновлення контрактів на синтетичні активи, гарантуючи, що вони залишатимуться адаптованими до змінних вимог, зберігаючи при цьому цілісність і безпеку контракту. Ці фундаментальні знання будуть корисними, коли ми глибше заглибимося в більш просунуті аспекти управління синтетичними активами в наступних уроках. Залишайтеся на зв'язку!

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.
Danh mục
Bài học 1

Управління та оновлення контрактів на синтетичні активи

За допомогою цього уроку ви отримаєте досвід, необхідний для керування та оновлення контрактів на синтетичні активи, гарантуючи, що вони залишатимуться адаптованими до змінних вимог, зберігаючи при цьому цілісність і безпеку контракту. Ці фундаментальні знання будуть корисними, коли ми глибше заглибимося в більш просунуті аспекти управління синтетичними активами в наступних уроках.

Приступаючи до цього складного сегменту нашого курсу, давайте приділимо хвилинку, щоб повернутися до контракту на синтетичні активи, який ми розробили в першій частині. Цей контракт служить основою, на якій ми будуватимемо наше розуміння управління та оновлення розумних контрактів.

Резюме контракту на синтетичні активи

Нижче наведено контракт на синтетичні активи, який ми реалізували раніше. Цей контракт полегшує створення, керування та взаємодію з синтетичними активами в блокчейні.

Solidity 
 // SPDX-License-Identifier: прагма MIT 
 solidity ^0.8.0; 

 контракт SyntheticAsset { 
 uint256 public underlyingAssetPrice; 
 uint256 державна застава; 
 адреса державного власника; 
 відображення (адреса => uint256) public syntheticBalance; 
 uint256 public totalSyntheticSupply; 

 constructor() {
        owner = msg.sender;
    }

    модифікатор onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

    функція updatePrice(uint256 _price) public onlyOwner {
        underlyingAssetPrice = _price;
    }

    функція depositCollateral(uint256 _amount) public {
        collateral += _amount;
    }

    функція removeCollateral(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        collateral -= _amount;
    }

    функція getSyntheticAssetPrice() public view повертає (uint256) {
        return underlyingAssetPrice;
    }

    функція mintSyntheticAsset(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        syntheticBalance[msg.sender] += _amount;
        totalSyntheticSupply += _amount;
        collateral -= _amount;
    }

    функція 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.
  • Вивчіть переваги та недоліки кожного шаблону, щоб вибрати найбільш підходящий для вашого контракту.

Контракти проксі

  • Заглиблення в проксі-контракти, які дозволяють оновлювати логіку контракту, зберігаючи дані недоторканими.
  • Реалізація простого проксі-контракту для демонстрації процесу оновлення.
Solidity 
 contract Proxy { 
 адреса публічної реалізації; 

 функція upgradeImplementation(address _newImplementation) public onlyOwner {
        implementation = _newImplementation;
    }

    fallback() external payable { 
 address impl = implementation; 
 збірка { 
 let ptr := mload(0x40) 
 calldatacopy(ptr, 0, calldatasize()) 
 let result := delegatecall(gas(), impl, ptr, calldatasize(), 0, 0) 
 let size := returndatasize() 
 returndatacopy(ptr, 0, size) 
 результат перемикання 
 case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

Керування версіями

  • Впровадження контролю версій для відстеження оновлень контракту.
  • Використання семантичного керування версіями для вказівки типу змін у кожному оновленні.

Тестування оновлень

  • Забезпечення того, щоб оновлення не створювали помилок і не змінювали призначені функції.
  • Тестування оновлень у контрольованому середовищі перед їх розгортанням у мережі.
    Нижче показано, як виглядатиме наша система після включення проксі-контракту для оновлень:
Solidity 
 // SPDX-License-Identifier: прагма MIT 
 solidity ^0.8.0; 

 договір Проксі { 
 адреса публічної реалізації; 
 адреса державного власника; 

 constructor() {
        owner = msg.sender;
    }

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

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

    fallback() external payable { 
 address impl = implementation; 
 збірка { 
 let ptr := mload(0x40) 
 calldatacopy(ptr, 0, calldatasize()) 
 let result := delegatecall(gas(), impl, ptr, calldatasize(), 0, 0) 
 let size := returndatasize() 
 returndatacopy(ptr, 0, size) 
 результат перемикання 
 case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

contract SyntheticAsset { 
 uint256 public underlyingAssetPrice; 
 uint256 державна застава; 
 адреса державного власника; 
 відображення (адреса => uint256) public syntheticBalance; 
 uint256 public totalSyntheticSupply; 

 constructor() {
        owner = msg.sender;
    }

    модифікатор onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

    функція updatePrice(uint256 _price) public onlyOwner {
        underlyingAssetPrice = _price;
    }

    функція depositCollateral(uint256 _amount) public {
        collateral += _amount;
    }

    функція removeCollateral(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        collateral -= _amount;
    }

    функція getSyntheticAssetPrice() public view повертає (uint256) {
        return underlyingAssetPrice;
    }

    функція mintSyntheticAsset(uint256 _amount) public {
        require(collateral >= _amount, "Insufficient collateral");
        syntheticBalance[msg.sender] += _amount;
        totalSyntheticSupply += _amount;
        collateral -= _amount;
    }

    функція redeemSyntheticAsset(uint256 _amount) public {
        require(syntheticBalance[msg.sender] >= _amount, "Insufficient synthetic balance");
        syntheticBalance[msg.sender] -= _amount;
        totalSyntheticSupply -= _amount;
        collateral += _amount;
    }
}

У цьому налаштуванні контракт Proxy діє як шлюз для контракту SyntheticAsset , що дозволяє оновити реалізацію (тобто логіку) SyntheticAsset без втрати стану (тобто даних) контракту. Це досягається за допомогою fallback функції в Proxy, яка делегує виклики поточній реалізації SyntheticAsset, і функції upgradeImplementation , яка дозволяє власнику змінити адресу реалізації, щоб вказувати на нову версію SyntheticAsset.

За допомогою цього уроку ви отримаєте досвід, необхідний для керування та оновлення контрактів на синтетичні активи, гарантуючи, що вони залишатимуться адаптованими до змінних вимог, зберігаючи при цьому цілісність і безпеку контракту. Ці фундаментальні знання будуть корисними, коли ми глибше заглибимося в більш просунуті аспекти управління синтетичними активами в наступних уроках. Залишайтеся на зв'язку!

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.