我想使用 web3.js 或 ethers.js 与 Hedera 测试网进行交互。我怎样才能做到这一点? 的 我之前使用
hedera-sdk-js
与 Hedera Testnet 进行过交互,
例如使用以下代码:
import {
AccountBalanceQuery,
Client
} from "@hashgraph/sdk";
const client = new Client({
network: "testnet"
});
const accountId = '0.0.3996280';
const balance = await new AccountBalanceQuery()
.setAccountId(accountId)
.execute(client);
console.log(
`Balance of ${accountId} in Tinybars:`,
balance.hbars.toTinybars().toString(10)
);
我怎样才能在 web3.js/ethers.js 中执行与上述等效的操作?
首先,获取一个 RPC 端点 URL, 如何通过 RPC 连接到 Hedera 测试网? 中对此进行了详细说明。 的 获得该值后,用该值替换下面代码示例中的
${RPC_URL}
。
安装 web3.js:
npm install web3
然后使用下面的脚本建立连接 使用
Web3.providers.HttpProvider
到 RPC 端点,
并用它查询eth_blockNumber
:
import Web3 from 'web3';
const web3Provider = new Web3(new Web3.providers.HttpProvider('${RPC_URL}'), {
headers: [{
name: 'Access-Control-Allow-Origin', value: '*'
}],
keepalive: true,
withCredentials: false,
});
async function main() {
web3Provider.eth.getBlockNumber()
.then((blockNumber) => {
console.log('block number', blockNumber);
})
.catch(console.error);
web3Provider.eth.getBalance(
'0x00000000000000000000000000000000003cfa78')
.then((balance) => {
console.log('balance', balance);
})
.catch(console.error);
}
main();
安装 ethers.js:
npm install ethers@v5
然后使用下面的脚本建立连接 使用
ethers.providers.JsonRpcProvider
到 RPC 端点,
并用它查询eth_blockNumber
:
import { ethers } from 'ethers';
const web3Provider = new ethers.providers.JsonRpcProvider({
url: '${RPC_URL}',
headers: {
'Access-Control-Allow-Origin': '*',
},
});
async function main() {
web3Provider.getBlockNumber()
.then((blockNumber) => {
console.log('block number', blockNumber);
})
.catch(console.error);
web3Provider.getBalance(
'0x00000000000000000000000000000000003cfa78')
.then((balance) => {
console.log('balance', balance.toBigInt());
})
.catch(console.error);
}
main();
@bguiz 回答应该可以。还有这个教程展示了如何使用 ethers.js 以及像 MetaMask 这样的钱包来做到这一点。
https://youtu.be/mhqQToUEMBs?t=274
这是视频中代码的链接,您可以重复使用该功能使用以太币连接 Hedera 网络(测试网/主网/预览网)。 https://github.com/ed-marquez/hedera-example-metamask-counter-dapp/blob/master/src/components/hedera/walletConnect.js
代码也如下所示
您首先创建一个新的以太供应商
然后定义要连接的网络
chainId
(testnet/mainnet/previewnet)。如果您使用的是像 MetaMask 这样的钱包,您可以选择以编程方式切换到 Hedera 网络,然后您可以指定 JSON-RPC 和网络浏览器 URLs
获取选择的账号
import { ethers } from "ethers";
const network = "testnet";
async function walletConnectFcn() {
console.log(`\n=======================================`);
// ETHERS PROVIDER
const provider = new ethers.providers.Web3Provider(window.ethereum, "any");
// SWITCH TO HEDERA TEST NETWORK
console.log(`- Switching network to the Hedera ${network}...🟠`);
let chainId;
if (network === "testnet") {
chainId = "0x128";
} else if (network === "previewnet") {
chainId = "0x129";
} else {
chainId = "0x127";
}
await window.ethereum.request({
method: "wallet_addEthereumChain",
params: [
{
chainName: `Hedera ${network}`,
chainId: chainId,
nativeCurrency: { name: "HBAR", symbol: "ℏℏ", decimals: 18 },
rpcUrls: [`https://${network}.hashio.io/api`],
blockExplorerUrls: [`https://hashscan.io/${network}/`],
},
],
});
console.log("- Switched ✅");
// CONNECT TO ACCOUNT
console.log("- Connecting wallet...🟠");
let selectedAccount;
await provider
.send("eth_requestAccounts", [])
.then((accounts) => {
selectedAccount = accounts[0];
console.log(`- Selected account: ${selectedAccount} ✅`);
})
.catch((connectError) => {
console.log(`- ${connectError.message.toString()}`);
return;
});
return [selectedAccount, provider, network];
}
导出默认钱包ConnectFcn;