TronBox 快速入门

本文主要入门介绍如何创建 TronBox 项目以及部署智能合约。

在开始之前,最好对波场有基础的了解,推荐阅读波场文档

安装TronBox

在使用 TronBox 之前,请使用npm命令安装它。可以参考 安装TronBox

创建项目工程

TronBox 大多数命令都是在 TronBox 项目目录下运行的。 所以第一步是创建一个 TronBox 项目。 可以创建一个空项目模板,不过对于刚接触 TronBox 的同学,推荐使用 TronBox Boxes,它提供了示例应用代码和项目模板。 我们将使用 MetaCoin box 作为案例,它创建一个可以在帐户之间转移的 Token(代币)。

1.为 MetaCoin 项目创建一个新目录:

mkdir MetaCoin
cd MetaCoin

2.下载 MetaCoin 项目:

tronbox unbox metacoin

如果要创建没有合约的空工程,可以使用 tronbox init.

在操作完成之后,就有这样的一个项目结构:

项目结构

 这仅仅是一个入门。后面的文章我们可以学习到更多。
  1. contracts/MetaCoin.sol : 这是一个用 Solidity 编写的 MetaCoin 代币 智能合约。注意他还引用了目录下的另外一个合约文件 contracts/ConvertLib.sol

  2. contracts/Migrations.sol : 这是一个单独的 Solidity 文件,用来管理和升级智能合约. 每一个工程都有这样的一个文件,并且通常不需要编辑它。

  3. migrations/1_initial_migration.js : 这是一个部署脚本,用来部署 Migrations 合约,对应 Migrations.sol 文件。

  4. migrations/2_deploy_contracts.js : 这是一个部署脚本,用来部署 MetaCoin 合约。 (部署脚本的运行是有顺序的,以 2 开头的脚本通常在以 1 开头的脚本之后运行)

  5. test/metacoin.js : 这是一个用 JavaScript 编写的测试用例脚本

  6. tronbox.js : TronBox 配置文件 , 用来设置网络信息,和其他项目相关的设置。当我们使用内建的默认的 TronBox 命令时,这个文件留空也是可以的。

编译合约

1.编译智能合约:

```
tronbox compile
```

我们可以看到下面的输出:

```
Compiling .\contracts\ConvertLib.sol...
Compiling .\contracts\MetaCoin.sol...
Compiling .\contracts\Migrations.sol...

Writing artifacts to .\build\contracts
```

使用 TronBox Runtime Environment 部署合约

为了部署我们的合约,我们需要连接到区块链网络。TronBox 提供了一个 tre 的私链,它可以帮助我们用来测试。注意,这个区块链是在我们本地的系统里面,他不和波场的主网进行连接。

我们可以使用 TronBox Runtime Environment 来启动区块链,并与之交互,它的目的是为 Tron 开发建立一个完整的私链。
需使用 docker 拉取镜像:

docker pull tronbox/tre

关于如何安装docker,请参考docker安装文档

1. 启动 TronBox Runtime Environment,运行下面命令:

docker run -it \
-p 9090:9090 \
--rm \
--name tron \
tronbox/tre

我们可以看到下面的信息:

TronBox Runtime Environment v1.0.1


Start the http proxy for dApps...
[HPM] Proxy created: /  ->  http://127.0.0.1:18190
[HPM] Proxy created: /  ->  http://127.0.0.1:18191
[HPM] Proxy created: /  ->  http://127.0.0.1:8545
[HPM] Proxy created: /  ->  http://127.0.0.1:8545
[HPM] Proxy created: /  ->  http://127.0.0.1:8060

Tron Quickstart listening on http://127.0.0.1:9090


ADMIN /admin/accounts-generation

FullNode is already.


Available Accounts
==================

(0) THD652niU9nm81xA8Gf2ctSQLDhiWUXT4o (10000 TRX)
(1) TSPjSVn1Ew1QaWMLyYSGiV78qaXbocuFkB (10000 TRX)
(2) TUcEcuj3FDSmsfaSWBH5CTu4k4sHEsStjo (10000 TRX)
(3) TVzQGMmmXBJC12o4yzBkr4dw6VWqPnR9CA (10000 TRX)
(4) TAZC9fKYnjtVFuHnaUzQ5xLSLe5MYovTYn (10000 TRX)
(5) TDi5qjuk8cs6FMG754FZUDxcLqTpVBUhPF (10000 TRX)
(6) TCwGkXWD2C8gi7UChVGnqipmfm8Hq4YYo9 (10000 TRX)
(7) TM3WZw9PWBMUTmFvXV7qxt6dq5Bv2znL7p (10000 TRX)
(8) TVyL1uiusn6r3UPGaosPBu1FTvQnWADNbP (10000 TRX)
(9) TMbXpcWsTXnXEHkqJkSmU1Gj21CCYLVMsv (10000 TRX)

Private Keys
==================

(0) 6b7b075714de08b1fcc2dc5afe20f5e087fb679032b601717d0cd3807e24d563
(1) 5adab5cdfafab07714895f8a0f9ccf50b3a786902bf21a31f5749f5f3a36a5ee
(2) c2f12cbc82befc3ba3da66fcfadac830e9a6e28fcbb8178bd6fdefaabe15d5fd
(3) 0b44950cb02dfc2e7bdc0803139cf767eff95af03568418f5e7fac0c25e9beeb
(4) ffd86aec3b4a5c2b2bb0df3078eebe97be75115a9affc788b427dcaad9084f10
(5) 367b6da347e91d1d1e02ec775028ffb310d2e37e4fc56001d3a1d96b33142890
(6) 9940da6d6516473373fa92c7731785dd545fac8638ee1b504da27befd2dec722
(7) d9ed135abc58e1ad081a8df755b76a0c6d6bab137021146d38a9bb7674aec345
(8) ba09da49973cd129d114d3b18559b701f68fedd9bdeb6859ba60c58b34c5a860
(9) ebe05e5b6335ce84f37fdc143164dd768a7204718c12f7786e8f44ce1b32412d

