合约部署与交互步骤

部署和与智能合约交互的步骤可以分为几个主要阶段。以下是一个详细的指南,涵盖了从部署合约到与其交互的完整过程。

1. 准备工作

  • 安装 Truffle: 确保你已经安装了 Truffle

    npm install -g truffle
  • 创建 Truffle 项目: 初始化一个新的 Truffle 项目。

    truffle init
  • 编写合约: 在 contracts 文件夹中创建和编写智能合约(例如 SimpleStorage.sol)。

2. 编写合约

contracts 文件夹中创建一个智能合约文件,例如 SimpleStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

contract SimpleStorage {
    uint public storedData;

    function set(uint x) public {
        storedData = x;
    }

    function get() public view returns (uint) {
        return storedData;
    }
}

3. 编写迁移文件

migrations 文件夹中创建一个迁移文件,例如 2_deploy_contracts.js,用于部署合约。

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

module.exports = function (deployer) {
  deployer.deploy(SimpleStorage);
};

4. 配置 Truffle

truffle-config.js 文件中配置你的网络。确保你已设置网络配置和合约编译器版本。这里以 development 网络为例:

module.exports = {
  networks: {
    development: {
      host: "localhost",
      port: 7545, // Ganache 的默认端口
      network_id: "*", // 任何网络 ID
    },
  },
  compilers: {
    solc: {
      version: "^0.8.21", // 你使用的 Solidity 版本
    },
  },
};

5. 编译合约

使用 Truffle 编译合约,确保合约代码没有语法错误。

truffle compile

6. 部署合约

部署合约到指定的网络(如本地开发网络 Ganache)。

truffle migrate

使用 --reset 选项重新部署合约,清除之前的部署记录:

truffle migrate --reset

7. 与合约交互

使用 Truffle 控制台与合约进行交互。首先启动 Truffle 控制台:

truffle console --network development

在控制台中,你可以通过以下步骤与合约交互:

7.1. 获取合约实例

const instance = await SimpleStorage.deployed();

7.2. 调用合约方法

  • 调用公共方法:

    await instance.set(123); // 调用设置值的方法
    const storedData = await instance.get(); // 调用获取值的方法
    console.log(storedData.toString()); // 输出存储的数据
  • 检查合约状态:

    const storedData = await instance.storedData();
    console.log("Stored data:", storedData.toString());

8. 测试合约

编写测试用例确保合约功能正常。在 test 文件夹中创建测试文件,例如 simpleStorage.test.js

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

contract('SimpleStorage', accounts => {
  let instance;

  before(async () => {
    instance = await SimpleStorage.new(); // 部署新的合约实例
  });

  it('should store and retrieve data', async () => {
    await instance.set(123);
    const storedData = await instance.get();
    assert.equal(storedData.toString(), '123', 'The stored data should be 123');
  });
});

运行测试用例:

truffle test

总结

  1. 编写合约: 在 contracts 文件夹中创建合约代码。
  2. 编写迁移文件: 在 migrations 文件夹中创建用于部署合约的迁移脚本。
  3. 配置 Truffle: 配置 truffle-config.js 文件以指定网络和编译器版本。
  4. 编译合约: 使用 truffle compile 编译合约。
  5. 部署合约: 使用 truffle migrate 部署合约。
  6. 与合约交互: 使用 Truffle 控制台或脚本与合约进行交互。
  7. 测试合约: 编写和运行测试用例以验证合约功能。

获取已经部署合约实例的方法总结

在 Truffle 中,SimpleStorage.deployed() 是一种常见的方法来获取已部署合约的实例,但还有其他几种方法可以创建或获取合约实例,具体取决于你的使用场景。以下是几种方法:

1. SimpleStorage.deployed()

  • 用途: 获取已部署的合约实例。这是最常用的方法,适用于你已经部署了合约,并且想要与该合约交互。

  • 示例:

    const instance = await SimpleStorage.deployed();

2. SimpleStorage.at(address)

  • 用途: 获取合约实例,指定合约的地址。这种方法适用于你知道合约的地址,并且想要与特定地址的合约交互。

  • 示例:

    const instance = await SimpleStorage.at('0x1234567890abcdef1234567890abcdef12345678');

3. new SimpleStorage()

  • 用途: 部署一个新的合约实例。这种方法适用于你希望在脚本中部署一个新的合约实例,而不是与已部署的合约交互。

  • 示例:

    const instance = await SimpleStorage.new();

4. 在迁移脚本中使用 deployer 对象

  • 用途: 在迁移脚本中部署和获取合约实例。deployer 对象提供了 deploy 方法,适用于你在迁移过程中部署新的合约实例。

  • 示例:

    module.exports = function(deployer) {
        deployer.deploy(SimpleStorage).then(instance => {
            // 这里的 `instance` 是新的合约实例
            console.log("Contract deployed at address:", instance.address);
        });
    };

5. 在测试脚本中使用 beforebeforeEach 钩子

  • 用途: 在测试脚本中部署合约实例,并在每个测试用例中使用。beforebeforeEach 钩子函数通常用于设置测试环境。

  • 示例:

    const SimpleStorage = artifacts.require("SimpleStorage");
    
    contract('SimpleStorage', accounts => {
        let instance;
    
        before(async () => {
            instance = await SimpleStorage.new(); // 部署新的合约实例
        });
    
        it('should store the initial value correctly', async () => {
            const storedData = await instance.storedData();
            assert.equal(storedData.toString(), '100', 'The stored data should be 100');
        });
    });

总结

  • SimpleStorage.deployed(): 用于获取已部署的合约实例。
  • SimpleStorage.at(address): 用于获取特定地址的合约实例。
  • new SimpleStorage(): 用于部署新的合约实例。
  • 在迁移和测试脚本中使用 deployer 对象或钩子函数来管理合约实例。