1. 程式人生 > 程式設計 >使用ethers.js部署Solidity智慧合約的方法

使用ethers.js部署Solidity智慧合約的方法

如果你已經在以太坊上開發過DApp,那你在前端中可能用過web3.。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.conwww.cppcns.comtract負責與智慧合約進行互動,包括部署合約、監聽合約裡的事件、獲取合約裡的資訊,呼叫合約裡的函式等功能;
    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,value);
    }
}

3.2 http://www.cppcns.com編寫部署

    新建一個資料夾名稱為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,wallet)
    let cohttp://www.cppcns.comntractObj = await factory.deploy(100)
    console.log('contractAddress=',contractObj.address)
    console.log('deploy txHash=',contractObj.deployTransaction.hash)

    await contractObj.deployed()   
}

deployContract(jsonAbi,wallet)



3.3 編譯合約

    a)設定ganache的IP為127.0.0.1,埠為8545
    b) 在truffle-config.js裡,開啟development網段、http://www.cppcns.comsolc指定版本為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)
      // : 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"
      // }
    }
  },};

NkJzq   開啟一個黑框框控制檯,使用truffle編譯該合約

cd sendtokenone
truffle console
compile

3.4 部署合約

    在黑框框終端裡,輸入如下命令,即可部署合約

cd sendtokenone
node migDeploy\1_deploy_event.js

    效果如下:

使用ethers.js部署Solidity智慧合約的方法

圖(1) 使用ether.js部署合約

可以打印合約地址和txHash,說明合約部署成功。

到此這篇關於使用ethers.js部署Solidity智慧合約的文章就介紹到這了,更多相關ethers.js部署Solidity智慧合約內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!