Chuyển đến nội dung chính

Gửi giao dịch bằng viem

giao dịch
viem
Alchemy
Người mới bắt đầu
Elan Halpern
4 tháng 11, 2020
14 phút đọc

Đây là hướng dẫn thân thiện với người mới bắt đầu về cách gửi các giao dịch Ethereum bằng thư viện viem (mở trong tab mới). Có ba bước chính để gửi một giao dịch lên Chuỗi khối Ethereum: tạo, ký và phát sóng. Chúng ta sẽ đi qua cả ba bước này, hy vọng sẽ giải đáp được mọi thắc mắc của bạn! Trong hướng dẫn này, chúng ta sẽ sử dụng Alchemy (mở trong tab mới) để gửi các giao dịch của mình lên Chuỗi Ethereum. Bạn có thể tạo một tài khoản Alchemy miễn phí tại đây (mở trong tab mới).

LƯU Ý: Hướng dẫn này dành cho việc ký các giao dịch của bạn trên backend cho ứng dụng của bạn. Nếu bạn muốn tích hợp việc ký các giao dịch của mình trên frontend, hãy xem API nhà cung cấp MetaMask (mở trong tab mới).

Những điều cơ bản

Giống như hầu hết các nhà phát triển chuỗi khối khi mới bắt đầu, bạn có thể đã tìm hiểu về cách gửi một giao dịch (một việc đáng lẽ ra khá đơn giản) và bắt gặp vô số hướng dẫn, mỗi hướng dẫn lại nói một kiểu khác nhau khiến bạn cảm thấy hơi choáng ngợp và bối rối. Nếu bạn đang ở trong tình cảnh đó, đừng lo lắng; tất cả chúng ta đều từng như vậy! Vì vậy, trước khi bắt đầu, hãy làm rõ một vài điều:

1. Alchemy không lưu trữ các khóa riêng tư của bạn

  • Điều này có nghĩa là Alchemy không thể thay mặt bạn ký và gửi các giao dịch. Lý do cho việc này là vì mục đích bảo mật. Alchemy sẽ không bao giờ yêu cầu bạn chia sẻ khóa riêng tư của mình và bạn cũng không bao giờ nên chia sẻ khóa riêng tư của mình với một nút được lưu trữ (hoặc với bất kỳ ai khác).
  • Bạn có thể đọc từ chuỗi khối bằng cách sử dụng API cốt lõi của Alchemy, nhưng để ghi vào đó, bạn sẽ cần sử dụng một công cụ khác để ký các giao dịch của mình trước khi gửi chúng qua Alchemy (điều này cũng tương tự đối với bất kỳ dịch vụ nút nào khác).

2. "Người ký" (signer) là gì?

  • Người ký sẽ ký các giao dịch cho bạn bằng khóa riêng tư của bạn. Trong hướng dẫn này, chúng ta sẽ sử dụng viem (mở trong tab mới) để ký giao dịch của mình, nhưng bạn cũng có thể sử dụng bất kỳ thư viện Web3 nào khác.
  • Trên frontend, một ví dụ điển hình về người ký sẽ là MetaMask (mở trong tab mới), nó sẽ thay mặt bạn ký và gửi các giao dịch.

3. Tại sao tôi cần phải ký các giao dịch của mình?

  • Mọi người dùng muốn gửi một giao dịch trên mạng lưới Ethereum đều phải ký giao dịch đó (bằng khóa riêng tư của họ), nhằm xác thực rằng nguồn gốc của giao dịch đúng là từ người mà nó tuyên bố.
  • Việc bảo vệ khóa riêng tư này là cực kỳ quan trọng, vì việc có quyền truy cập vào nó sẽ cấp toàn quyền kiểm soát tài khoản Ethereum của bạn, cho phép bạn (hoặc bất kỳ ai có quyền truy cập) thực hiện các giao dịch thay mặt bạn.

4. Làm cách nào để bảo vệ khóa riêng tư của tôi?

  • Có nhiều cách để bảo vệ khóa riêng tư của bạn và sử dụng nó để gửi các giao dịch. Trong hướng dẫn này, chúng ta sẽ sử dụng một tệp .env. Tuy nhiên, bạn cũng có thể sử dụng một nhà cung cấp riêng biệt lưu trữ các khóa riêng tư, sử dụng một tệp kho khóa, hoặc các tùy chọn khác.

