閱讀時間 12 分鐘
概覽
TRON 開源且支援智慧合約的公有區塊鏈平台。憑藉其關鍵功能與創新方法TRON 高效能的基礎架構,用於執行智慧合約並以高 TPS 水準處理交易。
「每秒交易量」(TPS)一詞用以描述一個網路在單一秒內能夠處理的交易數量。
由於Ethereum相容Ethereum 熟悉Ethereum 開發者Ethereum 輕鬆地在TRON 建置去中心化應用程式(dApps)。Ethereum TRON 流暢且簡便TRON 使 dApps 能無縫整合至TRON 。
在本指南中,您將學習如何使用 Solidity、JavaScript 以及Tron 的開發者工具,在TRON 部署智慧合約並與其互動。
您將負責的工作內容
- 了解TRON
- 使用 TronBox 在TRON 建立並部署智慧合約
- 使用 TronWeb JS 函式庫與智慧合約進行互動
您需要準備的物品
- 對區塊鏈概念的基本了解
- 具備 JavaScript 和Solidity的知識
- 已安裝Node.js(版本 18.16 或更高)
- 已安裝TronBox(版本 3.3 或更高)
- TronWeb(5.2 版或更高版本)——安裝說明將於本指南中詳述。
- dotenv(版本 16.2 或更高)——安裝說明將於本指南中詳述。
- prompt-sync(版本 4.2 或更高)——安裝說明將於本指南中詳述。
- 程式碼編輯器(例如Visual Studio Code)
- 一款TRON 自主保管型 Web3 錢包(例如TronLink)
您可以點擊上方的連結,並依照相關說明,分別下載並安裝各項依賴項。
本指南中使用的依賴項
| 依賴關係 | 版本 |
|---|---|
| node.js | 18.16.0 |
| tronbox | 3.3.0 |
| tronweb | 5.2.0 |
| dotenv | 16.2.0 |
| prompt-sync | 4.2.0 |
TRON的獨特特點
雖然TRON Ethereum相容性,但也具備使其脫穎而出的獨特功能。這些獨特特性不僅提升了TRON 的吸引力,也為開發者和使用者開拓了更多可能性。其中部分特殊功能包括:
-
DPoS 共識機制:為了驗證區塊和TRON 「委託權益證明」(DPoS)系統,其中 27 位超級代表每六小時輪流擔任。
-
能源效率: 委託權益證明(DPoS)機制透過其「超級代表」的運作方式,降低了網路維護與交易驗證所需的能源消耗。
-
資源模型: TRON 交易需支付頻寬費與能源費,其中「頻寬」指交易中的位元組數,「能源」則是衡量 TVM(TRON 機器)在TRON 執行指定活動所需運算量的單位。
在TRON ,區塊生產者被稱為「超級代表」。他們是透過投票程序選出。最終,得票數最高的 27 位候選人將被選為超級代表。
開發者設定
TRON Quicknode存取TRON
若要在TRON 上進行開發,您需要一個 APIendpoint 連線至網路。您可以自由選擇使用公開節點,或自行部署並管理基礎架構;不過,若您希望將回應時間縮短 8 倍,不妨將繁重的工作交給我們處理。請點此註冊帳號。
Testnet 方便Testnet 本指南將使用TRON Testnet 。因此,我們將在開發過程中使用公開的端點。不過,若您要在TRON mainnet進行開發,我們建議使用Quicknode端點。Quicknode端點具備更高的可靠性和效能,能確保開發過程更加順暢。

向錢包充值
Let's fund the wallet via the faucet that shared by the TRON team. The faucet gives free TRX on TRON Nile Testnet.
我們假設您已經設定好錢包以進行充值;若尚未設定,請安裝一個TRON 自主保管型 Web3 錢包(例如TronLink)來完成設定。
- 透過 TronLink 擴充功能取得您的錢包地址

