如何使用JavaScript在TRON上部署智能合约并与之交互

  • QuickNode
  • 发布于 2025-02-17 18:48
  • 阅读 44

本文档介绍了如何使用Solidity、JavaScript和Tron的开发者工具在TRON区块链上部署和交互智能合约。内容包括TRON区块链的介绍,使用TronBox创建和部署智能合约,以及使用TronWeb JS库与智能合约交互。同时,也提到了TRON的一些独特特性,如DPoS共识机制和资源模型,并提供了开发者设置和环境配置的详细步骤。

概述

TRON 是一个开源的公共区块链平台,支持智能合约。凭借其关键特性和创新方法,TRON 提供了一个高性能的基础设施,用于执行智能合约并以高 TPS 水平处理交易。

术语“每秒交易数”(TPS)描述了一个网络在一秒内可以处理多少笔交易。

由于与以太坊的兼容性,熟悉以太坊的开发者可以毫不费力地在 TRON 区块链上构建去中心化应用程序(dApp)。从以太坊到 TRON 的过渡是平滑和简化的,允许将 dApp 无缝集成到 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 保持与以太坊的兼容性,但它也拥有使其与众不同的独特功能。这些独特的属性有助于 TRON 的吸引力并扩大了开发者和用户的可能性。其中一些特殊功能包括:

  • DPoS 共识机制: 为了验证区块和交易,TRON 使用委托权益证明 (DPoS) 系统,其中 27 个超级代表每六个小时轮换一次。

  • 能源效率: 由于其超级代表方法,委托权益证明 (DPoS) 减少了网络维护和交易验证所需的能量。

  • 资源模型: TRON 网络上的交易需要支付带宽和能量费用,其中带宽是指交易中的字节数,而能量是指 TVM (TRON 虚拟机) 在 TRON 网络上进行指定活动所需的计算量的测量单位。

在 TRON 网络中,区块生产者被称为超级代表。它们是通过投票过程选出的。得票数最高的 27 名候选人最终被选为超级代表。

开发者设置

使用 QuickNode 访问 TRON

要在 TRON 上构建,你需要一个 API 终结点来连接网络。 欢迎使用公共节点或部署和管理你自己的基础设施;但是,如果你想要快 8 倍的响应时间,可以将繁重的工作交给我们。 在此处注册一个帐户。

在本指南中,为方便起见,我们将使用 TRON Nile 测试网。 因此,我们将使用公共终结点进行开发。 但是,我们建议在 TRON 主网上工作时使用 QuickNode 的终结点。 QuickNode 的终结点提供增强的可靠性和性能,确保在开发过程中获得更流畅的体验。

QuickNode Endpoints

为钱包充值

让我们通过 TRON 团队共享的 faucet 为钱包充值。 该 faucet 在 TRON Nile 测试网上提供免费的 TRX。

我们假设你已经设置了一个要充值的钱包,如果你还没有这样做,请通过安装 TRON 兼容的自托管 Web3 钱包(例如 TronLink)来进行设置。

  • 通过 TronLink 扩展程序获取你的钱包地址 TronLink Wallet
  • 转到 faucet
  • 在“获取 2000 个测试币”下的框中键入你的钱包地址。
  • 解决验证码并单击“获取”按钮

设置项目

