上一篇链接: https://www.jianshu.com/p/262615eb62a3
4、Ganache+Truffle创建智能合约
前面2个小钱包,可以互相连通,转账了,但是我们还需要定制功能,也就是发布智能合约
这里我们用Ganache来创建账户、监测测试
1、安装Ganache
Ganache是一个测试客户端,基于本地内存执行的,拥有良好的界面,他能对Transation立即执行,迅速的创建和调用自己编写的智能合约,提升测试效率。
ganache的使用:
启动会自动创建私有链,在这个链中为你声明了10个拥有100个eth的账户,你可以通过其RPChttp://127.0.0.1:7545来连接这个链,用来进行操作
优点:就是你不用自己进行什么配置,简单
缺点:在上面进行的所有操作,在下次重新启动时就会被清空,不想自己配置的私有链,数据都保存在本地
Ganache 也是一个Javascript编写的Nodejs项目,Linux 系统 安装方式: npm install -g truffle
windows 环境下可以直接进行下载安装,下载地址如下:这个地址很慢,建议从别的网站下载
https://github.com/trufflesuite/ganache/releases
下载安装后打开,会给我们创建10个账号,界面如下:
还记得我们一开始创建创世块,启动客户端,用personal.newAccount("123456")创建的账号吗?没错这个客户端直接帮我们建了10个

现在将我们修改Ganache端口port和NetworkID:4528988,注意NetworkID不要和之前一样,否则会影响后面的测试,开启自动挖矿

2、使用小狐狸连接Ganache
切换到8489端口

使用1号账户的私钥登录小狐狸,

给第2个账户发送10块,这个传输会立即完成,不像我们之前需要手动开启挖矿,等待几秒。

可以看到传输的信息
3、安装Truffle,部署智能合约
Truffle是现在比较流行的一个Solidity智能合约开发框架,是使用Javascript编写的Nodejs项目。
truffle的安装需要首先装有:nodejs、npm、ganache和truffle。
使用如下命令安装 Truffle:
// 如果淘宝镜像连不上,需要更换为原始镜像
> npm config set registry https://registry.npmjs.org/
> npm install -g ganache-cli
> npm install -g truffle
// 查看 Truffle 版本
> truffle version

创建测试工程:新建文件夹,执行命令创建工程。
网上提供了2种方式,推荐第2种,淘宝镜像下载不了,需要更好到初始镜像,所以我第一次下载用的第3种,git的方式下载
1、truffle init //初始化 空 Truffle 工程,此处我们使用下面这种方式初始化
2、truffle unbox webpack//下载metacoin 的示例代码,如果使用这种方法则不用建立空工程
亲测好用,不过本文的后面测试还是用的第2条命令
3、npm install -g truffle-expect truffle-config web3
下载完成后,可以用我们喜欢的编译器打开,这里我用的是VS Code
修改truffle-config.js, 让端口设置和Ganache一致