- 前往水龍頭
- 請在下方方框中輸入您的錢包地址:
獲得 2000 枚測試幣。 - 請完成驗證碼,然後點擊
取得按鈕
設定專案
您需要一個終端機視窗(例如「終端機」、「Windows PowerShell」)以及一個程式碼編輯器(例如「Visual Studio Code」),才能設定此專案。
請在終端機中執行以下程式碼,以建立所需的資料夾:
mkdir send-message
cd send-message
mkdir tronbox
cd tronbox
接著,請使用以下指令建立一個簡單的專案。
tronbox init
它會建立一些在部署過程中相當實用的資料夾和檔案。該資料夾結構位於 tronbox 資料夾應呈現如下樣貌:
├── contracts
│ └── Migrations.sol
├── migrations
│ ├── 1_initial_migration.js
│ └── 2_deploy_contracts.js
├── sample-env
├── test
├── tronbox-config.js
└── tronbox.js
- 合約: Solidity 智慧合約應存放於此資料夾中。
- contracts/Migrations.sol:一個用於管理及升級智慧合約的預先編寫好的 Solidity 檔案。每個專案都必須包含此檔案,且通常保持不變。
- 遷徙: 部署腳本應存放於此資料夾中。
- migrations/1_initial_migration.js: 此腳本用於部署
遷徙合約。 - migrations/2_deploy_contracts.js:用於部署其他合約的部署腳本。我們將在接下來的章節中對其進行修改。
- migrations/1_initial_migration.js: 此腳本用於部署
- 測試:所有用於測試智慧合約的腳本都應放在此處。本指南不涵蓋測試相關內容。
- sample-env:範例 .env 檔案。此檔案有助於安全地處理環境變數。我們將在接下來的章節中詳細說明。
- tronbox.js:這是 TronBox 的設定檔,用於設定網路資訊及其他與專案相關的參數。我們可以維持現狀。
智慧合約部署
建立智慧合約
現在,透過執行這些指令,讓我們建立 SendMessage.sol 位於 合約 資料夾。
cd contracts
echo > SendMessage.sol
接著,請使用您的程式碼編輯器開啟該檔案。複製以下程式碼,並將其貼上至該檔案中。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;
contract SendMessage {
uint256 totalMessages; // Counter for total number of messages
string lastMessage; // Variable to store the last message
event NewMessage(address indexed from, string message, uint256 timestamp); // Event to emit when a new message is set
constructor(string memory _message) {
setMessage(_message); // Set the initial message when the contract is deployed
}
// Function to set a new message
function setMessage(string memory _message) public {
require(
(keccak256(abi.encodePacked(lastMessage)) !=
keccak256(abi.encodePacked(_message))),
"Same message" // Check if the new message is different from the last message
);
totalMessages += 1; // Increment the total message count
lastMessage = _message; // Update the last message variable
emit NewMessage(msg.sender, _message, block.timestamp); // Emit an event for the new message
}
// Function to retrieve the last message
function getLastMessage() public view returns (string memory) {
return lastMessage; // Get the last message
}
// Function to retrieve the total number of messages
function getTotalMessages() public view returns (uint256) {
return totalMessages; // Get the total number of messages
}
}
智慧合約邏輯
智慧合約 SendMessage 旨在促進區塊鏈上的訊息傳遞功能。它允許使用者設定和檢索訊息,同時追蹤已發送訊息的總數。該智慧合約包含以下關鍵要素:
-
變數:
總訊息數是一個用於追蹤透過該合約傳送的訊息總數的計數器。lastMessage是一個字串變數,用來儲存最後一則已傳送訊息的內容。
-
活動:
新訊息這是一個每當有新訊息被設定時便會觸發的事件。該事件包含發送者的地址、訊息內容以及時間戳記。
-
建構函式:
- 建構函式會在智慧合約部署時執行,並將初始訊息作為參數傳入。它會呼叫
setMessage用於設定初始訊息的功能。
- 建構函式會在智慧合約部署時執行,並將初始訊息作為參數傳入。它會呼叫
-
setMessage功能:- 此函式允許使用者透過提供字串參數來設定新訊息
_message. - 它首先會透過比較兩者的雜湊值,來檢查新訊息是否與上一則訊息不同。若兩者相同,則會拋出錯誤訊息。
- 如果新訊息不同,則會將
總訊息數計數器,更新lastMessage變數,並輸出新訊息活動。
- 此函式允許使用者透過提供字串參數來設定新訊息
-
getLastMessage功能:- 此函式會透過傳回
lastMessage變數。
- 此函式會透過傳回
-
getTotalMessages功能:- 此函式透過回傳的值來取得已傳送訊息的總數,該值為
總訊息數計數器。
- 此函式透過回傳的值來取得已傳送訊息的總數,該值為
智慧合約提供了一個簡單的消息傳遞系統,使用者可在其中設定和檢索訊息,同時確保不會儲存重複的訊息。此外,它還透過事件機制來追蹤和監控區塊鏈上的訊息更新,從而確保透明度。
部署前的準備工作
修改設定檔
在本節中,您將設定配置檔案並編譯智慧合約。
向上瀏覽一個目錄以變更當前目錄。
cd ..
接著,開啟 tronbox.js 定義所有網路(mainnet、測試網等)及編譯器設定的檔案。
關於設定檔的更詳細資訊,請參閱此處說明。
您可能會注意到像這樣的變數: process.env.PRIVATE_KEY_MAINNET, process.env.PRIVATE_KEY_SHASTA,以及 process.env.PRIVATE_KEY_NILE. 您必須提供錢包的私鑰,且應以安全的方式提供,因為私鑰絕不能公開分享。因此,該 dotenv 該套件應安裝在 tronbox 執行這段程式碼即可建立該目錄。
npm install dotenv --save
要取得您的私鑰;
- 開啟 TronLink 錢包擴充功能
- 開啟
錢包管理選單 - 選擇
匯出帳戶 - 選擇
私鑰 - 請輸入您的密碼
- 複製您的私鑰

