LapTrinhBlockchain

Chia sẻ kiến thức về Lập Trình Blockchain

Kiến thức lập trình, Lập trình Blockchain, Lập trình Công cụ, Lập trình NodeJs

Tìm hiểu lập trình trên Hedera, một số vấn đề mà Dev quen Ethereum gặp phải

Tìm hiểu lập trình trên Hedera, một số vấn đề mà Dev quen Ethereum gặp phải

Tìm hiểu lập trình trên Hedera, một số vấn đề mà Dev quen Ethereum gặp phải

Chia sẻ bài viết
0
(0)

Hedera được đánh giá là một trong những nền tảng DLT (Distributed Ledger Technology) tiên tiến nhất, được quản lý bởi Hội đồng quản trị Hedera – gồm các tập đoàn và tổ chức lớn trên toàn cầu. Điểm đặc biệt của Hedera là việc sử dụng thuật toán đồng thuận độc quyền mang tên Hashgraph, mang lại khả năng mở rộng vượt trội, tốc độ nhanh chóng và tính minh bạch.

Gần đây tôi chú ý tới mạng lưới Hedera này và bắt đầu tìm hiểu. Tôi quen làm việc với các blockchain dạng EVM giống như Ethereum hơn, khi sang mạng Hedera, mặc dù có hỗ trợ EVM nhưng có nhiều chỗ vướng mắc cần phải chú ý.

Tìm hiểu về Hedera

Đầu tiên chúng ta tìm hiểu sơ bộ về Hedera trước khi đi sâu hơn về mảng lập trình để tương tác với blockchain này.

Hedera là gì?

Hedera là một mạng sổ cái phân tán công khai (public distributed ledger) sử dụng thuật toán đồng thuận Hashgraph, không phải blockchain truyền thống. Điểm cốt lõi:

  • Không dùng cấu trúc block nối chuỗi mà theo cấu trúc DAG
  • Không cần miner.
  • Đồng thuận dựa trên cơ chế gossip about gossip + virtual voting.
  • Token gốc: HBAR.
  • Được quản trị bởi Governing Council gồm các tập đoàn lớn (Google, IBM, Boeing, LG, v.v.).

Một số thông số kỹ thuật nổi bật của dự án:

  • Cơ chế đồng thuận (Consensus): Hashgraph (aBFT)
  • Trạng thái cuối cùng (Finality): ~3-5 giây
  • TPS lý thuyết: 10,000+
  • Năng lượng tiêu thụ: Rất thấp
  • Smart contract: EVM compatiable
  • Cấu trúc: DAG (Không phải dạng chain)

Mặc dù dự án đã có từ lâu với FDV hơn $4.4B nhưng kiểm tra hệ sinh thái Defi qua Defillama thấy khá nhỏ với TVL chỉ có khoảng $56M. Mặc dù vậy Hedera có điểm mạnh riêng so với các blockchain khác thì:

  • Bitcoin ưu tiên bao mật và phi tập trung tuyệt đối
  • Ethereum thì mạnh về hệ sinh thái
  • Solana thiên về DeFi tốc độ cao
  • Aptos/Sui thì tập trung vào thực thi hợp đồng thông minh có khả năng mở rộng
  • Còn Hedera thì tập trung vào kết quả lớp đồng thuận mạng, tập trung vào hiệu năng cao với chi phí thấp, tập trung vào quản trị có kiểm soát do đó dễ tiếp cập với các doanh nghiệp.

Hedera cũng có nhiều nhược điểm như Quản trị tập trung, không mở hoàn toàn như Ethereum, hệ sinh thái Defi rất yếu.

Cơ chế hoạt động của Hashgraph

Chúng ta đi sâu hơn cơ chế của Hashgraph. Chúng ta đi vào một số vấn đề như sau:

Cấu trúc dữ liệu: Event DAG

Hashgraph không tạo block. Thay vào đó, mỗi node tạo ra một event. Một event gồm:

  • Danh sách transaction
  • Hash của event trước đó do chính node tạo (self-parent)
  • Hash của event gần nhất nó nhận từ node khác (other-parent)
  • Timestamp

