0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Tìm hiểu về Ethers.js

Đăng vào 1 tháng trước

• 5 phút đọc

Ethers.js là một thư viện JavaScript nhẹ cho phép tương tác với blockchain Ethereum. Thư viện này cung cấp:

  • Một cách kết nối thống nhất tới các nút Ethereum.
  • Công cụ để tạo và quản lý ví.
  • API đơn giản để gọi các hợp đồng thông minh.
  • Các tiện ích tích hợp để xử lý các định dạng dữ liệu đặc thù của blockchain (ví dụ: BigNumber, chuỗi hex, băm).

So với các lựa chọn khác như web3.js, Ethers.js được thiết kế để:

  • Nhỏ hơn (có thể loại bỏ mã không sử dụng, mô-đun).
  • An toàn hơn (tính bất biến, kiểu dữ liệu nghiêm ngặt).
  • Thân thiện với nhà phát triển (bề mặt API sạch).

2. Cài Đặt

Để cài đặt Ethers.js, bạn có thể sử dụng npm (hoặc yarn/pnpm):

Copy
npm install ethers

import { ethers } from "ethers";

const { ethers } = require("ethers");

async function main() {
  const provider = ethers.getDefaultProvider();
  const blockNumber = await provider.getBlockNumber();
  console.log("Khối mới nhất:", blockNumber);
}

main();

2.1 Nhà Cung Cấp – Kết Nối với Ethereum

Nhà Cung Cấp là kết nối của bạn tới mạng Ethereum. Có thể hiểu nó như một "API chỉ đọc".

2.1.1 Nhà Cung Cấp JSON-RPC

Copy
const provider = new ethers.JsonRpcProvider("http://localhost:8545");

2.1.2 Infura

Copy
const provider = new ethers.InfuraProvider("mainnet", process.env.INFURA_API_KEY);

2.1.3 Alchemy

Copy
const provider = new ethers.AlchemyProvider("sepolia", process.env.ALCHEMY_API_KEY);

2.1.4 Etherscan (chỉ đọc)

Copy
const provider = new ethers.EtherscanProvider("mainnet", process.env.ETHERSCAN_API_KEY);

2.1.5 Nhà Cung Cấp Trình Duyệt (MetaMask)

Copy
const provider = new ethers.BrowserProvider(window.ethereum);
await provider.send("eth_requestAccounts", []);

Tóm lược:

Nhà cung cấp = kết nối blockchain.

Sử dụng RPC cho môi trường phát triển, Infura/Alchemy cho sản phẩm, MetaMask cho trình duyệt.

2.2 Ví – Quản Lý Khóa

Ví đại diện cho một tài khoản Ethereum (khóa riêng + địa chỉ).

2.2.1 Tạo Ví Ngẫu Nhiên

Copy
const wallet = ethers.Wallet.createRandom();
console.log("Địa chỉ:", wallet.address);
console.log("Cụm từ khôi phục:", wallet.mnemonic.phrase);

2.2.2 Nhập Từ Khóa Riêng

Copy
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY);

2.2.3 Nhập Từ Cụm Từ Khôi Phục

Copy
const wallet = ethers.Wallet.fromPhrase("test test test ...");

2.2.4 Kết Nối Ví với Nhà Cung Cấp

Copy
const provider = new ethers.JsonRpcProvider("https://rpc.sepolia.org");
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);

2.2.5 Ký Tin Nhắn

Copy
const signature = await wallet.signMessage("Xin chào Ethereum");
console.log("Chữ ký:", signature);

2.2.6 Gửi Giao Dịch

Copy
const tx = await wallet.sendTransaction({
  to: "0xabc123...def",
  value: ethers.parseEther("0.01")
});
console.log("Mã giao dịch:", tx.hash);

⚡ Tóm lược:

Ví = danh tính + người ký.

Luôn kết nối ví → nhà cung cấp trước khi gửi giao dịch.

3. Hợp Đồng – Tương Tác với Hợp Đồng Thông Minh

Đối tượng Hợp Đồng cho phép bạn gọi các hàm đã được định nghĩa trong hợp đồng thông minh.

3.1 Định Nghĩa Hợp Đồng

Copy
const abi = [
  "function balanceOf(address) view returns (uint)",
  "function transfer(address, uint) returns (bool)"
];
const tokenAddress = "0xYourTokenAddress";
const contract = new ethers.Contract(tokenAddress, abi, provider);

3.2 Đọc Dữ Liệu

Copy
const balance = await contract.balanceOf("0xabc123...");
console.log("Số dư:", ethers.formatUnits(balance, 18));

3.3 Ghi Dữ Liệu (với Người Ký)

Copy
const signer = new ethers.Wallet(process.env.PRIVATE_KEY, provider);
const contractWithSigner = contract.connect(signer);

