使用ethers.js部署Solidity智能合约的完整指南

作者:测试鸭

时间:2026-10-25

浏览:335

本文详细介绍如何使用轻量级库ethers.js结合Truffle框架部署Solidity智能合约。内容涵盖ethers.js与Web3.js的核心区别、项目环境初始化、依赖安装、合约编写、编译配置及通过脚本完成合约部署的具体操作步骤,帮助开发者快速掌握以太坊DApp后端交互与合约上线流程。

文章目录

对于已在以太坊平台进行DApp开发的开发者而言,前端JavaScript中常接触的是web3.js。相比之下,Ethers.js作为一种更为轻量的替代方案,正逐渐受到青睐。

相较于Web3.js,Ethers.js具备多项优势,其中最为突出的特性在于其提供的状态与密钥管理功能。Web3.js的设计初衷是假设DApp连接至本地节点,由该节点负责密钥存储、交易签名及与以太坊区块链的交互。然而在实际应用中,绝大多数用户并不会在本地运行geth节点。Metamask通过在浏览器应用中模拟此类节点环境,使得大多数web3应用依赖其来保存密钥、签名交易并实现与以太坊的交互。

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、新建一个工程sendtokenone

图(1) 使用ether.js部署合约

若能打印出合约地址和txHash,则表明合约部署成功。

至此,关于使用ethers.js部署Solidity智能合约的介绍已完成。如需了解更多相关ethers.js部署Solidity智能合约的内容,请搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章