部署
在项目根目录下的migrations目录,存放的是所有的部署文件。每个文件存放具体的部署任务。随着开发的不断进行,我们可能需要添加新的部署文件来部署我们的合约。
ps:部署和迁移是一个意思,个人比较喜欢部署这个意思。
部署文件长啥样?
这部分我们要了解四个部分:
- 文件命名格式
- artifacts.require("")
- module.exports =function(deployer){}
下面是一个部署文件:
Filename:4_example_migration.js
var MyContract = artifacts.require("MyContract");
module.exports = function(deployer) {
// deployment steps
deployer.deploy(MyContract);
};
文件名的格式[序号]_[文件描述].js, 序号是必须的,用于记录迁移是否成功,文件描述便于我们理解。
artifacts.require("合约名");注意这里是contracts目录下某个.sol文件内部的某个合约名,而不是.sol文件名。如果该.sol文件内部只有一个合约那么,可以不需要指定合约名。否则应该像如下这样。
// fileName: ./contracts/Contracts.sol
contract ContractOne {
// ...
}
contract ContractTwo {
// ...
}
//
var ContractOne = artifacts.require("ContractOne");
var ContractTwo = artifacts.require("ContractTwo");
modules.export类似于node.js模块系统,但是这里必须导出一个函数,函数的第一个参数是deployer部署对象,该对象通过为部署智能合同提供了明确的语法以及执行一些部署的更普通的职责,例如保存部署的工件供以后使用,从而辅助部署。部署者对象是用于登台部署任务的主要接口,这里是其API。
所以总结这部分职责如下:
- 按顺序定义好文件名
- require()要交互的智能合约
- 通过deployer对象在module.export导出的函数中编写相关的部署任务。
部署
这部分我们要完成的为:
- 了解部署初始化
- 执行部署,了解部署流程
通过执行`truffle migrate`命令就可以执行部署(迁移),但是要实现这个功能,需要一个在所有合约.sol之前编写一个部署合约contracts/Migrations.sol。之后再所有部署js文件之前编写部署 这个合约的部署任务文件(migrations/1_initial_migration.js),一般编写完毕后无需再修改。
// contracts/Migrations.sol
pragma solidity ^0.4.8;
contract Migrations {
address public owner;
// A function with the signature `last_completed_migration()`, returning a uint, is required.
uint public last_completed_migration;
modifier restricted() {
if (msg.sender == owner) _;
}
function Migrations() {
owner = msg.sender;
}
// A function with the signature `setCompleted(uint)` is required.
function setCompleted(uint completed) restricted {
last_completed_migration = completed;
}
function upgrade(address new_address) restricted {
Migrations upgraded = Migrations(new_address);
upgraded.setCompleted(last_completed_migration);
}
}
// migrations/1_initial_migration.js
var Migrations = artifacts.require("Migrations");
module.exports = function(deployer) {
// Deploy the Migrations contract as our only task
deployer.deploy(Migrations);
};
上面准备工作完毕之后就可以部署了,这时候我们需要决定部署/迁移到那个网络,并且保证这个网络在部署时是运行着的。也就是连接到我们使用ganache-cli创建的服务,即编写配置文件,再次赘述:
// truffle.js 或 truffle-config.js
module.exports = {
// See <http://truffleframework.com/docs/advanced/configuration>
// to customize your Truffle configuration!
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // Match any network id
}
}
};
之后执行:truffle migrate
部署成功。
总结
本篇学完之后,
- 了解部署/迁移文件的格式,以及如何编写部署/迁移文件
- 如何执行命令部署/迁移合约到指定网络