使用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
Ethers.contract
Ethers.utils
Ethers.wallets
其中,Ethers.provider負責與以太坊節點進行連接,查詢交易、廣播交易,獲取賬戶餘額等功能;
Ethers.contract負責與智能合約進行交互,包括部署合約、監聽合約裡的事件、獲取合約裡的信息,調用合約裡的函數等功能;
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); } }
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('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)設置ganache的IP為127.0.0.1,端口為8545
b) 在truffle-config.js裡,開啟development網段、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" // } } }, };
打開一個黑框框控制臺,使用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智能合約內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JavaScript canvas實現鏡像圖片效果
- 使用Python的開發框架Brownie部署以太坊智能合約
- React報錯之Parameter event implicitly has an any type解決
- Vue-CLI3.x 自動部署項目至服務器的方法步驟
- 微信小程序使用同聲傳譯實現語音識別功能