这篇文章提供了一个关于如何在TRON区块链上部署和交互智能合约的全面指南,包括使用Solidity编写合约,使用JavaScript和Tron相关开发工具进行交互。文章详细介绍了所需的环境、依赖项配置、智能合约的逻辑与实现,以及如何通过CLI和脚本与合约进行交互,适合希望深入了解TRON开发的读者。
TRON 是一个开放源代码的公共区块链平台,能够实现智能合约。凭借其关键特性和创新方法,TRON 为高性能执行智能合约和处理高 TPS 水平的交易提供了基础设施。
“每秒交易数”(TPS)描述了一个网络在单秒内能够处理多少交易。
熟悉 Ethereum 的开发者可以轻松地在 TRON 区块链上构建去中心化应用程序(dApps),这是因为 TRON 与 Ethereum 兼容。从 Ethereum 迁移到 TRON 流畅且高效,允许 dApps 无缝集成到 TRON 网络。
在本指南中,你将学习如何使用 Solidity、JavaScript 和 TRON 的开发工具,在 TRON 区块链上部署和互动智能合约。
你可以点击上面的链接并按照说明下载和安装每个依赖项。
依赖项 | 版本 |
---|---|
node.js | 18.16.0 |
tronbox | 3.3.0 |
tronweb | 5.2.0 |
dotenv | 16.2.0 |
prompt-sync | 4.2.0 |
虽然 TRON 与 Ethereum 保持兼容,但它也拥有许多独特的特性,使其与众不同。这些独特属性增加了 TRON 的吸引力,并扩展了开发者和用户的可能性。一些特别的特性包括:
DPoS 共识机制:为了验证区块和交易,TRON 采用了 Delegated Proof-of-Stake (DPoS) 系统,其中 27 个超级代表每六小时轮换一次。
能源效率:由于其超级代表的方式,Delegated Proof-of-Stake (DPoS) 减少了网络维护和交易验证所需的能源。
资源模型:TRON 网络上的交易受带宽和能源费用的影响,其中带宽指交易中的字节数,能源指 TVM (TRON 虚拟机) 执行指定活动所需的计算量的单位。
在 TRON 网络中,区块生产者被称为 超级代表。它们通过投票过程选出,最终选择前 27 名获得最高票数的候选人作为超级代表。
要在 TRON 上构建,你需要一个 API 端点来连接网络。你可以使用公共节点或部署和管理你自己的基础设施;但是,如果你希望获得 8 倍的响应速度,你可以让我们来处理重任。在 此处 注册一个免费的帐户。
在本指南中,我们将使用 TRON Nile 测试网以方便开发。因此,我们将利用公共端点进行开发。但是,我们建议在 TRON 主网上时使用 QuickNode 的端点。QuickNode 的端点提供增强的可靠性和性能,确保开发过程中的更流畅体验。
让我们通过 TRON 团队分享的水龙头 为钱包充资。水龙头在 TRON Nile 测试网上提供免费的 TRX。
我们假设你已经设置了一个钱包以进行充资,如果尚未设置,请通过安装一个兼容 TRON 的自托管 Web3 钱包(例如 TronLink)来完成。
获取 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 智能合约应放在此文件夹中。
migrations: 部署脚本应位于此文件夹中。
Migrations
合约。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; // 总消息计数器
string lastMessage; // 存储最后一条消息的变量
event NewMessage(address indexed from, string message, uint256 timestamp); // 设置新消息时要发出的事件
constructor(string memory _message) {
setMessage(_message); // 合约部署时设置初始消息
}
// 设置新消息的函数
function setMessage(string memory _message) public {
require(
(keccak256(abi.encodePacked(lastMessage)) !=
keccak256(abi.encodePacked(_message))),
"相同的消息" // 检查新消息是否与最后一条消息不同
);
totalMessages += 1; // 增加总消息计数
lastMessage = _message; // 更新最后一条消息变量
emit NewMessage(msg.sender, _message, block.timestamp); // 发出新消息的事件
}
// 检索最后一条消息的函数
function getLastMessage() public view returns (string memory) {
return lastMessage; // 获取最后一条消息
}
// 检索总消息数量的函数
function getTotalMessages() public view returns (uint256) {
return totalMessages; // 获取总消息数量
}
}
智能合约 SendMessage
旨在实现区块链上的消息功能。它允许用户设置和检索消息,同时跟踪发送的消息总数。智能合约包含以下关键元素:
变量:
totalMessages
是一个计数器,用于跟踪通过合约发送的总消息数。lastMessage
是一个字符串变量,用于存储最后一条发送消息的内容。事件:
NewMessage
是一个事件,每当设置新消息时都会发出。它包括发送者的地址、消息内容和时间戳。构造函数:
setMessage
函数来设置初始消息。setMessage
函数:
_message
来设置新的消息。totalMessages
计数器,更新 lastMessage
变量,并发出 NewMessage
事件。getLastMessage
函数:
lastMessage
变量的值来检索最后一条消息的内容。getTotalMessages
函数:
totalMessages
计数器的值来检索发送的总消息数。智能合约提供了一个简单的消息系统,用户可以设置和检索消息,同时确保不存储重复消息。它还通过事件的使用提供了透明性,以跟踪和监视区块链上的消息更新。
在本节中,你将设置配置文件并编译智能合约。
向上导航一个目录以更改目录。
cd ..
然后,打开定义所有网络(主网、测试网等)和编译器设置的 tronbox.js
文件。
关于配置文件的更多详细信息在 这里 讲解。
你可能会注意到变量如 process.env.PRIVATE_KEY_MAINNET
、process.env.PRIVATE_KEY_SHASTA
和 process.env.PRIVATE_KEY_NILE
。提供你的钱包的私钥是必要的,私钥必须安全提供,因为私钥不应公开共享。因此,需要通过运行以下代码在 tronbox
目录中安装 dotenv
包。
npm install dotenv --save
获取你的私钥:
钱包管理
菜单导出账户
私钥
然后,创建一个 .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
。这样可以确保.env
文件不被 Git 跟踪。
然后,编译智能合约。
tronbox compile
这时控制台输出应该如下所示。
Compiling ./contracts/Migrations.sol...
Compiling ./contracts/SendMessage.sol...
Writing artifacts to ./build/contracts
是时候将智能合约部署到测试网。合约部署(迁移)由 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
输出应如下所示。部署的智能合约的地址(以 base58 和 hex 格式)在部署时会有所不同。
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 测试网浏览器上检查这些智能合约。
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 项目并安装 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
更改为你已部署的 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(`当前消息是: ${lastMessage}`);
let input = prompt("你想要发送新消息吗?([1]: 是,[2]: 否)");
if (input == 1) {
let newMessage = prompt("输入你的新消息: ");
let txId = await contract.setMessage(newMessage).send();
console.log(
`在浏览器上检查交易: https://nile.tronscan.org/#/transaction/${txId}`
);
lastMessage = await contract.getLastMessage().call();
console.log(`当前消息是: ${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
。发送更改消息的交易将被发送到区块链。然后,检查交易的链接及当前消息将显示在终端中。
当前消息是: Hi QuickNode!
> 你想要发送新消息吗?([1]: 是,[2]: 否)1
> 输入你的新消息: QuickNode ❤️
在浏览器上检查交易: https://nile.tronscan.org/#/transaction/87119e102111de7a2d062feb005662e9fdf62170442d93b1f43853aeddabbfcd
最后一条消息是: QuickNode ❤️
恭喜你的成就!在这段学习旅程中,我们在每一步都在这里指导你。从为你的钱包充足到设置 QuickNode 端点,再到使用 TronBox 建立开发环境,你已经获得了在 TRON 测试网上创建和部署智能合约以及与其交互所需的技能。
一旦你掌握了测试网的开发并准备将你的技能带到主网,你可以在 此处 注册一个免费的 QuickNode 账户并创建一个 TRON 主网端点。
如果你遇到任何问题或有任何疑问,我们很乐意帮助你!在 Discord 或 Twitter 找到我们。
告诉我们 如果你有任何反馈或新主题的请求。我们期待你的回复。
- 原文链接: quicknode.com/guides/oth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!