HD Wallet
==================
Mnemonic:      buyer assume spin morning mosquito fortune enhance vocal raven tired wise fun
Base HD Path:  m/44'/195'/0'/0/{account_index}

GET 200  - 32850.036 ms

这里显示了 10 个账号,和他们对应的私钥,这些账号可以用来和区块链进行交互。

这个docker image 未针对苹果 ARM 芯片(Apple silicon) 做优化,可能出现无法使用,需多次重启docker的情况

2. 打开控制台,执行部署:

tronbox migrate

我们可以看到类似下面的输出:

Using network 'development'.

Running migration: 1_initial_migration.js
Replacing Migrations...
Migrations:
    (base58) TBp7j3cUisov1tWbq1vagxwXmNBcmmjLzw
    (hex) 4114381a89161cd01957dc854a69c000f019d3a4cb
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Replacing ConvertLib...
ConvertLib:
    (base58) TGoVTVUt5KBtLqMd8m4kdhMgivUc83mig1
    (hex) 414af27519fbc1e8ffe911761ab106fff563200830
Linking ConvertLib to MetaCoin
Replacing MetaCoin...
MetaCoin:
    (base58) TQCcNUFpK8zLskJvryWE82ZEGXBqSHA2Sy
    (hex) 419c1aad134258c42af129822814098333ba251e52
Saving successful migration to network...
Saving artifacts...

这里显示了网络,部署的合约地址,以及交易的状态等信息。

 当然我们自己部署的时候,交给哈希和地址等信息,都是和上面不一样的。

测试

  1. 打开控制台终端,运行 Solidity 测试用例:
   tronbox test ./test/metacoin.js

回车之后,你将看到这样的输出:

    Contract: MetaCoin
    ✓ should verify that there are at least three available accounts
    ✓ should verify that the contract has been deployed by accounts[0] (64ms)
    ✓ should put 10000 MetaCoin in the first account (116ms)
  Sleeping for 1 second... Slept.
    ✓ should call a function that depends on a linked library (1116ms)
    ✓ should send coins from account 0 to 3 and verify that a Transfer event has been emitted (1066ms)
  Sleeping for 3 seconds... Slept.
    ✓ should send coins from account 0 to 1 (1277ms)

  6 passing (8s)

如果在windows平台运行,这个命令遇到问题,可以参考 tronbox-配置 中的“解决Windows命名冲突” 章节。

合约交互

我们可以使用 TronBox 的控制台:tronbox console,和合约进行交互。

tronbox console

可以看到下面的提示:

tronbox(development)>
 控制台提示符:tronbox(development)> 括号里,指当前连接的网络。

示例如下:

  • 获取账户余额等信息:

    tronbox(development)> tronWeb.trx.getAccount()
    
    //outputs:
    // {
    //   account_name: '5a696f6e',
    //   address: '41928c9af0651632157ef27a2cf17ca72c575a4d21',
    //   balance: 94999899999000000,
    //   latest_opration_time: 1667357772000,
    //   allowance: 140480000000,
    //   is_witness: true,
    //   account_resource: {}
    //   }
    
  • 获取账号列表:

    tronbox(development)> tronWeb._accounts
    
    //outputs:
    // [
    //   'TPt8VDCU5c5PWsZ8KDTsq9YwQRoSFpN1KX',
    //   'TPQbBa5TvHCjoJX3EWBtQ44Laq929wCuxb',
    //   'TC5SR8sVePhmPvdusQoks3gaTv7aM523Rp',
    //   'TWDvZhLq4cXPF4p9UsyJC3XVLqVGUVwxuj',
    //   'TKrtFy3GYGZeoyT8wwbbpap3vuSXSKUq1w',
    //   'TLKrFZtDNBcp9wAGnCfkY7nKoMdpeGvtkX',
    //   'TKG9BwY5vySYoq6Wmw31c7tXz1q6sjcDC8',
    //   'TPSBT6r6kwgMhwrzTYYKsJCrwQkkjQHxBA',
    //   'TKu86RPU6Kr88kx6LNxofidA3HRKX5tUEj',
    //   'TLpJz5qNiWh2VSkR1ynmVDL3nCFQ8J7euY'
    //   ]
    
  • 调用合约检查账户余额:

    tronbox(development)> MetaCoin.deployed().then(res => res.getBalance(tronWeb._accounts[0]))
    
    //outputs:
    //BigNumber { _hex: '0x2710', _isBigNumber: true }
    
  • 发送一些 metacoin 到其他的账号:

    tronbox(development)> MetaCoin.deployed().then(res => res.sendCoin(tronWeb._accounts[1],500))
    
    //outputs:
    //'3b6a2cb56841f5cd39b4e081c33465909204b36794fcd494c0374eb5d3d3fb9d'
    
  • 检查刚刚收款人余额:

    tronbox(development)> MetaCoin.deployed().then(res => res.getBalance(tronWeb._accounts[1]))
    
    //outputs:
    //BigNumber { _hex: '0x01f4', _isBigNumber: true }
    
  • 检查刚刚发送方的余额:

    tronbox(development)> MetaCoin.deployed().then(res => res.getBalance(tronWeb._accounts[0]))
    
    //outputs:
    //BigNumber { _hex: '0x251c', _isBigNumber: true }
    

进一步学习

本篇快速入门仅仅是了解 TronBox 工程的一个生命周期,还有很多内容需要学习,请学习文档其余部分。