接著,建立一個 .env 請執行以下程式碼來建立並寫入您的私密金鑰。請勿忘記將 您的_私鑰 並使用您的錢包私鑰。
echo "export PRIVATE_KEY_NILE=YOUR_PRIVATE_KEY" > .env
該 tronbox 目前,資料夾結構應如下所示。
請注意,
.env,.gitignore,以及.git-folder-keeper是隱藏檔案。
├── .env
├── .gitignore
├── contracts
│ ├── Migrations.sol
│ └── SendMessage.sol
├── migrations
│ ├── 1_initial_migration.js
│ └── 2_deploy_contracts.js
├── sample-env
├── test
│ └── .git-folder-keeper
├── tronbox-config.js
└── tronbox.js
請確保
.gitignore檔案包含.env. 這樣一來,就能確保該.env該檔案未被 Git 追蹤。
編譯
接著,編譯智慧合約。
tronbox 編譯
控制台的輸出將呈現如下樣貌。
Compiling ./contracts/Migrations.sol...
Compiling ./contracts/SendMessage.sol...
Writing artifacts to ./build/contracts
部署
現在是將智慧合約部署到testnet的時候了。合約部署(遷徙) 由位於 遷徙 資料夾。
該 1_initial_migration.js 該檔案已預先寫好,因此您無需編輯此檔案。不過,建議您使用程式碼編輯器開啟檔案以檢查內容。內容應如下所示。
var Migrations = artifacts.require("./Migrations.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations);
};
現在,請開啟 2_deploy_contracts.js 使用您的程式碼編輯器開啟該檔案,並根據以下內容進行修改。
var MyContract = artifacts.require("./SendMessage.sol");
module.exports = function(deployer) {
deployer.deploy(MyContract, "Hi Quicknode!");
};
SendMessage 智慧合約接受一個參數(_message) 在 建構函式 函式,所以, 「Quicknode!」 表示此參數。您可以將其改為任何您想要的值。
執行此指令,將智慧合約部署至 NileTestnet。
請確認終端機的當前目錄為
tronbox.
source .env && tronbox migrate --network nile
輸出結果應如上所示。當您部署時,已部署智慧合約的位址(以Base58 和十六進位制表示)將會有所不同。
Using network 'nile'.
Running migration: 1_initial_migration.js
Deploying Migrations...
Migrations:
(base58) TLp71KNc3bZah88Pwo8MuHma9pKUsCP4hK
(hex) 4176f0a2987d97a3dbb376807558697a339fee0fe6
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying SendMessage...
SendMessage:
(base58) TPDnWBU9mD4VSYmGbXVrKsocvuqBFJuFPk
(hex) 41915b6cc017b44eba2c7af7ddb94885ab3c34e1c5
Saving successful migration to network...
Saving artifacts...
恭喜!您剛剛在TRON Testnet成功部署了您的第一個智慧合約!
您可以在TRON Testnet 上查看這些智慧合約。
- 前往TRON Testnet
- 請貼上 SendMessage 智慧合約的 Base58 位址(TPDnWBU9mD4VSYmGbXVrKsocvuqBFJuFPk 對我來說) 輸入搜尋欄中,然後按下
輸入
智慧合約在區塊鏈瀏覽器中被索引可能需要幾分鐘時間。
與智慧合約互動
本指南說明如何透過腳本檔案與智慧合約進行互動。不過,請記住,與智慧合約互動的方式有多種。
透過腳本檔案進行互動
在主專案目錄(send-message)中建立一個新資料夾(tronweb),用來寫入一個基本腳本檔案。
cd ..
mkdir tronweb
cd tronweb
目前,資料夾結構應如下所示。
├── tronbox
│ ├── .env
│ ├── .gitignore
│ ├── build
│ │ └── contracts
│ │ ├── Migrations.json
│ │ └── SendMessage.json
│ ├── contracts
│ │ ├── Migrations.sol
│ │ └── SendMessage.sol
│ ├── migrations
│ │ ├── 1_initial_migration.js
│ │ └── 2_deploy_contracts.js
│ ├── sample-env
│ ├── test
│ │ └── .git-folder-keeper
│ ├── tronbox-config.js
│ └── tronbox.js
└── tronweb
執行這些指令,即可建立一個空的 npm 專案並安裝 tronweb, dotenv,以及 prompt-sync 套件。
npm init --yes
npm install tronweb
npm install dotenv
npm install prompt-sync
接著,建立一個空的 JavaScript 檔案。
echo > sendMessage.js
接著,請使用您的程式碼編輯器開啟該檔案,並將以下程式碼貼入檔案中。請別忘了將 BASE58_SENDMESSAGE_CONTRACT_ADDRESS 寄至合約地址(base58) 您已部署的 SendMessage 智慧合約。
此腳本檔案分別執行以下操作:取得當前訊息、詢問使用者是否要變更訊息、傳送一筆用於變更訊息的交易,以及取得新的當前訊息。
const TronWeb = require("tronweb");
const prompt = require("prompt-sync")();
require("dotenv").config();
const tronWeb = new TronWeb({
fullHost: "https://nile.trongrid.io",
privateKey: process.env.PRIVATE_KEY_NILE,
});
async function sendMessage() {
contractAddress = "BASE58_SENDMESSAGE_CONTRACT_ADDRESS";
let contract = await tronWeb.contract().at(contractAddress);
let lastMessage = await contract.getLastMessage().call();
console.log(`The current message is: ${lastMessage}`);
let input = prompt("Do you want to send a new message? ([1]: Yes, [2]: No) ");
if (input == 1) {
let newMessage = prompt("Type your new message: ");
let txId = await contract.setMessage(newMessage).send();
console.log(
`Check tx on the explorer: https://nile.tronscan.org/#/transaction/${txId}`
);
lastMessage = await contract.getLastMessage().call();
console.log(`The current message is: ${lastMessage}`);
}
}
sendMessage();
在腳本檔案中,您可能會注意到這個變數
process.env.PRIVATE_KEY_NILE. 為了將交易發送至區塊鏈,需要一個私鑰。因此,我們將使用dotenv與我們在智慧合約部署中使用的相同套件。
建立一個 .env 請執行以下程式碼來建立並寫入您的私密金鑰。請勿忘記將 您的_私鑰 並使用您的錢包私鑰。
echo "export PRIVATE_KEY_NILE=YOUR_PRIVATE_KEY" > .env
現在,您可以執行這個腳本了!
node sendMessage.js
主控台會顯示當前的訊息,然後詢問您是否要傳送新訊息。
- 類型
1並按下輸入如果您想傳送新訊息。 - 接著,主控台會要求輸入新訊息。
- 輸入任何內容,然後按下
輸入.
用於變更訊息的交易將被發送至區塊鏈。隨後,終端機上將顯示用於在區塊鏈瀏覽器中查閱該交易的連結,以及當前的訊息內容。
The current message is: Hi Quicknode!
> Do you want to send a new message? ([1]: Yes, [2]: No) 1
> Type your new message: Quicknode ❤️
Check tx on the explorer: https://nile.tronscan.org/#/transaction/87119e102111de7a2d062feb005662e9fdf62170442d93b1f43853aeddabbfcd
The last message is: Quicknode ❤️
結論
恭喜您取得這項成就!在這段學習旅程中,我們始終陪伴在您身邊,在每一步都為您提供指引。從為錢包充值endpoint 設定Quicknode endpoint 到使用 TronBox 建立開發環境endpoint 您已掌握了在TRON Testnet 創建和部署智慧合約Testnet 其互動所需的各項技能。
當您已掌握testnet 的開發testnet 準備將技能應用於mainnet,可在此註冊一個免費的Quicknode ,並建立TRON mainnet endpoint。