你需要一个终端窗口(即Terminal、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
  • contracts:Solidity 智能合约应位于此文件夹中。

    • contracts/Migrations.sol: 用于管理和升级智能合约的预先编写的 Solidity 文件。 这是每个项目中都必需的,通常保持不变。
  • migrations:部署脚本应位于此文件夹中。

    • migrations/1_initial_migration.js: 此脚本用于部署 Migrations 合约。
    • migrations/2_deploy_contracts.js: 用于部署其他合约的部署脚本。 我们将在以下各节中对其进行修改。
  • test:所有用于测试智能合约的脚本都应位于此处。 测试不在本指南的范围内。
  • sample-env: 示例 .env 文件。 它对于安全地处理环境变量很有用。 我们将在以下各节中介绍它。
  • tronbox.js: TronBox 配置文件,用于配置网络信息和其他项目相关参数。 我们可以保持原样。

智能合约部署

创建智能合约

现在,通过运行这些命令,让我们在 contracts 文件夹中创建 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. 变量:
    • totalMessages 是一个计数器,用于跟踪通过合约发送的消息总数。
    • lastMessage 是一个字符串变量,用于存储最后发送的消息的内容。
  2. 事件:
    • 每当设置新消息时,都会发出 NewMessage 事件。 它包括发送者的地址、消息内容和时间戳。
  3. 构造函数:
    • 构造函数在部署智能合约时执行,并以初始消息作为参数。 它调用 setMessage 函数来设置初始消息。
  4. setMessage 函数:
    • 此函数允许用户通过提供字符串参数 _message 来设置新消息。
    • 它首先通过比较它们的哈希值来检查新消息是否与最后一条消息不同。 如果它们相同,则会抛出错误消息。
    • 如果新消息不同,它会递增 totalMessages 计数器,更新 lastMessage 变量,并发出 NewMessage 事件。
  5. getLastMessage 函数:
    • 此函数通过返回 lastMessage 变量的值来检索最后一条消息的内容。
  6. getTotalMessages 函数:
    • 此函数通过返回 totalMessages 计数器的值来检索已发送的消息总数。

智能合约提供了一个简单的消息传递系统,用户可以在其中设置和检索消息,同时确保不存储重复消息。 它还通过使用事件来跟踪和监视区块链上的消息更新来提供透明度。

准备部署

修改配置文件

在本节中,你将设置配置文件并编译智能合约。

向上导航一个目录以更改目录。

cd ..

然后,打开定义所有网络(主网、测试网等)和编译器设置的 tronbox.js 文件。

有关配置文件的更多详细信息,请在此处进行说明。

你可能会注意到诸如 process.env.PRIVATE_KEY_MAINNETprocess.env.PRIVATE_KEY_SHASTAprocess.env.PRIVATE_KEY_NILE 之类的变量。 必须提供你的钱包的私钥,该私钥应安全地提供,因为私钥不得公开共享。 因此,应通过运行以下代码将 dotenv 包安装到 tronbox 目录中。

npm install dotenv --save

要获取你的私钥:

  • 打开 TronLink 钱包扩展程序
  • 打开“钱包管理”菜单
  • 选择“导出帐户”
  • 选择“私钥”
  • 输入你的密码
  • 复制你的私钥

TronLink

然后,创建一个 .env 文件并通过运行以下代码写入你的私钥。 不要忘记将 YOUR_PRIVATE_KEY 替换为你的钱包的私钥。

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。 这样,可以确保 Git 不跟踪 .env 文件。

编译

然后,编译智能合约。

tronbox compile

这就是控制台输出的样子。

Compiling ./contracts/Migrations.sol...
Compiling ./contracts/SendMessage.sol...
Writing artifacts to ./build/contracts

部署

现在是将智能合约部署到测试网的时候了。 合约部署 (migrations) 由 migrations 文件夹中的脚本文件处理。

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 智能合约在 constructor 函数中接受一个参数 (_message),因此,"Hi QuickNode!" 指示此参数。 你可以将其更改为你想要的任何内容。

运行命令以将智能合约部署到 Nile 测试网。

确保终端的目录是 tronbox

source .env && tronbox migrate --network nile

输出应如下所示。 部署的智能合约的地址(以 base58hex 表示)在你部署时会有所不同。

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 Nile 测试网上部署了你的第一个智能合约!

可以在 TRON Nile 测试网浏览器上检查这些智能合约。

  • 转到 TRON Nile 测试网浏览器
  • 将 SendMessage 智能合约的 base58 地址 (对我而言是 TPDnWBU9mD4VSYmGbXVrKsocvuqBFJuFPk) 粘贴到搜索栏中,然后按“Enter”

智能合约可能需要几分钟才能在浏览器中建立索引。

与智能合约交互

本指南说明如何通过脚本文件与智能合约交互。 但是,请记住,有多种方法可以与它们交互。

通过脚本文件交互

在主项目目录 (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 项目并安装 tronwebdotenvprompt-sync 包。

npm init --yes
npm install tronweb
npm install dotenv
npm install prompt-sync

然后,创建一个空的 JavaScript 文件。

echo > sendMessage.js

然后,使用你的代码编辑器打开文件并将以下代码粘贴到你的文件中。 不要忘记将 BASE58_SENDMESSAGE_CONTRACT_ADDRESS 更改为已部署的 SendMessage 智能合约的合约地址 (base58)。

此脚本文件分别执行获取当前消息询问用户是否要更改消息发送事务以更改消息获取新的当前消息

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 文件并通过运行以下代码写入你的私钥。 不要忘记将 YOUR_PRIVATE_KEY 替换为你的钱包的私钥。

echo "export PRIVATE_KEY_NILE=YOUR_PRIVATE_KEY" > .env

现在,你已准备好运行脚本!

node sendMessage.js

控制台显示当前消息,然后询问你是否要发送新消息。

  • 如果要发送新消息,请键入 1 并按 Enter
  • 然后,控制台会询问新消息。
  • 键入你想要的任何内容,然后按 Enter

更改消息的事务将发送到区块链。 然后,用于检查浏览器上事务的链接和当前消息将显示在终端中。

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 ❤️

结论

恭喜你取得的成就! 在整个学习过程中,我们一直在这里指导你。 从为你的钱包充值到设置 QuickNode 终结点并使用 TronBox 建立开发环境,你已经获得了在 TRON 测试网上创建和部署智能合约并与之交互的必要技能。

一旦你掌握了测试网上的开发,并准备好将你的技能应用到主网,你可以在此处注册一个免费的 QuickNode 帐户并创建一个 TRON 主网终结点。

如果遇到任何问题或有任何疑问,我们很乐意为你提供帮助! 在 DiscordTwitter 上找到我们。

我们 ❤️ 反馈!

如果你对新主题有任何反馈或要求,请告诉我们。 我们很乐意收到你的来信。

  • 原文链接: quicknode.com/guides/tro...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。