const tx = await contractWithSigner.transfer("0xdef456...", ethers.parseUnits("1", 18));
await tx.wait();
console.log("Chuyển khoản được xác nhận:", tx.hash);

3.4 Lắng Nghe Sự Kiện

Copy
contract.on("Transfer", (from, to, value) => {
  console.log(`Chuyển khoản: ${value} token từ ${from} đến ${to}`);
});

⚡ Tóm lược:

Hợp đồng = giao diện + ABI + địa chỉ.

Sử dụng nhà cung cấp cho các cuộc gọi đọc, người ký ví cho các giao dịch.

4. Tiện Ích – Những Trợ Giúp Hàng Ngày

4.1 Chuyển Đổi Đơn Vị

Copy
const value = ethers.parseEther("1.0");
console.log(value.toString());
console.log(ethers.formatEther(value));

4.2 Toán Học BigNumber

Copy
const a = ethers.parseUnits("1000", 18);
const b = ethers.parseUnits("250", 18);
console.log(a.add(b).toString());

4.3 Băm

Copy
const hash = ethers.keccak256(ethers.toUtf8Bytes("hello"));
console.log("Băm:", hash);

4.4 Trợ Giúp Địa Chỉ

Copy
console.log(ethers.isAddress("0xabc123...")); 
console.log(ethers.getAddress("0xabc123..."));

⚡ Tóm lược: Tiện ích xử lý các đơn vị ETH, số lớn, băm, địa chỉ.

5. Chủ Đề Nâng Cao

5.1 Ước Lượng Gas & Ghi Đè

Copy
const gas = await contract.estimateGas.transfer("0xdef...", ethers.parseUnits("1", 18));
const tx = await contractWithSigner.transfer("0xdef...", ethers.parseUnits("1", 18), {
  gasLimit: gas * 2n
});

5.2 Bộ Lọc Sự Kiện

Copy
const filter = contract.filters.Transfer(null, "0xdef...");
const events = await contract.queryFilter(filter, -1000, "latest");
console.log(events);

5.3 Mẹo Bảo Mật

  • Không bao giờ mã hóa các khóa riêng.
  • Sử dụng BrowserProvider cho các dApp giao diện.
  • Xác thực đầu vào của người dùng.

6. Tóm Tắt Nhanh (Bảng Tóm Tắt)

Khái Niệm Mô Tả
Nhà cung cấp kết nối (JsonRpcProvider, InfuraProvider, BrowserProvider).
quản lý khóa + ký giao dịch.
Hợp đồng tương tác với ABI.
Tiện ích chuyển đổi, băm, địa chỉ.
Nâng cao gas, bộ lọc, bảo mật.

7. Các Thực Hành Tốt Nhất

  • Sử dụng môi trường phát triển an toàn.
  • Luôn kiểm tra các giao dịch trước khi gửi.
  • Đảm bảo mã nguồn của bạn luôn được cập nhật.

8. Các Cạm Bẫy Thường Gặp

  • Không sử dụng khóa riêng cứng trong mã nguồn của bạn.
  • Không xác thực đầu vào của người dùng có thể dẫn đến tấn công.

9. Mẹo Hiệu Suất

  • Sử dụng các nhà cung cấp tối ưu để giảm độ trễ.
  • Giảm thiểu số lượng giao dịch không cần thiết để tiết kiệm gas.

10. Giải Quyết Sự Cố

  • Nếu giao dịch không thành công, kiểm tra lại các thông số đầu vào.
  • Sử dụng các công cụ theo dõi giao dịch để tìm hiểu nguyên nhân sự cố.

Câu Hỏi Thường Gặp (FAQ)

Q1: Ethers.js có tương thích với web3.js không?
A1: Có, nhưng Ethers.js cung cấp trải nghiệm dễ dàng hơn và an toàn hơn.

Q2: Tôi có thể sử dụng Ethers.js trên trình duyệt không?
A2: Có, bạn có thể sử dụng Ethers.js trong bất kỳ ứng dụng web nào với BrowserProvider.

Q3: Làm thế nào để bảo mật khóa riêng của tôi?
A3: Không bao giờ mã hóa chúng trong mã nguồn. Sử dụng các phương pháp bảo mật tốt nhất để lưu trữ.

Kết Luận

Ethers.js là một công cụ mạnh mẽ cho việc phát triển ứng dụng trên blockchain Ethereum. Với tài liệu này, bạn đã có thể bắt đầu làm việc với Ethers.js một cách dễ dàng và hiệu quả. Hãy thử nghiệm với các ví dụ và khám phá thêm những khả năng mà Ethers.js mang lại cho bạn trong việc xây dựng các ứng dụng phi tập trung. Đừng quên theo dõi cập nhật từ cộng đồng để tiếp cận những tính năng mới nhất!

Bạn đã sẵn sàng để bắt đầu hành trình phát triển với Ethers.js? Hãy chia sẻ kinh nghiệm của bạn trong cộng đồng!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào