以太坊毋庸置疑拥有现在最活跃,最繁荣的区块链生态。其智能合约开发语言,IDE,及各种工具层出不穷且更加成熟。 Conflux 作为新一代公链,相比以太坊在性能上有巨大(两个量级)的提升,并且其智能合约 VM 完全兼容 EVM。 因此以太坊的开发生态可以复用过来,比如同样使用 Solidity 开发合约,甚至以太坊的合约大多可以直接部署到 Conflux 上。 Truffle 是一个世界级的以太坊智能合约环境(工具)提供合约编译,链接,部署,测试等功能。是一款智能合约开发利器。 为了简化 Conflux 合约开发工作,小伙伴对 Truffle 进行了简单的改造(Conflux-Truffle),可以提供相同的功能和体验,如果你是一个以太坊开发者, 那么用 truffle 你可以无缝开发 Conflux 合约。
Conflux-Truffle 是对 truffle 的一个简单化改造,以支持 Conflux 的智能合约开发,目前其是一个单独的 npm module 和 命令。 同样使用 npm 安装:
$ npm install -g conflux-truffle
安装成功后,你就可以使用命令 cfxtruffle 进行智能合约开发工作了,比如:
$ cfxtruffle -h
智能合约开发,本地节点是必须的,truffle 套件中提供了 Ganache,这是一个以太坊本地节点,开发非常方便,Conflux 目前提供了 conflux-rust 的 Docker 镜像 confluxchain/conflux-rust,也可以非常方便的启动本地节点。
# 下载镜像
$ docker pull confluxchain/conflux-rust
# 运行节点
$ docker run -p 12537:12537 --name cfx-node confluxchain/conflux-rust
注意:该镜像首次启动时,会自动创建 10 个账号,每个账号会分配 1000 CFX,可以用于测试,该镜像默认以 dev 模式运行
当然你也可以使用自定义配置,镜像运行时也可以挂载本地目录(目录中需包含文件:default.toml, log.yaml, throttling.toml),这样可以使用自定义配置文件,节点运行的数据也会保存到本地目录中,container 删掉重启数据也可以保留。
# 使用本地配置运行节点
$ docker run -p 12537:12537 -v $(pwd)/run:/root/run --name cfx-node confluxchain/conflux-rust
如果电脑没有 Docker 环境或对 Docker 不熟悉,可以直接下载或编译 Conflux 节点程序,本地运行,具体方法可参看这里。
如果 Docker 使用自定义配置文件,或者使用本地程序运行,节点起来之后需要手动准备一些账号用于测试:
conflux local account new
创建几个账号 (注意:docker 模式不要使用 account new创建账号)- 转一些 CFX (从 mining_author 地址转账)
rpc local account unlock --address your-address
解锁账号
这样就可以直接使用 cfxtruffle 了,使用体验跟 truffle 完全一致。
这里对使用 cfxtruffle 开发的流程做一个简单的介绍,如果你对 truffle 已经很熟悉,可以直接跳过。
创建空项目
$ cfxtruffle init
另外 truffle 也提供了许多项目模板叫做 box,可以使用 unbox 命令下载模板,快速开发(有时需要翻墙)
$ mkdir MetaCoin
$ cd MetaCoin
$ cfxtruffle unbox metacoin
创建的项目目录内容如下:
- build 存放合约编译后的文件(json)
- contracts 合约代码目录
- migrations 合约迁移脚本目录 (js 脚本)
- test 测试文件
- truffle-config.js 配置文件
cfxtruffle create 可以用于创建新的合约文件
$ cfxtruffle create contract MetaCoin
$ cfxtruffle create migration MetaCoin
$ cfxtruffle create test MetaCoin
命令执行后创建的文件在对应的目录中。另外生成的 migrate 脚本文件名中包含一个时间戳,需要手动将其改为脚本中下一序号,具体原因参看这里
$ cfxtruffle compile
编译后的内容会存放在 build 目录中。
$ cfxtruffle deploy # or cfxtruffle migrate
deploy 跟 migrate 本质上是一个命令,truffle 使用 migration 脚本的方式管理合约的部署和迁移,具体来说
- migration 文件夹中的每一个脚本对应一个部署 task,添加新合约,需要添加对应的 migration 脚本
- 所有 truffle 项目都会自带一个 Migration 合约,用于存储当前项目上次部署的位置:
last_completed_migration
,setCompleted()
- cfxtruffle deploy 执行时会查询上次的部署位置,并从下一个任务开始执行,执行完成之后也会更新当次部署序号。
另外 cfxtruffle deploy 有几个参数(--reset, --from, --to)可以控制 migration 的执行规则,具体可参看 cfxtruffle help
cfxtruffle 也提供了命令行式的交互环境,在该环境中可以直接获取或更新合约的状态。在 console 环境中不仅集成了合约对应的 js 类,
还包含了 cfx
, cfxutil
对象,可以直接使用,非常方便(具体用法可参看 js-conflux-sdk)。
$ cfxtruffle console # 在项目目录下执行,开启交互模式
# 初始合约实例
cfxtruffle(develop)> let instance = await MetaCoin.deployed()
cfxtruffle(develop)> instance
# 获取余额
cfxtruffle(develop)> let balance = await instance.getBalance(accounts[0])
cfxtruffle(develop)> balance.toNumber()
# 转账
cfxtruffle(develop)> let result = await instance.sendCoin(accounts[1], 10, {from: accounts[0]})
cfxtruffle(develop)> result
cfxtruffle 默认集成了 Mocha 和 chai 测试框架,可通过 test 子命令运行。
单元测试代码示例:
const MetaCoin = artifacts.require("MetaCoin");
contract('MetaCoin', (accounts) => {
it('should put 10000 MetaCoin in the first account', async () => {
const metaCoinInstance = await MetaCoin.deployed();
const balance = await metaCoinInstance.getBalance.call(accounts[0]);
assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account");
});
}
执行测试:
$ cfxtruffle test
cfxtruffle 同样支持部署到远端节点,只需要在配置文件中配好需要部署用户的私钥(privateKeys
)即可。
development: {
host: "test.confluxrpc.com",
port: 80,
network_id: "*",
privateKeys: ["keys1xxxxxx", "keys1xxxxxx"],
},
这样在部署合约,以及与合约交互的时候会使用这里配置的私钥对应的账号。
目前 cfxtruffle 迁移还在不断进行中,以下命令还无法支持 conflux
- develop
- build
cfxtruffle 可以大大减少智能合约开发工作量,目前核心功能(编译,部署,交互,测试)已完成兼容改造,其余 feature 也会持续迁移从而进行支持。