Truffle 5 手册

Truffle命令
命令行概述 truffle build - 构建项目 truffle compile - 编译合约 truffle config - 分析功能开关 truffle console - 启动控制台 truffle create - 创建新构件 truffle debug - 调试链上交易 truffle deploy - 部署合约 truffle develop - 启动开发控制台 truffle exec - 执行JS脚本 truffle help - 帮助信息 truffle init - 初始化项目 truffle install - 安装以太坊包 truffle migrate - 部署合约 truffle networks - 检查网络构件 truffle opcode - 显示合约操作码 truffle publish - 发布以太坊包 truffle run - 运行插件命令 truffle test - 执行测试 truffle unbox - 下载项目模板 truffle version - 显示i版本信息 truffle watch - 自动重新构建
Truffle配置文件
配置文件概述 networks - 网络配置 contracts_directory - 合约目录配置 contracts_build_directory - 合约构建目录配置 migrations_directory - 迁移脚本目录配置 mocha - 测试配置 compilers.solc - Solidity编译器配置 compilers.external - 外部编译器配置
合约抽象层API
合约抽象对象概述 MyContract.new - 部署新合约 MyContract.at - 载入已部署合约 MyContract.deployed - 载入默认合约 MyContract.link - 链接合约库 MyContract.networks - 获取网络列表 MyContract.setProvider - 设置web3提供器 MyContract.setNetwork - 设置网络 MyContract.hasNetwork - 检测指定网络 MyContract.defaults - 实例默认值 MyContract.clone - 克隆合约抽象 MyContract.numberFormat - 数值格式 MyContract.timeout - 交易超时区块数 MyContract.autoGas - 是否自动估算gas MyContract.gasMultiplier - 设置gas估算倍数
Truffle Box API
Truffle Box概述 Truffle Box配置文件 Truffle Box图像规范 Truffle Box发布流程
使用指南
在Truffle中使用Metamask
在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

合约抽象对象概述

Truffle提供了一个合约抽象层,用来与合约进行交互。

获取合约抽象对象

要获取合约抽象实例,可以使用artifacts对象的require()方法来载入 指定的合约构件。在控制台环境外,artifacts在迁移文件、测试文件和exec 脚本中也是有效的。可以如下方式创建指定合约的抽象对象:

const MyContract = artifacts.require("MyContract");

在开发控制台中也可以获取到合约抽象实例。在开发控制台可以使用 at、deployed或new方法获取到合约抽象实例:

truffle(development)> const myContract = await MyContract.deployed();

现在可以访问MyContract的以下函数:

  • at(): 创建一个合约抽象实例,表征部署在指定地址的MyContract合约
  • deployed():创建一个合约抽象实例,表征MyContract管理的默认地址
  • new():向链上部署一个新版本合约,并获取新合约对应的抽象实例

合约方法调用

每个合约抽象实例都绑定到以太坊网络上的特定地址,并且js实例的方法与合约 方法是一一对应的。例如,如果你的Solidity合约有一个函数 someFunction(uint value) {},那么可以像这样调用其对应的js方法:

let deployed;
MyContract.deployed()
  .then((instance) => {
    deployed = instance;
    return deployed.someFunction(5);
  }).then((result) => {
    // Do something with the result or continue with more transactions.
  });

也可以使用async/await语法来简化上面的代码。在本文的剩余部分将使用 async/await,但是记住你也可以使用promise来与合约交互:

const deployed = await MyContract.deployed();
const result = await deployed.someFunction(5);
// Do something with the result or continue with more transactions.

合约事件监听

合约的方法和事件具有EventEmitter接口,因此可以像下面这样配置 监听句柄:

const example = await artifacts.require("Example").deployed();

example
  .setValue(45)
  .on('transactionHash', hash => {})
  .on('receipt', receipt => {})
  .on('error', error => {})
  .on('confirmation', (num, receipt) => {})
  .then(receipt => {});

example
  .ExampleEvent()
  .on('data', event => ... etc ... )

example
  .ExampleEvent()
  .once('data', event => ... etc ... )

合约抽象API

合约抽象有两组API,一个是静态合约抽象API,另一个是合约实例API。合约抽象 API适用于所有的合约,例如MyContract.at(),而合约实例API则对应于区块链 上合约的特定部署。