Skip to main content

Foundry

使用 [Foundry]测试和部署智能合同 (https://book.getfoundry.sh/)


  1. 使用 foundryup 工具链安装程序
curl -L https://foundry.paradigm.xyz | bash

这将安装 foundryup,然后按照屏幕上的说明进行操作,这将使foundryup命令在您的 CLI 中可用。 运行foundryup本身将安装最新的预编译的二进制文件: forgecastanvilchisel。 更多选项请参阅foundryup --help

note

如果您使用的是Windows,则需要安装并使用Git BASHWSL,作为您的终端,因为Foundryup目前不支持PowerShellCmd

  1. 安装后,创建一个项目。 我们的名字是 hello_subspace

    若要初始化项目,请运行

    forge init hello_subspace

    cd 到 hello_subspace 目录,让我们看看项目的结构。

    Foundry-1

  2. 所有必要的回购结构都是自动创建的,因此我们可以立即开始编写和测试我们的智能合约。 As you can see, there are separate directories for storing smart contracts (src) and testing smart contracts (test). 让我们看看Counter.sol智能合约,并为标准行为添加更多功能。 我们的智能合同将有三个函数:setNumber(),将uint256数字设置为提供的值。 递增()会增加值1 和 deciment()会减少值1。

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  3. 让我们确保所有函数正常工作,方法是在 Counter.t.sol 测试文件中添加几个测试,并检查它们是否通过。

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  4. 在我们的测试中,我们首先将初始值设置为2。 然后检查函数递增()是否增加值1,如果deciment()减少值1。 让我们通过运行来构建一个项目:

    forge build

    并通过运行以下命令来确保测试按预期工作

    forge test

    Foundry-2

    很好,所有测试都通过了,这意味着智能合约正在按预期工作。

  5. 其次,我们需要设置两件事,以便部署我们的智能合同

    • We need to connect a wallet that has sufficient balance of tAI3 to cover the gas fees.
    • 我们需要设置一个稍后使用的环境变量。

    为了使我们的生活更容易,让我们创建一个新的 Makefile.env 文件作为我们项目的根目录. .env文件通常用于存储应用程序的环境变量。 They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    环境变量可以包括数据库连接详细信息、API密钥、外部资源URI或其他配置变量,这些变量可能会根据应用程序的运行环境而更改。 在我们的示例中,我们将使用它来指向我们的核心EVM RPC URL,方法是设置

    RPC_URL=https://nova-0.gemini-3h.subspace.network/ws

    然后为兼容EVM的钱包设置私钥

    PRIVATE_KEY=”your_private_key_value”
    tip

    重要的是注意到 nv 文件不应承诺于您的源控制(如Git),特别是当它们包含敏感数据时,如您的私钥。 要防止这种情况,请将.env添加到.gitignore文件中。 这有助于确保敏感密钥的安全,并避免在应用程序的代码或版本控制历史记录中暴露它们的风险。

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  6. In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
    caution

    Do not attempt to speed up a transaction (do not include a tip on top of the gas fees). To read more about this, please refer to this section.

    caution

    In some cases when deploying the script, you may experience "No manual gas limit set" or "Gas estimation failed" issues. Please refer to this section for the solution.

  7. Congratulations, you've successfully deployed your smart contract on Autonomys EVM!