Pycardano: The Ultimate Course for Python and AI Developers
About Lesson

Lập trình PyCardano: Tạo Ví, Quản Lý Mnemonic và Cơ Chế HDWallet Toàn Tập

Chào mừng các bạn quay trở lại với series Lập trình PyCardano! Ở bài viết trước, chúng ta đã kết nối thành công với mạng lưới blockchain thông qua Blockfrost và Ogmios. Hôm nay, chúng ta sẽ bước sang một cột mốc quan trọng tiếp theo: Tạo ra “tấm căn cước” để chính thức tham gia vào mạng lưới – Đó chính là Ví (Wallet).

Trong bài viết này, chúng ta sẽ cùng tìm hiểu sâu về cơ chế HDWallet, cách tạo cụm từ khôi phục (Mnemonic) bằng Python, và bí mật đằng sau “Đường dẫn dẫn xuất” (Derivation Path) chuẩn của hệ sinh thái Cardano.


1. Hiểu đúng về Mnemonic và HDWallet

Trước khi bắt tay vào code, hãy cùng làm rõ một số khái niệm cốt lõi:

  • Mnemonic (Cụm từ khôi phục/Seed Phrase): Đây là chiếc “chìa khóa vạn năng” (Master Key) của bạn, thường bao gồm 12 hoặc 24 từ tiếng Anh ngẫu nhiên. Mất 24 từ này đồng nghĩa với việc mất toàn bộ tài sản. Ngược lại, chỉ cần nhớ 24 từ này, bạn có thể khôi phục lại ví ở bất kỳ đâu.

  • HDWallet (Hierarchical Deterministic Wallet – Ví xác định phân cấp): Hãy tưởng tượng Mnemonic là một gốc cây. Từ gốc cây này mọc ra các nhánh (Account – Tài khoản), và từ mỗi nhánh lại mọc ra vô số chiếc (Address – Địa chỉ ví). Nhờ cơ chế này, bạn chỉ cần lưu giữ đúng 1 chuỗi 24 từ duy nhất nhưng lại có thể quản lý hàng nghìn địa chỉ ví khác nhau một cách có hệ thống.


2. Tạo Mnemonic bằng Python

Thư viện PyCardano đã tích hợp sẵn sức mạnh để làm việc với HDWallet theo chuẩn BIP-39. Hãy cùng tạo một file Python mới (ví dụ: create_wallet.py) và bắt đầu.

Python

 
from pycardano import HDWallet, Strength

# 1. Tạo một ví HD mới ngẫu nhiên (Strength.twenty_four = 24 từ)
# Bạn có thể dùng Strength.twelve nếu chỉ muốn tạo 12 từ
hdwallet = HDWallet.generate(strength=Strength.twenty_four)

# 2. Lấy cụm từ khôi phục (Mnemonic)
mnemonic_phrase = hdwallet.mnemonic

print("--- HÃY LƯU LẠI CỤM TỪ NÀY Ở NƠI AN TOÀN ---")
print(mnemonic_phrase)
print("---------------------------------------------")

⚠️ Cảnh báo bảo mật: Trong các dự án thực tế (Production), tuyệt đối không bao giờ in (print) Mnemonic ra màn hình console hay lưu cứng (hardcode) vào trong file mã nguồn. Bạn nên lưu nó vào các trình quản lý mật khẩu hoặc file .env.


3. Derivation Path: Đường dẫn bí mật CIP-1852

Để biến 24 từ ngẫu nhiên kia thành những địa chỉ ví cụ thể trên Cardano, chúng ta cần một “công thức toán học” gọi là Derivation Path (Đường dẫn dẫn xuất).

Cardano sử dụng chuẩn CIP-1852 với công thức gốc là: m / 1852' / 1815' / 0' / 0 / 0

