以太坊标准JS API库——浅谈Web3.js与Ethers.js

这篇具有很好参考价值的文章主要介绍了以太坊标准JS API库——浅谈Web3.js与Ethers.js。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

web3.js与ethers.js/hardhat-ethers介绍

版本号:
Web3.js v1.7.3
Ethers.js v.5.6

简单介绍web3.js

web3.js是一个标准的以太坊JavaScript API库,该JS库由以太坊基金会开发维护,同时它也是最早且使用最广泛的一个ETH API库。由于Moonbeam完全兼容以太坊EVM,因此web3.js可以在Moonbeam上进行正常交互

web3.js(v1.7.3)库官方使用文档:https://web3js.readthedocs.io/en/v1.7.3/index.html

web3.js的安装与常用API介绍

安装web3.js

在命令终端输入npm install web3即可正常安装

常用API介绍

1. 签名交易web3.eth.accounts.signTransaction()
web3.eth.accounts.signTransaction(tx, privateKey, [, callback]) => promise<object>

第一个参数为tx,即定义该交易的细则,在其中可以定义的交易细则有gas,to,value,gasPrice等参数,其中gas是必须要设置的参数(其余用到的交易参数都是可选择的),gas参数规定了该交易将要花费的gas费用,to参数则说明了这笔交易的接受者,而value参数则规定了这笔交易中转移代币的数量
第二个参数为privateKey,为发起交易人的私钥,该交易将由该私钥进行签署

第三个参数为callback,该参数为一个可选参数,该回调函数返回的第一个参数为一个错误对象,第二个参数为结果对象

该接口返回一个Promise对象,如果签署交易成功,将会返回该交易的一些具体信息,如messageHashrawTransactiontransactionHash等信息

2. 部署合约contractInstance.deploy()
new web3.eth.Contract(jsonInterface[, address][, options]) => promise<contract>

该方法用于生产合约实例,只有通过合约实例才能进行部署操作。该函数只需要填写一个一个参数即可,jsonInterface即为该合约的abi,填入该参数即可完成合约实例的生成

contractInstace.deploy(options) => promise<transaction>

改方法用于部署合约,调用该函数将返回部署合约交易的具体信息
其中的参数为options,其中里面可以写入两个部分,即data(String)与arguments(Array)两个参数,data参数为合约的bytecode;arguments参数为合约构造函数中的参数,因此该参数为可选的

deploy函数会返回一个交易对象,该对象自带一个数组与4个函数,数组表示先前传入的构造函数的入参,四个函数分别为send()estimateGas()encodeABI()createAccessList()

3. 调用合约方法methods.myMethod.call()
myContract.methods.myMethod(param1[, param2[, ...]]).call(options [, defaultBlock] [, callback]) => returnValuesOfContract

该方法用于调用一个“constant”方法并在不发起任何交易的同时在EVM执行智能合约的方法,使用此方法调用的智能合约方法均不会改变合约状态
其中myMethod()括号中填入的参数为该方法的入参,call()中填入的options包含如下几个方面的值:from、gasPrice、gas,call()中还可以选择性的填入defaultBlock与callback,其中defaultBlock为默认区块设置,callback回调函数第一个参数为错误对象,第二个参数为合约方法结果

该方法会返回调用函数的返回结果,如果返回结果为多个,则返回一个带有索引的对象

4. 订阅监听事件web3.eth.subscribe()
web3.eth.subscribe(type [, options] [, callback]) => subscriptionInstance

该方法用于订阅监听智能合约中触发的事件
其中订阅方法包含四种方法,分别为:pendingTransactions,newBlockHeaders,syncing,logs

监听事件一般采用newBlockHeaders模式,该模式订阅监听传入的区块头,该特性可以作为计时器来检查区块链上的变化。callback参数与上述函数一样,第一个参数为错误对象,第二个参数为结果对象

