TRON采用账户模型,账户的唯一标识为地址(address),对账户操作需要私钥签名。每个账户可以拥有TRX、TRC10 Token、带宽、能量等各种资源。通过发送交易可以增减TRX或者TRC10 Token余额,可以发布并拥有智能合约,也可以调用自己或者他人发布的智能合约。可以申请成为超级代表并被投票,也可以对超级代表进行投票等等。TRON所有的活动都围绕账户进行。

账户类型

TRON账户类型分为两种:

  • 普通账户。即外部账户,由拥有该账户私钥的人控制
  • 合约账户。一个部署到TRON网络上的智能合约就是一个合约账户,由代码控制,没有人拥有合约账户的私钥。

所有类型的账户都可以:

  • 接收,持有和发送TRX/其它tokens
  • 与部署的智能合约交互

账户及密钥对

帐户由一对加密密钥组成:公钥和私钥。公钥映射为地址,私钥用来对交易进行签名。这对密钥不但可以防止交易被篡改和伪造,而且还可以证明交易确实是由发送方所发送。

由于可以通过密钥对来验证交易的发送方,因此可以防止恶意参与者传播虚假交易。

如果Alice想要将TRX从她自己的账户发送到Bob的账户,那么Alice需要创建一个交易,然后将其发送到TRON网络,TRON网络需要验证该交易。密钥对的使用确保了Alice可以证明是她发起的交易请求。如果没有这个密钥机制,恶意的对手Eve就可以简单地公开广播一个类似于“从Alice的账户中发送5个TRX到Eve的账户中”的请求,而没有人能够验证它是不是来自于Alice。

外部账户的创建

对于创建账户,有非常多的库和工具可以选择,它们会生成一个随机的私钥。私钥由64个十六进制字符组成。公钥的生成基于私钥,并使用椭圆曲线数字签名算法来生成对应的公钥。基于公钥可以计算出地址。

账户地址格式

TRON网络账户地址有两种格式,一种是Hex格式,另一种是Base58格式。

  • Hex格式
    用公钥P作为输入,计算SHA3得到结果H,取H的最后20字节,在前面填充一个字节0x41得到Hex格式地址。例如:

    418840E6C55B9ADA326D211D818C34A994AECED808
    
  • Base58格式
    对hex格式的地址进行basecheck计算得到Base58格式地址,所有账户地址的第一个字符均为T。例如:

    TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL
    

    使用tronweb进行Hex和Base58格式转换示例:

    tronWeb.address.toHex("TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL")
    > "418840E6C55B9ADA326D211D818C34A994AECED808"
    
    tronWeb.address.fromHex("418840E6C55B9ADA326D211D818C34A994AECED808")
    > "TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL"
    

创建账户的几种方式

可以通过以下几种方式创建TRON网络账户,也就是生成一个私钥和对应的地址。

  • 使用命令行钱包wallet-cli离线创建账户
    wallet> GenerateAddress
    {
        "address": "TU6JdEDQGPus64LTMksvnxF2cv4FQrXPCa",
        "privateKey": "b1ba1db577a36421924a87026cda27523851c6e88123d0a0a1def9a974376176"
    }
    
  • 使用SDK离线创建账户
    以tronweb为例:
    tronWeb.createAccount()
    > address:
    {
        base58: "TDpBe64DqirkKWj6HWuR1pWgmnhw2wDacE"
        hex: "412A2B9F7641D0750C1E822D0E49EF765C8106524B"
        privateKey: "427139B43028A492E2705BCC9C64172392B8DB59F3BA1AEDAE41C88924960091"
        publicKey:"0404B604296010A55D40000B798EE8454ECCC1F8900E70B1ADF47C9887625D8BAE3866351A6FA0B5370623268410D33D345F63344121455849C9C28F9389ED9731"
    }
    
  • 使用钱包应用生成私钥和地址

激活账户

新创建的账户在链上并不存在,需要激活后,才能通过API查询或者通过区块链浏览器搜索到,可以通过以下两种方式激活账户:

  • 由已有老账户往新账户地址发送任意数量的TRX或者TRC-10代币,完成账户的激活。
  • 使用已有的老账户调用Java-tron的wallet/createaccount接口创建一个交易,然后签名并广播到网络,也能完成对一个新账户的激活。

激活账户需要支付1TRX的账户创建费用,另外上面两种激活新账户的交易,如果交易发送者账户有足够的质押获得的带宽,那么这笔交易消耗的带宽会从发送者账户质押获得的带宽中扣除,否则,会消耗0.1 TRX来支付带宽费用。

在合约中向一个未激活的账户地址转账TRX或TRC-10代币,也能完成这个账户的激活。这种方式除了正常合约调用需要消耗的带宽和能量外,只会额外消耗25,000 能量,不会消耗1TRX的账户创建费用和0.1TRX的带宽费用。

合约账户

将合约部署到TRON区块链时,得到相应的合约账户地址,该地址由部署合约交易的ID以及发送者账户地址计算所得。合约账户和外部账户的地址格式相同,可以是hex格式或者Base58格式,例如:

Hex:   TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t 
Base58:41A614F803B6FD780986A42C78EC9C7F77E6DED13C