Vì mỗi event trỏ đến 2 event trước → tạo thành một Directed Acyclic Graph (DAG). Do đó mà: Không có chuỗi block, Không có miner leader, Không có block proposal.

Gossip About Gossip

Hedera có cơ chế lan truyền dữ liệu như sau:

  1. Node A chọn ngẫu nhiên node B
  2. A gửi cho B:
    • Các transaction chưa biết
    • Toàn bộ metadata về ai đã nói chuyện với ai

Vì mỗi event có thông tin self-parent và other-parent nên toàn bộ lịch sử lan truyền được mã hóa trong DAG.

Điều đặc biệt: Mỗi node cuối cùng sẽ có cùng một DAG đầy đủ (trừ khi có Byzantine).

Virtual Voting

Đây là điểm sáng tạo nhất của Hedera. Trong blockchain truyền thống Node phải gửi vote thật nên tốn băng thông mạng và cần nhiều thông điệp hơn bình thường với message complexity O(n²). Trong Hashgraph, vì mọi node đều biết toàn bộ DAG, nên họ có thể tự mô phỏng việc vote của node khác, mà không cần gửi vote thật.

Cách xác định thư tự: Hashgraph chia event thành:

  • Bước 1: Chia Round
    Một event thuộc round R nếu nó “strongly sees” ≥ 2/3 node của round trước . “Strongly see” = có đường đi trong DAG đến event của node đó.
  • Bước 2: Xác định Famous Witness
    Witness = event đầu tiên của một node trong round. Nodes sẽ “vote ảo” để xác định witness nào là famous. Toàn bộ quá trình diễn ra mà không gửi vote thực tế. Quy trình:
    • Round r witness vote cho round r-1 witness
    • Vote được truyền qua các round tiếp theo
    • Khi ≥ 2/3 đồng thuận → witness được đánh dấu famous
  • Bước 3: Finality
    Khi một event được Seen bởi đủ famous witness → Nó được consensus timestamp → Thứ tự được chốt vĩnh viễn → Không fork → Xác định trạng thái Finality

Phân tích độ phức tạp và hiệu năng

Chúng ta sẽ đánh giá ở một số tiêu chí như sau:

  • Message complexity
    • Traditional BFT: O(n²) message voting
    • Hashgraph: Chỉ O(n log n) do gossip random
  • Latency
    • Thường 3–5 giây
    • Phụ thuộc tốc độ gossip lan toàn mạng
  • Throughput
    • Cao vì:
      • Không có block size bottleneck
      • Không có leader serialization
    • Nhưng:
      • Execution layer không song song mạnh như Solana/Aptos
      • Smart contract vẫn EVM-based
    • Hedera có cơ chế Consensus nhanh nhưng không đồng nghĩa với execution nhanh.

So sánh kiến trúc với Blockchain truyền thống

Thành phầnBlockchainHashgraph
Data structureChainDAG
BlockCóKhông
LeaderCóKhông
Vote messageCóKhông
ForkCó thểKhông
FinalityProbabilistic / deterministicDeterministic

Điểm yếu kỹ thuật của Hashgraph

  1. Toàn bộ node phải giữ toàn bộ DAG => Do đó bộ nhớ tăng nhanh và không dễ cho việc sharding
  2. Không thực sự permissionless => Khi có số lượng node tham gia lớn (Chẳng hạn 10,000 nodes) thì Gossip complexity sẽ bùng nổ => Nên Hedera phải dùng mô hình Council.
  3. Không tối ưu cho MEV & DeFi: Nguyên nhân là bởi
    • Thứ tự giao dịch phụ thuộc timestamp trung bình
    • Không có cơ chế builder / proposer
    • Nên với arbitrage tốc độ cao thì Hashgraph không phải là môi trường tối ưu => Tay to không có lợi thế thì nhỏ lẻ có cơ hội

