跳至主要內容

如何TRON JavaScript 在TRON 上部署智慧合約並與其互動

更新於
Aug 07, 2026

閱讀時間 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.js18.16.0
tronbox3.3.0
tronweb5.2.0
dotenv16.2.0
prompt-sync4.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端點具備更高的可靠性和效能,能確保開發過程更加順暢。

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 擴充功能取得您的錢包地址 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:用於部署其他合約的部署腳本。我們將在接下來的章節中對其進行修改。
  • 測試:所有用於測試智慧合約的腳本都應放在此處。本指南不涵蓋測試相關內容。
  • 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 旨在促進區塊鏈上的訊息傳遞功能。它允許使用者設定和檢索訊息,同時追蹤已發送訊息的總數。該智慧合約包含以下關鍵要素:

  1. 變數:

    • 總訊息數 是一個用於追蹤透過該合約傳送的訊息總數的計數器。
    • lastMessage 是一個字串變數,用來儲存最後一則已傳送訊息的內容。
  2. 活動:

    • 新訊息 這是一個每當有新訊息被設定時便會觸發的事件。該事件包含發送者的地址、訊息內容以及時間戳記。
  3. 建構函式:

    • 建構函式會在智慧合約部署時執行,並將初始訊息作為參數傳入。它會呼叫 setMessage 用於設定初始訊息的功能。
  4. setMessage 功能:

    • 此函式允許使用者透過提供字串參數來設定新訊息 _message.
    • 它首先會透過比較兩者的雜湊值,來檢查新訊息是否與上一則訊息不同。若兩者相同,則會拋出錯誤訊息。
    • 如果新訊息不同,則會將 總訊息數 計數器,更新 lastMessage 變數,並輸出 新訊息 活動。
  5. getLastMessage 功能:

    • 此函式會透過傳回 lastMessage 變數。
  6. 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 錢包擴充功能
  • 開啟 錢包管理 選單
  • 選擇 匯出帳戶
  • 選擇 私鑰
  • 請輸入您的密碼
  • 複製您的私鑰

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。

如果您遇到任何問題或有任何疑問,我們很樂意為您提供協助!歡迎在DiscordTwitter 上聯絡我們。