同时在该函数的返回内容中,有几个回调函数比较常见:on("connected"), on("data"), on("error"), on("changed")

  1. 一旦订阅成功连接则触发on("connected"),该函数返回订阅id;
  2. 当log有数据时触发on("data")
  3. 当订阅出错时触发on("error")
  4. 当有log被删除出区块链时触发on("changed")

简单介绍Ethers.js

Ethers.js与Web3.js一样,都是以太坊标准JavaScript API库,Ethers.js最初是为了ethers.io设计,后来拓展为一个开放的JS API库,与Web3.js相同的是,Ethers.js同样可以与Moonbeam进行正常交互,这得益于Moonbeam是一个完全兼容以太坊EVM的智能合约平台;而与Web3.js不同的是,Ethers.js在使用时不需要过多的回调函数,而且可以搭配Hardhat工具是的语法得到进一步的优化

Ethers.js(Hardhat)的安装与常用API介绍

Ethers.js(Hardhat)的安装

Ethers.js的安装分为两种,一种为直接使用命令行安装,另一种为通过Hardhat间接安装(配合Hardhat使用),推荐第二种通过Hardhat👷的方式使用Ethers.js(安装Hardhat时通过hardhat-ethers插件安装经过包装后的Ethers.js)

安装步骤如下:

// command line
npm install --save ethers

// install Hardhat
npm init
npm install --save-dev hardhat
npx hardhat

常用API介绍

Ethers.js库中的API主要由4大部分组成:ProvidersSignersContract InteractionUtilities

1. Provider

Provider是以太坊网络连接的抽象,其为标准以太坊节点功能提供简洁、一致的接口

在Provider中比较常用的方法为JsonRpcProvider,该方法允许通过JSON-RPC的方式连接某一个节点网络

// new ethers.providers.JsonRpcProvider([urlOrConnectionInfo[, networkish]])
const provider = new ethers.providers.JsonRpcProvider(
        'https://rpc.api.moonbase.moonbeam.network',
        {
            chainId: 1287,
            name: 'moonbase-alpha'
        }
);

在上面的代码示例中,通过JsonRpcProvider的方式,连接到了Moonbase Alpha测试网中,在其中不止可以定义url参数,还可以定义该网络的chainId与name等信息

2. Signers

Signer是以太坊账户的抽象,可用于对消息和交易进行签名,并将签名过的交易发送到以太坊网络以执行状态更改操作

在Signer中比较常用的方法为Wallet,只有Wallet可以使用私钥对交易和信息进行签名

// new ethers.Wallet(privateKey[, provider])
const alice = new ethers.Wallet(privateKeyAlice, provider);
const bob = new ethers.Wallet(privateKeyBob, provider);

const txReceipt = await alice.sendTransaction({
    to: bob.address,
    value: ethers.utils.parseEther('1.0')
});
await txReceipt.wait();

在上面的代码示例中,使用Wallet定义了alice与bob两个Signer,接下来alice调用方法sendTransaction()方法向bob发起交易,转移了1 ether的token

3. Contract Interaction

部署合约与生成合约实例离不开下面介绍的两个方法:ContractFactory()与Contract,具体方法直接看下面的代码示例接口

// deploy contract
new ethers.ContractFactory(interface, bytecode[, signer])
contractFactory.deploy(..args)
contract.deployed()

// generate contract instance
new ethers.Contract(address, abi, signerOrProvider)

其中ContracFactory中的interface参数代表合约的abi
使用Hardhat编译过后的合约,其abi与bytecode等编译信息都存放在了项目根目录下的artifacts/contracts/CONTRACT_NAME.json文件中

4. Utilities

utilities下提供的各种方法更像是各种各样的工具,比较常用的有对BigNumber的操作,以太坊Token单位的直接转换以及将string于bytes32相互转化的工具等,以下列出几个常见方法

// BigNumber
BigNumber.toNumber() => number
BigNumber.toHexString() => string<DataHexString>

