TRON 上的 Solidity:为 TVM 编写智能合约
Solidity 是TRON 智能合约的主导语言。熟悉以太坊ERC-20和DeFi模式的开发人员可以将他们的大部分知识移植到TRC-20和TVM——同时注意地址格式、能源成本和工具链差异。
本指南涵盖了TRON的 Solidity 约定、标准代币实现、常见陷阱以及从代码到主网的路径。
Solidity → TVM 管道
1.用pragma solidity写入.sol文件
2.通过TronBox/TronIDE编译→字节码+ABI
执行环境: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);
}
}
mint 与 onlyOwner 很方便,但如果所有者密钥泄露则很危险 - 安全指南。
地址处理
- 链上
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}
- 打包存储变量
- 最小化链上字符串(部署时可接受的名称/符号)
- 避免用户数组上的无限循环
- 尽可能使用
immutable和constant
昂贵的合同增加了集成商的USDT转移成本。
测试工作流程
- TronBox 编译
2.部署Shasta
- TronWeb脚本:转账、批准、transferFrom
- 模糊边缘情况:零金额、最大 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。
感谢你的反馈——帮助我们改进文档。