【Web3項目案例】Ethers.js極簡入門+實戰案例:實現ERC20協議代幣查詢、交易

?

?蘇澤

大家好 這里是蘇澤 一個鐘愛區塊鏈技術的后端開發者

本篇專欄?←持續記錄本人自學智能合約學習筆記和經驗總結 如果喜歡拜托三連支持~


目錄

簡介

前景科普-ERC20

??Ethers極簡入門教程:HelloVitalik(非小白可跳)

教程概覽

開發工具

VScode(推薦)

HelloVitalik程序

導入ethers庫

連接以太坊網絡

編寫異步函數

獲取Vitalik的ETH余額

輸出結果

Async/Await

為什么以太坊交互需要異步編程?

以太坊開發入門:使用Ethers.js與ERC20代幣交互

環境準備

設置環境變量

步驟1:引入依賴并配置環境變量

步驟2:設置以太坊提供者和錢包

步驟3:加載ERC20合約

步驟4:查詢代幣余額

步驟5:轉賬代幣

步驟6:執行主函數并處理錯誤

一些方法的詳細解釋:


簡介

在以太坊生態系統中,ERC20 代幣是最常見的一種代幣標準。ERC20 代幣基于智能合約構建,可以在以太坊網絡上進行轉賬和查詢余額。

在本文中,我們將使用 ethers.js 庫實現與 ERC20 合約進行交互的功能,包括轉賬代幣和查詢余額等操作。

前景科普-ERC20

ERC20代幣是符合以太坊請求評論20(Ethereum Request for Comments 20,簡稱ERC20)標準的代幣。ERC20是一種協議標準,定義了代幣在以太坊區塊鏈上必須實現的一系列規則和功能,以確保不同代幣之間的兼容性和互操作性

??Ethers極簡入門教程:HelloVitalik(非小白可跳)

教程概覽

  • 工具與環境:我們將使用VScode作為開發工具,并通過npm安裝ethers庫。
  • 在線編輯器:介紹使用playcode在線編譯JavaScript代碼。
  • 程序示例:編寫HelloVitalik程序,查詢Vitalik的ETH余額。

開發工具

VScode(推薦)

使用本地VScode進行開發,安裝Node.js后,通過npm安裝ethers庫:

npm install ethers --save

HelloVitalik程序

導入ethers

import { ethers } from "ethers";

連接以太坊網絡

使用Provider類連接以太坊網絡:

const provider = ethers.getDefaultProvider();

編寫異步函數

使用async/await語法編寫異步函數,與區塊鏈進行交互:

const main = async () => {// ...
};
main();

獲取Vitalik的ETH余額

利用Provider類的getBalance()函數查詢Vitalik的ETH余額:

const balance = await provider.getBalance("vitalik.eth");

輸出結果

將獲取到的余額從wei轉換為ETH,并在控制臺輸出:

console.log(`ETH Balance of vitalik: ${ethers.formatEther(balance)} ETH`);

不難發現 我們的代碼中用到Async和Await,這是為什么呢?

Async/Await

除了Promises和回調函數,ethers.js還支持使用async/await關鍵字來處理異步性。

async/await是ES7引入的語法糖,它可以讓我們像編寫同步代碼一樣編寫異步代碼。使用async關鍵字修飾一個函數,就可以在函數體內使用await關鍵字來等待一個異步操作完成。await關鍵字可以在Promise對象或返回Promise對象的函數前使用,它會暫停函數的執行,直到Promise對象狀態變為resolved并返回結果。

為什么以太坊交互需要異步編程?

以太坊是一個分布式網絡,涉及到網絡通信和共識機制等復雜因素。在與以太坊進行交互時,我們需要等待交易被確認、智能合約的執行結果等。這些操作都需要耗費時間,并且可能會受到網絡延遲等因素的影響。如果使用同步編程模型,主線程會被阻塞,無法處理其他任務,從而造成用戶體驗的下降。

異步編程模型通過將長時間運行的任務委托給后臺處理,讓主線程能夠繼續執行其他任務,提高了程序的響應能力和效率。ethers.js利用了Promises和回調函數等機制來處理以太坊交互的異步性。

以太坊開發實踐:使用Ethers.js與ERC20代幣交互

環境準備