// Display Logic and Input
ethers.utils.parseEther(string) => BigNumber
ethers.utils.formatEther(value(BigNumber)) => string

// Strings
ethers.utils.parseBytes32String(aBytesLike) => string
ethers.utils.formatBytes32String(text) => string<DataHexString<32>>
  1. BigNumber.toNumber():将BigNumber的值转换为JavaScript值

  2. BigNumber.toHexString():将BigNumber值转换为0x开头,16进制的值

  3. ethers.utils.parseEther(string):将一个整数转换为以ether为单位的大整数

  4. ethers.utils.formatEther(value(BigNumber)):将大整数转换为以ether为单位的整数

  5. ethers.utils.parseBytes32String(aBytesLike):返回一个bytes 32编码数据表示的解码字符串

  6. ethers.utils.formatBytes32String(text):返回文本的bytes 32字符串表示形式

hardhat-ethers升级接口

使用原生Ethers.js库进行与节点进行交互时,特别在部署合约方面的接口使用中,会发现原生接口的调用比较麻烦

因此Hardhat在此方面做了优化,即Hardhat提供了一个hardhat-ethers插件,该插件会提供一个ethers对象,该对象与Ethers.js有着相同的API,同时还有一些Hardhat特别定义的接口

其特别定义的接口主要体现在以下是三个方面:

  • 不需要额外定义provider,provider已经在执行npx hardhat --network NET run SCRIPT 命令时已自动连接到了选定网络中
  • getSigner() => Signer,该接口直接在hardhat配置中获取signer,不需要定义wallet,但需要提前将账户私钥信息填写到Hardhat配置文件中
  • getContracFactory(contractName[, signer]) => contractFactory,该接口简化了原生contractFactory()接口,使得只需要合约的名字即可产生contractFactory对象
    以部署一个ERC-20合约为例:
// using hardhat-ethers API to deploy an ERC20 contract

// get signer
const alith = await ethers.getSigner(1);
// deploy contract
const Token = await ehters.getContractFactory('Token', alith);
const token = await Token.deploy('MoonToken', 'MTK', 100);
await token.deployed();

// using raw ethers.js API to deploy the same ERC20 contract

// get provider and signer
const provider = new ethers.providers.JsonRpcProvider('http://localhost:9933');
const alith = new ethers.Wallet(privateKeyAlith, provider);
// deploy contract
const Token = new ethers.ContractFactory(interface, bytecode, alith);
const token = await Token.deploy('MoonToken', 'MTK', 100);
await token.deployed();

通过上面的代码示例可以很直观的发现,使用hardhat-ethers提供的API在部署合约时会更方便一些


Web3.js与Ethers.js都属于以太坊标准JavaScript API库,二者各有特点,同样被广大的Web3开发者接受

Web3.js属于比较老牌的API库,功能比较强大,但是使用过程中需要注意各种回调函数;而Ethers.js属于新兴起的API库,其最大的特点在于其接口调用简单方便,对于不是很熟悉JS的开发者来说比较友好。文章来源地址https://www.toymoban.com/news/detail-819393.html

