Приступаючи до цього складного сегменту нашого курсу, давайте приділимо хвилинку, щоб повернутися до контракту на синтетичні активи, який ми розробили в першій частині. Цей контракт служить основою, на якій ми будуватимемо наше розуміння управління та оновлення розумних контрактів.
Нижче наведено контракт на синтетичні активи, який ми реалізували раніше. Цей контракт полегшує створення, керування та взаємодію з синтетичними активами в блокчейні.
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
для обмеження доступу до певних функцій є звичайною практикою.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
.
За допомогою цього уроку ви отримаєте досвід, необхідний для керування та оновлення контрактів на синтетичні активи, гарантуючи, що вони залишатимуться адаптованими до змінних вимог, зберігаючи при цьому цілісність і безпеку контракту. Ці фундаментальні знання будуть корисними, коли ми глибше заглибимося в більш просунуті аспекти управління синтетичними активами в наступних уроках. Залишайтеся на зв'язку!
Приступаючи до цього складного сегменту нашого курсу, давайте приділимо хвилинку, щоб повернутися до контракту на синтетичні активи, який ми розробили в першій частині. Цей контракт служить основою, на якій ми будуватимемо наше розуміння управління та оновлення розумних контрактів.
Нижче наведено контракт на синтетичні активи, який ми реалізували раніше. Цей контракт полегшує створення, керування та взаємодію з синтетичними активами в блокчейні.
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
для обмеження доступу до певних функцій є звичайною практикою.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
.
За допомогою цього уроку ви отримаєте досвід, необхідний для керування та оновлення контрактів на синтетичні активи, гарантуючи, що вони залишатимуться адаптованими до змінних вимог, зберігаючи при цьому цілісність і безпеку контракту. Ці фундаментальні знання будуть корисними, коли ми глибше заглибимося в більш просунуті аспекти управління синтетичними активами в наступних уроках. Залишайтеся на зв'язку!