Một số điểm lưu ý khi bắt đầu lập trình tương tác với mạng Hedera

Cần hiểu rõ bạn đang dùng lớp nào của Hedera

Hedera có 3 lớp dịch vụ chính:

  1. Hedera Token Service (HTS)
  2. Hedera Consensus Service (HCS)
  3. Smart Contract Service (EVM)

Nhiều dev bên Ethereum vào Hedera và chỉ dùng Smart Contract, bỏ qua HTS, trong khi HTS nhanh hơn, rẻ hơn và chuẩn hơn. Ví dụ:

  • Mint token → Fùng HTS tốt hơn ERC-20
  • NFT → HTS native NFT tốt hơn ERC-721

Mô hình tài khoản khác Ethereum

Hedera có mô hình tài khoản (Account Model) khác so với Ethereum. Cụ thể:

  • Trên Ethereum:
    • Account = address
    • Có private key
  • Trên Hedera:
    • Account ID dạng: 0.0.x
    • Key structure có thể phức tạp:
      • Multi-key
      • Threshold key
      • Key list

Tức là:

  • Quản lý khóa (Key management) phức tạp hơn
  • Phân quyền có thể thiết kế ngay từ account layer
  • Phí và signature khác EVM

Phí giao dịch

Cơ chế phí trên Hedera và Ethereum cũng khác nhau. Cụ thể:

  • Ethereum: Cơ chế đấu giá Gas (Gas auction) => Phí biến động
  • Hedera: Phí cố định (Dựa theo USD) => Phí này thấp

Đây là điểm quan trọng khi cần xây dựng bot.

Smart Contract Execution giới hạn gì?

Mặc dù EVM compatible, nhưng:

  • Không phải mọi opcode đều tối ưu
  • Không có ecosystem tooling phong phú như Ethereum
  • Debug tool còn hạn chế
  • Không có Foundry-level maturity

Do đó chúng ta cần:

  • Test kỹ trên testnet
  • Kiểm tra compatibility library
  • Không giả định mọi thứ giống Ethereum

State & Storage Cost

Hedera tính phí storage khác Ethereum. Trên Ethereum, nơi gas storage rất đắt đỏ, nếu bạn lưu nhiều dữ liệu on-chain, thiết kế contract phức tạp thì cần tối ưu state size. Hedera rẻ nhưng vẫn nên tối ưu.

Thực hiện kích hoạt ví EVM để sử dụng trên mạng lưới Hedera

Quá trình kích hoạt này chính là việc ánh xạ ví EVM sang một account trên Hedera. Quy trình kích hoạt đầy đủ bao gồm 2 bước (Chi tiết xem: Auto Account Creation):

  • B1: Tạo địa chỉ EVM Alias (Hollow Account)
    • Bạn thực hiện bằng cách mở Ví HashPack, chọn một account mà bạn đã có sẵn HBAR, thực hiện chuyển ít nhất 0.1 HBAR tới địa chỉ EVM (Địa chỉ này chưa từng tồn tại trên Hedera)
    • Ở bước này mạng lưới sẽ tự động khởi tạo một tài khoản tạm gọi là Hollow Account (Tài khoản rỗng). Tài khoản này đã có mã Hedera Account ID (0.0.xxxxx) ngầm định trên sổ cái, nhưng chưa được gắn đầy đủ Public Key (Khóa công khai) của người sở hữu.
    • Với tài khoản Hollow Account, khi bạn tra địa chỉ EVM này trên HashScan thì sẽ ra thông tin và nhìn thấy được địa chỉ Hedera Account ID, nhưng trường “ADMIN KEY” sẽ là None.
  • B2: Kích hoạt hoàn toàn (Complete Activation)
    • Để kích hoạt hoàn toàn, bạn mở MetaMask, chọn account là địa chỉ EVM ở trên, bạn nhớ thêm mạng lưới Hedera từ ChainList.org, thực hiện chuyển lượng HBAR bất kỳ tới một địa chỉ khác.
    • Sau giao dịch này khóa công khai ECDSA của bạn sẽ được ghi nhận hoàn toàn trên sổ cái Hedera, lúc này hai địa chỉ EVM 0x... và Hedera Account ID 0.0.xxxxx đã được đồng bộ hóa hoàn toàn.
    • Lúc này nếu bạn tra địa chỉ EVM trên HashScan thì sẽ thấy trường “ADMIN KEY” bây giờ đã có dữ liệu.