5. Sự khác biệt giữa eth_sendTransaction và eth_sendRawTransaction là gì?

eth_sendTransaction và eth_sendRawTransaction đều là các hàm API của Ethereum dùng để phát sóng một giao dịch lên mạng lưới Ethereum để nó được thêm vào một khối trong tương lai. Chúng khác nhau ở cách xử lý việc ký các giao dịch.

  • eth_sendTransaction được sử dụng để gửi các giao dịch chưa được ký, điều này có nghĩa là nút mà bạn đang gửi tới phải quản lý khóa riêng tư của bạn để nó có thể ký giao dịch trước khi phát sóng lên Chuỗi. Vì Alchemy không giữ các khóa riêng tư của người dùng, họ không hỗ trợ phương thức này.
  • eth_sendRawTransaction (mở trong tab mới) được sử dụng để phát sóng các giao dịch đã được ký. Điều này có nghĩa là trước tiên bạn phải ký giao dịch bằng khóa riêng tư của mình (trong viem, sử dụng signTransaction (mở trong tab mới) với một tài khoản cục bộ (mở trong tab mới)), sau đó truyền kết quả vào eth_sendRawTransaction.

Khi sử dụng viem, eth_sendRawTransaction được truy cập bằng cách gọi hàm sendRawTransaction (mở trong tab mới).

Đây là những gì chúng ta sẽ sử dụng trong hướng dẫn này.

6. Thư viện Web3 là gì?

  • Thư viện Web3 là một trình bao bọc xung quanh các lệnh gọi JSON-RPC tiêu chuẩn khá phổ biến để sử dụng trong phát triển Ethereum.
  • Có nhiều thư viện Web3 cho các ngôn ngữ khác nhau. Trong hướng dẫn này, chúng ta sẽ sử dụng viem (mở trong tab mới), được viết bằng TypeScript và hoạt động trong bất kỳ dự án JavaScript nào. Bạn có thể xem các tùy chọn khác tại đây như Ethers.js (mở trong tab mới).

Được rồi, bây giờ chúng ta đã giải quyết xong một vài câu hỏi này, hãy chuyển sang phần hướng dẫn. Đừng ngần ngại đặt câu hỏi bất cứ lúc nào trong Discord (mở trong tab mới) của Alchemy!

7. Làm cách nào để gửi các giao dịch an toàn, tối ưu hóa Gas và riêng tư?

LƯU Ý: Hướng dẫn này yêu cầu một tài khoản Alchemy, một Địa chỉ Ethereum hoặc Ví MetaMask, Node.js và npm đã được cài đặt. Nếu chưa có, hãy làm theo các bước sau:

  1. Tạo một tài khoản Alchemy miễn phí (mở trong tab mới)
  2. Tạo tài khoản MetaMask (mở trong tab mới) (hoặc lấy một Địa chỉ Ethereum)
  3. Cài đặt Node.js và npm (mở trong tab mới)

Các bước để gửi giao dịch của bạn

1. Tạo một ứng dụng Alchemy trên mạng thử nghiệm Sepolia

Điều hướng đến Bảng điều khiển Alchemy (mở trong tab mới) của bạn và tạo một ứng dụng mới, chọn Sepolia (hoặc bất kỳ mạng thử nghiệm nào khác) cho mạng lưới của bạn.

2. Yêu cầu ETH từ vòi Sepolia

Làm theo các hướng dẫn trên vòi Sepolia của Alchemy (mở trong tab mới) để nhận ETH, hoặc sử dụng một trong các vòi Sepolia khác. Các vòi cung cấp một lượng nhỏ (vòi Alchemy cung cấp 0,1 ETH mỗi ngày), như vậy là quá đủ cho hướng dẫn này. Đảm bảo bao gồm Địa chỉ Ethereum Sepolia của bạn (từ MetaMask) chứ không phải mạng lưới khác. Sau khi làm theo các hướng dẫn, hãy kiểm tra lại xem bạn đã nhận được ETH trong Ví của mình chưa.

3. Tạo một thư mục dự án mới và cd vào đó

Tạo một thư mục dự án mới từ dòng lệnh (terminal đối với máy Mac) và điều hướng vào đó:

mkdir sendtx-example
cd sendtx-example

4. Cài đặt viem (hoặc bất kỳ thư viện Web3 nào)

Chạy lệnh sau trong thư mục dự án của bạn để cài đặt viem (mở trong tab mới):

