[关闭]
@qidiandasheng 2018-09-16T16:38:45.000000Z 字数 6318 阅读 2278

Truffle框架简单使用

区块链


介绍

Truffle是以太坊智能合约的开发框架。

官网文档地址:https://truffleframework.com/docs/truffle/overview
中文翻译文档:http://truffle.tryblockchain.org/Truffle-introduce-%E4%BB%8B%E7%BB%8D.html

安装创建工程

安装

  1. $ npm install -g truffle

创建工程

进入一个新建的工程目录,执行以下命令:

  1. $ truffle init
  2. 或者
  3. $ truffle unbox <box-name>

truffle init只是创建一个空白的不包含只能合约代码的Truffle工程。

truffle unbox <box-name>表示创建一个示例工程。<box-name>是一些别人已经创建好的开源的示例项目,可以到TRUFFLE BOXES里查看有哪些项目。

工程目录

以下是一个最简单的truffle工程默认创建的目录文件:

测试合约

Truffle使用Mocha测试框架来做自动化测试,使用Chai来做断言。这两个库的结合可能让人耳目一新,我们基于这两者之上,提供一种方式来编译简单和可管理的合约自动化测试用例。

这里我们使用truffle unbox metacoin来创建一个生成代币的合约工程。

然后在工程目录中输入以下命名:

  1. truffle test ./test/TestMetacoin.sol
  2. 或者
  3. truffle test ./test/metacoin.js

输出:

  1. Compiling ./contracts/ConvertLib.sol...
  2. Compiling ./contracts/MetaCoin.sol...
  3. Compiling ./contracts/Migrations.sol...
  4. Compiling ./test/TestMetacoin.sol...
  5. Compiling truffle/Assert.sol...
  6. Compiling truffle/DeployedAddresses.sol...
  7. TestMetacoin
  8. testInitialBalanceUsingDeployedContract (76ms)
  9. testInitialBalanceWithNewMetaCoin (66ms)
  10. 2 passing (836ms)

每个测试文件中包含用Truffle自定义的contract()函数,使用的是Mocha里的类型describe()函数,但额外添加了一些特性:

编译合约

使用一下命名编译合约:

  1. truffle compile

输出:

  1. Compiling ./contracts/ConvertLib.sol...
  2. Compiling ./contracts/MetaCoin.sol...
  3. Compiling ./contracts/Migrations.sol...
  4. Writing artifacts to ./build/contracts

编译的输出位于./build/contracts目录。如果目录不存在会自动创建。这些编译文件对于Truffle框架能否正常工作至关重要。你不应该在正常的编译或发布以外手动修改这些文件。

这些编译后的文件,就是最后部署合约时需要用到的文件。

在Truffle开发环境上移植(Migrating)

移植是由一些Javascript文件组成来协助发布到以太坊网络。主要目的是用来缓存你的发布任务,它的存在基于你的发布需求会改变的前提。当你的工程发生了重要的改变,你将创建新的移植脚本来将这些变化带到区块链上。之前运行移植的历史记录通过一个特殊的Migrations合约来记录到链上。

为了部署只能合约,我们需要链接到一个区块链网络,Truffle会创建一个私有的区块链网络用于测试,这个区块链网络只是创建于你本地,并不会跟其他的以太坊主网连接。

启动开发环境:

  1. truffle develop