Cơ chế Token Association trên Hedera

Trên Hedera, để ngăn ngừa việc nhận spam/scam token vào ví, hệ thống có một cơ chế bắt buộc gọi là Token Association (Liên kết Token). Nếu ai đó muốn gửi token mới này cho bạn, ví của bạn phải thực hiện Associate Token ID đó trước. Các thực hiện như sau:

  • Sử dụng Ví HashPack: Hoặc những ví hỗ trợ mạng Hedera gốc thì thao tác này khá dễ dàng.
    • Mở ứng dụng Ví (HashPack / Blade), chọn Add Token / Associate Token.
    • Nhập đúng mã Token ID (0.0.xxxxx) của token mới. Ví dụ token PACK là 0.0.4794920
    • Ký xác nhận giao dịch (tốn một lượng phí khoảng 0.8 HBAR).
  • Ví EVM sử dụng Metamask: Yêu cầu bắt buộc là ví Evm đã được ánh xạ đầy đủ
    • Vào SaucerSwap, thực hiện kết nối tới ví Metamask
    • Thực hiện swap từ HBAR sang token mà bạn muốn liên kết, ví dụ token PACK
    • Thực hiện bấm Swap => SaucerSwap sẽ hiện cửa sổ popup thông báo “Enable PACK in your wallet” để liên kết token với ví của bạn
    • Trong Metamask bạn sẽ thấy một giao dịch yêu cầu bạn confirm với phí tầm 0.8 HBAR => Bạn confirm giao dịch trên Metamask (Phí tầm 0.8 HBAR)
    • Sau khi giao dịch hoàn thành, SaucerSwap sẽ hiện hộp thoại thông báo hoàn thành như ảnh dưới.
    • Bạn vào HashScan tìm kiếm địa chỉ EVM, sau đó sang task Assets bạn sẽ thấy token được hiển thị trong danh sách “HTS Tokens“.
SaucerSwap thực hiện liên kết token thành công
PACK hiển thị trong danh sách HTS Tokens
PACK hiển thị trong danh sách HTS Tokens

Ghi chú: WHBAR không cần phải thực hiện thao tác Token Association như các HTS token thông thường. Vì WHBAR được phát hành dưới dạng chuẩn ERC-20 thông thường trên tầng Smart Contract EVM của Hedera, chứ không nằm trực tiếp dưới dạng native HTS token yêu cầu cơ chế liên kết ví thủ công.

Hedera sử dụng cơ chế Native Staking- HBAR chi tiêu tự do và vẫn được nhận thưởng

Hedera sử dụng cơ chế Native Staking (Staking gốc), cơ chế staking này có các đặc điểm sau:

  • Không có thời gian khóa: Khác với nhiều mạng lưới khác, Hedera thiết kế cơ chế staking trực tiếp tại tầng tài khoản, điều này giúp:
    • Tài sản của bạn không bị đóng băng hay khóa lại.
    • Bạn có thể tự do chuyển đi , giao dịch, hoặc chi tiêu số HBAR trong ví của mình bất cứ lúc nào bạn muốn.
  • Toàn bộ số dư được tính staking tự động
    • Khi bạn chọn một Node đồng thuận (Consensus Node) hoặc một tài khoản để stake, toàn bộ số dư trong ví của bạn sẽ được tự động tính vào trọng số stake của node đó.
    • Nếu bạn tiêu bớt hoặc nhận thêm HBAR vào ví, trọng số staking sẽ tự động cập nhật theo số dư thực tế của bạn tại từng thời điểm mà không cần phải thực hiện bất cứ thao tác thêm nào.
  • Không có rủi ro Slashing
    • Hedera không áp dụng cơ chế slashing (phạt bằng cách trừ trực tiếp số tiền đang stake nếu node gặp sự cố hoặc gian lận). Do đó, tài sản của bạn rất an toàn khi tham gia staking.

