TRON 上的 Solidity:为 TVM 编写智能合约 — TRON Wiki

TRON 上的 Solidity:为 TVM 编写智能合约

11 分钟阅读 · ⌘K 搜索

Solidity 是TRON 智能合约的主导语言。熟悉以太坊ERC-20和DeFi模式的开发人员可以将他们的大部分知识移植到TRC-20和TVM——同时注意地址格式、能源成本和工具链差异。

本指南涵盖了TRON的 Solidity 约定、标准代币实现、常见陷阱以及从代码到主网的路径。

Solidity → TVM 管道

1.用pragma solidity写入.sol文件

2.通过TronBox/TronIDE编译→字节码+ABI

  1. 通过迁移或TronWeb进行部署
  2. 通过 TronWebHTTP 触发器 进行交互
  3. 验证TronScan来源

执行环境:TVM解释

TRC-20 模板

使用 OpenZeppelin 的标准可替代代币:

代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract ExampleToken is ERC20, Ownable {
    constructor() ERC20("Example", "EXM") Ownable(msg.sender) {
        _mint(msg.sender, 1_000_000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) external onlyOwner {
        _mint(to, amount);
    }
}

mintonlyOwner 很方便,但如果所有者密钥泄露则很危险 - 安全指南

地址处理

  • 链上address类型内部为20字节十六进制
  • TronWeb 转换 Base58 T... ↔ 十六进制 API
  • msg.sender是TVM中的合约调用者地址

始终验证输入:

代码
require(to != address(0), "zero address");

与以太坊 Solidity 的区别

主题以太坊习惯TRON调整
燃气gasleft()通过链式能源计量
block.timestamp~12 秒分辨率~3s 块
tx.origin反模式TRON 上仍然是反模式
Chainlink 预言机广泛应用验证TRON预言机可用性
feeLimit不适用在TronWeb发送选项中设置

在 Shasta 上重新测试重入防护、call 模式和 delegatecall

节能模式{#gas-efficiency}

  • 打包存储变量
  • 最小化链上字符串(部署时可接受的名称/符号)
  • 避免用户数组上的无限循环
  • 尽可能使用immutableconstant

昂贵的合同增加了集成商的USDT转移成本。

测试工作流程

  1. TronBox 编译

2.部署Shasta

  1. TronWeb脚本:转账、批准、transferFrom
  2. 模糊边缘情况:零金额、最大 uint、重入尝试

TRON 上的常见漏洞{#vulnerability}

与 EVM 相同的类:

  • 可重入性
  • 整数溢出(Solidity 0.8+ 有内置检查)
  • mint / withdraw 缺少访问控制
  • 蜜罐黑名单(恶意令牌)

审计员将以太坊方法应用于 TVM 字节码。

与 dApp 集成

通过 TronLink 注入的 TronWeb 进行前端调用:

代码
const contract = await tronWeb.contract(abi, contractAddress);
await contract.transfer(to, amount).send({ feeLimit: 100_000_000 });

后端:以编程方式发送 USDT

验证并发布 ABI

部署后:

  • TronScan合约验证
  • 在文档中为集成商发布 ABI
  • 记录管理职能和所有权

编译器版本固定

在 TronBox 配置中固定准确的 solc 版本。 TronScan 验证需要匹配的编译器设置,包括优化运行。即使源代码正确,不匹配的设置也无法验证。

导入路径和 OpenZeppelin

使用在TVM上测试过的@openzeppelin/contracts版本。一些以太坊特定的模式(例如某些预言机接口)需要调整。测试合约中的 SafeERC20 TRC-20 交互 — TRON 上存在非标准代币,其转账费用行为破坏了简单的集成。

相关指南 {#相关}

常见问题解答

我应该在 TRON 上使用哪个 Solidity 版本?

匹配您的 TronBox 或 TronIDE 编译器支持的版本 - 通常为 0.8.x。在生产中固定版本并在 TronScan 上使用相同的编译器进行验证。

我可以在 TRON 上使用 OpenZeppelin 合约吗?

是的。导入OpenZeppelin ERC20、Ownable等,用TronBox编译。验证许可证和版本兼容性。

Solidity 是唯一的选择吗?

坚固性占主导地位。一些工具尝试将其他语言编译为 TVM——生产代币几乎都是 Solidity。

如何调用另一个合约?

interface + Contract(addr).method() 模式与以太坊相同。

TRC-20 与 ERC20.sol 文件名相同吗?

OpenZeppelin 软件包名称显示为 ERC20,但作为 TRC-20 标准行为部署到 TRON。