Lưu ý, nếu bạn muốn sử dụng thư viện Ethers.js, hãy làm theo các hướng dẫn tại đây (mở trong tab mới).

npm init -y
npm install viem

5. Cài đặt dotenv

Chúng ta sẽ sử dụng một tệp .env để lưu trữ an toàn khóa API và khóa riêng tư của mình.

npm install dotenv

6. Tạo tệp .env

Tạo một tệp .env trong thư mục dự án của bạn và thêm nội dung sau (thay thế "your-api-url" và "your-private-key")

  • Để tìm URL API Alchemy của bạn, hãy điều hướng đến trang chi tiết ứng dụng của ứng dụng bạn vừa tạo trên bảng điều khiển của mình, nhấp vào "View Key" ở góc trên cùng bên phải và lấy URL HTTP.
  • Để tìm khóa riêng tư của bạn bằng MetaMask, hãy xem hướng dẫn (mở trong tab mới) này. Sử dụng một Tài khoản chỉ chứa ETH mạng thử nghiệm.
API_URL="your-api-url"
PRIVATE_KEY="your-private-key"
Đừng commit .env! Vui lòng đảm bảo không bao giờ chia sẻ hoặc để lộ tệp .env của bạn với bất kỳ ai, vì làm như vậy là bạn đang làm lộ các bí mật của mình. Nếu bạn đang sử dụng hệ thống kiểm soát phiên bản, hãy thêm .env của bạn vào tệp gitignore.

7. Tạo tệp sendTx.js

Tuyệt vời, bây giờ chúng ta đã bảo vệ dữ liệu nhạy cảm của mình trong tệp .env, hãy bắt đầu viết mã. Đối với ví dụ gửi giao dịch của chúng ta, chúng ta sẽ gửi 0,001 ETH đến một Địa chỉ khác mà bạn kiểm soát, chẳng hạn như Tài khoản thứ hai trong MetaMask.

Tạo một tệp sendTx.js, đây là nơi chúng ta sẽ cấu hình và gửi giao dịch ví dụ của mình, và thêm các dòng mã sau vào đó:

Đảm bảo thay thế 0xYourSecondAddress bằng Địa chỉ bạn muốn gửi ETH đến. Tập lệnh lấy Địa chỉ (gửi) của riêng bạn từ PRIVATE_KEY, vì vậy bạn không cần phải nhập nó.

Bây giờ, trước khi chúng ta bắt đầu chạy mã này, hãy nói về một số thành phần ở đây.

  • account: Một Tài khoản cục bộ được tạo từ khóa riêng tư của bạn bằng privateKeyToAccount (mở trong tab mới). Việc ký diễn ra trên máy của bạn và khóa riêng tư không bao giờ được gửi đến Alchemy.
  • publicClient và walletClient: các máy khách viem gửi các yêu cầu JSON-RPC đến URL Alchemy của bạn. Máy khách công khai đọc từ Chuỗi và máy khách ví chuẩn bị và ký các giao dịch cho Tài khoản của bạn.
  • nonce : Đặc tả nonce được sử dụng để theo dõi số lượng giao dịch được gửi từ Địa chỉ của bạn. Chúng ta cần điều này cho mục đích bảo mật và để ngăn chặn các cuộc tấn công phát lại. Để lấy số lượng giao dịch được gửi từ Địa chỉ của bạn, chúng ta sử dụng getTransactionCount (mở trong tab mới). viem cũng sẽ điền thông tin này cho bạn, nhưng chúng ta tìm nạp nó một cách rõ ràng ở đây để cho thấy nó đến từ đâu.
  • transaction: Đối tượng giao dịch có một vài khía cạnh mà chúng ta cần chỉ định. prepareTransactionRequest (mở trong tab mới) điền phần còn lại cho chúng ta, bao gồm chainId và các trường phí EIP-1559 maxFeePerGas và maxPriorityFeePerGas, dựa trên các điều kiện mạng lưới hiện tại
    • to: Đây là Địa chỉ chúng ta muốn gửi ETH đến.
    • value: Đây là số tiền chúng ta muốn gửi, được chỉ định bằng Wei trong đó 10^18 Wei = 1 ETH. parseEther (mở trong tab mới) chuyển đổi số lượng ETH thành Wei cho chúng ta. Tài khoản của bạn cần nhiều hơn một chút so với mức này, vì nó cũng phải trả phí Gas
    • gas: Có nhiều cách để xác định lượng Gas phù hợp để đưa vào giao dịch của bạn. Alchemy hỗ trợ webhook (mở trong tab mới) có thể thông báo cho bạn về hoạt động trên chuỗi. Đối với các giao dịch trên Mạng chính, một thực tiễn tốt là kiểm tra các điều kiện Gas hiện tại để xác định lượng Gas phù hợp cần đưa vào. Một giao dịch chuyển ETH thông thường đến một Địa chỉ thông thường luôn sử dụng chính xác 21000 Gas, đây là mức tối thiểu cho bất kỳ giao dịch nào, vì vậy chúng ta đặt 21000 ở đây. Nếu bạn bỏ qua gas, viem sẽ ước tính nó cho bạn.
    • nonce: xem định nghĩa nonce ở trên. Nonce bắt đầu đếm từ số không.
    • [TÙY CHỌN] data: Được sử dụng để gửi thông tin bổ sung cùng với giao dịch chuyển của bạn, hoặc gọi một hợp đồng thông minh, không bắt buộc đối với các giao dịch chuyển số dư, hãy xem lưu ý bên dưới.
  • signedTx: Để ký đối tượng giao dịch của chúng ta, chúng ta sẽ sử dụng phương thức signTransaction, phương thức này ký nó cục bộ bằng Tài khoản được tạo từ PRIVATE_KEY của chúng ta
  • sendRawTransaction: Khi chúng ta có một giao dịch đã được ký, chúng ta có thể gửi nó đi để được đưa vào một khối tiếp theo bằng cách sử dụng sendRawTransaction, phương thức này gọi eth_sendRawTransaction
  • waitForTransactionReceipt: Đợi cho đến khi giao dịch được đưa vào một khối và trả về biên lai của nó