Để tham gia Staking thì bạn thực hiện thao tác sau 1 lần duy nhất:

  • B1-Mở ví HashPack: Mở ví của mình (ví dụ: HashPack, Blade Wallet, hoặc các ví Hedera khác) và chọn “Stake HBAR”
  • B2-Chọn Node (Staking Node): Bạn chọn một trong các Node đồng thuận do các thành viên Hội đồng Hedera vận hành (ví dụ: Google, IBM, LG, Dell, Swirlds,…).
  • Xác nhận (Confirm): Nhấn xác nhận liên kết tài khoản của bạn với Node đó.

Thao tác trên sẽ không chuyển tiền HBAR của bạn đi đâu cả, nó chỉ làm nhiệm vụ “ủy quyền” (delegate) trọng số số dư tài khoản cho Node đó. Cơ chế trả thưởng staking của Hedera cũng rất linh hoạt, hỗ trợ 2 cơ chế như sau:

  • Auto-Claim – Tự động trả về ví
    • Phần thưởng sẽ tự động được gộp trực tiếp vào số dư ví của bạn mỗi khi tài khoản của bạn phát sinh bất kỳ giao dịch nào trên mạng lưới Hedera.
    • Các giao dịch kích hoạt auto-claim bao gồm:
      • Bạn nhận thêm HBAR từ người khác gửi đến.
      • Bạn chuyển HBAR cho tài khoản khác.
      • Bạn tương tác với dApp, mua/bán NFT, hoặc swap token.
      • Bạn thực hiện thao tác đổi Node staking hay nạp/rút HBAR.
  • Claim Reward – Nhận thủ công
    • Nếu trong một khoảng thời gian dài bạn không thực hiện bất kỳ giao dịch nào, phần thưởng vẫn sẽ tiếp tục được tích lũy an toàn trên hệ thống.
    • Nếu muốn phần thưởng chạy về số dư khả dụng trong ví ngay lập tức, bạn chỉ cần:
      • Mở ví (như HashPack hoặc Blade Wallet).
      • Vào mục Staking.
      • Bấm nút “Collect Rewards” / “Claim Rewards” (Thu thập phần thưởng).

STAKED FOR NO REWARD – Cơ chế từ chối nhận thưởng

Khi xem thông tin một Node của Hedera bạn sẽ thấy trường “STAKED FOR NO REWARD“, trường này hiển thị thông tin lượng HBAR đang ủy quyền cho Node này nhưng không nhận được phần thưởng.

STAKED FOR NO REWARD - HBAR đang ủy quyền cho Node này nhưng không nhận được phần thưởng

Nguyên nhân có một số lượng HBAR không được nhận thưởng do:

  • Tài khoản tự bật cài đặt “Từ chối nhận thưởng“:
    • Một số tổ chức, quỹ đầu tư, hoặc chính các Node operators (như IBM, Google…) chọn bật tính năng này để nhường phần thưởng cho cộng đồng hoặc do lý do pháp lý/kế toán.
    • Trên hình ảnh của bạn, mục DECLINE REWARD của chính Node này đang ghi là true — nghĩa là bản thân số HBAR của IBM tự stake vào Node của họ không lấy thưởng, số HBAR này sẽ bị tính vào mục Staked for No Reward.
  • Node bị vượt quá hạn mức tối đa (Max Stake Cap):
    • Mỗi Node có một hạn mức stake tối đa (như hình hiển thị MAX STAKE là 450,000,000 HBAR).
    • Nếu tổng lượng HBAR stake vào Node vượt quá 450 triệu HBAR, phần vượt dư ra đó sẽ không được tính thưởng (để tránh việc một Node tập trung quá nhiều quyền lực đồng thuận).
  • Số dư tài khoản quá nhỏ hoặc không đủ điều kiện chu kỳ:
    • Tài khoản mới đổi Node hoặc mới nạp HBAR cần đợi hết chu kỳ 24 giờ (Epoch) hiện tại mới bắt đầu tính thưởng cho chu kỳ tiếp theo.

