使用ethers.js部署Solidity智能合約的方法
如果你已經(jīng)在以太坊上開發(fā)過(guò)DApp,那你在前端JavaScript中可能用過(guò)web3.js。Ethers.js則是一個(gè)輕量級(jí)的web3.js替代品。
與Web3.js相比,Ethers.js有很多優(yōu)點(diǎn),其中我最喜歡的一個(gè)特性是Ethers.js提供的狀態(tài)和密鑰管理。Web3的設(shè)計(jì)場(chǎng)景是DApp應(yīng)該連接到一個(gè)本地節(jié)點(diǎn),由這個(gè)節(jié)點(diǎn)負(fù)責(zé)保存密鑰、簽名交易并與以太坊區(qū)塊鏈交互?,F(xiàn)實(shí)并不是這樣的,絕大多數(shù)用戶不會(huì)在本地運(yùn)行一個(gè)geth節(jié)點(diǎn)。Metamask在瀏覽器應(yīng)用中有效地模擬了這種節(jié)點(diǎn)環(huán)境,因此絕大多數(shù)web3應(yīng)用需要使用Metamask來(lái)保存密鑰、簽名交易并完成與以太坊的交互。
Ethers.js采取了不同的設(shè)計(jì)思路,它提供給開發(fā)者更多的靈活性。Ethers.js將“節(jié)點(diǎn)”拆分為兩個(gè)不同的角色:
錢包:負(fù)責(zé)密鑰保存和交易簽名
提供器:負(fù)責(zé)以太坊網(wǎng)絡(luò)的匿名連接、狀態(tài)檢查和交易發(fā)送。
ethers.js是一個(gè)非常精簡(jiǎn)的以太坊操作庫(kù),它包含如下四個(gè)模塊:
Ethers.provider
Ethers.contract
Ethers.utils
Ethers.wallets
其中,Ethers.provider負(fù)責(zé)與以太坊節(jié)點(diǎn)進(jìn)行連接,查詢交易、廣播交易,獲取賬戶余額等功能;
Ethers.contract負(fù)責(zé)與智能合約進(jìn)行交互,包括部署合約、監(jiān)聽合約里的事件、獲取合約里的信息,調(diào)用合約里的函數(shù)等功能;
Ethers.utils是一個(gè)工具庫(kù),主要用于處理輸入、輸出數(shù)據(jù),數(shù)據(jù)的類型與格式轉(zhuǎn)換;
Ethers.wallets主要用于創(chuàng)建新錢包,連接或切換現(xiàn)有錢包,以及對(duì)交易進(jìn)行簽名等功能。
下面,介紹使用Ethers.js來(lái)部署智能合約。
1、新建一個(gè)工程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 創(chuàng)建一個(gè)EventValue.sol合約
在sendtokenone/contacts目錄,創(chuàng)建一個(gè)創(chuàng)建一個(gè)EventValue.sol合約,內(nèi)容如下:
// 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);
}
}
3.2 編寫部署腳本
新建一個(gè)文件夾名稱為migDeploy,然后在這個(gè)文件夾里,創(chuàng)建部署腳本1_deploy_event.js
mkdir migDeploy cd migDeploy touch 1_deploy_event.js
1_deploy_event.js的內(nèi)容如下:
// sendtokenone/migDeploy/1_deploy_event.js
const {ethers} = require("ethers")
const fs = require('fs')
let provider = new ethers.providers.JsonRpcProvider('http://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 = '0x403d...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)設(shè)置ganache的IP為127.0.0.1,端口為8545
b) 在truffle-config.js里,開啟development網(wǎng)段、solc指定版本為0.6.6,具體如下:
// truffle-config.js
module.exports = {
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"
// }
}
},
};
打開一個(gè)黑框框控制臺(tái),使用truffle編譯該合約
cd sendtokenone
truffle console
compile
3.4 部署合約
在黑框框終端里,輸入如下命令,即可部署合約
cd sendtokenone
node migDeploy\1_deploy_event.js
效果如下:

可以打印合約地址和txHash,說(shuō)明合約部署成功。
到此這篇關(guān)于使用ethers.js部署Solidity智能合約的文章就介紹到這了,更多相關(guān)ethers.js部署Solidity智能合約內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS如何調(diào)用WebAssembly編譯出來(lái)的.wasm文件
這篇文章主要介紹了關(guān)于WebAssembly編譯出來(lái)的.wasm文件js如何調(diào)用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
JS使用正則表達(dá)式找出最長(zhǎng)連續(xù)子串長(zhǎng)度
這篇文章主要介紹了js 正則找出最長(zhǎng)連續(xù)子串長(zhǎng)度的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-10-10
uni-file-picker文件選擇上傳功能實(shí)現(xiàn)
這篇文章主要介紹了uni-file-picker文件選擇上傳,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
TypeScript對(duì)于Duck類型和模塊命名空間應(yīng)用
這篇文章主要介紹了TypeScript對(duì)于Duck類型和模塊命名空間應(yīng)用,Duck類型是一種動(dòng)態(tài)類型和多態(tài)形式,在duck類型中,重點(diǎn)是對(duì)象的行為可以做什么,而不是對(duì)象所屬的類型2022-08-08
權(quán)威JavaScript 中的內(nèi)存泄露模式
權(quán)威JavaScript 中的內(nèi)存泄露模式...2007-08-08
完美解決IE低版本不支持call與apply的問(wèn)題
這篇文章主要是對(duì)解決IE低版本不支持call與apply的問(wèn)題進(jìn)行了詳細(xì)的介紹。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
Javascript獲取background屬性中url的值
Javascript獲取CSS中屬性值方法有很多,今天工作的時(shí)候遇到了一個(gè)問(wèn)題是需要利用Javascript獲取css中background-img屬性u(píng)rl的值,通過(guò)查閱網(wǎng)站的資料找到了解決方法,現(xiàn)在將方法分享給大家,有需要的朋友們們可以參考借鑒,下面來(lái)一起看看吧。2016-10-10

