如果环境已经比较熟悉了,想直接看hello world实战(踩坑),可以翻到第二页
往期回顾
如果还没装好环境或者GETH不会用的话,可以回去看看DAY1与DAY2,部分truffle相关的内容可以直接看翻译文档
这里不妨假设大家已经装好了 truffle
、ganache
和geth
写在前面
由于 truffle
近期有重大更新,目前网上大部分的博客已经官方文档翻译是基于 truffle2/3/4
的版本,而我在测试是 truffle
已经更新到了 5.3
,所以很多内容会与网上操作不太相同……大家查阅资料是注意自己的版本。
学习Truffle前要知道什么:
总的来说不需要什么特别的。 由于本身是基本Javascript的,但对Javascript的要求比较低,知道基本语法、模块、Promise的概念差不多就可以了,不知道也行,碰到不懂的,现查资料都来得及。(这个我做为一个后台开发勉强可以懂)。 需要知道Solidity,因为本身就是针对它的一个框架,不然学这个干什么。 知道一点点以太坊的基础,不过学Solidity那点就够了。
查看 truffle 版本
1 | truffle |
此时可以看到我们的版本为5.3.7:
初始化工程
1 | mkdir test |
合约编译
合约位置
所有的合约应该位于 ./contracts
目录。项目默认提供了一个合约文件,一个库文件,均以 .sol
结尾作为示例。尽管库文件有一定的特殊性,但为简单起见,当前均称之为合约。
编译命令
1 | truffle compile |
Truffle 仅默认编译自上次编译后被修改过的文件,来减少不必要的编译。如果想编译全部文件,可以使用 --compile-all
选项。
1 | truffle compile --compile-all |
相关约定
Truffle
需要定义的合约名称和文件名准确匹配,类似于 JAVA
里面的文件名和类名。举例来说,如果文件名为 MyContract.sol
,那么合约文件须为如下两者之一:
1 | contract MyContract { |
依赖
可以通过使用 import 来声明依赖。Truffle 将会按正确顺序依次编译合约,并在需要的时候自动关联库。
编译目录
编译的输出位于./build/contracts
目录,如果目录不存在会自动创建。这些编译文件对于 Truffle 框架能否正常工作至关重要——我们不应该在正常的编译或发布以外手动修改这些文件。
合约移植
移植是由一些 Javascript
文件组成来协助发布到以太坊网络。主要目的是用来缓存你的发布任务,它的存在基于你的发布需求会改变的前提。当你的工程发生了重要的改变,你将创建新的移植脚本来将这些变化带到区块链上。
之前运行移植的历史记录通过一个特殊的 Migrations
合约来记录到链上,下面有详细说明。
移植命令
1 | truffle migrate |
这个命令会执行所有的位于 migrations
目录内的移植脚本。如果之前的移植成功执行,truffle migrate
仅会执行新创建的移植。如果没有新的移植脚本,这个命令不同执行任何操作。可以使用选项 --reset
来从头执行移植脚本。
移植脚本
例如文件名:4_example_migration.js
1 | module.exports = function(deployer) { |
需要注意的是文件名以数字开头,一个描述性的后缀结尾。数字前缀是必须的,用于记录移植是否成功。后缀仅是为了提高可读性,以方便理解。
移植js里的exports的函数接受一个 deployer 对象作为第一个参数。这个对象用于发布过程,提供了一个清晰的语法支持,同时提供一些通过的合约部署职责,比如保存发布的文件以备稍后使用。deployer 对象是用来缓存(stage)发布任务的主要操作接口。
移植测试
这里我们先删掉刚刚手写的移植脚本,减少报错:
1 | truffle compile |
报错,提示无法连接到客户端:
Something went wrong while attempting to connect to the network. Check your network configuration.
Could not connect to your Ethereum client with the following parameters:
- host > 127.0.0.1
- port > 7545- network_id > 5777
Please check that your Ethereum client:
- is running
- is accepting RPC connections (i.e., “–rpc” option is used in geth)
- is accessible over the network
- is properly configured in your Truffle configuration file (truffle-config.js)
Truffle v5.3.7 (core: 5.3.7)
Node v10.19.0
错误原因:客户端没启动…
解决方案:启动 ganache-cli
客户端
1 | # sudo npm install -g ganache-cli |
ganache-cli启动成功
再次移植合约:
1 | truffle migrate |
依然报错,network指定了id,但是监听的id不对:
解决方案,打开 truffle-config.js
,取消注释,指定 development
的网络 id
、端口等信息:
此时的端口已改为8545
,ganache-cli
的默认端口也是 8545
,我们重新启动 ganache-cli
:
在另一个 terminal
中进行合约移植:
1 | truffle migrate |
此时可以看到两个终端各自打印的区块信息:
其他
构建应用与合约交互我们之后再讲,旧版本的 truffle
可以参考翻译文档,新版的 truffle
在 init
时移除了 app
目录,需要手动构建 WEB
目录,或者通过npm
启动 web
服务