Một số điểm cần lưu ý với Hedera EVM

Trước đây tôi làm việc nhiều với Evm, và khi làm việc với Hedera Evm, tôi thấy có một số điểm khác có thể ảnh hưởng để nghiệp vụ của bạn:

  • Vấn đề trùng nonce: Trên Evm sẽ không bao giờ có 2 giao dịch trùng nonce, nhưng trên Hedera Evm thì có thể. Ví dụ hai giao dịch sau đều cùng 1 Ethereum Nonce 709: 0.0.995584@1772215243.223562314 và 0.0.995584@1772215267.134637524 => Tôi không để ý vấn đề này dẫn đến xử lý sai gây ra hiện tượng lặp transaction.
  • Vấn đề cấp quyền sử dụng token cho một spender: Trên Hedera Evm, bạn không thể cấp quyền sử dụng lượng không giới hạn (Unlimited) cho một spender, mà bạn chỉ có thế cấp quyền với số lượng tối đa bằng tổng cung của token đó => Bạn không để ý vấn đề này bạn sẽ mất nhiều phí để thực hiện cấp quyền mà không hiểu sao giao dịch cứ lỗi hoài.
  • Việc ánh xa account EVM sang account trên Hedera: Hedera có EVM, nhưng account model KHÔNG giống Ethereum. Account trên Hedera có dạng 0.0.x trong khi đó account EVM có dạng 0xabc nên để dùng được account EVM trên mạng lưới Hedera ta phải thực hiện ánh xạ EVM account sang Hedera account.
  • Chú ý trường value thực hiện giao dịch Hedera Evm: Như chúng ta biết thì HBAR có decimals=8 trong khi trên Evm thì đơn vị nhỏ nhất là wei ứng với ETH có decimals=18 => Do đó khi truyền lượng ví dụ 1.5 HBAR thông qua trường value thì bạn phải sử dụng 1.5*10^18 chứ không phải 1.5*10^8

Lập trình tương tác với mạng Hedera gốc

Chi tiết bạn nên đọc tài liệu chính thức của Hedera “Hedera Native Developers“, Hedera Playground và một số ví dụ mẫu trên Hedera. Để lập trình tương tác với mạng Hedera gốc, chúng ta sẽ sử dụng Hedera SDK, SDK này hỗ trợ các ngôn ngữ: Java, Javascript và Go. Trong bài viết này tôi sử dụng Hedera SDK với ngôn ngữ Javascript thông qua thư viện @hashgraph/sdk.

Tài khoản Operator: Tài khoản để thực hiện giao dịch

Đầu tiên chúng ta cần phải có một tài khoản Hedera trước đã. Chúng ta nên sử dụng ví HashPack dể tạo tài khoản trên mạng lưới Hedera gốc, nhớ tạo một tài khoản trên Testnet và một tài khoản trên Mainnet để tiện cho việc thao tác.

Sau khi có tài khoản thì chúng ta cần có một ít token HBAR để có thể bắtđầu thực hiện thao tác:

  • Trên Testnet: Vào trang Hedera Faucet để nhận 100 HBAR mỗi ngày, hỗ trợ cả địa chỉ Hedera gốc và địa chỉ dạng EVM. Nếu bạn cần số lượng HBAR lớn bạn có thể đăng ký qua trang https://portal.hedera.com/register
  • Trên Mainnet:
    • Cách đơn giản nhất là mua một ít HBAR trên các sàn tập trung như Binance, Mexc, Bybit, Okx… rồi rút về địa chỉ đã tạo ở trên.
    • Nếu bạn có ví ethereum với điểm trên Human Passport trên 20 điểm, thì bạn có thể vào trang này https://faucet.hashport.network, rồi nhập địa chỉ ví Ethereum, đâu đó được nhận 2 HBAR thì phải.