Lưu ý về data Có hai loại giao dịch chính có thể được gửi trong Ethereum.

  • Chuyển số dư: Gửi ETH từ Địa chỉ này sang Địa chỉ khác. Không yêu cầu trường data, tuy nhiên, nếu bạn muốn gửi thông tin bổ sung cùng với giao dịch của mình, bạn có thể đưa thông tin đó ở định dạng HEX vào trường này.
    • Ví dụ: giả sử chúng ta muốn ghi Mã băm của một tài liệu IPFS lên Chuỗi Ethereum để cung cấp cho nó một dấu thời gian bất biến. Trường data của chúng ta sau đó sẽ trông giống như data: toHex("IPFS hash"), sử dụng toHex (mở trong tab mới) của viem. Và bây giờ bất kỳ ai cũng có thể truy vấn Chuỗi và xem khi nào tài liệu đó được thêm vào.
  • Giao dịch hợp đồng thông minh: Thực thi một số mã hợp đồng thông minh trên Chuỗi. Trong trường hợp này, trường data phải chứa hàm thông minh mà bạn muốn thực thi, cùng với bất kỳ tham số nào.

8. Chạy mã bằng cách sử dụng node sendTx.js

Điều hướng trở lại terminal hoặc dòng lệnh của bạn và chạy:

node sendTx.js

9. Xem giao dịch của bạn trên trình khám phá khối

Tập lệnh in mã băm giao dịch ngay khi nút chấp nhận giao dịch, sau đó đợi cho đến khi nó được đưa vào một khối (thường trong vòng vài giây) và in kết quả. Để xem chi tiết, hãy dán Mã băm vào một trình khám phá khối Sepolia chẳng hạn như Sepolia Etherscan (mở trong tab mới) hoặc Blockscout (mở trong tab mới). Ở đó, bạn có thể theo dõi giao dịch đi từ trạng thái chờ xử lý đến khi được đưa vào, và xem số tiền, phí và khối mà nó đã hạ cánh.

Nếu bạn thấy lỗi insufficient funds thay vào đó, Tài khoản của bạn không có đủ ETH Sepolia để trang trải giá trị cộng với Gas. Quay lại bước 2 và yêu cầu thêm từ một vòi.

Tuyệt vời! Bạn vừa gửi giao dịch Ethereum đầu tiên của mình bằng Alchemy 🎉

Để phản hồi và đóng góp ý kiến về hướng dẫn này, vui lòng nhắn tin cho Elan trên Discord (mở trong tab mới) của Alchemy!

Được xuất bản lần đầu bởi Alchemy.