到了这里,关于以太坊标准JS API库——浅谈Web3.js与Ethers.js的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web3.js在以太坊上部署和调用智能合约

    介绍如何使用Web3.js在以太坊上部署和调用智能合约;Web3.js是以太坊JavaScript API的实现,它可以与以太坊区块链进行交互 智能合约编写 使用Solidity编写一个简单的智能合约,然后使用Web3.js将其部署到以太坊区块链,通过JavaScript调用该智能合约 这个智能合约非常简单。它有两

    2024年02月16日
    浏览(46)
  • 以太坊Dapp通过web3js部署调用智能合约

    参考视频:https://www.bilibili.com/video/BV14z4y1Z7Jd?p=1 https://remix.ethereum.org/ 创建一个新的文件夹 mkdir MyDapp2 启动 ganache-cli 下载web3 npm install web3 ,注:ganache的启动和deploy.js要在同一个目录。 先进行测试 node deploy.js 部署合约 web3的版本:1.7.1 复制 WEB3DEPLOY 的内容到deploy.js == ganache需要

    2023年04月23日
    浏览(46)
  • 【Web3】Web3Js高频Api

    目录 Web3Js方法 初始化Web3实例 Web3Api 创建账号Api 获取余额Api 单位转换工具函数 Web3Js方法 web3.eth:用于与以太坊区块链和智能合约之间的交互。 web3.utils:包含一些辅助方法。 web3.shh:用于协议进行通信的P2P和广播。 web3.bzz:用于与群网络交互的Bzz模块。 初始化Web3实例 npm

    2024年02月13日
    浏览(40)
  • 【Web3】 Web3JS Pay Api

    Web3Network.eth.sendSignedTransaction(serializedTx) 参数: from - String|Number :发送帐户的地址。如果未指定,则使用web3.eth.defaultAccount属性。或web3.eth.accounts.wallet中本地的地址。 to - String :(可选)消息的目标地址,若未定义则为发送消息。 value - Number|String|BN|BigNumber :(可选)为wei中的交易

    2024年02月16日
    浏览(36)
  • 关于web3.js中与交易发送、交易签名、智能合约函数调用相关api的理解

    web3.js中有一些与交易发送、签名、合约函数调用相关的api,初学者(如me)常常搞不清什么情况下应该调用哪个,以及它们之间的区别。现将个人浅见记录如下,备忘。 sendTransaction web3.eth.sendTransaction(transactionObject [, callback]) transactionObject对象设置交易的各种参数(不包括签名r,

    2023年04月09日
    浏览(126)
  • web3.js 基础

    web3.js是一个库集合,允许您使用HTTP、IPC或WebSocket与本地或远程以太坊节点交互。 github readthedocs npm npm install web3 yarn yarn add web3 In the Browser 使用预构建的dist/web3.min.js,或者使用web3.js库进行构建: 然后在你的html文件中包含dist/web3.min.js。这将在window 对象上公开 Web3 。 jsDelivr CD

    2024年02月09日
    浏览(30)
  • web3.js获取导入

    我们访问 https://github.com/ 我们搜索 web3.js 然后我们直接点击第一个进去 进入之后 往下拉 你会看到 它支持node项目的两种引入方式 这里 大家可以直接下载我的资源 https://download.csdn.net/download/weixin_45966674/87878737 下载好解压出来就会有一个 web3.min.js 我们将下载下来的js文件放在

    2024年02月08日
    浏览(29)
  • ethers js基础操作

    查看一个地址的余额 创建provider调用其getBalance方法 web2通过http获取内容 web3通过jsonrpc获取内容 存储在变量provider中 读取智能合约 创建智能合约 参数分别是地址 abi provider const contract = new ethers.Contract(address, ERC20_ABI, provider); 从一个钱包转到另一个钱包 将私钥和provider传入ethe

    2024年02月11日
    浏览(41)
  • web3.js 查看钱包金额

    ajax与web服务器交互,传递数据; 等同于 web3.js 向以太坊网络某一节点交互; 见下图来自link. 所以接下来的问题是: JSON RPC(JSON远程调用)作为程序和EVM client的web3 interface,是如何作用的?? 类似jQuery ajax库来读写web服务器上的数据??这又是什么? 注册infura,创建新proj

    2024年02月16日
    浏览(40)
  • web3.js简介与入门

    区块链,当前无论是在国内还是国外都是一个比较时髦的概念,在国内由于政策及市场成熟度的原因,技术氛围还没有那么浓厚。可是在国外,区块链的学习及使用正在如火如荼进行着。 想让自己与国际接轨,或者想了解一下区块链吗,如果你是前端开发人员或者熟悉Javas

    2024年01月17日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包