Truffle是以太坊知名的智能合约开发工具,提供编译、链接、测试、部署等实用功能。深受Solidity开发者的喜爱。Conflux作为新一代高性能公链,不仅在完全去中心化的前提下实现了两个数量级的性能提升,还实现了兼容EVM的虚拟机,这意味着Dapp开发者无需学习新的开发语言就可以在Conflux网络上开发应用。为了提升Conflux的合约开发体验,官方最近对Truffle进行了迁移和改造,创建了Conflux-Truffle,可以支持Conflux的合约开发。本文将详细介绍如何使用ConfluxTruffle开发Conflux智能合约,从环境构建、项目创建、开发、编译、测试、部署,逐一介绍。基本概念介绍Dependencies准备用cfxtruffle开发智能合同参考文档基本概念介绍区块链世界是去中心化的,所有参与节点数据相同,人人平等。区块链中数据的组织形式是:先将多个事务打包在一起形成一个块,然后将块按照顺序链接起来形成一个链,所以称为区块链。最初的区块链只支持转账,所以只有一个应用(比特币)。以太坊创造性地加入了EVM的功能,具有图灵完整性,因此可以在其上自由开发各种去中心化应用(Dapp)。EpochstorageLimit传统的区块链账本是单链的,每个块从头到尾都有一个编号,这个编号叫做blocknumber。Conflux开发了全新的ledger结构,3360树形图,实现了高吞吐量和低延迟。树形图的账簿结构中,如果只看父边,那就是树,如果父边引用,那就是图。正是这种结构使得Conflux网络能够并行发出块,即在某个块之后可以全部生成多个块。所以Conflux中没有blocknumber这个概念。但为了实现总序,Conflux通过GHAST规则从创建块开始,在其所有子块中选择最重的子树块作为pivotblock。所有枢轴块链接在一起形成一个链,该链被定义为pivotchain。如果只看pivotchain,它与常见的区块链结构是一致的。在这个链中,基于每个pivotblock定义了一个epoch,所以你可以把Conlux中的Epoch理解为blocknumber对应的概念,但是Conlux中的每个Epoch可能有多个block。在现实世界中,发送转账交易需要向银行支付手续费,发送比特币交易需要向矿工支付手续费,以太坊也是一样。具体来说,以太坊网络的交易最终由矿工运行的EVM执行,用gas来衡量一个交易的工作量(可以理解为工作时间)。当发送事务时,事务发送者可以指定他愿意为每个工作量支付的价格,即gasPrice。所以最后一笔交易的手续费是gas*gasPrice。发送交易时指定的gas是一个限制值,即发送方愿意为一个交易支付多少工时的gas。如果交易所需的工作量超过了gas,则不会再次支付,交易也不会执行。在Dapp系统中,事务执行除了计算资源外,还需要矿工保存契约的状态,所以存储资源需要付费。在Conflux系统中发送事务时,还需要抵押一部分成本用于状态存储。所以在Conflux中发送交易时,会比Ethereum多一个storageLimit参数,用来设置愿意为某笔交易存储抵押的成本上限。合同释放使用过的存储空间后,还会退还抵押费用。DApp传统App的所有状态都存储在集中式服务器的数据库中,对其状态的查询和修改可以直接通过API在数据库中执行SQL操作来完成。虽然速度快,但也存在数据篡改、隐私泄露等问题。Dapp是一个运行在区块链系统上的应用,称为分散应用。申请状态存储在区块链系统上,状态查询需要通过网络,状态变更只能是发送交易的形式。
在传统的互联网应用中,钱包通过帐户访问服务,但数据本质上存储在服务提供商的服务器上。在区块链世界,所有的交易都需要通过钱包发送,比如以太坊的MetaMask和Conflux的Portal。在您的钱包中,您可以查看余额、发送交易、与Dapp交互、接收来自测试网络的令牌等。事实上,钱包里有你账户的私钥。在区块链世界,只有私钥可以签署和发送交易。私钥只能自己保管,不能让别人知道。Dependencies准备在开发智能合约之前准备一些开发环境。npmNPM是node.js的一个包管理工具因为cfxtruffle是用node开发的,所以需要和NPM一起安装。Npm包含在node的安装包中。只要成功安装了节点,npm就会成功安装。要安装node,可以直接下载官方安装包,也可以使用nvm。安装后,可以使用以下命令查看版本:cfxtruffle可以在cfxtrufflenpm成功安装后安装。有两点需要注意:安装NPM时,需要将全局安装的npminstall包的名称指定为conflux-truffle through-g,安装后cfxtrufflex-rustdocker的命令行程序需要运行本地节点进行契约调试。运行Conflux最简单的方法是使用docker来运行Conflux-rust映像。这样就不需要自己编译程序和准备配置文件了。你只需要在本地安装docker环境。一个简单的命令启动一个本地Conflux节点,该节点将同时创建10个本地帐户。每个账号会分配1000CFX用于合约部署和交互,这些账号会自动解锁。汇流河
st镜像启动之后,cfxtruffle可以直接使用它来部署合约,以及同合约交互。当然也可以自己编译或下载节点程序,自定义配置文件,然后运行本地节点。节点运行起来之后需要手动创建本地账号,并转账给他们使之有余额,以及手动进行解锁。说明:本地账号可以使用节点命令行(confluxaccountnew)或localrpc创建,本地账号可以被节点程序访问,并直接用于交易签名。本地账号可以直接通过cfx_sendTransaction发送交易,交易的签名操作由节点完成,不需要事先签名,本地开发Dapp非常方便。本地账号为了安全,需要解锁才能直接发送交易,可以在调用cfx_sendTransaction时通过第二个参数传递密码,也可以事先调用unlockrpc解锁账号。目前的cfxtruffle需要0.6.0以上版本的conflux-rust镜像搭配使用。ConfluxportalConfluxportal是一款浏览器插件钱包,支持Chrome和Firefox等浏览器。在官网点击链接即可下载安装(可能需要翻墙)。安装后该钱包可切换不同Conflux网络,当然也可以连接本地网络,并且可以申领测试网络代币,如果合约本地测试完之后,可部署到测试网络测试。使用cfxtruffle开发智能合约环境准备好之后,可以使用cfxtruffle开发智能合约了,我们会使用cfxtruffle开发一个具有铸币和转账功能的coin合约。首先来看下cfxtruffle所有命令:我们也可以查看某个具体命令的使用帮助:创建项目第一步我们需要创建一个cfxtruffle基础项目:新创建的项目有以下文件夹和文件:contractssolidity合约代码目录migrations合约部署迁移脚本目录test单元测试目录truffle-config.jscfxtruffle配置文件(js文件)另外cfxtruffle也提供了许多功能更完善的项目模板(box)或者叫脚手架,使用模板,会节省许多初始化工作:你可以到官方的box列表看看是否有满足你需求的模板.注:这两个命令,在国内可能需要翻墙。添加合约init命令只会创建一个空项目,里面包含一个基础的Migrations合约及它的迁移脚本。我们需要添加新的文件,来用于开发新的合约,create命令可以用于创建一个合约相关的所有文件,包括合约源码(contract),部署脚本(migration),测试脚本(test)。其使用方式为:cfxtrufflecreate<artifact_type><ArtifactName>现在我们来创建Coin合约的源码文件以上命令执行完之后,会在contracts目录创建一个Coin.sol文件,我们可以在其中编写solidity代码。如下是Coin合约的solidity,其实现了铸币,转账,余额查询的功能。该合约具体属性和方法如下:owner属性:合约所有者,只有合约所有者可以执行铸币操作,owner具有public属性,因此也会自动创建一个对应的方法,用于查询合约的所有者balances属性:余额,map类型,用于存储账户的余额信息,constructor方法:该方法仅会在合约创建的时候执行一次,之后不会再执行,主要用于设置合约初始状态mint方法:铸币,可以给某个地址生成指定数额的cointransfer方法:转账,给另外账户转账Transfer事件:每当转账操作发生,会触发一个此事件compilesolidity是一种高级语言,其语法参考了C ,python,js,但solidity不能直接部署,需要先进行编译。这其实跟C 程序比较类似,需要编译为binary程序才能执行。solidity的编译器是solc可以单独安装和使用,不过cfxtruffle中集成了编译compile的功能可以直接使用。solidity编译后,会生成bytecode和abi(ApplicationBinaryInterface合约对外接口的描述),这两者在部署的时候都会用到。cfxtruffle编译后生成的json文件中,该文件包含有合约的bytecode,abi,ast,name等信息,该文件在之后的部署,调试等步骤中都会被用到。truffle-config.jstruffle-config.js是项目的配置文件,非常重要,cfxtruffle许多命令运行时都会使用取这里的配置。其中最重要的配置项为networks,用于配置cfxtruffle部署交互的网络,默认使用development网络。除此之外,还可以配置测试,compiler等信息,具体参看“阅读原文”。本地部署合约开发的时候,会先在本地节点部署和测试,前边我们介绍了如何使用docker启动一个本地节点。启动的节点可以用来做本地部署和测试。cfxtruffle中的migrate命令主要用于合约部署(deploy是migrate的别名)。migrations文件夹用于存放migration脚本,这些脚本管理着合约的部署,通常每个合约对应一个migration脚本。cfxtruffle项目创建后会有一个Migrations.sol合约,及其对应的迁移脚本。该合约主要用于在链上记录合约的部署序号(整数序号)。每次migrate命令执行时会到链上查询上次部署的位置,然后判断是否有新合约需要部署。Migrations.sol合约代码如下:现在让我们来使用create命令,添加一个Coin合约的部署脚本:然后可以在里面加入如下代码设置完成之后可以运行部署命令了deploy命令执行完成之后,会输出部署的结果,比如交易hash,合约地址,花费的费用等。合约交互合约部署之后,通常我们会需要跟合约进行交互,比如查询状态,发起转账等等。cfxtruffle内含console命令,可以开启一个交互式的命令行环境,该环境提供了合约的JS对象,账号列表,以及js-conflux-sdk实例及util等非常方便。你可以在里面实例化合约对象,然后通过实例对象与合约交互,比如:查询状态,修改余额等。以下是Coin合约交互的例子:除此之外还可以在console部署新合约,实例化指定地址的合约,estimateGa等,关于合约的详细交互方式,可以参看“阅读原文”。另外在console中,可以直接执行cfxtruffle的命令:networks,compile等注:目前cfxtruffle暂不支持devel 以上就是帮企客小编为大家带来的全部内容,希望可以帮助到大家。免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:bangqikeconnect@gmail.com