安装:npm install [email protected] ethers
--ethers は web3 よりも使用が比較的簡単で、主に 3 つの大きなオブジェクトを操作します。
1. プロバイダー (プロバイダー) は、イーサリアム ネットワークに接続するために使用される抽象クラスで、ブロックチェーン ネットワークにアクセスし、チェーン上の状態を取得するための読み取り専用フォームを提供します。
2. 署名者 (署名者) は通常、何らかの方法で秘密鍵に直接または間接的にアクセスでき、メッセージに署名し、許可されたネットワーク内のアカウント内のイーサを管理してトランザクションを実行できます。
3. コントラクト (contract) は、実際の特定のコントラクトを表すためにイーサリアム ネットワーク上で実行される抽象概念であり、アプリケーションはそれを JavaScript オブジェクトのように使用できます。
1. プロバイダーを作成する
import { ethers } from "ethers";
let provider = new ethers.providers.Web3Provider(window.ethereum)
1.1 ユーザーのブラウザにメタマスクウォレットがインストールされているかどうかを確認する
const isWallet = () => {
if (window.ethereum) {
console.log('安装了钱包')
} else {
console.log('未安装钱包')
}
}
isWallet()
1.2 ユーザーを監視して、現在接続されているウォレットアカウントを切り替える
// 监听账户切换事件
window.ethereum.on("accountsChanged", function (accounts) {
if (accounts.length > 0) {
// 执行账户切换后的逻辑
console.log('当前链接的账户地址是:'+accounts[0])
//accounts里的是钱包链接的所有账户地址
} else {
// 处理没有连接账户的情况
console.log('没有账户链接')
}
})
1.3 トランザクションハッシュに基づいてトランザクション情報を取得する
// 获取交易收据
const receipt = await provider.getTransactionReceipt(txHash);
// 获取交易信息
const tranction = await provider.getTransaction(txHash)
2. 署名者を作成します。その前に、必ずユーザーのウォレットをリンクし、アドレスを取得してください。
//参数有两个,第一个固定字符串,第二个数组,该方法会启动metask插件,并链接账户,返回结果是账户地址
const go = async () => {
//地址,account是钱包里所有的账户地址
let account = await provider.send("eth_requestAccounts", []);
console,log(account)
//signer
let signer = provider.getSigner(account[0]);
console,log(signer)
};
go();
2.1 残高を取得する
let balance = await signer.getBalance()
console.log(balance)
2.2 フォーマットバランス
//格式化后以eth为单位
let balance = ethers.utils.formatEther(balance)
console.log(balance)
3. コントラクトの作成(スマートコントラクト)
// 有三个参数
const proxyContract = new ethers.Contract(
address,//合约地址
abi,//合约abi
signer
);
// 下面解释三个参数的含义
-- 3 つのパラメータがあります。1 つ目はコントラクト アドレス、2 つ目はコントラクト abi、3 つ目は署名者です。コントラクト abi は、コードが Solidity 言語で書かれた後にコンパイルされた json ファイルです。ファイルは最初の 2 つのパラメーターとして使用する必要があります。json ファイル構造は次のようになります。
-- 数万行の json ファイルの場合、最初のパラメータとして必要なのは abi とバイトコード生成アドレスだけであり、他のものは気にしません~
import { ContractFactory } from "ethers";//用于生成地址
import abi from "./UsufructNFT.json"; //引入json文件
// 参数有三个,1.abi 2. bytecode 3. signer;如果有合约文件的话都可以获取到
let factory = new ContractFactory(abi.abi, abi.bytecode, signer);
let factoryRes = await factory.deploy();
console.log("合约地址: " + factoryRes.address);
-- すべてのパラメータを取得したら、コントラクトを作成し、コントラクトのプロパティとメソッドを呼び出すことができます。
const proxyContract = new ethers.Contract(
factoryRes.address,//合约地址
abi.abi,//合约abi
signer
);
console.log(proxyContract)
--proxyContract はインスタンス化されたコントラクトです。proxyContract を使用できます。コントラクトのメソッドをクリックします。
4. ブロック変更イベントを監視し、トランザクションをキャプチャし、契約をリリースし、その他のアクションを実行します。
//监听区块变化触发
provider.on("block", async (blockNumber) => {
console.log('当前变化的区块号码是:'+blockNumber);
// 根据区块号获取交易信息获取
const block = await provider.getBlock(blockNumber);
// 获取区块中的交易列表
const transactions = block.transactions;
// 获取每笔交易的详细信息
const transactionPromises = transactions.map((txHash) =>
provider.getTransaction(txHash)
);
const transactionDetails = await Promise.all(transactionPromises);
// 打印交易信息
transactionDetails.forEach((tx) => {
console.log(tx);
console.log("Transaction Hash:", tx.hash);
console.log("From:", tx.from);
console.log("To:", tx.to);
console.log("Value:", ethers.utils.formatEther(tx.value));
console.log("--------------------------");
});
});
ethers公式サイト:https://learnblockchain.cn/ethers_v5/