Alors que nous entamons ce segment avancé de notre cours, prenons le temps de revoir le contrat d'actif synthétique que nous avons élaboré dans la première partie. Ce contrat sert de base à notre compréhension de la gestion et de la mise à niveau des contrats intelligents.
Vous trouverez ci-dessous le contrat d'actif synthétique que nous avons mis en œuvre précédemment. Ce contrat facilite la création, la gestion et l'interaction avec des actifs synthétiques sur la blockchain.
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;
}
modificateur 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;
}
}
Maintenant que nous avons une meilleure compréhension de notre contrat de base, examinons les aspects de la gestion et de la mise à jour des contrats d'actifs synthétiques.
onlyOwner
pour restreindre l'accès à certaines fonctions est une pratique courante.Solidity
contrat Proxy {
adresse implémentation publique ;
fonction upgradeImplementation(adresse _newImplementation) public onlyOwner {
implementation = _newImplementation;
}
fallback() external payable {
adresse impl = implémentation ;
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) }
}
}
}
contrat SyntheticAsset {
uint256 public underlyingAssetPrice ;
uint256 public collateral ;
address public owner ;
mapping(address => uint256) public syntheticBalance ;
uint256 public totalSyntheticSupply ;
constructor() {
owner = msg.sender;
}
modificateur 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;
}
}
Dans cette configuration, le contrat Proxy
sert de passerelle pour le contrat SyntheticAsset
, ce qui permet de mettre à jour l'implémentation (c'est-à-dire la logique) de SyntheticAsset
sans perdre l'état (c'est-à-dire les données) du contrat. Cela est possible grâce à la fonction fallback
de Proxy
, qui délègue les appels à l'implémentation actuelle de SyntheticAsset
, et à la fonction upgradeImplementation
, qui permet au propriétaire de modifier l'adresse de l'implémentation pour qu'elle pointe vers une nouvelle version de SyntheticAsset
.
Cette leçon vous permettra d'acquérir l'expertise nécessaire pour gérer et mettre à jour les contrats d'actifs synthétiques, en veillant à ce qu'ils restent adaptables à l'évolution des besoins tout en préservant l'intégrité et la sécurité du contrat. Ces connaissances fondamentales seront déterminantes pour approfondir les aspects plus avancés de la gestion des actifs synthétiques dans les leçons suivantes. Restez à l'écoute !
Alors que nous entamons ce segment avancé de notre cours, prenons le temps de revoir le contrat d'actif synthétique que nous avons élaboré dans la première partie. Ce contrat sert de base à notre compréhension de la gestion et de la mise à niveau des contrats intelligents.
Vous trouverez ci-dessous le contrat d'actif synthétique que nous avons mis en œuvre précédemment. Ce contrat facilite la création, la gestion et l'interaction avec des actifs synthétiques sur la blockchain.
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;
}
modificateur 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;
}
}
Maintenant que nous avons une meilleure compréhension de notre contrat de base, examinons les aspects de la gestion et de la mise à jour des contrats d'actifs synthétiques.
onlyOwner
pour restreindre l'accès à certaines fonctions est une pratique courante.Solidity
contrat Proxy {
adresse implémentation publique ;
fonction upgradeImplementation(adresse _newImplementation) public onlyOwner {
implementation = _newImplementation;
}
fallback() external payable {
adresse impl = implémentation ;
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) }
}
}
}
contrat SyntheticAsset {
uint256 public underlyingAssetPrice ;
uint256 public collateral ;
address public owner ;
mapping(address => uint256) public syntheticBalance ;
uint256 public totalSyntheticSupply ;
constructor() {
owner = msg.sender;
}
modificateur 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;
}
}
Dans cette configuration, le contrat Proxy
sert de passerelle pour le contrat SyntheticAsset
, ce qui permet de mettre à jour l'implémentation (c'est-à-dire la logique) de SyntheticAsset
sans perdre l'état (c'est-à-dire les données) du contrat. Cela est possible grâce à la fonction fallback
de Proxy
, qui délègue les appels à l'implémentation actuelle de SyntheticAsset
, et à la fonction upgradeImplementation
, qui permet au propriétaire de modifier l'adresse de l'implémentation pour qu'elle pointe vers une nouvelle version de SyntheticAsset
.
Cette leçon vous permettra d'acquérir l'expertise nécessaire pour gérer et mettre à jour les contrats d'actifs synthétiques, en veillant à ce qu'ils restent adaptables à l'évolution des besoins tout en préservant l'intégrité et la sécurité du contrat. Ces connaissances fondamentales seront déterminantes pour approfondir les aspects plus avancés de la gestion des actifs synthétiques dans les leçons suivantes. Restez à l'écoute !