以太坊区块链中只有主链上的交易是有效的,所以可以认为以太坊区块链账本是一条单链,从前往后每个区块都有一个编号,叫做区块号( block number),conflux 开发了一种全新的账本结构: 树图,实现了高吞吐,低延迟。
在树图区块结构中,如果只看父边他是一个 Tree,如果父边引用边都看则是一个 Graph。正是这种结构使得 Conflux 网络可以并发出块,即多个区块可以都在某个区块之后生成。因此在 Conflux 是没有 block number 的概念。 但为了实现全序,Conflux 通过 GHAST 规则从创世区块开始,在其所有子区块中选择最重子树 block 为 pivot block,所有的 pivot block 链到一块也形成一条链 定义为 pivot chain,如果只看 pivot chain 其跟普通的区块链结构一致,在这条链上基于每个 pivot block 定义一个Epoch,因此你可以把 conflux 中的 Epoch 理解为跟 block number 对应的概念,只不过 conflux 中的每个 epoch 中可能会有多个 block。
在现实世界中,发送转账交易需要给银行付手续费,在比特币中发送交易需要给矿工付手续费,在以太坊中同样如此。具体来讲,以太坊网络的交易最终是由矿工 运行的 EVM 执行的,gas 是用来衡量一笔交易执行的工作量(可以理解为工作的工时),交易发送者,发送交易时可以指定愿意给每个工作量付的价格即 gasPrice。 因此最终一笔交易的手续费为 gas * gasPrice。 在发送一笔交易时指定的 gas 则是一个限制值,即发送方最大愿意为一笔交易支付 gas 这么多的工时,如果交易需要的工作量超过 gas,则不会再付钱,交易不会被执行。
在 Dapp 系统中,交易执行除了需要矿工进行计算付出计算资源外,还需要矿工存储合约的状态,因此需要付出存储资源。在 Conflux 系统中发送交易时,还需要为状态存储 抵押一部分费用,因此在 conflux 中发送交易时会比以太坊多一个 storageLimit 参数,用于设置愿意为某笔交易存储所抵押的费用上限。在合约释放掉使用的存储空间之后,抵押的费用 也会得到返还。
Conflux区块链现有开发工具主要有 Conflux Truffle
与 Conflux Studio
, 其功能主要对应以太坊使用最广的开发工具的Truffle
和 Remix
。
Conflux-Truffle
为以 Truffle
为原型改造的服务于conflux区块链的合约开发工具。 详细了解请参看Conflux-Truffle
使用教程。 其与Truffle
的区别主要有以下几点。
项目名称 | npmjs 包名 | 安装后的命令行程序名称 |
---|---|---|
Conflux-Truffle |
conflux-truffle |
cfxtruffle |
Truffle |
truffle |
truffle |
2. Ganache
VS conflux-rust docker
Ganache
为 Truffle 官方提供的用于方便开发智能合约时快速启动以太坊私链的一个工具。
conflux暂时没有Ganache
对应版本,但conflux提供了conflux-docker
,使用方法也很方便,启动conflux-docker
默认也会启动一个私链,分配10个初始账户并分配cfx, 且会自动 unlock 这些账户。
它们的最大区别是Ganache
提供了一个图形化界面可以查看运行情况,及做一些简单交互。后续官方也会增强类似功能。
子命令 | Truffle是否支持 | Conflux-Truffle是否支持 |
---|---|---|
build | 已过时 | N |
compile | Y | Y |
config | Y | Y |
console | Y | Y |
create | Y | Y |
debug | Y | Y |
deploy | Y | Y |
develop | Y | N |
exec | Y | Y |
help | Y | Y |
init | Y | Y |
install | Y | Y |
migrate | Y | Y |
networks | Y | Y |
obtain | Y | Y |
opcode | Y | Y |
publish | Y | Y |
run | Y | Y |
test | Y | Y |
unbox | Y | Y |
version | Y | Y |
watch | Y | Y |
ctxtruffle
除了不支持子命令 cfxtruffle develop
外,其余子命令名称及使用方式均与trffule
一致; 后续版本中会增加该功能。
当运行cfxtruffle console/exec/run
时,依然可以通过 �web3
相关api与 conflux 交互,同时也在改上下文中注入了js-conflux-sdk
的Conflux
及Util
模块,可以通过 cfx
及cfxutil
使用。 如下所示
# cfx
cfxtruffle(development)> await cfx.getBalance('0x148A9696F8DCf4d6cB01eC80F1047a3476bA5C56')
cfxtruffle(development)> await cfx.getNextNonce("0xbbd9e9be525ab967e633bcdaeac8bd5723ed4d6b")
# cfxutil
cfxtruffle(development)> let drip = cfxutil.unit.fromCFXToGDrip(0.1)
cfxtruffle(development)> let randomKey = cfxutil.sign.randomPrivateKey()
truffle
中可以通过设置HDWalletProvider
来调用本地钱包进行签名,cfxtruffle
只需要在网络配置中设置 privateKeys
字段即可,该字段是一个私钥数组,当发送交易或部署合约时会自动从改 privateKeys
列表中选取对应的私钥进行签名。示例如下
Truffle
设置
// truffle-config.js
testnet: {
provider: new HDWalletProvider("3f841bf589fdf83a521e55d51afddc34fa65351161eead24f064855fc29c9580", "http://localhost:7545"),
network_id: "*",
// 注意:从 portal 获取的私钥需要添加 0x 前缀,privateKeys 也可以指定单个 key,若配置了私钥,请注意不要将代码上传到公开代码仓储中。
// privateKeys: ['your-private-key']
}
Conflux-Trffle
设置
// truffle-config.js
testnet: {
host: "wallet-testnet-jsonrpc.conflux-chain.org",
port: 12537,
network_id: "*",
// 注意:从 portal 获取的私钥需要添加 0x 前缀,privateKeys 也可以指定单个 key,若配置了私钥,请注意不要将代码上传到公开代码仓储中。
// privateKeys: ['your-private-key']
privateKeys: ['0x3f841bf589fdf83a521e55d51afddc34fa65351161eead24f064855fc29c9583','0x4f841bf589fdf83a521e55d51afddc34fa65351161eead24f064855fc29c9581']
}
如前文所示,由于conflux中的共识方式与以太坊不同,增加了epoch及storageLimit的概念,所以在通过rpc与conflux交互时经常需要传这些参数,具体不同请参见rpc及sdk区别
Conflux Studio 是一个帮助开发者快速开发 Conflux 智能合约的集成化开发环境。其与Remix类似提供了图形界面让开发者与合约交互。 Remix是基于浏览器端的应用程序,而Conflux Studio 是一个独立的可执行程序,除了程序类型区别外,其功能及使用方式上也有很多区别
功能 | Remix | Conflux Studio |
---|---|---|
编辑合约 | Y | Y |
调试合约代码 | Y | N |
合约错误检查 | Y | N |
编译及部署合约 | Y | Y 在Project页面操作,内部实现为调用Conflux-Truffle 编译 |
显示编译及部署结果UI(包含 ABI 及 Bytecode) | Y | Y 在ABI Storage中查看合约编译历史的ABI, |
设置gaslimit | Y | N |
部署合约时设置构造函数参数 | Y | N |
根据 ABI 和地址加载合约实例 | Y | N |
Tuple传参 | Y | N |
支持编译优化 | Y | N |
支持自动编译合约 | Y | N |
合约交互UI | Y | Y 在Contract页面操作 |
命令终端 | Y | Y |
在命令终端中与sdk交互 | 命令终端中注入了web3 | N |
连接节点 | 通过设置node url连接 | 提供Network选项卡,可以本地创建节点,也可以选择testnet和mainnet |
创建节点并管理节点 | Y | N |
内置执行环境JavaScript VM | Y | N |
初始账户Accounts | 自动分配,或通过metamask导入 | 手动根据keystore导入 或 通过IDE创建 |
支持插件安装 | Y | N |
记录交易供replay(包含交易哈希,交易创建合约的abi) | Y | N |
Unit Test | Y | N |
导入项目 | 从本地及其它源导入项目,如github,gist,ipfs等 | 内置了智能合约模板, 在 Project 页面操作 |
账户浏览器 | N | Y 在Explorer页面地址栏中输入账户地址查看 |