1.下载
npm install -g truffle
2.使用
创建没有合约的空工程
truffle init
或下载模板
truffle unbox metacoin
在操作完成之后,就有这样的一个项目目录结构:
contracts/
: Solidity合约目录migrations/
: 部署脚本文件目录test/
: 测试脚本目录truffle-config.js
: Truffle 配置文件
编译合约
truffle compile
仅编译自上次编译以来有更改的合约。 如果我们想覆盖此行为,可以使用 --all 选项运行上面的命令。
生成build文件夹
可以看到合约对应的 json
文件,即abi
接口
Artifacts 主要是指编译的目标(或目标文件)
合约部署(Migrations)
Truffle要求我们有迁移合约(Migrations 合约)才能使用迁移功能。
迁移脚本(JavaScript文件)可帮助我们将合约部署到以太坊网络。
$ truffle migrate
如果迁移先前已成功运行,则 truffle migrate 将仅运行新创建的迁移。
可以使用 --reset 选项从头开始运行所有迁移。
这将部署在项目的 `migrations` 目录中的所有迁移文件。
migration.sol合约文件
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.25 <0.7.0;
contract Migrations {
address public owner;
uint public last_completed_migration;
modifier restricted() {
if (msg.sender == owner) _;
}
//设置owner
constructor() public {
owner = msg.sender;
}
#如果发送者已部署过合约,设置上次完成迁移的值
function setCompleted(uint completed) public restricted {
last_completed_migration = completed;
}
}
migrations/1_initial_migration.js
脚本
const Migrations = artifacts.require("Migrations");
// 任务就是 部署迁移合约
module.exports = function(deployer) {
deployer.deploy(Migrations);
};
-
artifacts.require()
方法告诉 Truffle 我们想要与哪些合约进行交互。- 返回了一个 合约抽象( 指定的名称应与该源文件中的合约定义的名称相匹配。)
-
所有迁移都必须通过
module.exports
语法导出函数。- 每次迁移导出的函数都应该接受
deployer
对象作为其第一个参数。
- 每次迁移导出的函数都应该接受
我们的迁移文件将用于部署程序 deployer 来(分阶段)部署任务。
迁移也会通过我们的以太坊客户端和 Web3 provider 提供给我们的帐户列表,供我们在部署期间使用。 下面和 从web3.eth.getAccounts()
返回的完全相同的帐户列表。
module.exports = function(deployer, network, accounts) {
// Use the accounts within your migrations.
}
deploy 方法:
// 部署没有构造函数的合约
deployer.deploy(A);
// 部署合约 并使用一些参数传递给合约的构造函数。
deployer.deploy(A, arg1, arg2, ...);
// 如果合约部署过,不会覆盖
deployer.deploy(A, {
overwrite: false});
// 设置gasLimit 和部署合约的账号
deployer.deploy(A, {
gas: 4612388, from: "0x...."});
// 部署多个合约,一些包含参数,另一些没有。
// 这比编写三个`deployer.deploy()`语句更快,因为部署者可以作为单个批处理请求执行部署。
deployer.deploy([
[A, arg1, arg2, ...],
B,
[C, arg1]
]);
deployer.then(function() {
…})
//就像 promise 一样,可运行任意部署步骤。
与合约交互
以太坊网络区分将数据写入网络和从网络读取数据
写入数据称为交易 transaction
读取数据称为 调用 call。
交易 Transactions
交易
改变了网络的状态。
交易
的特征是它写入(或更改)数据。
一个交易
需要耗费以太运行,称为 “gas”,交易
同样需要(较长)时间来处理。
通常,通过交易执行的函数不会返回值,仅仅是返回一个交易ID。 可总结`交易`的特征如下:
- 消耗Gas 费用(以太)
- 会更改网络状态
- 不会立即执行(需要等待网络矿工打包)
- 没有执行返回值(只是一个交易ID)。
调用 Calls
调用
则不同,调用
依然可以在网络上执行合约代码,但不会永久更改任何数据(如状态变量)。
调用
的特征是读取数据。
-
当我们通过`调用`执行合约函数时,我们可以立刻获取到返回值。 可总结`调用Call`的特点: - 免费(不消耗 Gas) - 不改变网络状态 - 立即执行 - 有返回值
选择使用 交易
还是调用
关键是看 读取数据 还是需要写入数据。
合约抽象( Contract abstraction)
合约抽象是一种代码封装,让我们可以轻松地与合约进行交互
交互
Truffle 通过交互式控制台为您提供了两种简单的方法来执行此操作,您的合约可用并可以使用。
- Truffle 控制台:连接到任何以太坊客户端的基本交互式控制台
- Truffle Develop:一个交互式控制台,也产生了一个开发区块链
要启动控制台:
truffle console
这将查找配置中调用的网络定义development
,并连接到它
配置文件
配置文件名为 truffle-config.js
,位于项目目录的根目录下。
它是JavaScript文件,可以执行创建配置所需的任何代码。
它必须导出表示项目配置的对象,如下例所示:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // 匹配任何网络
}
}
};
默认配置附带开发网络的配置,运行在 127.0.0.1:8545
上。
出表示项目配置的对象,如下例所示:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // 匹配任何网络
}
}
};
默认配置附带开发网络的配置,运行在 127.0.0.1:8545
上。