使⽤ethers.js部署Solidity智能合约的⽅法
如果你已经在以太坊上开发过DApp,那你在前端JavaScript中可能⽤过web3.js。Ethers.js则是⼀个轻量级的web3.js替代品。与Web3.js相⽐,Ethers.js有很多优点,其中我最喜欢的⼀个特性是Ethers.js提供的状态和密钥管理。Web3的设计场景是DApp应该连接到⼀个本地节点,由这个节点负责保存密钥、签名交易并与以太坊区块链交互。现实并不是这样的,绝⼤多数⽤户不会在本地运⾏⼀个geth节点。Metamask在浏览器应⽤中有效地模拟了这种节点环境,因此绝⼤多数web3应⽤需要使⽤Metamask来保存密钥、签名交易并完成与以太坊的交互。
Ethers.js采取了不同的设计思路,它提供给开发者更多的灵活性。Ethers.js将“节点”拆分为两个不同的⾓⾊:
钱包:负责密钥保存和交易签名
提供器:负责以太坊⽹络的匿名连接、状态检查和交易发送。
ethers.js是⼀个⾮常精简的以太坊操作库,它包含如下四个模块:
Ethers.provider
act
Ethers.utils
Ethers.wallets
其中,Ethers.provider负责与以太坊节点进⾏连接,查询交易、⼴播交易,获取账户余额等功能;
act负责与智能合约进⾏交互,包括部署合约、监听合约⾥的事件、获取合约⾥的信息,调⽤合约⾥的函数等功能;
Ethers.utils是⼀个⼯具库,主要⽤于处理输⼊、输出数据,数据的类型与格式转换;
Ethers.wallets主要⽤于创建新钱包,连接或切换现有钱包,以及对交易进⾏签名等功能。
下⾯,介绍使⽤Ethers.js来部署智能合约。
1、新建⼀个⼯程sendtokenone
mkdir sendtokenone
cd sendtokenone
npm init -y
truffle init
2、修改package.json并安装依赖包
a)修改后的package.json⽂件如下:
//package.json
{
"name": "sendtokenone",
"version": "1.0.0",
"description": "ethers.js部署合约",
"main": "",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@openzeppelin/contracts": "^3.4",
"@truffle/hdwallet-provider": "^1.5.0",
"bignumber": "^1.1.0",
"bignumber.js": "^8.1.1",
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",
"eslint": "^5.15.0",
"ethereumjs-tx": "^1.3.7",
"ethers": "^5.4.7",
"request": "^2.88.2",
"web3": "^1.3.0"
},
"devDependencies": {
"@babel/core": "^7.12.3",
"@babel/preset-env": "^7.12.1"
}
}
b) 安装依赖包
npm install
3、新建智能合约
3.1 创建⼀个EventValue.sol合约
在sendtokenone/contacts⽬录,创建⼀个创建⼀个EventValue.sol合约,内容如下:
// EventValue.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract EventValue {
event ValueChanged(address indexed author,uint oldValue,uint newValue);
uint _value;
constructor(uint value) public {
uint tmp = _value;
_value = value;
emit ValueChanged(msg.sender, tmp, value);
}
function getValue() view public returns (uint) {
return _value;
}
function setValue(uint value) public {
uint tmp = _value;
_value = value;
emit ValueChanged(msg.sender, tmp, value);
js获取json的key和value}
}
3.2 编写部署脚本
新建⼀个⽂件夹名称为migDeploy,然后在这个⽂件夹⾥,创建部署脚本1_deploy_event.js mkdir migDeploy
cd migDeploy
touch 1_deploy_event.js
1_deploy_event.js的内容如下:
// sendtokenone/migDeploy/1_deploy_event.js
const {ethers} = require("ethers")
const fs = require('fs')
let provider = new ethers.providers.JsonRpcProvider('localhost:8545')
function getHexString(prikeyPath) {
const privKeyFile = fs.readFileSync(prikeyPath).toString().trim();
const privKey = new Buffer.from(privKeyFile, 'hex');
return privKey
}
// var privKey = getHexString(".secret")
var privKey = '23d5'
let wallet = new ethers.Wallet(privKey,provider)
var jsonStr = fs.readFileSync('./build/contracts/EventValue.json')
var jsonInfo = JSON.parse(jsonStr)
var jsonAbi = jsonInfo.abi
var bytecode = jsonInfo.bytecode
async function deployContract(abi,bytecode,wallet) {
let factory = new ethers.ContractFactory(abi,bytecode,wallet)
let contractObj = await factory.deploy(100)
console.log('contractAddress=',contractObj.address)
console.log('deploy txHash=',contractObj.deployTransaction.hash)
await contractObj.deployed()
}
deployContract(jsonAbi,bytecode,wallet)
3.3 编译合约
a)设置ganache的IP为127.0.0.1,端⼝为8545
b) 在truffle-config.js⾥,开启development⽹段、solc指定版本为0.6.6,具体如下: // truffle-config.js
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 8545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
},
// Set default mocha options here, use special reporters etc.
mocha: {
// timeout: 100000
},
// Configure your compilers
compilers: {
solc: {
version: "0.6.6", // Fetch exact version from solc-bin (default: truffle's version)
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
// settings: { // See the solidity docs for advice about optimization and evmVersion
// optimizer: {
// enabled: false,
/
/ runs: 200
// },
// evmVersion: "byzantium"
// }
}
},
};
打开⼀个⿊框框控制台,使⽤truffle编译该合约
cd sendtokenone
truffle console
compile
3.4 部署合约
在⿊框框终端⾥,输⼊如下命令,即可部署合约
cd sendtokenone
node migDeploy\1_deploy_event.js
效果如下:
图(1) 使⽤ether.js部署合约
可以打印合约地址和txHash,说明合约部署成功。
到此这篇关于使⽤ethers.js部署Solidity智能合约的⽂章就介绍到这了,更多相关ethers.js部署Solidity智能合约内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论