首先,確保你已經安裝了Node.js環境,并準備好了以下依賴:

  • ethers:以太坊JavaScript庫,用于與以太坊網絡交互。
  • dotenv:用于加載環境變量的庫。
  • chalk:用于在控制臺輸出中添加顏色。

安裝依賴:

npm install ethers dotenv chalk

設置環境變量

在與以太坊網絡進行交互時,我們需要使用一些環境變量來連接到以太坊節點。為了安全起見,我們將這些敏感信息保存在?.env?文件中,并通過?dotenv?庫加載到環境變量中。

在項目目錄中創建一個新的文件?.env,并填入以下內容:

INFURA_API_KEY=<YOUR_INFURA_API_KEY>
PRIVATE_KEY=<YOUR_PRIVATE_KEY>
TOKEN_ADDRESS=<TOKEN_ADDRESS>

步驟1:引入依賴并配置環境變量

const { ethers } = require("ethers");
const dotenv = require("dotenv");
const chalk = require("chalk");dotenv.config();

這里我們引入了所需的模塊,并使用dotenv庫加載了存儲在.env文件中的環境變量。

步驟2:設置以太坊提供者和錢包

const main = async () => {const provider = new ethers.providers.InfuraProvider("mainnet",process.env.INFURA_API_KEY);const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);console.log(chalk.bold("Connected to Ethereum network!!!"));

我們使用Infura作為我們的以太坊節點提供者,并使用環境變量中的私鑰創建了一個錢包實例。

步驟3:加載ERC20合約

const tokenAddress = process.env.TOKEN_ADDRESS;
const tokenAbi = []; // 這里應該是ERC20代幣的ABI數組const tokenContract = new ethers.Contract(tokenAddress, tokenAbi, wallet);
console.log(chalk.bold(`Loaded ERC20 contract at address ${tokenContract.address}`));

創建一個合約實例,用于與特定的ERC20代幣合約交互。

步驟4:查詢代幣余額

const getAddressBalance = async (address) => {const balance = await tokenContract.balanceOf(address);const decimals = await tokenContract.decimals();return balance.div(ethers.BigNumber.from(10).pow(decimals)).toString();
};const address = "<ADDRESS_TO_QUERY>"; // 要查詢余額的以太坊地址
const balance = await getAddressBalance(address);
console.log(chalk.green.bold(`Current token balance: ${balance}`));

定義一個異步函數getAddressBalance來查詢指定地址的代幣余額,并將其轉換為人類可讀的格式。

步驟5:轉賬代幣

const transferToken = async (toAddress, amount) => {const tx = await tokenContract.transfer(toAddress, amount);console.log(chalk.green.bold(`Transfer of ${amount} tokens to ${toAddress} successful! Transaction hash: ${tx.hash}`));
};const toAddress = "<ADDRESS_TO_TRANSFER>"; // 要轉賬代幣的以太坊地址
const amount = ethers.utils.parseUnits("<AMOUNT>", "<DECIMALS>"); // 要轉賬的代幣數量
await transferToken(toAddress, amount);

定義一個異步函數transferToken來執行代幣轉賬,并輸出交易成功的信息。

步驟6:執行主函數并處理錯誤

main().catch((error) => console.error(chalk.foregroundColorNames.bold("Error: "), error));

執行main函數,并捕獲任何可能發生的錯誤。

一些方法的詳細解釋:

  1. Provider:Provider是ethers.js中的一個核心概念,它負責與以太坊節點通信。Provider可以是WebSocket連接、HTTP連接,或者是任何實現了所需API的自定義實現。

  2. getSigner():這個方法從Provider對象中獲取一個Signer實例。Signer實例代表了一個擁有私鑰的以太坊賬戶,它能夠簽署交易和消息,從而允許你代表該賬戶發送交易。

  3. contractAddress:這是智能合約在以太坊網絡上的地址。

  4. abi:ABI代表應用二進制接口(Application Binary Interface),它是智能合約的接口描述,定義了合約的方法和事件。

  5. new ethers.Contract():這是創建一個表示智能合約的實例的方法。你需要提供合約地址、ABI和Signer對象,這樣你就可以調用合約的方法并與之交互。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37203.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

