?
?蘇澤
大家好 這里是蘇澤 一個鐘愛區塊鏈技術的后端開發者
本篇專欄?←持續記錄本人自學智能合約學習筆記和經驗總結 如果喜歡拜托三連支持~
目錄
簡介
前景科普-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
函數,并捕獲任何可能發生的錯誤。
一些方法的詳細解釋:
-
Provider:Provider是ethers.js中的一個核心概念,它負責與以太坊節點通信。Provider可以是WebSocket連接、HTTP連接,或者是任何實現了所需API的自定義實現。
-
getSigner():這個方法從Provider對象中獲取一個
Signer
實例。Signer
實例代表了一個擁有私鑰的以太坊賬戶,它能夠簽署交易和消息,從而允許你代表該賬戶發送交易。 -
contractAddress:這是智能合約在以太坊網絡上的地址。
-
abi:ABI代表應用二進制接口(Application Binary Interface),它是智能合約的接口描述,定義了合約的方法和事件。
-
new ethers.Contract():這是創建一個表示智能合約的實例的方法。你需要提供合約地址、ABI和
Signer
對象,這樣你就可以調用合約的方法并與之交互。