openzeppelin开发配置

Posted by 姚飞亮 on 2020-11-01

openzeppelin开发配置

1.安装

sudo npm install @openzeppelin/cli --unsafe-perm=true --allow-root

2.初始化

npx openzeppelin init`

配置部署账号

1
2
3
4
5
6
> //secrets.json 助记词
> {
> "mnemonic": "window habit dragon snake *** *** *** clock hold bar public dust",
> "projectId": "272c7dbe1460492b804fdbeffb36cab4"
> }
>

3.修改 networks.js 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const { projectId, mnemonic } = require('./secrets.json');
const HDWalletProvider = require('@truffle/hdwallet-provider');
module.exports = {
networks: {
rinkeby: {
provider: () => new HDWalletProvider(
mnemonic, `https://rinkeby.infura.io/v3/0c23855fdde64855986fd08b858f1906`
),
networkId: 4,
gasPrice: 10e9
},
development: {
protocol: 'http',
host: 'localhost',
port: 8545,
gas: 5000000,
gasPrice: 5e9,
networkId: '*',
},
},
};

4.部署

npx oz create

5.测试执行合约方法(写入)

npx oz send-tx

6.读取合约数据(读取)

npx oz call

7.升级合约(合约地址不变)

npx oz upgrade

8.单独编译 大多数CLI命令(例如oz createoz upgrade)会在需要时自动编译项目智能合约

npx oz compile

9.链接以太坊合约包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//@openzeppelin/contracts-ethereum-package
//安装
sudo npm install @openzeppelin/contracts-ethereum-package --unsafe-perm=true --allow-root
//将OpenZeppelin合约以太坊软件包链接到项目中
npx oz link @openzeppelin/contracts-ethereum-package
//执行命令选择选项就可以发行Token
npx oz create
The create command is deprecated. Use deploy instead.
Nothing to compile, all contracts are up to date.
? Pick a contract to instantiate @openzeppelin/contracts-ethereum-package/ERC20PresetMinterPauserUpgrade
Safe
? Pick a network rinkeby
✓ Linked dependency @openzeppelin/contracts-ethereum-package 3.0.0
All implementations are up to date
? Call a function to initialize the instance after creating it? Yes
? Select which function initialize(name: string, symbol: string)
? name: string: NewToken
? symbol: string: NETO
✓ Instance created at 0xaD5be79048996817D0cdCbee2EdAFF78CAE7f103
To upgrade this instance run 'oz upgrade'
0xaD5be79048996817D0cdCbee2EdAFF78CAE7f103
//查询用户token数量
npx oz balance --erc20 0xaD5be79048996817D0cdCbee2EdAFF78CAE7f103
? Enter an address to query its balance 0x857eF46Cd9609Fb4098353a64F62Cfd99Be67266
? Pick a network rinkeby
Balance: 0 NETO

10.为了简化编码初始化程序,OpenZeppelin升级提供了基本Initializable合同,该合同包含一个initializer处理此问题的修饰符。您首先需要安装它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo npm install @openzeppelin/upgrades --unsafe-perm=true --allow-root

npx oz create
The create command is deprecated. Use deploy instead.
Nothing to compile, all contracts are up to date.
? Pick a contract to instantiate TokenExchange
? Pick a network rinkeby
✓ Added contract TokenExchange
✓ Contract TokenExchange deployed
All implementations have been deployed
? Call a function to initialize the instance after creating it? Yes
? Select which function initialize(_rate: uint256, _token: address)
? _rate: uint256: 10
? _token: address: 0xaD5be79048996817D0cdCbee2EdAFF78CAE7f103
✓ Instance created at 0x88dDC24f17D2938Af7769acea0D1e0F7583500e1

11.指定solidity编译器版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo npx oz compile --solc-version 0.6.0
// .openzeppelin/project.json
{
"manifestVersion": "2.2",
"name": "my-project",
"version": "1.0.0",
"compiler": {
"manager": "openzeppelin",
"solcVersion": "0.6.0"
}
}
//如果truffle用于编译项目,则可以指定在您的truffle.js或truffle-config.js
// truffle.js truffle-config.js
module.exports = {
compilers: {
solc: {
version: "0.5.14"
}
}
}

12.选择一个EVM版本

npx oz compile --evm-version berlin

13.使用优化器

1.Solidity编译器具有一个可选的优化器:它可以产生更小,更省气的EVM字节码,但代价是使其难以理解。

通过以下--optimizer选项启用或禁用优化器:

1
2
> $ npx oz compile --optimizer on
>

为了进行微调,您还可以传递该--optimizer-runs选项。这个数字应该是您期望智能合约被调用多少次的估计:一次过一次通过1,对于经常使用的合约一次更大。默认值为200。

1
2
> $ npx oz compile --optimizer on --optimizer-runs 100
>

如果您不确定要传递哪个值,请不要担心--optimizer-runs:正确使用此参数所获得的收益非常有限。

2.创建智能合约

可以使用两种主要方法来部署智能合约:使用CREATECREATE2流。我们将简要概述它们的工作方式及其核心区别。

  • CREATE

    可以通过其他合同(使用Solidity的new关键字)和常规帐户(例如运行oz create)创建智能合同。在这两种情况下,新合同的地址都以相同的方式计算:作为发送者自己的地址和现时的函数。

    1
    2
    >   new_address = hash(sender, nonce)
    >
  • CREATE2

    该操作码背后的全部思想是使结果地址独立于将来的事件。无论区块链上可能发生什么,总有可能在预先计算的地址处部署合同。

    新地址具有以下功能:

    • 0xFF,一个常量,可防止与 CREATE

    • 发件人自己的地址

    • 盐(发件人提供的任意值)

    • 待部署合同的字节码

      1
      2
      >     new_address = hash(0xFF, sender, salt, bytecode)
      >
https://docs.openzeppelin.com/cli/2.6/deploying-with-create2


Ω