Bây giờ chúng ta lấy địa chỉ và private key của tài khoản, lưu vào tệp .env với nội dung tin như sau:

OPERATOR_ACCOUNT_ID = 0.0.xxxxxxxx
OPERATOR_PRIVATE_KEY = yyyyyyyyyyyyyyyyyyyyyyyyy

Nhớ ưu tiên sử dụng tài khoản Testnet trước cho an toàn. Khi mọi thứ chạy hoàn hảo trên Testnet hãy chuyển sang sử dụng tài khoản Mainnet.

Tạo đối tượng Client: Đối tượng cơ bản sử dụng cho tất cả các thao tác sau này

Bây giờ chúng ta sẽ tạo đối tượng Client, đối tượng này nắm giữ tài khoản operator. Mã nguồn được đóng gói trong hàm initClient() để tái sử dụng trong các phần tiếp theo:

require('dotenv').config();
const hashgraph = require("@hashgraph/sdk");

function initClient(useForMainnet=false) {
    let client = null;
    if (useForMainnet) client = hashgraph.Client.forMainnet();
    else client = hashgraph.Client.forTestnet();
    let operatorAccountId = hashgraph.AccountId.fromString(process.env.OPERATOR_ACCOUNT_ID);
    let operatorAccountPk = hashgraph.PrivateKey.fromString(process.env.OPERATOR_PRIVATE_KEY);
    client.setOperator(operatorAccountId, operatorAccountPk);
    return client;
}

Hiển thị thông tin tài khoản và số dư tài khoản

Phần này chúng ta sẽ hiển thị thông tin tài khoản bao gồm địa chỉ evm, số dư HBAR và số dư các token khác.

// ...

// Show account info
async function showAccountInfo(client, accountId) {
    const accountInfo =  await new hashgraph.AccountInfoQuery()
        .setAccountId(accountId)
        .execute(client);
    console.log("Account Info:");
    console.log(`    AccountId  : ${accountId.toString()}`);
    console.log(`    Evm Address: 0x${accountInfo.contractAccountId}`);
    console.log(`    HBAR Balance: ${accountInfo.balance.toString()}`);
    console.log(`    Account Memo: ${accountInfo.accountMemo}`);
    console.log(`    Owned Nfts: ${accountInfo.ownedNfts.toString()}`);
    console.log(`    Ethereum Nonce: ${accountInfo.ethereumNonce.toString()}`);
    console.log(`    ...`);
}

async function showAccountBalance(client, accountId) {
    let balanceInfo = await new hashgraph.AccountBalanceQuery()
        .setAccountId(accountId)
        .execute(client);
    console.log("Balance Info:");
    console.log(`    AccountId  : ${accountId.toString()}`);
    console.log(`    HBAR Balance: ${balanceInfo.hbars.toString()}`);
    let tokens = JSON.parse(balanceInfo.tokens.toString());
    let tokenIds = Object.keys(tokens);
    console.log(`    Tokens Balance (${tokenIds.length})`);
    tokenIds.forEach(tokenId => {
        let tokenBalance = balanceInfo.tokens.get(tokenId);
        let tokenDecimals = balanceInfo.tokenDecimals.get(tokenId);
        let balance = Number(tokenBalance.toString())/10**Number(tokenDecimals.toString());
        console.log(`        ${tokenId}: ${balance}`);
    });
}

// Test function
async function test() {
    let client = initClient();
    await showAccountInfo(client, "0.0.1293");
    await showAccountBalance(client, "0.0.1293");
}
test();

Kết quả hiển thị như sau:

Bài viết này có hữu ích với bạn?

Kích vào một biểu tượng ngôi sao để đánh giá bài viết!

Xếp hạng trung bình 0 / 5. Số phiếu: 0

Bài viết chưa có đánh giá! Hãy là người đầu tiên đánh giá bài viết này.

Trả lời

Giao diện bởi Anders Norén