Bỏ qua để đến nội dung

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.

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ạngTiền tốĐộ dàiVí dụ
Hex4142 ký tự418840E6C55B9ADA326D211D818C34A994AECED808
Base58CheckT34 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.

Dẫn xuất Địa chỉ
# 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 secp256k1
3. Băm public key bằng Keccak-256, lấy 20 byte cuối cùng
4. Thêm tiền tố 0x41 vào đầu
5. 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.

address_utils.js
// Task: Xác thực, chuyển đổi và dẫn xuất các địa chỉ thông qua TronWeb.
// Xác thực
tronWeb.isAddress('TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL'); // true
// Hex → Base58Check
tronWeb.address.fromHex('418840e6c55b9ada326d211d818c34a994aeced808');
// → 'TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL'
// Base58Check → Hex
tronWeb.address.toHex('TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL');
// → '418840e6c55b9ada326d211d818c34a994aeced808'
// Dẫn xuất địa chỉ từ private key
tronWeb.address.fromPrivateKey(privateKey);
// Tạo một cặp khóa mới
const { address, privateKey } = tronWeb.utils.accounts.generateAccount();

LoạiMô tả
EOATà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.

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).

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

Tạo Tài khoản
# 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.

check_activation.js
// 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;

Để 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.

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)
Quyền hạnIDMặc địnhĐiều khiển
Owner (Chủ sở hữu)0Ngưỡng 1, khóa riêng của tài khoảnTất cả thao tác, bao gồm cập nhật quyền
Witness (Nhân chứng)1Chỉ thiết lập trên tài khoản SRKý sinh khối cho Siêu Đại diện (Super Representatives)
Active (Hoạt động)2–9Tự động tạo với các thao tác tiêu chuẩnCá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.

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
setup_multisig.js
// 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.

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:

sign_multisig.js
// 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 object
const fullySigned = await tronWeb.trx.multiSign(partialSigned, privateKey2);
// Đạt ngưỡng — phát giao dịch
const 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.

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:

Bitmap của Các thao tác
# 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.


resources_summary.js
// 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 TRX
console.log(resources.EnergyUsed); // Năng lượng đã tiêu thụ trong kỳ hiện tại
console.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ụng
console.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ết
console.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.