魔行觀察-烤匠麻辣烤魚-開關店監測-時間段:2011年1月 至 2024年6月

今日監測對象&#xff1a;烤匠麻辣烤魚&#xff0c;監測時間段&#xff1a;2011年1月 至 2024年6月 本文用到數據源獲取地址 魔行觀察http://www.wmomo.com/ 品牌介紹&#xff1a; 2013年&#xff0c;第一家烤匠在成都藍色加勒比廣場開業&#xff0c;隨后幾年成都國金中心店…

超詳細的tomcat安裝以及簡略項目的部署

一、安裝包 安裝路徑&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1JzPQQ2zUdnXi_FaTTG0pvg?pwdriht 提取碼&#xff1a;riht 安裝完之后我們打開&#xff0c;可看見以下目錄結構 二、環境變量配置 首先打開我們電腦的高級環境變量配置 我們先配置一個系統變量…

Variables Reference for vscode

Predefined variables Visual Studio Code 支持在調試、任務配置文件以及一些特定的設置中使用變量替換。這些變量可以使用 ${variableName} 語法在 launch.json 和 tasks.json 文件的某些鍵和值字符串中使用。 Predefined variables Visual Studio Code 支持以下預定義變量…

Zookeeper:Zookeeper JavaAPI操作與分布式鎖

文章目錄 一、Zookeeper JavaAPI操作1、Curator介紹2、創建、查詢、修改、刪除節點3、Watch事件監聽 二、Zookeeper分布式鎖原理 一、Zookeeper JavaAPI操作 1、Curator介紹 Curator是Apache Zookeeper的Java客戶端。常見的Zookeeper Java API&#xff1a; 原生Java API。ZkC…

天氣網站爬蟲及可視化

摘要&#xff1a;隨著互聯網的快速發展&#xff0c;人們對天氣信息的需求也越來越高。本論文基于Python語言&#xff0c;設計并實現了一個天氣網站爬蟲及可視化系統。該系統通過網絡爬蟲技術從多個天氣網站上獲取實時的天氣數據&#xff0c;并將數據進行清洗和存儲。同時&#…

數據倉庫面試題(二)

1. 簡述星型模型和雪花模型的區別&#xff1f;應用場景 &#xff1f; 星型模型&#xff08;Star Schema&#xff09;和雪花模型&#xff08;Snowflake Schema&#xff09;是數據倉庫中常用的兩種維度建模方法&#xff0c;它們在數據組織和設計上有所不同。 星型模型&#xff…

【簡易版tinySTL】 哈希表與移動語義

基本概念 哈希表&#xff08;HashTable&#xff09;是一個重要的底層數據結構, 無序關聯容器包括unordered_set, unordered_map內部都是基于哈希表實現。 哈希表是一種通過哈希函數將鍵映射到索引的數據結構&#xff0c;存儲在內存空間中。哈希函數負責將任意大小的輸入映射到…

【C++】內存分區

目錄 內存分區代碼運行前后區別各分區詳細解釋C內存申請和釋放 內存分區 不同的操作系統對程序內存的管理和劃分會有所不同。 此處是C內存區域劃分主要是針對通用的情況&#xff0c;并不限定在某個特定操作系統上 一般分為4個區&#xff08;有時把全局區拆分成數據區未初始化…

git 命令學習之branch 和 tag 操作

引言 在項目一個迭代過程結束之時&#xff0c;或是一個版本發布之后&#xff0c;我們要進行 新版本的開發&#xff0c;這時就需要對原來的項目代碼進行封存&#xff0c;以及新項目代碼的開始&#xff0c;這時就需要用到 branch 和 tag 操作。下面簡單說說對這兩個操作的理解。…

微服務之服務保護策略【持續更新】

文章目錄 線程隔離一、滑動窗口算法二、漏桶算法三、令牌桶算法 面試題1、Sentinel 限流和Gateway限流的區別 線程隔離 兩種實現方式 線程池隔離&#xff08;Hystix隔離&#xff09;&#xff0c;每個被隔離的業務都要創建一個獨立的線程池&#xff0c;線程過多會帶來額外的CPU…

【C語言】C語言-體育彩票的模擬生成和兌獎(源碼+論文)【獨一無二】

