Lesson 1

Управление и модернизация контрактов на синтетические активы

В этом уроке Вы получите опыт, необходимый для управления и обновления контрактов на синтетические активы, обеспечивая их адаптацию к меняющимся требованиям и сохраняя целостность и безопасность контракта. Эти базовые знания пригодятся нам, когда мы будем углубляться в более сложные аспекты управления синтетическими активами в последующих уроках.

Приступая к этому продвинутому сегменту нашего курса, давайте на минутку вернемся к синтетическому контракту на активы, который мы разработали в первой части. Этот контракт служит фундаментом, на котором мы будем строить наше понимание управления и обновления смарт-контрактов.

Обзор контракта на синтетические активы

Ниже представлен контракт на синтетические активы, который мы реализовали ранее. Этот контракт облегчает создание, управление и взаимодействие с синтетическими активами на блокчейне.

Solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SyntheticAsset {
 uint256 public underlyingAssetPrice;
 uint256 public collateral;
 address public owner;
 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;
    }

    function 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;
    }
}

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

Владение контрактом

  • Установление права собственности на контракт гарантирует, что только уполномоченные организации могут вносить изменения в контракт.
  • Применение модификатора типа OnlyOwner для ограничения доступа к определенным функциям - обычная практика.

Шаблоны обновления

  • Понимание различных шаблонов обновления, таких как Proxy, Eternal Storage и DelegateCall.
  • Изучите плюсы и минусы каждого шаблона, чтобы выбрать наиболее подходящий для Вашего контракта.

Контракты по доверенности

  • Изучение прокси-контрактов, которые позволяют обновлять логику контракта, сохраняя данные в целости.
  • Реализуйте простой прокси-контракт, чтобы продемонстрировать процесс обновления.
Solidity
contract Proxy {
 address public implementation;

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

    fallback() external payable {
 address impl = implementation;
 assembly {
 let ptr := mload(0x40)
 calldatacopy(ptr, 0, calldatasize())
 let result := delegatecall(gas(), impl, ptr, calldatasize(), 0, 0)
 let size := returndatasize()
 returndatacopy(ptr, 0, size)
 switch result
 case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

Версионирование

  • Внедрите контроль версий, чтобы отслеживать обновления контрактов.
  • Использование семантической версионности для указания типа изменений в каждом обновлении.

Тестирование обновлений

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

contract Proxy {
 address public implementation;
 address public owner;

 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;
 assembly {
 let ptr := mload(0x40)
 calldatacopy(ptr, 0, calldatasize())
 let result := delegatecall(gas(), impl, ptr, calldatasize(), 0, 0)
 let size := returndatasize()
 returndatacopy(ptr, 0, size)
 switch result
 case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

contract SyntheticAsset {
 uint256 public  underlyingAssetPrice;
 uint256 public collateral;
 address public owner;
 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;
    }

    function 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 без потери состояния (т.е. данных) контракта. Это достигается с помощью функции fallback в Proxy, которая делегирует вызовы текущей реализации SyntheticAsset, и функции upgradeImplementation, которая позволяет владельцу изменить адрес реализации, чтобы он указывал на новую версию SyntheticAsset.

В этом уроке Вы получите опыт, необходимый для управления и обновления контрактов на синтетические активы, обеспечивая их адаптацию к меняющимся требованиям и сохраняя целостность и безопасность контракта. Эти базовые знания пригодятся нам, когда мы будем углубляться в более сложные аспекты управления синтетическими активами в последующих уроках. Следите за новостями!

Disclaimer
* Crypto investment involves significant risks. Please proceed with caution. The course is not intended as investment advice.
* The course is created by the author who has joined Gate Learn. Any opinion shared by the author does not represent Gate Learn.
Catalog
Lesson 1

Управление и модернизация контрактов на синтетические активы

В этом уроке Вы получите опыт, необходимый для управления и обновления контрактов на синтетические активы, обеспечивая их адаптацию к меняющимся требованиям и сохраняя целостность и безопасность контракта. Эти базовые знания пригодятся нам, когда мы будем углубляться в более сложные аспекты управления синтетическими активами в последующих уроках.

Приступая к этому продвинутому сегменту нашего курса, давайте на минутку вернемся к синтетическому контракту на активы, который мы разработали в первой части. Этот контракт служит фундаментом, на котором мы будем строить наше понимание управления и обновления смарт-контрактов.

Обзор контракта на синтетические активы

Ниже представлен контракт на синтетические активы, который мы реализовали ранее. Этот контракт облегчает создание, управление и взаимодействие с синтетическими активами на блокчейне.

Solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SyntheticAsset {
 uint256 public underlyingAssetPrice;
 uint256 public collateral;
 address public owner;
 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;
    }

    function 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;
    }
}

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

Владение контрактом

  • Установление права собственности на контракт гарантирует, что только уполномоченные организации могут вносить изменения в контракт.
  • Применение модификатора типа OnlyOwner для ограничения доступа к определенным функциям - обычная практика.

Шаблоны обновления

  • Понимание различных шаблонов обновления, таких как Proxy, Eternal Storage и DelegateCall.
  • Изучите плюсы и минусы каждого шаблона, чтобы выбрать наиболее подходящий для Вашего контракта.

Контракты по доверенности

  • Изучение прокси-контрактов, которые позволяют обновлять логику контракта, сохраняя данные в целости.
  • Реализуйте простой прокси-контракт, чтобы продемонстрировать процесс обновления.
Solidity
contract Proxy {
 address public implementation;

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

    fallback() external payable {
 address impl = implementation;
 assembly {
 let ptr := mload(0x40)
 calldatacopy(ptr, 0, calldatasize())
 let result := delegatecall(gas(), impl, ptr, calldatasize(), 0, 0)
 let size := returndatasize()
 returndatacopy(ptr, 0, size)
 switch result
 case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

Версионирование

  • Внедрите контроль версий, чтобы отслеживать обновления контрактов.
  • Использование семантической версионности для указания типа изменений в каждом обновлении.

Тестирование обновлений

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

contract Proxy {
 address public implementation;
 address public owner;

 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;
 assembly {
 let ptr := mload(0x40)
 calldatacopy(ptr, 0, calldatasize())
 let result := delegatecall(gas(), impl, ptr, calldatasize(), 0, 0)
 let size := returndatasize()
 returndatacopy(ptr, 0, size)
 switch result
 case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

contract SyntheticAsset {
 uint256 public  underlyingAssetPrice;
 uint256 public collateral;
 address public owner;
 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;
    }

    function 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 без потери состояния (т.е. данных) контракта. Это достигается с помощью функции fallback в Proxy, которая делегирует вызовы текущей реализации SyntheticAsset, и функции upgradeImplementation, которая позволяет владельцу изменить адрес реализации, чтобы он указывал на новую версию SyntheticAsset.

В этом уроке Вы получите опыт, необходимый для управления и обновления контрактов на синтетические активы, обеспечивая их адаптацию к меняющимся требованиям и сохраняя целостность и безопасность контракта. Эти базовые знания пригодятся нам, когда мы будем углубляться в более сложные аспекты управления синтетическими активами в последующих уроках. Следите за новостями!

Disclaimer
* Crypto investment involves significant risks. Please proceed with caution. The course is not intended as investment advice.
* The course is created by the author who has joined Gate Learn. Any opinion shared by the author does not represent 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.