输出:

  1. Truffle Develop started at http://127.0.0.1:9545/
  2. Accounts:
  3. (0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
  4. (1) 0xf17f52151ebef6c7334fad080c5704d77216b732
  5. (2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
  6. (3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
  7. (4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
  8. (5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
  9. (6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
  10. (7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
  11. (8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
  12. (9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de
  13. Private Keys:
  14. (0) c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3
  15. (1) ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f
  16. (2) 0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8ad91193c05875ef1
  17. (3) c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd85da83b71f772aa6c
  18. (4) 388c684f0ba1ef5017716adb5d21a053ea8e90277d0868337519f97bede61418
  19. (5) 659cbb0e2411a44db63778987b1e22153c086a95eb6b18bdf89de078917abc63
  20. (6) 82d052c865f5763aad42add438569276c00d3d88a2d062d36b2bae914d58b8c8
  21. (7) aa3680d5d48a8283413f7a108367c7299ca73f553735860a87b08f39395618b7
  22. (8) 0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07700d8669ff12b7c4
  23. (9) 8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362dcae9012b548b1e5
  24. Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat
  25. ⚠️ Important ⚠️ : This mnemonic was created for you by Truffle. It is not secure.
  26. Ensure you do not use it on production blockchains, or else you risk losing funds.
  27. truffle(develop)>

这里会在你的9545端口创建一个私有区块链的节点,默认创建了10个账号,每个账号有100个ETH

然后我们在这个开发环境上执行migrate,就会把你的合约部署到当前这个区块链上了(我们能看到执行了一个移植的合约,然后就是部署你的合约到区块链上,输出合约地址等)。

  1. truffle(develop)> migrate
  2. Using network 'develop'.
  3. Running migration: 1_initial_migration.js
  4. Deploying Migrations...
  5. ... 0xc267cf36ebb42e18b8e85d76d5bf343d626d6ccd53701c29f65d2b2fa4153df4
  6. Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0
  7. Saving successful migration to network...
  8. ... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956
  9. Saving artifacts...
  10. Running migration: 2_deploy_contracts.js
  11. Deploying ConvertLib...
  12. ... 0xfd930298cdf712f94df8f00bca3c2b4ad4e69b8c921b6b617ac15af9eea8014b
  13. ConvertLib: 0x345ca3e014aaf5dca488057592ee47305d9b3e10
  14. Linking ConvertLib to MetaCoin
  15. Deploying MetaCoin...
  16. ... 0xf35146ab1ba2f17f56441186244269e8dc1968e3f156fc6ff97357c7e5b5a5e8
  17. MetaCoin: 0xf25186b5081ff5ce73482ad761db0eb0d25abfbf
  18. Saving successful migration to network...
  19. ... 0x059cf1bbc372b9348ce487de910358801bbbd1c89182853439bec0afaee6c7db
  20. Saving artifacts...

使用Ganache进行移植

Ganache是一个GUI桌面应用,它是一个ETH的客户端,它也可以创建一个私有的区块链网络。这里我们使用它来更直观的理解整个部署的过程。下载地址

我们修改之前创建的工程里面的truffle.js文件(表示部署到的区块链网络,这里表示的是你本地创建的一个7545端口的区块链节点端口,也就是你打开Ganache时默认创建):

  1. module.exports = {
  2. networks: {
  3. development: {
  4. host: "127.0.0.1",
  5. port: 7545,
  6. network_id: "*" // Match any network id
  7. }
  8. }
  9. };

启动Ganache时界面如下图:

然后我们使用Truffle来部署一下我们的合约:

  1. truffle migrate

输出:

  1. Using network 'development'.
  2. Running migration: 1_initial_migration.js
  3. Replacing Migrations...
  4. ... 0xc267cf36ebb42e18b8e85d76d5bf343d626d6ccd53701c29f65d2b2fa4153df4
  5. Migrations: 0x530a0e5aba4b6ef1e1da14c76379928f368b9aea
  6. Saving successful migration to network...
  7. ... 0x42527706e3dc74c3b95a371f7a6d12f319719c089b24cd3b5b66503a43d589d5
  8. Saving artifacts...
  9. Running migration: 2_deploy_contracts.js
  10. Replacing ConvertLib...
  11. ... 0xfd930298cdf712f94df8f00bca3c2b4ad4e69b8c921b6b617ac15af9eea8014b
  12. ConvertLib: 0x08a12a2d443f0d211d584e00620f06e67d38c489
  13. Replacing MetaCoin...
  14. ... 0xd3341391da8f9b0a7549e6d3690477cca0996cd98367266f3bf48d9737f9a48b
  15. MetaCoin: 0x074ea195414e6c1785e494a67462d7ac90f2c0b3
  16. Saving successful migration to network...
  17. ... 0xa0ee3d7f25f06350c259f80db21f2b7ac6375178fe927b50ffa234b09f4146a9
  18. Saving artifacts...

这里我们能看到我部署的合约地址就是0xa0ee3d7f25f06350c259f80db21f2b7ac6375178fe927b50ffa234b09f4146a9,然后我们就能在Ganache上看到生成新的区块和最新的合约了。

注意:

如果出现Error: Attempting to run transaction which calls a contract function错误,表示你之前已经移植过了,执行truffle migrate --reset既可。

调用合约

首先我们进入到开发环境连接到区块链网络来调用合约,这里我们先打开Canache,然后执行truffle console,需要配置truffle.js文件表示连接到哪个节点,这里我们连接到Canache

truffle consoletruffle develop类似,只是truffle console连接的是一个已经存在的区块链网络。

开发环境:

  1. truffle console

然后我们就可以调用合约了,比如获取发布合约的这个账户的代币余额:

  1. truffle(development)> MetaCoin.deployed().then(function(instance){return instance.getBalance(web3.eth.accounts[0]);}).then(function(value){return value.toNumber()});
  2. 10000

代币价值:

  1. MetaCoin.deployed().then(function(instance){return instance.getBalanceInEth(web3.eth.accounts[0]);}).then(function(value){return value.toNumber()});

转账:

  1. MetaCoin.deployed().then(function(instance){return instance.sendCoin(web3.eth.accounts[1], 500);});
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注