&#x1f449;博__主&#x1f448;&#xff1a;米碼收割機 &#x1f449;技__能&#x1f448;&#xff1a;C/Python語言 &#x1f449;公眾號&#x1f448;&#xff1a;測試開發自動化【獲取源碼商業合作】 &#x1f449;榮__譽&#x1f448;&#xff1a;阿里云博客專家博主、5…

【涵子來信科技潮流】——WWDC24回顧與暑假更新說明

期末大關&#xff0c;即將來襲。在期末之前&#xff0c;我想發一篇文章&#xff0c;介紹有關WWDC24的內容和暑假中更新的說明。本篇文章僅為個人看法和分享&#xff0c;如需了解更多詳細內容&#xff0c;請通過官方渠道或者巨佬文章進行進一步了解。 OK, Lets go. 一、WWDC24 …

Linux grep技巧 刪除含有指定關鍵詞的行,創建新文件

一. 需求 ?有如下文件&#xff0c;現要求 刪除含有xuecheng關鍵字的行刪除含有192.168.1.1關鍵字的行也就是說&#xff0c;最終只會留下127.0.0.1 license.sublimehq.com 127.0.0.1 www.xuecheng.com 127.0.0.1 img.xuecheng.com 192.168.1.1 www.test.com 127.0.0.1 video…

力扣每日一題 6/30 記憶化搜索/動態規劃

博客主頁&#xff1a;誓則盟約系列專欄&#xff1a;IT競賽 專欄關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? 494.目標和【中等】 題目&#xff1a; 給你一個非負整數數組 nums 和一個…

VMware17.0 安裝過程

VMware17.0 VMware 17.0 是一款功能強大的虛擬機軟件&#xff0c;用于在計算機上創建和管理虛擬機。它能夠同時運行多個操作系統&#xff0c;如 Windows、Linux 等&#xff0c;并且在這些虛擬機之間提供無縫的切換和共享功能。 VMware 17.0 支持最新的硬件和操作系統&#xf…

Chrome瀏覽器web調試(js調試、css調試、篡改前置)

目錄 1. 打開開發者工具(Dev Tool) 2. 打開命令菜單 截圖 3. 面板介紹 4. CSS調試 右鍵檢查快速到達元素處 查找DOM數 利用面板Console查找DOM節點 內置函數查找上一個選擇點擊的元素 5. 調試JS代碼(Javascript調試) 日志調試 選擇查看日志等級 眼睛觀測變量 …

【Leetcode 67 Easy】二進制求和

目錄 題目描述&#xff1a; 整體思路&#xff1a; 具體代碼&#xff1a; 題目描述&#xff1a; 原題地址 給你兩個二進制字符串 a 和 b &#xff0c;以二進制字符串的形式返回它們的和。 示例 1&#xff1a; 輸入:a "11", b "1" 輸出&#xff1a;&qu…

ubuntu 18 虛擬機安裝(4)安裝 postgres sql 數據庫

ubuntu 18 虛擬機安裝&#xff08;4&#xff09;安裝 postgres sql 數據庫 如何查看PostgreSQL的版本 https://blog.csdn.net/lee_vincent1/article/details/138731465 postgres 查看全部數據庫 https://blog.csdn.net/xie__jin__cheng/article/details/138653002 Ubuntu18.04…

數據資產鑄就市場競爭優勢:運用先進的數據分析技術,精準把握市場脈搏,構建獨特的競爭優勢,助力企業實現市場領先地位,贏得持續成功

目錄 一、引言 二、數據資產的重要性 三、先進數據分析技術的應用 1、大數據分析技術 2、人工智能與機器學習 3、數據可視化技術 四、精準把握市場脈搏 1、深入了解客戶需求 2、預測市場趨勢 3、優化資源配置 五、構建獨特的競爭優勢 1、定制化產品和服務 2、精準營…

數據結構—判斷題

1.數據的邏輯結構說明數據元素之間的順序關系&#xff0c;它依賴于計算機的存儲結構。 答案&#xff1a;錯誤 2.(neuDS)在順序表中邏輯上相鄰的元素&#xff0c;其對應的物理位置也是相鄰的。 答案&#xff1a;正確 3.若一個棧的輸入序列為{1, 2, 3, 4, 5}&#xff0c;則不…