本文档介绍了如何使用Solidity、JavaScript和Tron的开发者工具在TRON区块链上部署和交互智能合约。内容包括TRON区块链的介绍,使用TronBox创建和部署智能合约,以及使用TronWeb JS库与智能合约交互。同时,也提到了TRON的一些独特特性,如DPoS共识机制和资源模型,并提供了开发者设置和环境配置的详细步骤。
TRON 是一个开源的公共区块链平台,支持智能合约。凭借其关键特性和创新方法,TRON 提供了一个高性能的基础设施,用于执行智能合约并以高 TPS 水平处理交易。
术语“每秒交易数”(TPS)描述了一个网络在一秒内可以处理多少笔交易。
由于与以太坊的兼容性,熟悉以太坊的开发者可以毫不费力地在 TRON 区块链上构建去中心化应用程序(dApp)。从以太坊到 TRON 的过渡是平滑和简化的,允许将 dApp 无缝集成到 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 保持与以太坊的兼容性,但它也拥有使其与众不同的独特功能。这些独特的属性有助于 TRON 的吸引力并扩大了开发者和用户的可能性。其中一些特殊功能包括:
DPoS 共识机制: 为了验证区块和交易,TRON 使用委托权益证明 (DPoS) 系统,其中 27 个超级代表每六个小时轮换一次。
能源效率: 由于其超级代表方法,委托权益证明 (DPoS) 减少了网络维护和交易验证所需的能量。
资源模型: TRON 网络上的交易需要支付带宽和能量费用,其中带宽是指交易中的字节数,而能量是指 TVM (TRON 虚拟机) 在 TRON 网络上进行指定活动所需的计算量的测量单位。
在 TRON 网络中,区块生产者被称为超级代表。它们是通过投票过程选出的。得票数最高的 27 名候选人最终被选为超级代表。
要在 TRON 上构建,你需要一个 API 终结点来连接网络。 欢迎使用公共节点或部署和管理你自己的基础设施;但是,如果你想要快 8 倍的响应时间,可以将繁重的工作交给我们。 在此处注册一个帐户。
在本指南中,为方便起见,我们将使用 TRON Nile 测试网。 因此,我们将使用公共终结点进行开发。 但是,我们建议在 TRON 主网上工作时使用 QuickNode 的终结点。 QuickNode 的终结点提供增强的可靠性和性能,确保在开发过程中获得更流畅的体验。
让我们通过 TRON 团队共享的 faucet 为钱包充值。 该 faucet 在 TRON Nile 测试网上提供免费的 TRX。
我们假设你已经设置了一个要充值的钱包,如果你还没有这样做,请通过安装 TRON 兼容的自托管 Web3 钱包(例如 TronLink)来进行设置。
你需要一个终端窗口(即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
合约。现在,通过运行这些命令,让我们在 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
旨在促进区块链上的消息传递功能。 它允许用户设置和检索消息,同时跟踪发送的消息总数。 智能合约包括以下关键要素:
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
之类的变量。 必须提供你的钱包的私钥,该私钥应安全地提供,因为私钥不得公开共享。 因此,应通过运行以下代码将 dotenv
包安装到 tronbox
目录中。
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
。 这样,可以确保 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
输出应如下所示。 部署的智能合约的地址(以 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 测试网浏览器上检查这些智能合约。
智能合约可能需要几分钟才能在浏览器中建立索引。
本指南说明如何通过脚本文件与智能合约交互。 但是,请记住,有多种方法可以与它们交互。
在主项目目录 (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(`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 主网终结点。
如果遇到任何问题或有任何疑问,我们很乐意为你提供帮助! 在 Discord 或 Twitter 上找到我们。
如果你对新主题有任何反馈或要求,请告诉我们。 我们很乐意收到你的来信。
- 原文链接: quicknode.com/guides/tro...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!