# TRON 基础

### 代币体系

代币, token, 也叫通证，是公链体系的经济基础。

TRON 原生代币为 TRX, 链上相关操作费用均通过 TRX 支付（或通过临时锁仓冻结 TRX 获得的资源支付）。TRX 的最小单位是 SUN, `1_TRX = 1_000_000_SUN`.&#x20;

TRON 支持 TRC10 代币，一种集成在 TRON 基础设施的代币发行体系，相对于以太坊的代币发行体系(ERC20) 来说，它不需要通过智能合约和虚拟机，交易处理速度快，消耗资源少。TRC10 代币的符号和精度均可以自定义。

{% hint style="info" %}
TRC10 的交易处理逻辑是固定的，无法实现所谓的 "Programmable Money" 特性，只可以做代币使用。

除代币基础功能之外，TRC 10 支持在 ICO 阶段参与代币发行、按时间段锁仓。
{% endhint %}

TRON 支持基于智能合约的 TRC20 代币，等价于以太坊的 ERC20 代币。

由于 TRON 高度兼容以太坊智能合约，以太坊的其他代币体系也可轻松引入。例如不可分通证 ERC721.

代币可以通过交易所或他人转账的方式获取。测试网中的 TRX 可以通过水龙头地址申请。

### 密钥和地址

地址是区块链用户的唯一标识，同时也是智能合约的唯一标识。链上交易的发起者必须提供自己的地址并将消息用地址对应的私钥签名。

TRON 使用 Secp256k1 作为核心签名算法。与以太坊不同的是，签名的 `recover_id` 不需要 `+27` 偏移（即 `r, s, v` 中的 `v` 取值是 0 或 1）。

TRON 地址为大写字母 T 开头的 34 字符地址，例如 `T9zTTVfegCiJ5ovip4y2dCPiEdXT9EmtEw` 。以太坊地址前附加字节 0x41 后执行 Base58check 操作所得。

在多数 API 调用场合，需要使用 41 开头的 Hex 编码格式地址。例如 `41d497955836234a221a7d6f6496139a64f9766be7` 。在 TVM 虚拟机和 Solidity 编程中，需要再去掉前缀 41 成为和以太坊兼容的地址格式（20字节），例如 `0xd497955836234a221a7d6f6496139a64f9766be7`。

地址生成算法请参考 [Generate Address Offline](https://andelf.gitbook.io/tron/tron-by-example/generate-address-offline).

{% hint style="info" %}
以太坊编程中经常使用 0x 开头的 20 字节混合大小写 Hex 地址。这类地址叫做 Checksumed Address. 其大小写排列是一种校验机制，有效避免地址的错误拼写。

同时, Base58check 也是类似的一种校验机制，任意拼写错误都会导致非法地址。
{% endhint %}

### 账户体系

TRON 的记账方式使用 account-based model 而非 utxo-based model. 即与比特币不同，和以太坊相似。

以太坊的账户只有余额, code, storage, nonce 信息。TRON 中，账户余额信息，还有资源消耗，账户名字，账户权限等信息。

{% hint style="info" %}
TRON 账户没有 `nonce` 的概念。
{% endhint %}

一个地址只有在链上被创建为账户，才是被激活的账户。可以通过创建账户 API 或者向该账户转账激活指定账户。

### 交易

TRON 中的交易可以认为存在广义和狭义两种。

狭义的交易，指 TRX, TRC10 转账。

广义交易，指所有上链（被写入区块）的内置合约类型。包括：

```groovy
enum ContractType {
  // NOTE: unused or deprecated
  // BuyStorageContract = 21;
  // BuyStorageBytesContract = 22;
  // SellStorageContract = 23;
  AccountCreateContract = 0;
  TransferContract = 1;
  TransferAssetContract = 2;
  // NOTE: only used in active permission bits.
  OBSOLETE_VoteAssetContract = 3;
  VoteWitnessContract = 4;
  WitnessCreateContract = 5;
  AssetIssueContract = 6;
  WitnessUpdateContract = 8;
  ParticipateAssetIssueContract = 9;
  AccountUpdateContract = 10;
  FreezeBalanceContract = 11;
  UnfreezeBalanceContract = 12;
  WithdrawBalanceContract = 13;
  UnfreezeAssetContract = 14;
  UpdateAssetContract = 15;
  ProposalCreateContract = 16;
  ProposalApproveContract = 17;
  ProposalDeleteContract = 18;
  SetAccountIdContract = 19;
  // NOTE: only used in active permission bits.
  OBSOLETE_CustomContract = 20;
  CreateSmartContract = 30;
  TriggerSmartContract = 31;
  // NOTE: only used in active permission bits.
  OBSOLETE_GetContract = 32;
  UpdateSettingContract = 33;
  ExchangeCreateContract = 41;
  ExchangeInjectContract = 42;
  ExchangeWithdrawContract = 43;
  ExchangeTransactionContract = 44;
  UpdateEnergyLimitContract = 45;
  AccountPermissionUpdateContract = 46;
  ClearABIContract = 48;
  UpdateBrokerageContract = 49;
  // NOTE: Only used in active permission bits, and nile testnet.
  ShieldedTransferContract = 51;
}
```

### 资源模型

TRON 定义了两种资源，带宽(bandwidth)和能量(energy)。带宽用于支付交易上链成本，即所发送的交易越复杂，带宽消耗越高。能量用于支付智能合约虚拟机 TVM 的运行成本。智能合约的创建和功能调用，均需要消耗能量。

带宽和能量可以通过稳定费率燃烧(burn) TRX 支付。也可以提前通过锁仓冻结获得（浮动费率。不需要时可以解冻）。

智能合约的 pure/view 函数一般消耗资源较少，且不对合约储存进行改动，波场的 API 服务允许免费调用智能合约的 pure/view 函数。此时交易不上链，API 直接返回 TVM 虚拟机结果。
