当前位置:网站首页>Precautions for scalable contract solution based on openzeppelin
Precautions for scalable contract solution based on openzeppelin
2022-07-02 11:35:00 【Ni xiansen_】
be based on Openzeppelin Considerations for scalable contract solutions
matters needing attention
Constructors
Please Do not use Constructors contructor(), We know that the runtime logic of scalable contracts is separated from data , Contract data is stored in Agency contract in , The contract we wrote is Logical contract , When the contract is deployed , Logical contract call contructor() The initialization data is Logical contract Of , Agency contract The data in is not initialized , So it's invalid .
Include Global variables Assign initial value when declaring , Because this is equivalent to the constructor contructor() Set these values in .
Parent contract initialization
If MyContract Inherited from contract BaseContract, that BaseContract Contract initialization function initialize() Of modifier( Decorators ) You have to use onlyInitializing, such as :
contract BaseContract is Initializable {
uint256 public y;
function initialize() public onlyInitializing {
y = 42;
}
}
// BaseContract Inherited from Initializable, There is no need to repeat explicit inheritance Initializable
contract MyContract is BaseContract {
int storageValue;
// modifier( Decorators ) initializer To ensure that initialize Will only be called once
function initialize(int initValue) public initializer {
BaseContract.initialize();
storageValue = initValue;
}
......
}
Declare state variables
- When declaring state variables , It cannot be assigned Initial value
It's wrong to do like this
contract MyContract is Initializable {
int storageValue = 666; // Invalid initial value
function initialize() public initializer {
}
......
}
Because this is equivalent to the constructor contructor() Set these values in , Therefore, it does not apply to scalable conventions .
- Defining constant state variables can still
It's OK like this
contract MyContract is Initializable {
// constant Constant keyword
int public constant storageValue = 666; // It works
function initialize() public initializer {
}
......
}
Create a new contract instance in the contract code
- Do not create new contract instances in the contract , The contract created is not scalable
like this , Even if MyContract It's upgradeable , but ERC20 Instances cannot be upgraded
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyContract is Initializable {
ERC20 public token;
function initialize() public initializer {
token = new ERC20("Test", "TST"); // This contract cannot be upgraded
}
......
}
- If you want to MyContract Quote other upgradeable contracts , Then inject the deployed scalable contract instance into MyContract in , It's a good solution
like this
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
contract MyContract is Initializable {
IERC20Upgradeable public token;
function initialize(IERC20Upgradeable _token) public initializer {
token = _token;
}
......
}
Declare the state variable when upgrading the contract
When writing a new version of the contract , Whether due to new features or bug Repair , There is an additional limitation to be observed : The declaration order of contract state variables cannot be changed , Nor can you change its type .
For example, the current version (V1) Contract state variable layout
contract MyContractV1 {
uint256 private x;
string private y;
}
When writing the new version of the contract , Please avoid the wrong operation :
- Change the type of variable
This is wrong
contract MyContractV2 {
string private x;
string private y;
}
- Change the order in which they are declared
This is wrong
contract MyContractV2 {
string private y;
uint256 private x;
}
- Introduce a new variable before the existing variable
This is wrong
contract MyContractV2 {
bytes private a;
uint256 private x;
string private y;
}
That's right
contract MyContractV2 {
uint256 private x;
string private y;
bytes private a;
}
- Delete existing variables
This is wrong
contract MyContractV2 {
string private y;
}
Reference documents :
Openzeppelin Write upgradeable contracts :https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable
边栏推荐
- TIPC介绍1
- III Chip startup and clock system
- The difference between SQL left join main table restrictions written after on and where
- C#多维数组的属性获取方法及操作注意
- MTK full dump grab
- Gaode draws lines according to the track
- TDSQL|就业难?腾讯云数据库微认证来帮你
- ros缺少xacro的包
- ImportError: cannot import name ‘Digraph‘ from ‘graphviz‘
- TIPC introduction 1
猜你喜欢

二.Stm32f407芯片GPIO编程,寄存器操作,库函数操作和位段操作

What are the software product management systems? Inventory of 12 best product management tools

C#多维数组的属性获取方法及操作注意

抖音海外版TikTok:正与拜登政府敲定最终数据安全协议

数字化转型挂帅复产复工,线上线下全融合重建商业逻辑

【云原生】2.5 Kubernetes 核心实战(下)

Skills of PLC recorder in quickly monitoring multiple PLC bits

Eight sorting summaries

The first white paper on agile practice in Chinese enterprises was released | complete download is attached

PKG package manager usage instance in FreeBSD
随机推荐
Iii. Système de démarrage et d'horloge à puce
Skills of PLC recorder in quickly monitoring multiple PLC bits
flutter 问题总结
js中给数组添加元素的方法有哪些
ros缺少xacro的包
通过券商经理的开户二维码开股票账户安全吗?还是去证券公司开户安全?
PLC-Recorder快速监控多个PLC位的技巧
Installation of ROS gazebo related packages
MTK full dump grab
制造业数字化转型和精益生产什么关系
The working day of the month is calculated from the 1st day of each month
Astparser parsing class files with enum enumeration methods
Compilation errors and printout garbled problems caused by Chinese content in vs2019 code
C file and folder operation
Is the stock account given by qiniu business school safe? Can I open an account?
mysql 基本语句
一.STM32的开发环境,keil5/MDK5.14安装教程(附下载链接)
Amazon cloud technology community builder application window opens
函数式接口和方法引用
bedtools使用教程