Mô hình phí & Ủy quyền
TRON thay thế gas truyền thống bằng một mô hình tài nguyên kép: Năng lượng dành cho việc thực thi Hợp đồng thông minh và Băng thông dành cho dữ liệu giao dịch. Hướng dẫn này giải thích cách để đạt được các tài nguyên này thông qua việc Khóa TRX, tác động của Mô hình Năng lượng Động (DEM) đối với các hợp đồng phổ biến, và cách triển khai ủy quyền phí để mang lại trải nghiệm người dùng không tốn phí (gasless).
Năng lượng
Phần tiêu đề “Năng lượng”Năng lượng bị tiêu thụ bởi việc thực thi Hợp đồng thông minh. Mọi opcode của TVM đều tốn Năng lượng, tương tự như gas trong EVM.
Cách có được Năng lượng
Phần tiêu đề “Cách có được Năng lượng”| Phương pháp | Cách thức hoạt động |
|---|---|
| Khóa TRX | Đóng băng TRX để lấy Năng lượng. Phần chia của bạn: (số TRX bạn đã Khóa ÷ tổng số TRX đã Khóa trên toàn mạng lưới) × 180,000,000,000 đơn vị/ngày |
| Đốt TRX theo nhu cầu | 100 SUN cho mỗi đơn vị Năng lượng (0.0001 TRX). Được sử dụng tự động khi Năng lượng từ việc Khóa TRX của bạn đã cạn kiệt. |
Mạng lưới phân bổ 180 tỷ Năng lượng mỗi ngày cho tất cả người Khóa TRX (stakers). Năng lượng đã Khóa sẽ dần dần phục hồi trong 24 giờ.
Khóa TRX để lấy Năng lượng (tronweb)
Phần tiêu đề “Khóa TRX để lấy Năng lượng (tronweb)”// Task: Đóng băng TRX gốc để có được tài nguyên Năng lượng cho các lệnh gọi Hợp đồng thông minh.// Khóa 1,000 TRX lấy Năng lượng (số tiền bằng SUN: 1 TRX = 1,000,000 SUN)await tronWeb.trx.freezeBalanceV2( 1_000_000_000, // SUN 1, // loại tài nguyên: 0 = Băng thông, 1 = Năng lượng);
// Kiểm tra số dư Năng lượng sau đóconst resources = await tronWeb.trx.getAccountResources('TYourAddress...');console.log('Năng lượng khả dụng:', resources.EnergyLimit - resources.EnergyUsed);Ưu tiên tiêu thụ
Phần tiêu đề “Ưu tiên tiêu thụ”- Năng lượng đã Khóa (miễn phí, phục hồi trong 24 giờ)
- Đốt TRX với tỷ giá 100 SUN mỗi đơn vị
Băng thông
Phần tiêu đề “Băng thông”Băng thông đo kích thước giao dịch tính bằng byte. Mỗi giao dịch tiêu thụ Băng thông tỷ lệ thuận với độ dài byte của nó trong cơ sở dữ liệu mạng lưới.
Cách có được Băng thông
Phần tiêu đề “Cách có được Băng thông”| Phương pháp | Cách thức hoạt động |
|---|---|
| Cấp phát miễn phí | 600 Băng thông mỗi tài khoản mỗi ngày, tự động — đủ cho khoảng 2–3 giao dịch chuyển khoản TRX đơn giản |
| Khóa TRX | Thêm Băng thông từ việc Khóa TRX. Tổng bể mạng lưới: 43,200,000,000 đơn vị/ngày |
| Đốt TRX theo nhu cầu | 1,000 SUN mỗi đơn vị Băng thông khi lượng cấp phát miễn phí và lượng đã Khóa bị cạn kiệt |
Giao dịch chuyển khoản TRX và chuyển token TRC-10 chỉ tốn Băng thông (không tốn Năng lượng). Lệnh gọi Hợp đồng thông minh tốn cả hai: Băng thông cho các byte của giao dịch, Năng lượng cho việc thực thi.
Mô hình Năng lượng Động (DEM)
Phần tiêu đề “Mô hình Năng lượng Động (DEM)”Mô hình Năng lượng Động (DEM) áp dụng một hệ số phạt cho các hợp đồng tiêu thụ nhiều hơn tỷ lệ của chúng trong bể Năng lượng hàng ngày của mạng lưới. Nó ngăn chặn việc một Hợp đồng đơn lẻ độc quyền hóa tài nguyên của mạng.
Cách thức hoạt động của tỷ lệ phạt (Punitive Scaling)
Phần tiêu đề “Cách thức hoạt động của tỷ lệ phạt (Punitive Scaling)”Mô hình giới thiệu một biến số tên là energy_factor cho mỗi Hợp đồng.
- Trạng thái Bình thường:
energy_factor = 0. Bạn trả chi phí Năng lượng cơ bản. - Trạng thái Tắc nghẽn: Nếu mức tiêu thụ Năng lượng của một Hợp đồng vượt qua một ngưỡng nhất định (hiện tại là 5,000,000,000 năng lượng cho mỗi Kỷ nguyên (Epoch) 6 giờ), hệ số
energy_factorsẽ tăng lên ở chu kỳ bảo trì khả dụng tiếp theo.
Hệ số này không tăng đột biến ngay lập tức. Nó mở rộng theo cấp số nhân trong suốt mỗi kỳ bảo trì (sự kiện 6-giây vào cuối mỗi Kỷ nguyên 6-giờ) mà Hợp đồng vẫn nằm trên mức ngưỡng:
- Kỳ 1:
energy_factor = 0.2(Tổng chi phí: 1.2x cơ bản) - Kỳ 2:
energy_factor = (1 + 0.2) * (1 + 0.2) - 1 = 0.44(Tổng chi phí: 1.44x cơ bản) - Tiếp tục: Việc này diễn ra cho tới khi nó chạm trần
3.4.
Các thông số Mainnet
Phần tiêu đề “Các thông số Mainnet”| Thông số | Giá trị |
|---|---|
| Ngưỡng hằng ngày | 5,000,000,000 Năng lượng |
| Hệ số tăng | 0.2 — tiền phạt tăng 20% mỗi chu kỳ đánh giá khi vượt trên ngưỡng |
| Hệ số tối đa | 3.4 — tiền phạt có thể lên tới 340% mức cơ bản |
| Hệ số giảm | 0.25 — tiền phạt giảm khi Hợp đồng rớt xuống dưới mức ngưỡng |
Công thức chi phí hiệu dụng
Phần tiêu đề “Công thức chi phí hiệu dụng”Năng lượng Cuối cùng = Năng lượng Cơ bản × (1 + energy_factor)Bài toán: Phạt 3.4x so với Tổng chi phí 4.4x
Phần tiêu đề “Bài toán: Phạt 3.4x so với Tổng chi phí 4.4x”Các nhà phát triển và người dùng thường bối rối về việc phí tối đa là 3.4x hay 4.4x. Đây là điểm khác biệt:
- Hệ số 3.4x (
energy_factor): Đây chính là giá trị “phạt”. Khi một Hợp đồng được sử dụng rất nhiều,energy_factortăng lên cho đến khi đạt mức trần (cap) là 3.4. - Hệ số 4.4x (Tổng hệ số nhân): Vì công thức năng lượng tổng cộng là
Năng lượng Cơ bản × (1 + energy_factor), hệ số phạt tối đa 3.4 dẫn tới chi phí cuối cùng gấp 4.4 lần năng lượng cơ sở (1 (Cơ sở) + 3.4 (Phạt) = 4.4).
Khi bạn thấy 3.4x, nó đề cập đến khoản phạt cộng thêm. Khi bạn thấy 4.4x (hoặc 440%), nó đề cập tới chi phí cuối cùng tổng cộng mà bạn đang bị tính.
Năng lượng cơ bản cho việc chuyển USDT là ~14,650 (người đã nắm giữ USDT) hoặc ~29,650 (người nhận với số dư 0). Tại energy_factor = 0 (không tắc nghẽn): 14,650 Năng lượng. Tại mức hệ số phạt tối đa (phạt 340%, energy_factor = 3.4): 14,650 × 4.4 = ~64,460 Năng lượng (người đã nắm giữ) hoặc 29,650 × 4.4 = ~130,460 Năng lượng (tài khoản mới).
Kiểm tra Hệ số Hiện tại của một Hợp đồng
Phần tiêu đề “Kiểm tra Hệ số Hiện tại của một Hợp đồng”# Task: Truy vấn hệ số Năng lượng động hiện tại cho một Hợp đồng cụ thể.curl -X POST https://api.trongrid.io/wallet/getcontractinfo \ -d '{ "value": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "visible": true }'
# Phản hồi bao gồm: trường "energy_factor"Thiết lập Giới hạn Phí (Fee Limits)
Phần tiêu đề “Thiết lập Giới hạn Phí (Fee Limits)”Mọi giao dịch làm thay đổi trạng thái (state-changing) đều yêu cầu một feeLimit — mức TRX tối đa mà người gọi sẵn sàng đốt nếu Năng lượng cạn kiệt. (Hãy nghĩ về điều này giống như việc thiết lập một thời gian chờ giới hạn hoặc hạn mức chi tiêu nghiêm ngặt trên một truy vấn cơ sở dữ liệu phức tạp để đảm bảo rằng một lỗi lập trình không làm cạn kiệt tài khoản của bạn).
| Thuộc tính | Giá trị |
|---|---|
| Đơn vị | SUN (1 TRX = 1,000,000 SUN) |
| Tối đa cho phép | 15,000 TRX (15,000,000,000 SUN) |
| Mặc định nếu bỏ trống | Được xác định qua mã triển khai, thường quá thấp |
| Nếu vượt mức | Giao dịch hoàn tác (reverts); một phần của giới hạn phí bị tiêu thụ |
// Task: Xác định số TRX tối đa bị đốt để lấy Năng lượng trước khi một giao dịch hoàn tác.await contract.someMethod(arg1, arg2).send({ feeLimit: 150_000_000, // Tối đa 150 TRX shouldPollResponse: true, // Đợi xác nhận});Ước tính Năng lượng Trước khi Thiết lập Giới hạn Phí
Phần tiêu đề “Ước tính Năng lượng Trước khi Thiết lập Giới hạn Phí”Phương pháp 1 — triggerconstantcontract (mô phỏng không cần phát sóng)
# Task: Mô phỏng một quá trình thực thi hợp đồng mà không phát lên mạng lưới để ước tính Năng lượng.curl -X POST https://api.trongrid.io/wallet/triggerconstantcontract \ -d '{ "owner_address": "TCallerAddress...", "contract_address": "TContractAddress...", "function_selector": "transfer(address,uint256)", "parameter": "000000000000000000000000<recipient_hex_without_41>...", "visible": true }'Trả về energy_used. Nhân với 1.5–2.0× như một biên độ an toàn khi thiết lập feeLimit (việc mô phỏng chạy tại hệ số hiện tại; hệ số trên mainnet có thể tăng lên trước khi giao dịch của bạn xác nhận).
Phương pháp 2 — estimateenergy (java-tron 4.7.0.1+, chính xác hơn)
# Task: Sử dụng API estimateenergy để lấy dữ liệu tiêu thụ theo thời gian thực một cách chính xác.curl -X POST https://api.trongrid.io/wallet/estimateenergy \ -d '{ "owner_address": "TCallerAddress...", "contract_address": "TContractAddress...", "function_selector": "transfer(address,uint256)", "parameter": "...", "visible": true }'Quy tắc Ngón tay cái (Rule of Thumb)
Phần tiêu đề “Quy tắc Ngón tay cái (Rule of Thumb)”Giới hạn phí (TRX) ≈ (Năng lượng ước tính × 2) ÷ 10,000Cho một chuyển khoản USDT đến người đã nắm giữ ở mức phạt DEM tối đa (14,650 cơ bản × 4.4 = ~64,460 Năng lượng) với biên độ 1.5×:
96,690 ÷ 10,000 ≈ 10 TRX → thiết lập feeLimit = 10_000_000 (hoặc 20 TRX để bao trọn luôn các giao dịch chuyển tài khoản mới).
Ủy quyền Phí (Fee Delegation)
Phần tiêu đề “Ủy quyền Phí (Fee Delegation)”Ủy quyền phí cho phép một người triển khai hợp đồng trợ cấp một phần hoặc toàn bộ chi phí Năng lượng cho người dùng gọi Hợp đồng của họ. Người dùng trả ít hơn hoặc không trả gì cả; Năng lượng đã Khóa của người triển khai sẽ gánh chịu chi phí đó. Đây là nền tảng cho trải nghiệm UX không tốn phí (gasless) trong các dApp trên TRON.
Hai Thông số khi Triển khai
Phần tiêu đề “Hai Thông số khi Triển khai”| Thông số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
consume_user_resource_percent | 0–100 | 100 | Tỷ lệ phần trăm Năng lượng do người gọi chịu. Đặt bằng 0 nếu người triển khai trả 100%. |
origin_energy_limit | uint | thay đổi | Năng lượng tối đa người triển khai cung cấp cho mỗi lần gọi đơn. Hoạt động như một hạn mức trần trên mỗi cuộc gọi cho các khoản trợ cấp từ người triển khai. |
Người Triển khai Trả Toàn bộ Phí
Phần tiêu đề “Người Triển khai Trả Toàn bộ Phí”// Task: Triển khai một hợp đồng nơi người triển khai trợ cấp 100% phí Năng lượng của người dùng.const deployed = await tronWeb.contract().new({ abi: compiledAbi, bytecode: compiledBytecode, feeLimit: 1_000_000_000, userFeePercentage: 0, // Người dùng trả 0% Năng lượng originEnergyLimit: 10_000_000, // Người triển khai chi trả tới 10M Năng lượng mỗi lần gọi});Với userFeePercentage: 0, những người gọi không cần Năng lượng đã Khóa và có thể thiết lập feeLimit: 0. Các giao dịch của họ thành công miễn là bể Năng lượng của người triển khai là đủ và lệnh gọi nằm trong khoảng originEnergyLimit.
Chia sẻ Phí (Người Triển khai 70%, Người Dùng 30%)
Phần tiêu đề “Chia sẻ Phí (Người Triển khai 70%, Người Dùng 30%)”// Task: Triển khai một hợp đồng với chi phí Năng lượng chia sẻ (30% cho người dùng, 70% người triển khai).const deployed = await tronWeb.contract().new({ abi: compiledAbi, bytecode: compiledBytecode, feeLimit: 1_000_000_000, userFeePercentage: 30, // Người dùng trả 30% Năng lượng originEnergyLimit: 5_000_000, // Người triển khai chi trả tới 5M Năng lượng mỗi lần gọi});Tính toán Giới hạn Năng lượng (Energy Limit Calculation)
Phần tiêu đề “Tính toán Giới hạn Năng lượng (Energy Limit Calculation)”Tổng EnergyLimit có sẵn cho một cuộc gọi = Năng lượng khả dĩ của người gọi + Năng lượng khả dĩ của người triển khai
Khả dĩ của người gọi = min( feeLimit ÷ 100 SUN, ← đã chuyển đổi sang đơn vị Năng lượng Năng lượng đã Khóa của người gọi + số dư TRX ÷ 100 SUN)
Khả dĩ của người triển khai = min( origin_energy_limit, ← trần mỗi cuộc gọi Năng lượng đã Khóa hiện tại của người triển khai)Nếu cuộc gọi yêu cầu nhiều Năng lượng hơn tổng số này, nó sẽ bị hoàn tác. Thông số originEnergyLimit của người triển khai giúp ngăn chặn một lệnh gọi đắt đỏ hay có ác ý duy nhất nào đó làm cạn kiệt toàn bộ bể Khóa của người triển khai.
Định cỡ originEnergyLimit
Phần tiêu đề “Định cỡ originEnergyLimit”Nên thiết lập originEnergyLimit để bao phủ Năng lượng tối đa cho hàm Hợp đồng đắt nhất của bạn có thể tiêu thụ, bao gồm cả hệ số nhân từ Mô hình Năng lượng Động (DEM):
originEnergyLimit ≥ chi_phí_năng_lượng_cơ_bản × max_energy_factor
Ví dụ cho một hàm DeFi phức tạp (100,000 cơ bản × 3.4 hệ số tối đa):originEnergyLimit = 340,000Hãy đặt một mức hào phóng trong suốt quá trình phát triển và thắt chặt lại sau khi bạn có dữ liệu gọi thực từ lịch sử giao dịch TRONSCAN.
Ủy quyền Tài nguyên (Khóa TRX và Ủy quyền cho một Địa chỉ khác)
Phần tiêu đề “Ủy quyền Tài nguyên (Khóa TRX và Ủy quyền cho một Địa chỉ khác)”Tách biệt khỏi việc ủy quyền phí cấp độ Hợp đồng, bạn có thể ủy quyền các tài nguyên đã Khóa của mình cho một địa chỉ khác. Hữu ích cho:
- Chi trả chi phí Năng lượng của một ví nóng mà không cấp cho nó quyền truy cập vào lượng TRX của bạn
- Cung cấp Năng lượng cho một tài khoản Hợp đồng nhằm kích hoạt các địa chỉ người dùng mới
- Tài trợ Phí mạng nơi một tài khoản kho bạc biệt lập chi trả các chi phí hoạt động của dApp
# Task: Ủy quyền Năng lượng đã Khóa thủ công cho một địa chỉ khác.curl -X POST https://api.trongrid.io/wallet/delegateresource \ -d '{ "owner_address": "TStakerAddress...", "receiver_address": "TOperatorAddress...", "balance": 1000000000, "resource": "ENERGY", "lock": false, "visible": true }'// Task: Quản lý việc ủy quyền tài nguyên có lập trình thông qua SDK.// Ủy quyềnawait tronWeb.trx.delegateResource( 1_000_000_000, // SUN 'TOperatorAddress...', 'ENERGY', 'TStakerAddress...', false,);
// Thu hồiawait tronWeb.trx.undelegateResource( 1_000_000_000, 'TOperatorAddress...', 'ENERGY', 'TStakerAddress...',);Ủy quyền có Khóa cứng (Locked Delegation)
Phần tiêu đề “Ủy quyền có Khóa cứng (Locked Delegation)”Việc thiết lập lock: true với một khoản lock_period (tính bằng khối, xấp xỉ 3 giây mỗi khối) sẽ ngăn chặn người Khóa TRX thu hồi tài nguyên trong khoảng thời gian xác định — hữu ích cho các thỏa thuận mức độ dịch vụ nơi người nhận cần sự đảm bảo về tính khả dụng của tài nguyên:
{ "lock": true, "lock_period": 86400 // ~3 ngày (86,400 khối × 3s ≈ 259,200 giây)}API Solidity để Khóa TRX
Phần tiêu đề “API Solidity để Khóa TRX”Các hợp đồng có thể Khóa TRX, ủy quyền và biểu quyết trực tiếp từ bên trong Solidity bằng cách sử dụng các tiện ích mở rộng precompile của TVM. Hữu ích cho các hợp đồng quản lý nguồn vốn của người dùng và cần tối ưu hóa các chi phí tài nguyên thông qua lập trình.
// Task: Thực thi việc Khóa TRX và ủy quyền trực tiếp từ logic hợp đồng sử dụng precompiles.// Khóa TRX để lấy Năng lượng từ bên trong một hợp đồngaddress(0x100000b).delegatecall( abi.encode(uint(amount), uint(1)) // freezeBalanceV2);
// Hoặc sử dụng cú pháp cấp cao (tvm-solc 0.8.18+)address payable receiver = payable(receiverAddress);receiver.delegateResource(amount, 1); // 1 = Năng lượngreceiver.unDelegateResource(amount, 1);
// Biểu quyết cho các Siêu Đại diện (Super Representatives)address[] memory srList = new address[](1);uint[] memory tpList = new uint[](1);srList[0] = srAddress;tpList[0] = votingPower;address(srList[0]).vote(srList, tpList);Danh sách kiểm tra Trước khi Triển khai
Phần tiêu đề “Danh sách kiểm tra Trước khi Triển khai”| Kiểm tra | Lưu ý |
|---|---|
Chạy triggerconstantcontract trên bản sao mainnet | Lấy số Năng lượng cơ bản, đừng lấy mức ước tính testnet |
Nhân với 1.5–2.0× cho feeLimit | Mức biên độ cho sự thay đổi của DEM |
Kiểm tra energy_factor cho hợp đồng mục tiêu | USDT và các Hợp đồng phổ biến khác thường có hệ số trên 0 |
Thiết lập originEnergyLimit nếu sử dụng ủy quyền phí | Phải bao phủ lệnh gọi ở trường hợp xấu nhất bao gồm khoản phạt động |
| Dành ngân sách cho kích hoạt người dùng đầu tiên (25,000 Năng lượng) | Bắt buộc khi Hợp đồng chuyển cho các địa chỉ chưa được kích hoạt |
| Đảm bảo ví của người triển khai đã Khóa đủ Năng lượng | Người triển khai Khóa thiếu TRX = người dùng trả phí bất ngờ |