Lección 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.

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

Descargo de responsabilidad
* La inversión en criptomonedas implica riesgos significativos. Proceda con precaución. El curso no pretende ser un asesoramiento de inversión.
* El curso ha sido creado por el autor que se ha unido a Gate Learn. Cualquier opinión compartida por el autor no representa a Gate Learn.
Catálogo
Lección 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.

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

Descargo de responsabilidad
* La inversión en criptomonedas implica riesgos significativos. Proceda con precaución. El curso no pretende ser un asesoramiento de inversión.
* El curso ha sido creado por el autor que se ha unido a Gate Learn. Cualquier opinión compartida por el autor no representa a Gate Learn.