XiaBee's Studio.

三天速成智能合约–DAY3:truffle 从放手到放弃

字数统计: 1.4k阅读时长: 5 min
2021/08/30

如果环境已经比较熟悉了,想直接看hello world实战(踩坑),可以翻到第二页

往期回顾

如果还没装好环境或者GETH不会用的话,可以回去看看DAY1DAY2,部分truffle相关的内容可以直接看翻译文档

这里不妨假设大家已经装好了 truffleganachegeth

写在前面

由于 truffle 近期有重大更新,目前网上大部分的博客已经官方文档翻译是基于 truffle2/3/4的版本,而我在测试是 truffle 已经更新到了 5.3,所以很多内容会与网上操作不太相同……大家查阅资料是注意自己的版本。

学习Truffle前要知道什么:

总的来说不需要什么特别的。 由于本身是基本Javascript的,但对Javascript的要求比较低,知道基本语法、模块、Promise的概念差不多就可以了,不知道也行,碰到不懂的,现查资料都来得及。(这个我做为一个后台开发勉强可以懂)。 需要知道Solidity,因为本身就是针对它的一个框架,不然学这个干什么。 知道一点点以太坊的基础,不过学Solidity那点就够了。

https://truffle.tryblockchain.org/

查看 truffle 版本

1
truffle

此时可以看到我们的版本为5.3.7:

初始化工程

1
2
3
mkdir test
cd test
truffle init

合约编译

合约位置

所有的合约应该位于 ./contracts 目录。项目默认提供了一个合约文件,一个库文件,均以 .sol 结尾作为示例。尽管库文件有一定的特殊性,但为简单起见,当前均称之为合约。

编译命令

1
truffle compile

Truffle 仅默认编译自上次编译后被修改过的文件,来减少不必要的编译。如果想编译全部文件,可以使用 --compile-all 选项。

1
truffle compile --compile-all

相关约定

Truffle 需要定义的合约名称和文件名准确匹配,类似于 JAVA 里面的文件名和类名。举例来说,如果文件名为 MyContract.sol,那么合约文件须为如下两者之一:

1
2
3
4
5
6
7
contract MyContract {
...
}
// or
library MyContract {
...
}

依赖

可以通过使用 import 来声明依赖。Truffle 将会按正确顺序依次编译合约,并在需要的时候自动关联库。

编译目录

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

合约移植

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

之前运行移植的历史记录通过一个特殊的 Migrations 合约来记录到链上,下面有详细说明。

移植命令

1
truffle migrate

这个命令会执行所有的位于 migrations 目录内的移植脚本。如果之前的移植成功执行,truffle migrate 仅会执行新创建的移植。如果没有新的移植脚本,这个命令不同执行任何操作。可以使用选项 --reset 来从头执行移植脚本。

移植脚本

例如文件名:4_example_migration.js

1
2
3
4
module.exports = function(deployer) {
// deployment steps
deployer.deploy(MyContract);
};

需要注意的是文件名以数字开头,一个描述性的后缀结尾。数字前缀是必须的,用于记录移植是否成功。后缀仅是为了提高可读性,以方便理解。

移植js里的exports的函数接受一个 deployer 对象作为第一个参数。这个对象用于发布过程,提供了一个清晰的语法支持,同时提供一些通过的合约部署职责,比如保存发布的文件以备稍后使用。deployer 对象是用来缓存(stage)发布任务的主要操作接口。

移植测试

这里我们先删掉刚刚手写的移植脚本,减少报错:

1
2
truffle compile
truffle migrate

报错,提示无法连接到客户端:

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
2
3
4
5
# sudo npm install -g ganache-cli
# 如果没安装,先npm安装

ganache-cli -p 7545
# 指定端口启动,如上图,默认网路端口为7545,故我们需监听7545端口

ganache-cli启动成功

再次移植合约:

1
truffle migrate

依然报错,network指定了id,但是监听的id不对:

img

解决方案,打开 truffle-config.js,取消注释,指定 development 的网络 id、端口等信息:

img

此时的端口已改为8545ganache-cli 的默认端口也是 8545,我们重新启动 ganache-cli

img

在另一个 terminal 中进行合约移植:

1
truffle migrate

此时可以看到两个终端各自打印的区块信息:

img

其他

构建应用与合约交互我们之后再讲,旧版本的 truffle 可以参考翻译文档,新版的 truffleinit 时移除了 app 目录,需要手动构建 WEB 目录,或者通过npm 启动 web 服务

CATALOG
  1. 1. 往期回顾
  2. 2. 写在前面
  3. 3. 查看 truffle 版本
  4. 4. 初始化工程
  5. 5. 合约编译
    1. 5.1. 合约位置
    2. 5.2. 编译命令
    3. 5.3. 相关约定
    4. 5.4. 依赖
    5. 5.5. 编译目录
  6. 6. 合约移植
    1. 6.1. 移植命令
    2. 6.2. 移植脚本
    3. 6.3. 移植测试
  7. 7. 其他