执行命令
// 编译
> truffle compile
// 部署
> truffle migrate
// 测试
> truffle test
如果合约更新看不到打印信息,需要加参数--reset
truffle migrate --reset
truffle migrate[--reset][--f <number>][--to <number>][--network <name>][--compile-all][--verbose-rpc][--dry-run][--interactive]
除非指定,否则将从上次完成的迁移开始。有关详细信息,请参阅(迁移)合约部署 。
选项:
--reset: 从头开始运行所有迁移,而不是从上次完成的迁移中运行。
--f <number>: 从特定的迁移中运行合约。该数字指的是迁移文件的前缀。
--to <number>: 运行合约到特定的迁移。该数字指的是迁移文件的前缀。
--network <name>: 指定要使用的网络,网络名称必须存在于配置中。
--compile-all: 编译所有合约,而不是智能地选择需要编译的合约。
--verbose-rpc: 记录Truffle和以太坊客户端之间的通信日志。
--dry-run: 分叉(fork - 复制)指定的网络并仅执行测试迁移。
--interactive: 在 dry run 之后,提示确认用户是否要继续。
下面是执行成功结果
D:\Program Files\Geth\Truffle>truffle compile
Compiling your contracts...
===========================
> Compiling .\contracts\ConvertLib.sol
> Artifacts written to D:\Program Files\Geth\Truffle\build\contracts
> Compiled successfully using:
- solc: 0.5.12+commit.7709ece9.Emscripten.clang
D:\Program Files\Geth\Truffle>
D:\Program Files\Geth\Truffle>truffle migrate
Compiling your contracts...
===========================
> Compiling .\contracts\ConvertLib.sol
> Artifacts written to D:\Program Files\Geth\Truffle\build\contracts
> Compiled successfully using:
- solc: 0.5.12+commit.7709ece9.Emscripten.clang
Starting migrations...
======================
> Network name: 'development'
> Network id: 4528988
> Block gas limit: 0x6691b7
1_initial_migration.js
======================
Deploying 'Migrations'
----------------------
> transaction hash: 0x3ddd44ce6b44d94156d06a6046f62f7f3a85791879fb687692a3b5c089734885
> Blocks: 0 Seconds: 0
> contract address: 0xf1EE2F4618abF1229f84a94daaaF2EfA933ad884
> block number: 2
> block timestamp: 1577353142
> account: 0x25c2B80cfb76377d818F12F3E15AE5035Bd9987F
> balance: 89.99451518
> gas used: 263741
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00527482 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00527482 ETH
2_deploy_contracts.js
=====================
Deploying 'ConvertLib'
----------------------
> transaction hash: 0xea47a933227c74ad1209d5a671baa2e2f6d19b937c877c55561494b997e4e72d
> Blocks: 0 Seconds: 0
> contract address: 0x3c82bd5bf546De4A082D6959877b186B5aE7bdee
> block number: 4
> block timestamp: 1577353142
> account: 0x25c2B80cfb76377d818F12F3E15AE5035Bd9987F
> balance: 89.99155524
> gas used: 105974
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00211948 ETH
Linking
-------
* Contract: MetaCoin <--> Library: ConvertLib (at address: 0x3c82bd5bf546De4A082D6959877b186B5aE7bdee)
Deploying 'MetaCoin'
--------------------
> transaction hash: 0xf76ebd8fbcdda92733553659377daf2f7f23631c6a05508b519ba6a4f0c375f3
> Blocks: 0 Seconds: 0
> contract address: 0xa63784460D45a944d5F75c7e40e3a367A4a43233
> block number: 5
> block timestamp: 1577353142
> account: 0x25c2B80cfb76377d818F12F3E15AE5035Bd9987F
> balance: 89.9847413
> gas used: 340697
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00681394 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00893342 ETH
Summary
=======
> Total deployments: 3
> Final cost: 0.01420824 ETH
D:\Program Files\Geth\Truffle>truffle test
Using network 'development'.
Compiling your contracts...
===========================
> Compiling .\contracts\ConvertLib.sol
> Compiling .\test\TestMetacoin.sol
TestMetacoin
√ testInitialBalanceUsingDeployedContract (77ms)
√ testInitialBalanceWithNewMetaCoin (122ms)
Contract: MetaCoin
√ should put 10000 MetaCoin in the first account
√ should call a function that depends on a linked library (49ms)
√ should send coin correctly (134ms)
5 passing (7s)
D:\Program Files\Geth\Truffle>
去Ganache上看一下运行结果:
● Accounts标签:第一个账户里ETH略有减少,因为交易消耗了gas
● Blocks标签:Ganache是自动挖矿,生成了6个新区块,每个区块里有一个交易
● Transactions标签:有6笔新交易,可以点开看交易详情
● Logs标签:显示交易和挖矿日志

至此合约的创建与测试已完成。
点开一个交易记录

最后使用如下命令启动 刚刚下载webpack 示例代码
npm run dev