Cơ bản về Solidity
Cần ôn lại ngôn ngữ này? Xem lại cú pháp Solidity, khả năng tương thích EVM và các mẫu thiết kế dành riêng cho TRON.
Hướng dẫn này là bệ phóng đưa bạn vào hệ sinh thái TRON. Vào cuối bài viết này, bạn sẽ có một hợp đồng thông minh được triển khai và hiểu biết vững chắc về các công cụ cơ bản, cách quản lý tài nguyên và kết nối mạng an toàn. Chúng tôi giả định bạn đã có kiến thức cơ bản về JavaScript và Solidity — bắt đầu xây dựng nào.
Trước khi viết bất kỳ mã nào, hãy đảm bảo môi trường cục bộ của bạn có những yếu tố thiết yếu sau:
node --version)Bạn không bao giờ nên trộn lẫn tiền cá nhân của mình với môi trường phát triển. Các công cụ phát triển yêu cầu quyền truy cập vào private key để ký các đợt triển khai và bằng cách tạo một ví “sandbox” riêng biệt, độc lập, bạn hoàn toàn loại bỏ rủi ro vô tình đốt TRX thật trong một tập lệnh thử nghiệm bị lỗi.
Mọi thao tác thay đổi blockchain (như triển khai hợp đồng) đều tiêu thụ tài nguyên mạng (Năng lượng và Băng thông). Trên Mainnet, điều này tốn TRX thật. Trên một testnet, bạn sử dụng “TRX Testnet” miễn phí, vô giá trị để mô phỏng các chi phí này mà không gặp rủi ro tài chính.
TRON duy trì hai mạng testnet công khai chính:
Đối với việc phát triển chung và bám sát hướng dẫn này, chúng ta sẽ sử dụng Nile vì đây là hộp cát tiêu chuẩn cho các nhà phát triển mới. Hãy cấp vốn cho ví của bạn:
Biên dịch Solidity xuống bytecode và đẩy nó lên blockchain một cách thủ công qua các yêu cầu HTTP thô rất tẻ nhạt và dễ sinh lỗi. TronBox là framework tiêu chuẩn giúp tự động hóa quá trình biên dịch, triển khai và luồng thử nghiệm, giữ cho dự án của bạn được tổ chức gọn gàng.
# Task: Cài đặt framework TronBox toàn cầu để bạn có thể sử dụng nó từ bất kỳ thư mục nào.npm install -g tronboxtronbox --versionHãy tạo một thư mục làm việc sạch sẽ:
# Task: Khởi tạo một dự án TronBox mới để tạo cấu trúc thư mục cần thiết.mkdir my-tron-projectcd my-tron-projecttronbox initTronBox tạo ra một cấu trúc tiêu chuẩn cho bạn:
/contracts/: Nơi chứa các tệp Solidity thô của bạn./migrations/: Các tập lệnh chỉ định chính xác cách thức các hợp đồng của bạn nên được triển khai./test/: Nơi bạn sẽ viết các bài kiểm tra để đảm bảo logic của bạn không có lỗ hổng.tronbox.js: Tệp cấu hình gốc.TronBox cần biết nơi để triển khai các hợp đồng của bạn (các endpoint của mạng lưới) và ai sẽ trả phí cho việc triển khai (private key của ví dev của bạn). Chúng tôi sử dụng các biến môi trường (.env) để nhúng private key một cách linh hoạt nhằm tránh việc nó bị hardcode vào các tệp mã nguồn của bạn.
Thay thế nội dung của tronbox.js bằng cấu hình này:
// Task: Chỉ định cho TronBox cách kết nối với mạng Nile testnet một cách an toàn.module.exports = { networks: { nile: { privateKey: process.env.PRIVATE_KEY_NILE, userFeePercentage: 100, feeLimit: 1000000000, fullHost: 'https://nile.trongrid.io', network_id: '3', }, mainnet: { privateKey: process.env.PRIVATE_KEY_MAINNET, userFeePercentage: 100, feeLimit: 1000000000, fullHost: 'https://api.trongrid.io', network_id: '1', }, }, compilers: { solc: { version: '0.8.18', }, },};Tạo một tệp .env trong thư mục gốc của dự án của bạn (và thêm nó vào .gitignore ngay lập tức!):
# Task: Lưu trữ an toàn private key testnet của bạn ra khỏi quản lý mã nguồn.PRIVATE_KEY_NILE=your_nile_dev_wallet_private_key_here(Để lấy private key của bạn: Mở TronLink → chọn tài khoản dev của bạn → nhấp vào menu ba chấm → Export Account).
Máy ảo TRON (TVM) tương thích cao với Máy ảo Ethereum (EVM). Điều này có nghĩa là chúng ta viết các hợp đồng của mình bằng Solidity. Khi chúng ta biên dịch, TronBox dịch mã Solidity con người có thể đọc được này thành bytecode mà máy có thể đọc được và tạo ra một ABI (Giao diện Nhị phân Ứng dụng), đóng vai trò như một “cuốn sổ tay” hướng dẫn cách các frontend có thể tương tác với hợp đồng.
Tạo một tệp mới tại contracts/SimpleStorage.sol:
// Task: Định nghĩa một hợp đồng tối giản giúp lưu trữ và truy xuất một số duy nhất.// SPDX-License-Identifier: MITpragma solidity ^0.8.18;
contract SimpleStorage { uint256 private value;
// Các Event cho phép các frontend lắng nghe những thay đổi trên blockchain event ValueSet(uint256 indexed newValue, address indexed setter);
// Các hàm 'external' có thể được gọi bởi người dùng hoặc các hợp đồng khác function set(uint256 _value) external { value = _value; emit ValueSet(_value, msg.sender); }
// 'view' có nghĩa là hàm này đọc dữ liệu nhưng không thay đổi blockchain function get() external view returns (uint256) { return value; }}Bây giờ, hãy yêu cầu TronBox biên dịch nó:
# Task: Dịch mã Solidity thành bytecode sẵn sàng cho TVM và ABI.tronbox compileNhìn vào bên trong thư mục build/contracts/. TronBox vừa tạo ra các tạo tác cần thiết cho việc triển khai.
Blockchain là một cỗ máy trạng thái. “Di trú” đơn giản có nghĩa là dịch chuyển blockchain từ trạng thái hiện tại sang một trạng thái mới bao gồm hợp đồng của bạn. Tập lệnh di trú cho TronBox biết chính xác những hợp đồng nào cần triển khai và theo thứ tự nào.
Tạo migrations/2_deploy_simple_storage.js:
// Task: Hướng dẫn TronBox triển khai hợp đồng SimpleStorage.const SimpleStorage = artifacts.require('SimpleStorage');
module.exports = function (deployer) { deployer.deploy(SimpleStorage);};Đã đến lúc biến nó thành hiện thực. Bằng cách chạy lệnh migrate, TronBox sẽ xây dựng một giao dịch triển khai, ký nó bằng private key trong .env của bạn và phát nó lên mạng Nile. Mạng lưới sẽ khấu trừ TRX Testnet (Năng lượng/Băng thông) để lưu trữ bytecode của hợp đồng của bạn vĩnh viễn.
# Task: Phát hợp đồng của bạn lên mạng lưới để đưa nó vào hoạt động.source .env # Tải private key của bạn vào phiên làm việc của terminaltronbox migrate --network nileQuan sát terminal. TronBox sẽ xuất ra một địa chỉ hợp đồng đã được triển khai (bắt đầu bằng T...). Sao chép địa chỉ này.
Kiểm tra thành quả: Đi đến nile.tronscan.org và tìm kiếm địa chỉ hợp đồng mới của bạn. Bạn sẽ thấy lượng Năng lượng chính xác đã được tiêu thụ và giao dịch triển khai đã được xác minh. Bạn chính thức đã hiện diện trên TRON.
Một hợp đồng thông minh không mấy hữu ích nếu không ai có thể nói chuyện với nó. tronweb là SDK JavaScript chính thức. Chúng ta sử dụng nó để kết nối một tập lệnh Node.js (hoặc một frontend React) trực tiếp với blockchain nhằm thực thi các hàm set() và get() của chúng ta.
Đầu tiên, cài đặt SDK:
# Task: Thêm SDK TronWeb vào dự án của bạn để cho phép giao tiếp với blockchain.npm install tronwebTạo scripts/interact.js:
// Task: Sử dụng TronWeb để đọc từ và ghi vào hợp đồng live của bạn.import TronWeb from "tronweb"
// Khởi tạo TronWeb với endpoint Nile và key dev của bạnconst tronWeb = new TronWeb({ fullHost: 'https://nile.trongrid.io', privateKey: process.env.PRIVATE_KEY_NILE,});
const CONTRACT_ADDRESS = 'T...'; // Dán địa chỉ đã được triển khai của bạn vào đây!
async function main() { // Tải ABI để TronWeb biết những hàm nào tồn tại const contract = await tronWeb.contract().at(CONTRACT_ADDRESS);
console.log('Thực thi thao tác ghi...'); // .send() tạo ra một giao dịch, đốt Năng lượng, và thay đổi trạng thái blockchain const tx = await contract.set(42).send(); console.log('Hash giao dịch:', tx);
console.log('Thực thi thao tác đọc...'); // .call() là một truy vấn cục bộ, miễn phí tới một node. Nó không làm thay đổi trạng thái. const result = await contract.get().call(); console.log('Giá trị hiện đang được lưu trữ on-chain:', result.toString());}
main().catch(console.error);Chạy tập lệnh tương tác của bạn:
# Task: Thực thi tập lệnh để trò chuyện với Nile testnet.node scripts/interact.jsXin chúc mừng! Bạn đã hoàn thành thành công toàn bộ vòng đời phát triển DApp trên TRON. Bạn hiện có:
tronweb để đọc và ghi vào blockchain.Bạn đã có nền tảng. Bây giờ là lúc để xây dựng một cái gì đó phức tạp hơn.
Cơ bản về Solidity
Cần ôn lại ngôn ngữ này? Xem lại cú pháp Solidity, khả năng tương thích EVM và các mẫu thiết kế dành riêng cho TRON.
Hợp đồng Thông minh
Đã sẵn sàng viết các logic phức tạp? Đi sâu vào các hành vi đặc thù của TVM và các kỹ thuật tối ưu hóa Năng lượng.
tronweb SDK
Muốn xây dựng một frontend? Nhận tài liệu tham khảo đầy đủ về quản lý tài khoản, ký giao dịch và lắng nghe sự kiện.
Mô hình phí & Tài nguyên
Tự hỏi tại sao việc triển khai tốn Năng lượng? Tìm hiểu cách mô hình tài nguyên của TRON khác biệt so với Phí mạng truyền thống.