Truffleubuntu安装truffletruffle安装的依赖环境为:Nodejs、git、python2.7(ubuntu自带)installgitsudoapt-getinstallgit安装完成后在命令行输入git命令行,并出现一些git命令表示安装成功。命令行输入:$gitconfig--globaluser.name"YourName"$gitconfig--globaluser.email"email@example.com"安装NodeJs首先安装NodeJs环境:如果没有安装g++和libssl-dev,首先要安装,安装方法如下:$sudoapt-getinstallg++$sudoapt-getinstalllibssl-dev接下来可以下载安装nodeJS,安装最新版本或者>6.9:国内下载的比较多比较慢,tarzxvfnode-v9.8.0.tar.gz需要一定的时间进入解压后的目录:$./configure$make&&makeinstall安装需要半小时安装完成后,在控制台输入:$node-v如果显示版本信息,说明node安装成功。如果安装过程中出现一些包权限错误,在安装自带的python2.7ubuntu的命令前加上sudo。如果需要确认,输入$python--version安装truffle$npminstall-gtruffle命令执行后,输入truffle,显示truffle的命令界面,表示安装成功。安装ganache-cliganache-cli是以太坊区块链的模拟环境。与geth不同的是,geth是真实的以太坊环境,而ganache-cli是使用内存在本地模拟的以太坊环境。为了开发调试,更方便快捷,当你的合约在ganache-cli中测试通过后,就可以部署到geth了。因此使用truffle+ganache-cli进行本地开发测试方便快捷,可以提高开发者的开发测试效率。安装命令:$npminstall-gganache-cli使用ganache-cli命令:$ganache-cli安装完成后直接输入$ganache-cli即可。会提示8545端口被监听,说明ganache-cli安装成功,同时也开启了区块链测试环境。在开发和部署过程中,该窗口始终处于打开状态,无法关闭。所以在开发测试的过程中,需要打开另外一个终端运行ganache-cli。truffle框架使用truffleinit新建测试根目录,命令行进入该目录,输入truffleinit(创建应用),因为现在truffleinit命令不会生成上层网页实例。本文以truffleunboxmetacoin为例,生成一个数字货币应用。如图:如果报错,尝试添加sudo。命令执行后生成的framework文件目录如下:(以后要修改文件夹时修改整个文件夹权限的命令sudochmod-R777./testmodification测试文件夹的权限及其子目录为777)。contracts存储智能合约,包括ConvertLib.solMetaCoin.solMigrations.solmigrations存储部署智能合约的程序测试智能合约的测试脚本truffle-config.jstruffle.js存储配置信息注意:在truffle.js中添加:networks:{development:{host:"localhost",port:8545,network_id:"*"//匹配任意网络id}}将项目部署到本地8545端口,也是ganache-cli监听的端口。truffle主要是命令trufflecompile编译编译智能合约,会编译当前项目。编译完成后,工程中会出现一个build文件夹。build里面有个contracts文件夹,里面的ConvertLib.solMetaCoin.solMigrations.sol变成了json文件,包含了对应合约的信息。部署trufflemigrate需要在本地运行一个以太坊客户端。比如盖特。但是成本非常高,出块速度慢。我们使用ganache-cli(他是一个基于js的区块链模拟器,原名TestPRC),无需等待挖矿,所有区块链操作瞬间完成,主要用于部署前测试。打开区块链测试环境:打开另一个终端运行ganache-cli,这个窗口一直打开,开发部署时不能关闭。输入$ganache-cli启动,显示监听8454端口。输入trufflemigrations运行migration文件夹内初始部署和部署合约的js程序。部署到ganache-cli网络。当前智能合约部署的地址将显示在终端中。如果报错nonetworkspecified.cannotdeterminecurrentnetwork,说明truffle.js文件中没有配置本地网络的8545端口。同时,运行ganache-cli的终端也会输出相应的交易信息。Tulutruffleconsoleconsole是一个用于与智能合约进行交互的控制台。调出控制台输入js代码与ganache-cli网络进行交互。WEB3.js运行truffle控制台时,truffle会引入一个名为WEB3.js的js库,它是js与区块链交互的桥梁。就像一个RESTfulAPI。WEB3也可以通过abi获取可以调用的函数接口。(ABI(ApplicationBinaryInterface):ApplicationBinaryInterface,就是solidity规定的外界与合约交互的方式,abi告诉用户智能合约上有哪些接口是供人们调用的。)输入web3.eth.accounts将为网络上的所有帐户输出ganache-cli。输入web3.+tab会输出所有支持的命令,比如web3.currentProvider输出当前HttpProvider的信息。输入web3.eth.+tab输出命令集,可以查看当前区块、gas价格、是否挖矿、当前账户、账户余额等。MetaCoin.deployed可以获取已经部署到网络。MetaCoin.deployed.then(contract=>{metacoin=contract})这是一个异步调用。获取实例后,将合约赋值给元币变量,然后使用元币实例与合约进行交互。输入元币显示合约信息。输入metacoin.+tab显示相关功能。web3调用合约函数有两种方式:函数名.call()用于只读函数,比如常量函数,修改状态变量的函数执行会失败。Functionname.send()/functionname()用于修饰状态变量的函数调用,可以简称为后者。输入metacoin.getBalance.call('address1').then((result)=>{console.log(result)})这也是一个异步调用,用于根据给定地址,得到结果如预期的那样是10000。输入metacoin.sendCoin.call('address2').then((result)=>{console.log(result)})返回true。表示转账成功。输入metacoin.getBalance.call('address2').then((result)=>{console.log(result)})查看地址2当前余额,返回的不是2,而是0,因为调用()函数只是在本地节点上执行函数,只是读取区块链上的信息,并没有写入以太坊,所以结果不是2。那么如何进行实际转账呢,输入metacoin.sendCoin('address2').then((result)=>{console.log(result)})与之前相比,少了一次调用,可以进行实际传输。返回的信息是一个json格式的交易对象。包含有关整个事务的信息。前端开发truffle也提供了前端集成的能力。这是一个新的例子。Trufflebox是truffle自带的脚手架。它不仅有后端合约,还有前端代码。比如:下载一个集成了react前端框架的盒子。访问truffleframework.com/boxes/react获取教程。新建一个空文件夹存放集成前端truffle项目mkdirreactcdreactinputtruffleunboxreact会自动下载解包设置所需的库,开箱成功后。目录下会多出config、node_modules、public、scripts文件夹,srcconfig里面包含一些前端需要的配置文件。node_modules是前端需要的一些依赖文件。public里面有一些图片和静态文件。脚本是前端运行需要的一些程序(build.js、start.js、test.js)。src存放的是前端的源代码,也是开发前端时写主要代码的地方。package.json中是前端开发,测试需要依赖的一些库的配置信息。contracts文件夹下没有MetaCoin.json,取而代之的是SimpleStorage.sol,这是一个简单的合约,功能是修改一个状态变量的值为x,然后读取。migration文件夹中的文件还是一样,_deploy_contracts.js的作用是将SimpleStorage.sol部署到网络中。注意!修改test/src/utils/getWeb3.js中的24行端口为8545,操作过程基本相同:trufflecompile打开新窗口进入ganache-cli返回原窗口进入trufflemigrationnpmrun开始输出app已经运行在localhost:3000上,默认浏览器会自动跳转到这个地址。如果没有跳转,则手动输入。前端框架运行原理css文件夹下有pure-min.css,是雅虎的前端框架。fonts文件夹存放字体相关的文件。utils文件夹下有getWeb3.js,主要是获取web3实例的程序。首先是查看程序中是否定义了web3。如果已经定义,则表示当前浏览器已经安装了metamask插件。这时候使用currentProvider来使用web3实例。如果已定义,请尝试连接到localhost:8545。这个端口就是ganache-cli本地ethereum运行的端口。index.js是react运行的入口点。React可以轻松构建前端页面。App.js是程序的主体,其中引入了SimpleStorageContract,也就是之前编译合约得到的abi文件。这会传递合约的方法及其在区块中的地址。componentWillMount是这个app的生命周期回调函数。它会异步获取web3获取web3对象,然后初始化合约。如果出现异常,会在控制台报错。在初始化合约的过程中,首先引入“truffle-contract”库。获取合约实例,将其分配给一个引用,并使用该引用调用set和get函数。渲染函数负责渲染。在App.js中将5改为10,刷新浏览器前端页面,将其改为10。测试truffle测试是智能合约中最重要的环节,因为智能合约一旦上线就无法修改,而且它是确保它们正确的必要条件。这里使用自动化测试。truffle提供了两种测试方法,使用js和Solidity。jsMochaChaiSoliditytest文件夹下有两个文件,分别是js和solidity测试。测试过程类似:部署、设置、获取和断言。soli是同步的。js的优点是测试类似于前端测试,可以模拟前端测试,称为集成测试,可以有更强大的语法支持。js还有一个很大的优势就是可以比较简单的实现异常捕获。推荐js写测试。soli测试简洁,适合做单元测试。还有一个好处就是js只能测试公共函数,而soli可以测试内部函数和内部函数。可以通过继承被测试的合约来获得对内部功能的访问。进入truffletest,会有2个测试结果。总结安装truffletruffleinittrufflecompiletrufflemigratetruffleconsoletruffletesttruffleunbox会下载一个配置好的前端环境truffle前端知识