智能合约
智能合约 "是在 TRON 网络上运行的应用程序。它是代码(其功能)和数据(其状态)的集合,位于 TRON 网络上的特定账户地址。智能合约是 TRON 账户的一种。这意味着它们有余额,可以在网络上发送交易。不过,它们不受用户控制,而是被部署到网络上并按程序运行。用户账户可以通过提交交易与智能合约互动,执行智能合约上定义的功能,但与智能合约的互动是不可逆的。
智能合约的最佳比喻或许是自动售货机。只要有正确的输入,就能保证一定的输出。自动售货机中就有这样的逻辑:钱+零食选择=零食分配,然后用户就可以从自动售货机中获得零食。
智能合约就像自动售货机一样,也有编程逻辑。下面是智能合约的一个简单例子–自动售货机:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract VendingMachine {
// 声明合约的状态
address public owner;
mapping (address => uint) public cupcakeBalances;
// When 'VendingMachine' contract is deployed:
// 1. 将部署地址设为合约的所有者
// 2. 将已部署智能合约的蛋糕金额设置为 100
constructor() {
owner = msg.sender;
cupcakeBalances[address(this)] = 100;
}
// Allow the owner to increase the smart contract's cupcake balance
function refill(uint amount) public {
require(msg.sender == owner, "Only the owner can refill.");
cupcakeBalances[address(this)] += amount;
}
// Allow anyone to purchase cupcakes
function purchase(uint amount) public payable {
require(msg.value >= amount * 1 trx , "You must pay at least 1 TRX per cupcake");
require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase");
cupcakeBalances[address(this)] -= amount;
cupcakeBalances[msg.sender] += amount;
}
}
就像自动售货机消除了对供应商雇员的需求一样,智能合约可以取代许多行业的中间商。
智能合约的属性
TRON 网络中的智能合约具有以下属性:
-
无权限
任何人都可以编写智能合约并将其部署到 TRON 网络。您只需学习如何用智能合约语言编码,并拥有足够的 TRX 来部署您的合约。从技术上讲,部署智能合约是一项交易,因此您需要像支付简单的 TRX 转账一样支付资源费。不过,部署合约所消耗的资源要高得多。TRON 拥有方便开发人员编写智能合约的语言:Solidity。不过,在部署之前必须对其进行编译,以便 TRON 虚拟机能够解释和存储合约。
-
可组合性
智能合约在 TRON 网络上是公开的,可视为开放式 API。这意味着您可以在自己的智能合约中调用其他智能合约,从而极大地扩展可能的功能。合约甚至可以部署其他合约。您不需要编写自己的智能合约就能成为 dapp 开发者,您只需要知道如何与它们交互。例如,您可以使用去中心化交易所 SunSwap 的现有智能合约来处理应用程序中的所有代币交换逻辑,而无需从头开始。
智能合约的限制
TRON 网络智能合约有以下限制:
-
无法与外部系统通信
智能合约无法直接与外部系统通信,因此智能合约本身无法获得 “真实世界 ”事件的信息,这一瓶颈限制了智能合约的应用场景,但这是设计的初衷。依赖外部信息可能会危及共识,而共识对于安全性和去中心化非常重要。但甲骨文可以用来解决这个问题。 -
智能合约的最长执行时间
为了确保网络的高吞吐量和稳定运行,TRON 将 TVM 的最大执行时间设置为 80ms,以确保 TRON 网络每 3 秒就能生成一个新区块,因此智能合约允许的最大执行时间为 80ms。TVM 的最长执行时间是 TRON 网络的第 13 个动态参数,超级代表委员会可以通过发起提案来修改该参数。对于复杂的智能合约,执行可能会超时并触发 OUT_OF_TIME 错误,调用者将被扣除全部的 fee_limit 费用。因此,为避免智能合约超时执行,应尽量将大合约拆分成小合约,并根据需要相互引用,同时注意常见陷阱和递归调用,避免无限循环。