Ý nghĩa của từng con số:

  • 1852': Chuẩn ví Cardano đa mục đích (tương tự chuẩn BIP-44 của Bitcoin).

  • 1815': Năm sinh của bà Ada Lovelace (đại diện cho đồng coin ADA).

  • 0': Account Index (Tài khoản số 0).

  • 0: Chain Index (Số 0 dùng cho ví nhận tiền thông thường, số 1 dùng cho ví nhận tiền thối lại – change address).

  • 0: Address Index (Địa chỉ ví đầu tiên).

Thay đổi bất kỳ một con số nào trong đường dẫn này, bạn sẽ nhận được một địa chỉ ví hoàn toàn khác!

Phân biệt Payment Key và Stake Key

Cardano có một kiến trúc độc đáo, tách biệt quyền “tiêu tiền” và quyền “ủy quyền” (staking).

  • Payment Key (Khóa thanh toán): Dùng để ký các giao dịch chuyển tiền.

  • Stake Key (Khóa ủy quyền): Dùng để ủy quyền số dư trong ví vào một Staking Pool mà không cần khóa hay di chuyển ADA đi nơi khác.

Python

 
# 3. Dẫn xuất ra các cặp khóa (Key Pair) từ ví gốc

# Payment Key (Đường dẫn kết thúc bằng 0/0)
payment_path = "m/1852'/1815'/0'/0/0" 
payment_wallet = hdwallet.derive_from_path(payment_path)
payment_skey = payment_wallet.private_key # Khóa riêng tư thanh toán
payment_vkey = payment_wallet.public_key  # Khóa công khai thanh toán

# Stake Key (Đường dẫn kết thúc bằng 2/0)
staking_path = "m/1852'/1815'/0'/2/0" 
staking_wallet = hdwallet.derive_from_path(staking_path)
stake_skey = staking_wallet.private_key   # Khóa riêng tư ủy quyền
stake_vkey = staking_wallet.public_key    # Khóa công khai ủy quyền

4. Lắp ráp Địa chỉ Ví Shelley

Một địa chỉ ví Cardano chuẩn hiện nay (thường bắt đầu bằng addr_ hoặc addr_test_) thực chất là sự kết hợp (hash) giữa Khóa công khai thanh toán (Payment PubKey) và Khóa công khai ủy quyền (Stake PubKey).

Python

 
from pycardano import Address, Network

# 4. Tạo địa chỉ (Address)
# Sử dụng Network.TESTNET cho môi trường Preprod/Preview
# Sử dụng Network.MAINNET khi triển khai thực tế
base_address = Address(
    payment_part=payment_vkey.hash(),
    staking_part=stake_vkey.hash(),
    network=Network.TESTNET 
)

print(f"Địa chỉ ví của bạn: {base_address}")

Xin chúc mừng! Chạy đoạn code trên và bạn sẽ sở hữu một địa chỉ ví hoàn chỉnh trên mạng lưới thử nghiệm của Cardano.


5. Khôi phục Ví từ Mnemonic đã lưu

Làm sao để mỗi lần chạy code không tạo ra một ví mới? Đơn giản là chúng ta sẽ sử dụng phương thức from_mnemonic() để khôi phục lại ví từ chuỗi 24 từ mà bạn đã lưu an toàn trong file .env.

Python

 
# Giả sử bạn lấy chuỗi 24 từ này từ file cấu hình bảo mật .env
MY_MNEMONIC = "từ1 từ2 từ3 ... từ24" 

# Khôi phục lại HDWallet
reconstructed_wallet = HDWallet.from_mnemonic(MY_MNEMONIC)

# Sau đó, bạn chỉ cần chạy lại bước dẫn xuất Derivation Path
# như ở mục 3 và 4 để lấy lại chính xác địa chỉ ví cũ của mình.

6. Tổng kết và Cảnh báo an toàn

  • Tuyệt đối bảo mật Mnemonic: Đừng commit bất kỳ file nào chứa 24 từ khôi phục của bạn lên GitHub.

  • Độ chính xác tuyệt đối: Derivation Path phải đúng đến từng con số và dấu nháy ('). Sai một ký tự là bạn sẽ truy cập vào một vùng không gian ví trống trơn hoàn toàn khác.