truffle使用

1.下载

npm install -g truffle

2.使用

创建没有合约的空工程
truffle init
或下载模板
truffle unbox metacoin

在操作完成之后,就有这样的一个项目目录结构:

image-20220228155114031

  • contracts/: Solidity合约目录
  • migrations/: 部署脚本文件目录
  • test/: 测试脚本目录
  • truffle-config.js: Truffle 配置文件

编译合约

truffle compile
仅编译自上次编译以来有更改的合约。 如果我们想覆盖此行为,可以使用 --all 选项运行上面的命令。

生成build文件夹

image-20220228155437076

可以看到合约对应的 json 文件,即abi接口

image-20220228160231763

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 上。

猜你喜欢

转载自blog.csdn.net/weixin_44932880/article/details/124825256
今日推荐