以太坊 --metrics
这是5在开始复仇重点series.Other帖子后第包括:
- 从以太坊开始-设置
- 以太坊开始-撰写合约
- 从以太坊开始-部署和运行合同
- 从以太坊开始-智能合约
- 从以太坊开始-工业化 (本文)
上周,我们终于开发出了一种合同,该合同以一种边缘化投票的形式提供了一些价值。
但是,有一个巨大的问题:没有测试! 作为专业开发人员,这是不可接受的。 而且,没有简化绿地开发的框架,没有自动化的部署过程等。总而言之,以太坊没有提供针对现成软件开发的工具。
由于这是一个很大的问题,因此可以使用Truffle框架形式的第三方工具。
- 内置的智能合约编译,链接,部署和二进制管理
- 自动化合同测试以快速发展
- 可编写脚本的部署和迁移框架
- 用于同时部署到公共和专用网络的网络管理
- 访问数百个外部软件包
- 交互式控制台,可直接进行合同沟通
- 外部脚本运行程序,在Truffle环境中执行脚本
- 专为速度而打造
http://truffleframework.com/
在本文中,我们将专注于测试和部署。
建立
在正确启动之前,需要一些步骤。
安装松露
松露变成npm软件包的形式。
npminstall-g truffle
如果您对JavaScript过敏,那就太糟糕了,因为本文的其余部分包含了很多内容。
初始化项目
- 为项目创建一个专用文件夹
- 在其中初始化松露模板
mkdir referendum
cd referendum
truffle init
一旦执行,以下结构将出现在项目文件夹的根目录:
资料夹/档案 | 内容 |
---|---|
|
用Solidity编写的智能合约。 在此处添加您自己的合同。 初始化后,将有一个Migration.sol文件。 不要删除它,因为它将在部署期间使用。 |
| Deployment scripts, written in JavaScript |
| Test files, written either in Solidity or in JavaScript. Add your own tests there. |
| Truffle configuration file for advanced usage. |
测试中
松露允许通过Solidity和JavaScript文件测试合同。 从10,000英尺的角度来看,Solidity测试类似于集成测试,而JavaScript更像是端到端测试。
两者都需要针对以太坊网络上部署的合同。
创建实体测试
我尝试首先用Solidity编写测试,因为我不是JavaScript迷...而感到痛苦:
- 它需要合同和测试方法来匹配模式,例如v4之前的JUnit。
- 没有嘲笑。
- 测试异常需要一个巨大的技巧 。
那时,我受够了,然后很快又回到了JavaScript。
创建JavaScript测试
有一些测试要求。 他们应该:
- 放在
test
文件夹中-这很明显 - 具有标准的
.js
扩展名 - 遵循标准的Mocha测试结构,用自定义
contract()
函数替换describe()
contract()
函数
这是对Referendum
合同进行此类测试的示例:
'use strict';
letVotingToken=artifacts.require('VotingToken'); (1)
letReferendumContract=artifacts.require('ReferendumContract'); (1)
contract('ReferendumContract',()=>{
consttotalSupply=16;
constvotesCount=totalSupply-1;
lettoken;
letcontract;
it('should be properly initialized',async()=>{
token=awaitVotingToken.new('DUMMY',votesCount); (2)
letquestion='Why?';
contract=awaitReferendumContract.new(question,votesCount,token.address); (2)
assert.equal(awaitcontract.getQuestion.call(),question); (3)
assert.equal(awaitcontract.isOpen.call(),true); (3)
});
});
上面的代码片段中有趣的部分如下:
-
artifacts.require()
告诉脚本需要哪些已部署合同。 -
new()
部署了这样的合同 - 读取数据时,使用
call()
代替real方法不会花费任何以太币。 这应该比调用“真实”基础方法更可取
尽管所有可用的较早版本编写的在线示例都可以使用上述代码片段的ECMAScript 6(2015!)中的语法和功能。 特别是,它利用async / await的优势通过防止回调地狱使异步代码更具可读性。 建议使用这些功能,因为它会使代码更具可读性。
执行测试
开始执行测试的最简单方法是:
truffle develop (1)
test (2)
- 创建一个全新的以太坊网络并启动Truffle开发控制台
- 启动位于
test
文件夹中的所有测试
初始化新的区块链应该给出以下输出:
Truffle Develop started at http://localhost:9545/ Accounts: (0) 0x627306090abab3a6e1400e9345bc60c78a8bef57 (1) 0xf17f52151ebef6c7334fad080c5704d77216b732 (2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef (3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544 (4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2 (5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e (6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5 (7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5 (8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc (9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de Private Keys: (0) c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3 (1) ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f (2) 0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8ad91193c05875ef1 (3) c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd85da83b71f772aa6c (4) 388c684f0ba1ef5017716adb5d21a053ea8e90277d0868337519f97bede61418 (5) 659cbb0e2411a44db63778987b1e22153c086a95eb6b18bdf89de078917abc63 (6) 82d052c865f5763aad42add438569276c00d3d88a2d062d36b2bae914d58b8c8 (7) aa3680d5d48a8283413f7a108367c7299ca73f553735860a87b08f39395618b7 (8) 0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07700d8669ff12b7c4 (9) 8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362dcae9012b548b1e5 Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat
这是通过测试的结果:
Using network 'develop'. Contract: ReferendumContract ✓ should be properly initialized (128ms) ✓ should have no votes upfront ✓ should return proper results and burn voting token when casting votes (61ms) ✓ should close vote when all votes have been cast (61ms) Contract: VotingToken ✓ should have 5 tokens initialized in the first account (46ms) ✓ transfer should decrease owner account balance without impact on total supply (74ms) ✓ burn should check if owner balance has enough tokens ✓ burn should decrease total supply and decrease owner account balance (43ms)
或者,可以使用truffle console
连接到现有的以太坊网络。 在这种情况下,现有的以太坊客户端应该正在运行并接受RPC连接:
geth--rinkeby--syncmode fast --cache 1024 --ipcpath ~/Library/Ethereum/geth.ipc --rpc
truffle console
test
请记住首先在一个单独的过程中解锁您的帐户:
geth attach
personal.unlockAccount( personal.listAccounts[0], 'password' , 10000 );
客户端绑定应在开发网络的truffle.js文件中配置:truffle.js module.exports = {网络:{开发:{主机:“ 127.0.0.1”,端口:8545,network_id:“ *”}}} ;
部署中
部署由位于migrations
文件夹中的脚本处理。
此类脚本已编号。 它们只能在特定的区块链上运行一次,因此下次运行不会再次执行它们(除非经过专门配置才能执行)。 这是通过在项目初始化期间创建的Migrations.sol
合同在区块链本身上实现的。 有一个名为1_initial_migration.js
的脚本,配置为将其部署为第一次部署。
先前的VotingToken
和ReferendumContract
的部署脚本如下所示:
varreferendum=artifacts.require("ReferendumContract"); (1)
vartoken=artifacts.require("VotingToken"); (1)
module.exports=(deployer)=>{ (2)
deployer.deploy(token,"DUMMY",5).then(()=>{ (3)
deployer.deploy(referendum,"Are you ok?",6,token.address); (4)
});
};
- 至于测试,它告诉您将需要哪些合同
- 该文档指出:“所有迁移都必须通过
module.exports
语法导出一个功能。deployer
对象是您分阶段部署任务的主要接口。” -
deployer.deploy()
显然部署了合同。 它接受由artifacts.require()
返回的合同对象作为第一个参数,并将合同构造函数参数作为以下参数。 - 全民投票合同需要令牌合同。 因此,前者的部署通过使用后者的
address
字段的回调链接在一起。
要启动这些脚本,请执行以下命令:
migrate
这将产生以下输出:
Using network 'development'. Running migration: 1_initial_migration.js Deploying Migrations... ... 0xe596d8eae73239195fa509bd6d271643f3077c23ff0d89b6cfdbd10c2ee990a4 Migrations: 0x0984883bb7f65b3ab11e84c10bf2cc97a8583fb1 Saving successful migration to network... ... 0xa7302dd463b1f05aea48bcf4beeb267ce73b64cd365981a163af16a567e2748f Saving artifacts... Running migration: 2_referendum_migration.js Deploying VotingToken... ... 0xd759398b331029053fa333d71eaa818e74b4614b0050ccca52801233fc59076b VotingToken: 0x4bc1ab343c69944d2aba0e7fa3c77ac7d4ed4577 Saving successful migration to network... Deploying ReferendumContract... ... 0x86bd810a3b5f8c0fd2b582e1b49ab9bc5bffe8e47eb3776cb5838d91e2b480ce ... 0xf0fb9ba91b8f1da15af837efc2287d2df6101b0d6562f049ac9d0a5261abe667 Saving artifacts... ReferendumContract: 0x3e94dfb44f1e121ed5c0b883b3ea473981d3e014
一个人应该已经通过松露开发或松露控制台连接到以太坊网络。
结论
此时,您应该能够以工业化的方式测试和部署合同。
现在由您决定在以太坊区块链上开始自己的旅程。
以太坊 --metrics