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

发布于 2021-05-24  107 次阅读


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

0x00 往期回顾

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

这里不妨假设大家已经装好了truffle、ganache和geth

0x01 写在前面

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

学习Truffle前要知道什么

总的来说不需要什么特别的。

由于本身是基本Javascript的,但对Javascript的要求比较低,知道基本语法、模块、Promise的概念差不多就可以了,不知道也行,碰到不懂的,现查资料都来得及。(这个我做为一个后台开发勉强可以懂)。

需要知道Solidity,因为本身就是针对它的一个框架,不然学这个干什么。

知道一点点以太坊的基础,不过学Solidity那点就够了。

https://truffle.tryblockchain.org/

0x02 查看truffle版本

truffle

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

0x03 初始化工程

mkdir test
cd test
truffle init

0x04 合约编译

合约位置:

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

编译命令:

truffle compile

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

truffle compile --compile-all

相关约定:

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

contract MyContract {
  ...
}
// or
library MyContract {
  ...
}

依赖:

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

编译目录:

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

0x05 合约移植

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

移植命令:

truffle migrate

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

移植脚本:

例如文件名:4_example_migration.js

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

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

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

移植测试:

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

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