ether.js的基本使用

Posted CamphorBloom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ether.js的基本使用相关的知识,希望对你有一定的参考价值。

Ethers是什么?

ethers.js 库旨在成为一个完整而紧凑的库,用于与以太坊区块链及其生态系统进行交互。它最初是为与ethers.io一起使用而设计的,后来扩展为一个更通用的库。

ether.js初体验

安装

Ethers 的各种类和函数可以从 @ethersproject 组织下的子包中手动导入,但对于大多数项目来说,伞形包(umbrella package)是最简单的入门方式。

npm install --save ethers

默认下载最新版本包。

引入依赖

Node.js环境

const  ethers  = require("ethers"); // node.js require

import  ethers  from "ethers";  // ES6 or TypeScript

 网页浏览器环境

对于快速演示或原型设计,您可以从 CDN 将其加载到 Web 应用程序中:

<!-- ES6 in the Browser -->
<script type="module">
    import  ethers  from "https://cdn.ethers.io/lib/ethers-5.2.esm.min.js";
    // Your code here...
</script>


<!-- ES3 (UMD) in the Browser -->
<script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js"
        type="application/javascript"></script>

将 ethers 库复制到您自己的网络服务器并自己提供服务通常是更好的做法(出于安全原因)。

常用术语

Common Terms
ProviderProvider(在ethers中)是一个为以太坊网络连接提供抽象的类。它提供对区块链及其状态的只读访问。
Signer签名者是一个(通常)以某种方式直接或间接访问私钥的类,它可以签署消息和交易以授权网络向您的帐户收取以太币,执行操作。
Contract

合约是一种抽象,表示与以太坊网络上特定合约的连接,因此应用程序可以像使用普通 JavaScript 对象一样使用它。

 

 

 

 

 

 

 连接以太坊:MetaMask

在以太坊上进行实验和开始开发的最快和最简单的方法是使用 MetaMask,它是一个浏览器扩展,提供以下功能:

  • 与以太坊网络的连接(Provider)
  • 持有你的私钥并且可以签署东西(Signer)

 示例代码如下:

const provider = new ethers.providers.Web3Provider(window.ethereum)

const signer = provider.getSigner()

控制台输出的内容: 

 

Web3Provider 包装了一个标准的 Web3 提供程序,它是MetaMask 作为 window.ethereum 注入每个页面的内容。提供者Provider还允许签署交易以发送以太币并支付费用以改变区块链内的状态。为此,我们需要帐户签名者Signer。

连接以太坊: RPC

JSON-RPC API 是另一种与以太坊交互的流行方法,可用于所有主要的以太坊节点实现(例如 Geth 和 Parity)以及许多第三方 Web 服务(例如 INFURA)。它通常提供:

  • 与以太坊网络的连接(Provider)
  • 持有你的私钥并且可以签署东西(Signer)

 示例代码如下:

const provider = new ethers.providers.JsonRpcProvider();

const signer = provider.getSigner()

如果您不指定 //url//,则 Ethers 连接到默认值 (即“http://localhost:8545”)

为本地测试方便,这里我使用Ganache客户端来模拟以太坊网络,端口设置为8545。控制台输出的内容:

 

查询区块链数据

一旦你有了一个提供者,你就有了一个到区块链的只读连接,你可以用它来查询当前状态、获取历史日志、查找部署的代码等等。

基本查询操作如下:

// 查找当前区块号
const BlockNumber = await provider.getBlockNumber();
console.log(BlockNumber);  // 49

// 获取当前主账户
let privateKey = "642f60dbea64adbda21bd43cf3b5adfd32d35ad0e0f6cee2808db500ab3cd094";
let wallet = new ethers.Wallet(privateKey, provider);
let accountAddress = wallet.address;

console.log('账户地址: ', accountAddress);


// 获取账户余额(通过地址或 ENS 名称,如果网络支持)
// balance = await provider.getBalance("ethers.eth")

const balance = await provider.getBalance(accountAddress);
console.log(balance.toString());  // 84878281540000000000 Wei

// 余额格式化(ether与wei的转换)
console.log(ethers.utils.formatEther(balance.toString())); // 84.87828154 Ether
console.log(ethers.utils.parseEther("1.0")); //  1000000000000000000

验证结果:

 

参考文档:Getting Started

如何使用 HardHat 调用应付账款 Solidity 函数?

【中文标题】如何使用 HardHat 调用应付账款 Solidity 函数?【英文标题】:How to invoke a payable solidity function using HardHat? 【发布时间】:2021-09-04 01:01:06 【问题描述】:

我有一个名为“收养狗”的可靠函数,如下所示,它基本上是合同中的一个应付函数。

// 这失败了,因为我不知道如何在 HARDHAT/ETHER.JS 中传递 ETH

硬汉

 const Adopt = await ethers.getContractFactory("Adopt");
    const adopt = await Adopt.deploy();
    await adopt.deployed();
    await adopt.adopt("Hachiko"); 

合同

 function adopt(string calldata dog_breed) external payable 
             require(msg.value >= 1 ether ,"Min 1 ether needs to be transfered");
            require(user_list[msg.sender].user_allowed_to_adopt,"User not 
            allowed to participate for adoption");
            require(!user_list[msg.sender].adopted,"User has already 
            adopted the dog");
            
        User memory user=user_list[msg.sender];
        user.adopted=true;
        user_list[msg.sender]=user;
    

【问题讨论】:

【参考方案1】:

您可以使用overrides 参数。

await adopt.adopt("Hachiko", 
    value: ethers.utils.parseEther("1.0")
); 

文档:https://docs.ethers.io/v5/api/contract/contract/#Contract-functionsCall

【讨论】:

以上是关于ether.js的基本使用的主要内容,如果未能解决你的问题,请参考以下文章

第一行代码:以太坊-创建自己的私有区块链

第一行代码:以太坊-创建自己的私有区块链

区块链学习--以太坊中基本概念

以太坊 DApp 开发入门实战! 用Node.js和truffle框架搭建——区块链投票系统!

使用ether.js开发以太坊web3钱包

以太坊区块链快速入门