Tài khoản & Quyền hạn
Tài khoản TRON tận dụng cùng một nền tảng mật mã học như Ethereum — ECDSA với secp256k1 — đồng thời giới thiệu các quyền đa chữ ký (multi-signature) gốc và một mô hình kích hoạt rõ ràng. Hướng dẫn này bao gồm việc mã hóa địa chỉ, các yêu cầu kích hoạt và hệ thống quyền tích hợp sẵn để quản lý tài khoản an toàn.
Định dạng Địa chỉ
Phần tiêu đề “Định dạng Địa chỉ”Một địa chỉ TRON được dẫn xuất từ một private key (khóa riêng) sử dụng cùng quy trình như Ethereum, với một sự khác biệt: các byte địa chỉ được thêm tiền tố 41 trước khi mã hóa Base58Check.
Mọi địa chỉ TRON đều tồn tại ở hai dạng biểu diễn:
| Định dạng | Tiền tố | Độ dài | Ví dụ |
|---|---|---|---|
| Hex | 41 | 42 ký tự | 418840E6C55B9ADA326D211D818C34A994AECED808 |
| Base58Check | T | 34 ký tự | TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL |
Cả hai đều tham chiếu đến cùng một tài khoản. Định dạng hex xuất hiện trong các lệnh gọi API thô và mã hóa ABI nội bộ. Định dạng Base58Check (tiền tố T) là những gì người dùng nhìn thấy trong Ví và trình khám phá khối.
Các Bước Dẫn xuất
Phần tiêu đề “Các Bước Dẫn xuất”# Task: Thực hiện theo các bước sau để dẫn xuất một địa chỉ TRON từ private key.1. Tạo một private key 256-bit ngẫu nhiên (64 ký tự hex)2. Dẫn xuất public key (khóa công khai) sử dụng ECDSA secp256k13. Băm public key bằng Keccak-256, lấy 20 byte cuối cùng4. Thêm tiền tố 0x41 vào đầu5. Mã hóa Base58Check → Địa chỉ có tiền tố TĐiều này giống hệt với việc dẫn xuất khóa Ethereum ngoại trừ bước 4 thêm tiền tố 41 thay vì 00.
Các Tiện ích Địa chỉ (tronweb)
Phần tiêu đề “Các Tiện ích Địa chỉ (tronweb)”// Task: Xác thực, chuyển đổi và dẫn xuất các địa chỉ thông qua TronWeb.// Xác thựctronWeb.isAddress('TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL'); // true
// Hex → Base58ChecktronWeb.address.fromHex('418840e6c55b9ada326d211d818c34a994aeced808');// → 'TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL'
// Base58Check → HextronWeb.address.toHex('TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL');// → '418840e6c55b9ada326d211d818c34a994aeced808'
// Dẫn xuất địa chỉ từ private keytronWeb.address.fromPrivateKey(privateKey);
// Tạo một cặp khóa mớiconst { address, privateKey } = tronWeb.utils.accounts.generateAccount();Các Loại Tài khoản
Phần tiêu đề “Các Loại Tài khoản”| Loại | Mô tả |
|---|---|
| EOA | Tài khoản thuộc sở hữu bên ngoài (Externally Owned Account). Được kiểm soát bởi một private key. Nắm giữ TRX, token và có thể gọi Hợp đồng. |
| Tài khoản Hợp đồng | Được tạo ra khi một Hợp đồng thông minh được triển khai. Địa chỉ được dẫn xuất từ ID giao dịch triển khai và địa chỉ người gửi. Không có private key. |
Kích hoạt Tài khoản
Phần tiêu đề “Kích hoạt Tài khoản”Một địa chỉ TRON mới được dẫn xuất sẽ không tồn tại on-chain cho đến khi nó được kích hoạt. Cho đến khi được kích hoạt, địa chỉ có thể giữ một cặp khóa hợp lệ nhưng mạng lưới không có bản ghi nào về nó. Nhiều thao tác — bao gồm việc nhận các khoản chuyển token TRC-20 lần đầu tiên — kích hoạt hoặc yêu cầu kích hoạt.
(Dành cho nhà phát triển Web2: Không giống như các cơ sở dữ liệu truyền thống nơi việc tạo một bản ghi người dùng mới là miễn phí, các blockchain yêu cầu “kích hoạt” một tài khoản để ngăn chặn thư rác. Hãy nghĩ về điều này giống như trả một khoản phí hạ tầng nhỏ, một lần để cung cấp vĩnh viễn một hàng cơ sở dữ liệu cho một người dùng mới).
Các Phương pháp Kích hoạt
Phần tiêu đề “Các Phương pháp Kích hoạt”Nhận một khoản chuyển TRX Con đường đơn giản nhất. Khi bất kỳ tài khoản nào gửi TRX đến một địa chỉ mới, việc kích hoạt diễn ra tự động. Chi phí: Khấu trừ 1 TRX từ người gửi.
API CreateAccount
# Task: Gọi endpoint wallet/createaccount để kích hoạt một địa chỉ.POST https://api.trongrid.io/wallet/createaccount
{ "owner_address": "TSenderAddress...", "account_address": "TNewAddress...", "visible": true}Chi phí: 1 TRX từ owner_address.
Chuyển token thông qua Hợp đồng thông minh
Nếu một hợp đồng TRC-20 thực hiện chuyển khoản tới một địa chỉ chưa được kích hoạt, việc kích hoạt sẽ tốn 25,000 Năng lượng từ người triển khai hợp đồng. Các nhà phát triển dApp nên dự trù khoản này khi giới thiệu người dùng mới — hãy xem Mô hình Phí để biết cách thiết lập origin_energy_limit nhằm trang trải chi phí này.
Kiểm tra Trạng thái Kích hoạt
Phần tiêu đề “Kiểm tra Trạng thái Kích hoạt”// Task: Xác định xem một địa chỉ đã được kích hoạt on-chain hay chưa.const account = await tronWeb.trx.getAccount('TAddress...');// Địa chỉ chưa được kích hoạt → object rỗng {}// Địa chỉ đã được kích hoạt → object có ít nhất { address: '...', balance: 0 }const isActivated = Object.keys(account).length > 0;Giới hạn Kích thước Giao dịch
Phần tiêu đề “Giới hạn Kích thước Giao dịch”Để duy trì sự ổn định của mạng lưới, TRON thực thi các giới hạn kích thước giao dịch nghiêm ngặt:
- Tạo tài khoản (Account Creation): Các giao dịch tạo tài khoản mới phải dưới 1,000 byte một cách nghiêm ngặt.
- Các Giao dịch Chung: Tất cả các giao dịch (bao gồm việc triển khai hợp đồng và kết quả thực thi) đều bị giới hạn ở kích thước tối đa là 500 KB.
Quyền hạn và Đa chữ ký (Multi-Signature)
Phần tiêu đề “Quyền hạn và Đa chữ ký (Multi-Signature)”Hệ thống quyền hạn của TRON cho phép một tài khoản yêu cầu nhiều người ký cho các giao dịch và hạn chế việc thao tác nào mỗi khóa có thể ủy quyền. Điều này được tích hợp vào giao thức — không cần Hợp đồng multisig nào. (Dành cho nhà phát triển Web2: Hãy nghĩ về điều này giống như Kiểm soát Truy cập Dựa trên Vai trò (RBAC) gốc, tương tự như việc yêu cầu phê duyệt từ nhiều quản trị viên trước khi thực thi một lệnh triển khai production quan trọng).
Các trường hợp sử dụng phổ biến:
- Các ví nóng của sàn giao dịch yêu cầu M-of-N (M trong số N) phê duyệt để rút tiền
- Quỹ kho bạc DAO yêu cầu nhiều thành viên hội đồng ký
- Tách biệt các khóa vận hành (sử dụng hàng ngày) khỏi các khóa quản trị (hiếm gặp, thao tác độ tin cậy cao)
Ba Cấp độ Quyền
Phần tiêu đề “Ba Cấp độ Quyền”| Quyền hạn | ID | Mặc định | Điều khiển |
|---|---|---|---|
| Owner (Chủ sở hữu) | 0 | Ngưỡng 1, khóa riêng của tài khoản | Tất cả thao tác, bao gồm cập nhật quyền |
| Witness (Nhân chứng) | 1 | Chỉ thiết lập trên tài khoản SR | Ký sinh khối cho Siêu Đại diện (Super Representatives) |
| Active (Hoạt động) | 2–9 | Tự động tạo với các thao tác tiêu chuẩn | Các việc hàng ngày: chuyển tiền, gọi hợp đồng, Khóa TRX |
Một tài khoản mới bắt đầu với một quyền Owner và một quyền Active, cả hai đều được kiểm soát bởi khóa riêng của tài khoản với ngưỡng (threshold) là 1.
Cấu trúc Quyền
Phần tiêu đề “Cấu trúc Quyền”Mỗi quyền định nghĩa:
- threshold (ngưỡng) — tổng trọng số tối thiểu của các chữ ký được yêu cầu
- keys (các khóa) — tối đa 5 cặp địa chỉ/trọng số; mỗi người ký đóng góp trọng số của họ khi họ ký
- operations (thao tác) — một bitmap 32-byte chỉ định xem quyền này có thể ủy quyền cho loại giao dịch nào trong số 60 loại giao dịch của TRON
Thiết lập Đa chữ ký 2-of-3 (2 trong 3)
Phần tiêu đề “Thiết lập Đa chữ ký 2-of-3 (2 trong 3)”// Task: Cập nhật các quyền của tài khoản để yêu cầu 2 trong số 3 người ký.const tx = await tronWeb.transactionBuilder.updateAccountPermissions( 'TOwnerAddress...', // tài khoản đang được cấu hình { // quyền chủ sở hữu — giữ là một khóa type: 0, threshold: 1, keys: [{ address: 'TOwnerAddress...', weight: 1 }], }, null, // quyền nhân chứng (null nếu không phải là một SR) [{ // các quyền hoạt động — yêu cầu 2 trong 3 người ký type: 2, threshold: 2, operations: '7fff1fc0033efb07000000000000000000000000000000000000000000000000', keys: [ { address: 'TSigner1...', weight: 1 }, { address: 'TSigner2...', weight: 1 }, { address: 'TSigner3...', weight: 1 }, ], }],);
const signed = await tronWeb.trx.sign(tx);await tronWeb.trx.sendRawTransaction(signed);Chi phí: 100 TRX cho giao dịch cập nhật quyền.
Ký một Giao dịch Đa chữ ký
Phần tiêu đề “Ký một Giao dịch Đa chữ ký”Một khi ngưỡng đa chữ ký (multi-sig) được thiết lập, các giao dịch từ tài khoản đó phải được ký bởi đủ số lượng người giữ khóa để đạt tới ngưỡng trước khi được phát lên mạng lưới:
// Task: Ký một giao dịch theo tuần tự với nhiều private key.// Người ký 1 thêm chữ ký của họconst partialSigned = await tronWeb.trx.multiSign(unsignedTx, privateKey1);
// Người ký 2 thêm chữ ký của họ vào cùng objectconst fullySigned = await tronWeb.trx.multiSign(partialSigned, privateKey2);
// Đạt ngưỡng — phát giao dịchconst result = await tronWeb.trx.sendRawTransaction(fullySigned);Mỗi người ký bổ sung sau người đầu tiên sẽ cộng thêm 1 TRX vào Phí mạng giao dịch.
Bitmap của Các thao tác
Phần tiêu đề “Bitmap của Các thao tác”Trường operations là một chuỗi hex 256-bit trong đó mỗi bit điều khiển một trong số 60 loại hợp đồng của TRON. Giá trị mặc định của bitmap quyền hoạt động:
# Task: Lưu ý bitmap mặc định cho các quyền hoạt động đầy đủ.7fff1fc0033efb07000000000000000000000000000000000000000000000000Điều này cấp tất cả các quyền cho các thao tác thông thường ngoại trừ AccountPermissionUpdateContract (được dành riêng cho Owner). Nếu bạn cần một quyền hoạt động bị hạn chế — ví dụ, một khóa người điều hành chỉ có thể gửi TRX nhưng không thể triển khai hợp đồng — bạn có thể tính toán một bitmap tùy chỉnh từ bảng tra cứu loại hợp đồng trong tài liệu TRON TIP.
Tóm tắt Các Tài nguyên Tài khoản
Phần tiêu đề “Tóm tắt Các Tài nguyên Tài khoản”// Task: Lấy tất cả các tài nguyên khả dụng và đã tiêu thụ cho một tài khoản.const resources = await tronWeb.trx.getAccountResources('TAddress...');
// Năng lượng (Energy)console.log(resources.EnergyLimit); // tổng Năng lượng khả dụng từ Khóa TRXconsole.log(resources.EnergyUsed); // Năng lượng đã tiêu thụ trong kỳ hiện tạiconsole.log(resources.TotalEnergyLimit); // thị phần của bạn trong bể Năng lượng mạng lưới
// Băng thông (Bandwidth)console.log(resources.NetLimit); // Băng thông từ Khóa TRX khả dụngconsole.log(resources.NetUsed); // Băng thông từ Khóa TRX đã tiêu thụconsole.log(resources.freeNetLimit); // hạn mức miễn phí (600/ngày)console.log(resources.freeNetUsed); // Băng thông miễn phí đã tiêu thụ hôm nay
// Sức mạnh TRON (trọng số biểu quyết từ Khóa TRX)console.log(resources.tronPowerUsed); // TP hiện được phân bổ cho biểu quyếtconsole.log(resources.tronPowerLimit); // tổng TP (= tổng số TRX đã Khóa)Để biết cơ chế Khóa TRX và cách tăng các hạn mức này, hãy xem Mô hình phí & Ủy quyền.