《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)

在这里插入图片描述

文章目录

  • 2.1 安装和配置 Solidity
    • 2.1.1 基础知识解析
      • 安装 Solidity 编译器
      • 配置开发环境
      • 熟悉命令行工具
    • 2.1.2 重点案例:配置本地开发环境
      • 案例 Demo:配置本地 Solidity 环境
      • 案例代码:HelloWorld.sol
    • 2.1.3 拓展案例 1:设置 Remix IDE
      • 案例 Demo:在 Remix IDE 中编写和测试智能合约
      • 案例代码:Greeter.sol
    • 2.1.4 拓展案例 2:使用 Truffle 框架
      • 案例 Demo:使用 Truffle 创建和测试一个智能合约
      • 案例代码:SimpleStorage.sol
      • 迁移脚本:2_deploy_contracts.js
      • 测试用例:simplestorage_test.js
  • 2.2 开发工具和 IDE 简介
    • 2.2.1 基础知识解析
      • 集成开发环境(IDE)的重要性
      • 常用的 Solidity 开发工具
      • 选择适合的工具
    • 2.2.2 重点案例:使用 Visual Studio Code 开发 Solidity
      • 案例 Demo:在 VS Code 中开发一个简单的智能合约
      • 案例代码:HelloWorld.sol
      • 测试和运行合约
    • 2.2.3 拓展案例 1:使用 Remix IDE 进行快速原型开发
      • 案例 Demo:在 Remix IDE 中创建和测试一个智能合约
      • 案例代码:SimpleStorage.sol
      • 在 Remix 中测试合约
    • 2.2.4 拓展案例 2:使用 Truffle 和 Ganache 进行开发和测试
      • 案例 Demo:在 Truffle 和 Ganache 环境中开发和测试智能合约
      • 案例代码:SimpleStorage.sol
      • 迁移脚本:2_deploy_contracts.js
      • 测试脚本:simplestorage.test.js
  • 2.3 测试和调试工具
    • 2.3.1 基础知识解析
      • 测试的重要性
      • 测试类型
      • 常用的测试工具
      • 调试工具
    • 2.3.2 重点案例:使用 Truffle 进行智能合约测试
      • 案例 Demo:在 Truffle 中测试智能合约
      • 案例代码:MyContract.sol
      • 迁移脚本:2_deploy_contracts.js
      • 测试脚本:mycontract_test.js
    • 2.3.3 拓展案例 1:使用 Mocha 和 Chai 进行单元测试
      • 案例 Demo:使用 Mocha 和 Chai 测试 Solidity 合约
      • 案例代码:Calculator.sol
      • 测试脚本:calculator_test.js
    • 2.3.4 拓展案例 2:使用 Remix 进行交互式测试和调试
      • 案例 Demo:在 Remix IDE 中进行交互式测试和调试
      • 案例代码:Counter.sol
      • 在 Remix 中进行调试:

2.1 安装和配置 Solidity

欢迎来到 Solidity 的世界,一个充满奇幻和机遇的新大陆!让我们从基础开始,一步步搭建起你的 Solidity 开发环境。

2.1.1 基础知识解析

欢迎来到搭建 Solidity 开发环境的第一步!这就像是你准备登陆一个新星球,首先需要确保你的太空船设备就绪。让我们来详细了解一下如何开始这一激动人心的旅程。

安装 Solidity 编译器

1. 使用 npm 安装: Solidity 的主流安装方式是通过 npm。在你的命令行工具中输入 npm install -g solc 即可全局安装 Solidity 编译器。这个命令会将 Solidity 安装到你的机器上,使得它可以在任何项目中使用。

2. 版本管理: Solidity 版本更新频繁,每个版本都可能带来新功能或语法改变。你可以通过命令 solcjs --version 查看当前安装的版本。为了确保与教程或项目的兼容性,你可能需要安装特定版本的 Solidity。

配置开发环境

1. 选择 IDE: 选择一个合适的集成开发环境(IDE)对提高开发效率至关重要。对于初学者,Remix IDE 是一个优秀的在线选择,它提供了编写、编译、部署和测试智能合约的一体化体验。而对于更习惯于本地开发的人,Visual Studio Code 加上 Solidity 插件是个不错的选择。

2. 安装必要插件: 在 Visual Studio Code 中,你可以通过安装 Solidity 插件来获得语法高亮、代码自动完成和格式化等功能。这些插件将大大提高你的编码效率。

3. 配置编译器: 不同的 IDE 对编译器的配置方式可能有所不同。在 Visual Studio Code 中,你可能需要在项目的设置中指定 Solidity 编译器的路径或版本。而在 Remix 中,你可以直接在网页界面上选择不同版本的编译器。

熟悉命令行工具

虽然许多 IDE 提供了图形界面来简化操作,但了解如何通过命令行使用 Solidity 编译器仍然很重要。学会使用命令行工具将使你能更灵活地控制编译过程,并更好地理解背后的过程。

就像每位太空探险者都需要了解自己的太空船一样,每位 Solidity 开发者也需要熟悉自己的开发环境。通过掌握这些基础知识,你将能够顺利地开始你的 Solidity 开发之旅,探索智能合约的无限可能性。

2.1.2 重点案例:配置本地开发环境

假设你是一名热衷于区块链技术的开发者,希望在本地机器上配置一个功能齐全的 Solidity 开发环境。这将使你能够高效地编写、测试和部署智能合约。

案例 Demo:配置本地 Solidity 环境

  1. 安装 Node.js 和 npm:

    • 访问 Node.js 官网,下载并安装 Node.js。这通常会自动安装 npm。
    • 安装完成后,在命令行中运行 node -vnpm -v 来确认它们已正确安装。
  2. 安装 Solidity 编译器(solc):

    • 在命令行中运行 npm install -g solc 安装 Solidity 编译器。
    • 使用 solcjs --version 命令来验证安装。
  3. 配置 Visual Studio Code:

    • 下载并安装 Visual Studio Code。
    • 打开 VS Code,搜索并安装 Solidity 插件,如 Juan Blanco's Solidity 插件,以获得语法高亮和代码智能提示。
  4. 安装 Truffle Framework:

    • Truffle 是一个流行的开发框架,用于编写、测试和部署智能合约。在命令行中运行 npm install -g truffle 来安装它。
    • 使用 truffle version 来确认安装。
  5. 创建和测试一个简单的智能合约:

    • 创建一个新的目录作为你的项目文件夹,并在其中运行 truffle init 初始化一个新的 Truffle 项目。
    • contracts 目录下创建一个新的 Solidity 文件,如 HelloWorld.sol,并编写一个简单的智能合约。
    • migrations 目录下创建一个迁移脚本来部署你的合约。
    • 运行 truffle develop 开启一个内置的 Ethereum 测试网络,并在该环境下运行 compilemigrate 命令来编译和部署你的合约。
    • 编写测试脚本并在 Truffle 开发环境中运行 test 命令来测试你的合约。

案例代码:HelloWorld.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract HelloWorld {string public greeting = "Hello, World!";function setGreeting(string memory _greeting) public {greeting = _greeting;}function getGreeting() public view returns (string memory) {return greeting;}
}

在这个案例中,我们配置了一个完整的本地开发环境,可以用于创建和测试 Solidity 项目。使用这样的环境,你可以高效地开发复杂的 DApps 和智能合约。

恭喜你!现在你已经配置好了自己的 Solidity 开发环境。这就像是为你的宇宙探索之旅装配了一个先进的太空船。现在,你已经准备好进入智能合约和区块链技术的奇妙世界,进行你的创新之旅了!

2.1.3 拓展案例 1:设置 Remix IDE

假设你是一位初入区块链领域的新手,希望通过一个简单、直观的方式开始你的 Solidity 学习之旅。Remix IDE 是一个完美的起点,它是一个基于浏览器的 Solidity 集成开发环境,适合快速开始和原型开发。

案例 Demo:在 Remix IDE 中编写和测试智能合约

  1. 访问 Remix IDE:

    • 打开浏览器,访问 Remix IDE 官网。
  2. 创建新文件:

    • 在 Remix IDE 中,点击左侧的“文件浏览器”图标,然后点击“新建文件”图标。
    • 命名新文件为 Greeter.sol
  3. 编写智能合约:

    • Greeter.sol 文件中编写一个简单的问候合约。这个合约包含一个可以存储和更改问候语的功能。
  4. 编译合约:

    • 点击左侧的“Solidity 编译器”图标。
    • 选择合适的编译器版本,然后点击“编译 Greeter.sol”。
  5. 部署和运行合约:

    • 点击左侧的“部署和运行交易”图标。
    • 选择一个环境(如 JavaScript VM)。
    • 点击“部署”来部署你的合约到虚拟环境中。
    • 一旦部署,你就可以与合约交互,尝试调用它的函数。

案例代码:Greeter.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Greeter {string public greeting;constructor(string memory _initialGreeting) {greeting = _initialGreeting;}function setGreeting(string memory _newGreeting) public {greeting = _newGreeting;}function greet() public view returns (string memory) {return greeting;}
}

在这个案例中,我们创建了一个简单的 Greeter 合约,它允许用户设置和检索一个问候语。通过 Remix IDE,我们可以轻松编写、编译、部署和测试智能合约,无需复杂的配置。

使用 Remix IDE,你就像是在一个安全的沙盒环境中进行实验,它为你提供了学习和探索 Solidity 的理想场所。现在,你已经准备好用这个强大的工具来探索更多智能合约的奇妙世界了!

2.1.4 拓展案例 2:使用 Truffle 框架

假设你已经熟悉了基本的 Solidity 编程,现在准备进一步探索更复杂的项目。Truffle 框架是一个完善的开发环境,它提供了编译、部署、测试智能合约的强大工具。对于希望进行全面区块链开发的人来说,Truffle 是一个理想的选择。

案例 Demo:使用 Truffle 创建和测试一个智能合约

  1. 安装 Truffle:

    • 在命令行中运行 npm install -g truffle,全局安装 Truffle。
    • 安装完成后,使用 truffle version 来确认安装成功。
  2. 初始化 Truffle 项目:

    • 创建一个新的目录作为你的项目文件夹,例如命名为 MyTruffleProject
    • 在该目录下打开命令行,运行 truffle init 初始化一个新的 Truffle 项目。
  3. 创建智能合约:

    • contracts 文件夹中创建一个新的 Solidity 文件,例如 SimpleStorage.sol
    • 编写一个基础的智能合约,用于存储和检索一个数值。
  4. 编译合约:

    • 在项目根目录下,运行 truffle compile 编译智能合约。
  5. 编写迁移脚本:

    • migrations 目录下创建一个新的迁移脚本,例如 2_deploy_contracts.js,用于部署你的智能合约。
  6. 测试智能合约:

    • test 文件夹中创建一个 JavaScript 或 Solidity 测试文件,例如 simplestorage_test.js
    • 编写测试用例来测试智能合约的功能。
    • 运行 truffle test 在测试网络上执行测试。

案例代码:SimpleStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract SimpleStorage {uint256 private storedData;function set(uint256 x) public {storedData = x;}function get() public view returns (uint256) {return storedData;}
}

迁移脚本:2_deploy_contracts.js

const SimpleStorage = artifacts.require("SimpleStorage");module.exports = function (deployer) {deployer.deploy(SimpleStorage);
};

测试用例:simplestorage_test.js

const SimpleStorage = artifacts.require("SimpleStorage");contract("SimpleStorage", () => {it("should store the value 89.", async () => {const storage = await SimpleStorage.deployed();await storage.set(89);const storedData = await storage.get();assert.equal(storedData, 89, "The value 89 was not stored.");});
});

在这个案例中,我们使用 Truffle 框架创建了一个名为 SimpleStorage 的智能合约,它简单地存储和检索一个数值。我们编写了迁移脚本来部署合约,并添加了测试用例来验证其功能。

通过使用 Truffle 框架,你可以体验到更专业和全面的智能合约开发过程。从编写和编译合约到测试和部署,Truffle 为你提供了一站式的解决方案。现在,你已经准备好用这个强大的框架来挑战更复杂的区块链项目了!

现在你已经了解了如何搭建和配置你的 Solidity 开发环境。无论是选择轻便的在线 IDE 还是配置全功能的本地环境,记得选择最适合你项目需求的工具。就像每个航海家都需要适合自己的航海图一样,每个 Solidity 开发者也需要适合自己的开发环境。现在,让我们扬帆起航,进入 Solidity 的奇妙世界吧!

2.2 开发工具和 IDE 简介

嘿,区块链的朋友们!让我们深入探索 Solidity 的神奇世界。要开始这趟旅程,你需要一些强大的工具。就像选择最佳的潜水装备一样,选择合适的开发工具和 IDE 对于编写高效、无错误的智能合约至关重要。

2.2.1 基础知识解析

开发 Solidity 智能合约就像是进行一次宇宙探索,你需要装备最先进的工具和技术。让我们深入了解一下这些工具,确保你的编程之旅顺利无阻。

集成开发环境(IDE)的重要性

  1. 功能集成: IDE 集成了编写、编译、测试和调试智能合约所需的所有工具。这就像是你的太空舱,提供了一切生存和探索所需的设备。

  2. 代码高效编写: 大多数 IDE 提供语法高亮、代码自动完成、错误提示等功能,使编写代码更加高效、准确。

  3. 错误检测与调试: IDE 能够帮助你快速定位代码中的错误,并提供调试工具来测试和优化代码。

常用的 Solidity 开发工具

  1. Remix IDE:

    • 适用场景: 快速原型开发、学习和小型项目。
    • 特点: 基于浏览器,无需安装,支持即时编译和部署。
  2. Visual Studio Code(VS Code):

    • 适用场景: 广泛的项目类型,从初学者到专业开发。
    • 特点: 高度可定制,丰富的插件生态,如 Solidity 插件。
  3. Truffle Suite:

    • 组件: 包括 Truffle、Ganache 和 Drizzle。
    • 适用场景: 复杂的 DApp 开发和测试。
    • 特点: 提供了编译、部署、测试智能合约的完整工具链。

选择适合的工具

选择 IDE 和工具时,考虑以下因素:

  • 项目需求: 不同的项目可能需要不同的工具。例如,简单的学习项目可能只需要 Remix,而大型复杂项目可能会从 Truffle Suite 中受益。

  • 个人喜好: 一些开发者可能更喜欢具有丰富功能和可定制性的环境,比如 VS Code,而其他人可能更倾向于简单易用的在线工具,如 Remix。

  • 学习曲线: 对于初学者来说,开始时使用简单直观的工具可能更容易上手。随着经验的积累,可以逐渐过渡到更复杂的工具和环境。

2.2.2 重点案例:使用 Visual Studio Code 开发 Solidity

想象一下,你正站在智能合约的大门前,准备使用 Visual Studio Code(VS Code)这把钥匙来解锁这扇门。VS Code 是一个功能强大的编辑器,通过合适的设置和插件,它可以成为开发 Solidity 的理想环境。

案例 Demo:在 VS Code 中开发一个简单的智能合约

  1. 安装 Visual Studio Code:

    • 访问 Visual Studio Code 官网,下载并安装 VS Code。
  2. 安装 Solidity 插件:

    • 打开 VS Code,转到扩展市场,搜索并安装一个 Solidity 插件,例如由 Juan Blanco 开发的插件。
  3. 配置 Solidity 环境:

    • 在 VS Code 中,通过设置(通常在文件 > 首选项 > 设置中)确保 Solidity 编译器配置正确。
    • 你可以设置默认的 Solidity 编译器版本,以确保与你的项目兼容。
  4. 创建和编写智能合约:

    • 在 VS Code 中创建一个新的项目文件夹,例如命名为 MySolidityProject
    • 在该文件夹中创建一个新的 Solidity 文件,如 HelloWorld.sol
    • 编写一个简单的智能合约,比如一个可以存储和返回问候语的合约。
  5. 编译智能合约:

    • 使用 VS Code 的集成终端运行 Solidity 编译器(solc),或者通过插件提供的功能编译你的合约。

案例代码:HelloWorld.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract HelloWorld {string private greeting;constructor(string memory _greeting) {greeting = _greeting;}function setGreeting(string memory _greeting) public {greeting = _greeting;}function getGreeting() public view returns (string memory) {return greeting;}
}

在这个简单的 HelloWorld 合约中,我们设置了一个可以更改的问候语。这个合约展示了 Solidity 的基本结构,包括构造函数、状态变量、函数和可见性修饰符。

测试和运行合约

  • 虽然 VS Code 本身不直接运行 Solidity 合约,但你可以使用 Truffle 或其他框架来测试和部署你的合约。
  • 编写测试脚本,并使用 Truffle 在本地或测试网络上部署和测试合约。

通过使用 Visual Studio Code,你已经迈出了成为 Solidity 开发者的第一步。现在,你拥有了编写、测试和完善智能合约所需的所有工具。

2.2.3 拓展案例 1:使用 Remix IDE 进行快速原型开发

想象你正站在一个巨大的乐高玩具箱前,准备开始你的创造之旅。Remix IDE 就像这样一个充满乐趣的工具箱,让你快速开始 Solidity 开发,无需复杂的配置或安装过程。

案例 Demo:在 Remix IDE 中创建和测试一个智能合约

  1. 访问 Remix IDE:

    • 打开浏览器,访问 Remix IDE。
  2. 创建新的 Solidity 文件:

    • 在 Remix 中,点击左侧的“文件浏览器”图标,然后点击“新建文件”图标。
    • 命名新文件为 SimpleStorage.sol
  3. 编写智能合约:

    • SimpleStorage.sol 文件中编写一个基本的智能合约,例如一个可以存储和检索数字的合约。
  4. 编译合约:

    • 点击左侧的“Solidity 编译器”图标。
    • 选择合适的编译器版本,然后点击“编译 SimpleStorage.sol”。
  5. 部署和测试合约:

    • 点击左侧的“部署和运行交易”图标。
    • 选择一个环境(例如 JavaScript VM)。
    • 点击“部署”来部署你的合约。
    • 一旦部署完成,使用 Remix 提供的界面与合约交互。

案例代码:SimpleStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract SimpleStorage {uint256 private storedData;function set(uint256 x) public {storedData = x;}function get() public view returns (uint256) {return storedData;}
}

在这个 SimpleStorage 合约中,我们定义了两个函数:set 用于存储一个数字,get 用于检索存储的数字。这个合约展示了 Solidity 的基本功能,非常适合作为初学者的第一个项目。

在 Remix 中测试合约

  • 通过 Remix 的界面,你可以调用 set 函数存储一个数字,然后调用 get 函数来查看存储的结果。
  • Remix 提供了一个简单直观的方式来与你的合约进行交互,让测试过程变得轻松愉快。

使用 Remix IDE,你可以轻松跳入 Solidity 开发的大海,开始你的编程之旅。它是一个完美的学习工具,让你在没有任何压力的情况下实验和探索智能合约的世界。

2.2.4 拓展案例 2:使用 Truffle 和 Ganache 进行开发和测试

假如你是一个热衷于探索和创新的开发者,渴望在一个更接近真实环境的模拟场景中测试你的智能合约。在这里,Truffle 和 Ganache 就像是你的探险装备,帮助你在安全的环境中模拟真实的区块链操作。

案例 Demo:在 Truffle 和 Ganache 环境中开发和测试智能合约

  1. 安装 Truffle 和 Ganache:

    • 使用 npm 安装 Truffle:在命令行中运行 npm install -g truffle
    • 下载并安装 Ganache,一个个人的以太坊区块链用于开发。
  2. 初始化 Truffle 项目:

    • 创建一个新的目录,例如 MyTruffleProject
    • 在该目录下,运行 truffle init 初始化一个新的 Truffle 项目。
  3. 编写智能合约:

    • contracts 目录中创建一个新的 Solidity 文件,如 SimpleStorage.sol
    • 编写一个智能合约,例如用于存储和检索数值的合约。
  4. 编写迁移脚本:

    • migrations 目录中创建一个新的迁移脚本,如 2_deploy_contracts.js,用于部署智能合约。
  5. 配置 Truffle 以使用 Ganache:

    • 在 Truffle 的配置文件 truffle-config.js 中设置 Ganache 作为开发环境。
  6. 编译和部署合约:

    • 在命令行中运行 truffle compile 编译智能合约。
    • 然后运行 truffle migrate 将合约部署到 Ganache。
  7. 编写和运行测试:

    • test 目录下创建测试脚本,例如 simplestorage.test.js
    • 编写测试用例,然后使用 truffle test 运行测试。

案例代码:SimpleStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract SimpleStorage {uint256 private storedData;function set(uint256 x) public {storedData = x;}function get() public view returns (uint256) {return storedData;}
}

迁移脚本:2_deploy_contracts.js

const SimpleStorage = artifacts.require("SimpleStorage");module.exports = function (deployer) {deployer.deploy(SimpleStorage);
};

测试脚本:simplestorage.test.js

const SimpleStorage = artifacts.require("SimpleStorage");contract("SimpleStorage", () => {it("should store and retrieve a value", async () => {const storage = await SimpleStorage.deployed();await storage.set(10);const storedData = await storage.get();assert.equal(storedData, 10, "The value 10 was not stored.");});
});

在这个案例中,我们使用 Truffle 创建了一个 SimpleStorage 智能合约,它可以存储和检索一个数值。通过 Ganache,我们可以在一个个人的模拟区块链上进行部署和测试,这提供了一个安全和控制的开发环境。

通过使用 Truffle 和 Ganache,你将能体验到一个接近实际的区块链开发环境。这样的工具使你能够在安全的沙盒中测试你的合约,为将来的部署到主网做好准备。开始你的开发之旅,享受创造的乐趣吧!

好了,现在你已经了解了 Solidity 开发的各种工具和 IDE。不论你是刚入门的新手还是经验丰富的开发者,总有一款工具适合你。现在,拿起你的工具,开始创造属于你的智能合约世界吧!

2.3 测试和调试工具

开发智能合约就像是在未知星球上建造一座建筑,测试和调试工具就是你的安全网和工具箱,确保一切按计划进行,没有意外发生。

2.3.1 基础知识解析

在 Solidity 开发的宇宙中,测试和调试工具是你的导航系统和维修工具包。它们确保你的智能合约能够在广阔的区块链宇宙中平稳航行,避免遭遇意外的陨石撞击。

测试的重要性

  1. 保障合约安全: 测试是确保智能合约代码安全、高效且按预期工作的关键步骤。合约一旦部署,就无法更改,因此前期的测试至关重要。

  2. 减少漏洞风险: 通过全面的测试,可以识别并修复可能导致安全漏洞的代码问题,这对于防止攻击和保护用户资产至关重要。

测试类型

  1. 单元测试: 检查智能合约中的单个函数或组件。这就像检查你的太空船的每个小部件是否正常工作。

  2. 集成测试: 测试合约之间的交互,确保它们作为一个整体协同工作。

  3. 端到端测试: 模拟用户与合约的交互,确保整个系统从开始到结束都能如预期运行。

常用的测试工具

  1. Truffle: 提供了一套完整的开发环境,包括用于测试的框架。Truffle 测试通常用 JavaScript 或 Solidity 编写。

  2. Ganache: 作为 Truffle Suite 的一部分,Ganache 是一个个人区块链,可用于快速开发和测试智能合约。

  3. Mocha 和 Chai: 这两个 JavaScript 测试库常与 Truffle 结合使用,提供了灵活的测试结构和丰富的断言功能。

调试工具

  1. Remix IDE: 提供了一个交互式的 Solidity 调试器,使得查看交易执行步骤和状态变化成为可能。

  2. Truffle Debugger: 一个命令行工具,允许开发者在执行时检查交易和跟踪代码。

掌握这些基础知识,你就可以像一个经验丰富的太空工程师一样,确保你的智能合约在任何环境下都表现出色。记住,良好的测试和调试不仅能够保护你的合约免受外部威胁,还能提升用户对你项目的信心。准备好了吗?让我们开始测试之旅,确保你的智能合约是无懈可击的!

2.3.2 重点案例:使用 Truffle 进行智能合约测试

假设你是一个区块链开发者,正在开发一个智能合约并希望确保其稳定性和安全性。使用 Truffle 进行测试是个非常好的选择。Truffle 不仅是一个开发框架,它还提供了强大的测试功能。

案例 Demo:在 Truffle 中测试智能合约

  1. 安装 Truffle:

    • 在命令行中运行 npm install -g truffle 安装 Truffle。
  2. 初始化 Truffle 项目:

    • 创建一个新目录,如 TruffleTesting
    • 在该目录中运行 truffle init 初始化 Truffle 项目。
  3. 编写智能合约:

    • contracts 目录下创建一个新的 Solidity 文件,如 MyContract.sol
    • 编写一个简单的智能合约。例如,一个可以存储和检索数字的合约。
  4. 编写迁移脚本:

    • migrations 目录下创建一个新的迁移脚本,如 2_deploy_contracts.js,用于部署智能合约。
  5. 编写测试脚本:

    • test 目录下创建一个 JavaScript 测试脚本,如 mycontract_test.js
    • 使用 JavaScript 和 Truffle 提供的断言库编写测试用例。
  6. 运行测试:

    • 在项目根目录下运行 truffle test,执行测试脚本。

案例代码:MyContract.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract MyContract {uint256 private number;function storeNumber(uint256 _number) public {number = _number;}function retrieveNumber() public view returns (uint256) {return number;}
}

迁移脚本:2_deploy_contracts.js

const MyContract = artifacts.require("MyContract");module.exports = function (deployer) {deployer.deploy(MyContract);
};

测试脚本:mycontract_test.js

const MyContract = artifacts.require("MyContract");contract("MyContract", () => {it("should store and retrieve a value", async () => {const myContract = await MyContract.deployed();await myContract.storeNumber(10);const retrievedNumber = await myContract.retrieveNumber();assert.equal(retrievedNumber, 10, "The value 10 was not stored.");});
});

在这个案例中,我们使用 Truffle 编写了 MyContract 合约,并创建了相应的测试脚本。通过这些测试,我们可以确保合约的主要功能 —— 存储和检索一个数字 —— 按预期工作。

通过使用 Truffle 进行智能合约测试,你就像是给你的太空船安装了一套先进的检测系统。这些测试确保你的合约能够在各种条件下正常工作,为最终的发射做好准备。

2.3.3 拓展案例 1:使用 Mocha 和 Chai 进行单元测试

设想你是一名致力于精确和高效率的开发者,正在寻找一种方法来确保你的智能合约中的每个函数都按预期工作。在这种情况下,Mocha 和 Chai 这两个 JavaScript 测试框架和断言库将是你理想的伙伴。

案例 Demo:使用 Mocha 和 Chai 测试 Solidity 合约

  1. 准备 Truffle 项目:

    • 确保你已经有一个使用 Truffle 框架的项目。如果没有,可以按照上一个案例中的步骤创建。
  2. 安装 Mocha 和 Chai:

    • 通常,Truffle 项目已经包含 Mocha 和 Chai,因此你不需要单独安装。如果需要,可以使用 npm 安装:npm install mocha chai
  3. 编写智能合约:

    • contracts 目录下,创建一个新的 Solidity 文件,比如 Calculator.sol
    • 编写一个简单的计算器合约,它能进行基本的数学运算。
  4. 编写测试用例:

    • test 目录下,创建一个 JavaScript 测试文件,比如 calculator_test.js
    • 使用 Mocha 定义测试套件,并使用 Chai 的断言进行测试。
  5. 运行测试:

    • 在命令行中运行 truffle test 来执行测试。

案例代码:Calculator.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Calculator {function add(uint256 a, uint256 b) public pure returns (uint256) {return a + b;}function subtract(uint256 a, uint256 b) public pure returns (uint256) {return a - b;}
}

测试脚本:calculator_test.js

const Calculator = artifacts.require("Calculator");
const { assert } = require("chai");contract("Calculator", () => {let calculator;before(async () => {calculator = await Calculator.deployed();});it("should correctly add two numbers", async () => {const result = await calculator.add(2, 3);assert.equal(result.toNumber(), 5, "The sum of 2 and 3 should be 5");});it("should correctly subtract two numbers", async () => {const result = await calculator.subtract(5, 3);assert.equal(result.toNumber(), 2, "The difference of 5 and 3 should be 2");});
});

在这个案例中,我们创建了一个 Calculator 合约,它包含两个基本的数学运算函数。通过编写对应的 Mocha 测试用例,并使用 Chai 的断言,我们能够验证这些函数是否按预期工作。

通过结合使用 Mocha 和 Chai,你可以对智能合约的每个功能进行细致入微的测试。这就像是给你的太空船的每个部件都进行了精确的工程检查,确保在真正启航之前,一切都运行完美。

2.3.4 拓展案例 2:使用 Remix 进行交互式测试和调试

设想你是一名刚入门的 Solidity 开发者,正在寻找一种直观、易于使用的方式来测试和调试你的智能合约。Remix IDE 提供了一个完美的平台,它不仅支持交互式的代码编写和编译,还提供了强大的测试和调试功能。

案例 Demo:在 Remix IDE 中进行交互式测试和调试

  1. 访问 Remix IDE:

    • 使用浏览器打开 Remix IDE。
  2. 创建新的 Solidity 文件:

    • 在 Remix 的“文件浏览器”中创建一个新文件,比如命名为 Counter.sol
  3. 编写智能合约:

    • Counter.sol 文件中,编写一个简单的计数器合约,包含增加和读取计数的功能。
  4. 编译合约:

    • 使用 Remix 中的编译器编译你的合约。
  5. 部署合约到 JavaScript VM:

    • 在“部署和运行交易”面板中,选择 JavaScript VM 环境。
    • 部署你的合约。
  6. 交互式测试合约:

    • 在部署后的合约界面中,尝试调用合约的不同函数,如增加计数器值。
  7. 使用 Remix 的调试功能:

    • 如果有必要,可以使用 Remix 的调试工具来检查交易执行情况和合约状态。

案例代码:Counter.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Counter {uint public count;function increment() public {count += 1;}function getCount() public view returns (uint) {return count;}
}

在这个 Counter 合约中,我们定义了一个简单的计数器。你可以使用 Remix 的界面来调用 increment 函数,然后检查 getCount 函数的返回值是否如预期那样增加。

在 Remix 中进行调试:

  • 使用 Remix 的交易记录功能,你可以找到每次函数调用的详细信息。
  • 如果需要,可以点击交易记录旁的“调试”按钮,进入调试模式,逐步检查合约执行的每个步骤。

使用 Remix IDE 进行交互式测试和调试,对于初学者来说是一个非常友好的选择。它不仅使测试过程简单化,还提供了直观的反馈和强大的调试工具。

通过掌握这些测试和调试工具,你就能确保你的智能合约像在严苛环境下经过测试的宇航服一样,既安全又可靠。测试可能看起来是漫长的旅程,但为了你的合约能在广阔的区块链宇宙中稳定飞行,这一切都是值得的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】Navicat/SQLyog连接Ubuntu中的数据库(MySQL)

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、安装…

Burp常见问题

前言 本文举例了几个常见的软件工具使用问题,文末会提供一些我自己整理和使用的工具资料 。 "在追逐零 Bug 的路上,我们不断学习、改进,更加坚定自己的技术信念。让我们相信,每一个 Bug 都是我们成长的机会。" 一、VM…

2 F. Greetings(离散化+树状数组)

题目链接 F. Greetings 题意 题解 由于两个人的速度是一样的,所以到达终点之前两个人是不会相遇的,考虑一下什么情况两个人会相遇,其中一个人到达终点时,另一个人,终点所在地的前面,并且它的终点在更右边…

模式匹配这么好,Java语法里有吗?

这篇文章我们借助新版Java来理解模式匹配,Rust版的模式匹配稍后就端上来,各位先尝尝Java这杯老咖啡还香不香😄。 什么是模式匹配? 下图直观的表达了模式匹配的概念。 所谓模式类似上图中木盒的各种形状的洞洞,我们…

Unable to make field private JavacProcessingEnvironment$DiscoveredPro报错解决办法

maven项目打包报错 报错信息 Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not &q…

2.20总结

根据这周的学习任务在学习KMP算法和哈希算法,这两种算法主要都用于字符串,而且学习起来都有一定的难度,刚开始的时候一个视频要看好几遍才能弄懂,但是经过这两天的学习也有了一定的收KMP 我通过一小段简单的代码来强化我对于KMP算法的理解&a…

阿里云服务器多少钱?2024年阿里云服务器价格配置表出炉!

2024年阿里云服务器租用价格表更新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

jmeter 命令行启动 动态参数化

[Jmeter命令行参数] 一、在linux中,使用非gui的方式执行jmeter。若需更改参数,必须先编辑jmx文件,找到对应的变量进行修改,比较麻烦。因此,可以参数化一些常用的变量,直接在Jmeter命令行进行设置 二、参数…

尚硅谷ES基础 - RESTful JSON基本概念倒排索引HTTP

RESTful & JSON REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。 Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。…

自动驾驶中之定位总结

1 前言2 典型的单个定位方式2.1 基于通信的定位方法2.1.1 GNSS 全球卫星导航系统2.1.1.1 gnss的优点与缺点2.1.1.2 gnss定位技术2.1.1.2.1 RTK定位技术2.1.1.2.2 PPP定位技术 2.1.1.2 gnss定位技术总结 2.1.2 车联网定位 2.1 基于航位推算的定位方法2.1.1 惯性测试单元定位IMU2…

Microsoft Office Visio 2007中绘制大括号

文章目录 一、Microsoft Office Visio 2007中绘制大括号 一、Microsoft Office Visio 2007中绘制大括号 在Microsoft Office Visio 2007中绘制大括号的方法如下: 打开Visio 2007——文件——形状——其他Visio方案——标注 此时左侧栏中出现“标注”栏&#xff0c…

代码随想录刷题笔记-Day21

1. 二叉搜索树中的插入操作 701. 二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。…

Discuz! X收藏列表页调用封面图片详细教程

Discuz! X默认收藏列表不显示封面图,我们接到客户需求要开发封面图功能在帖子列表,这是我们整理好的详细教程,下载即可查看 修改后,显示封面的收藏列表截图: 详细开发教程下载地址:Discuz! X收藏列表页调用…

【9】知识存储

一、图数据库neo4j Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。单节点的服务器可承载上亿级的节点和关系,单节点性能不够时也可进行分布式集群部…

提升认知水平和防止偏见浅谈

提升认知水平和防止偏见浅谈 《庄子外物》:井蛙不可语海,夏虫不可语冰。 不要跟井底的青蛙谈论大海,因为它的认知只有井底那么大,大海对于它来说是认知盲区;不要与夏虫去谈论冰雪,因为夏虫一生很短没有经历…

5. D. In Love(贪心)

题目链接 D. In Love 题意 线段的集合,有两种操作 插入一个线段删除一个线段 每次操作后都要去查询是否存在两个线段不相交 题解 首先先看两个线段不相交需要满足什么条件 也就是较 大 l > 小 r 大l>小r 大l>小r即可满足不相交 我们进行推广 当集合…

手撕qsort函数

前言 本篇主要讲解的是qsort函数细节以及运用实例。 紧跟我的脚步一起手撕qsort函数吧~ 欢迎关注​​个人主页:逸狼 更多优质内容: 拿捏c语言指针(上) 拿捏c语言指针(中) 拿捏c语言指针(下&…

【数据结构/c++】求解有向无环图DAG的关键路径

#include<cstring>//memset头文件 #include<algorithm>//fill头文件 #include<vector> #include<stdio.h> #include<stack> #include<queue> using namespace std; const int MAXV510; struct Node{int v,w;Node(int _v,int _w):v(_v),…

2023年便宜的云服务器分享:最低26元4核16G

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

嵌入式学习第十九天!(时间获取、文件属性和权限的获取、软链接和硬链接)

时间获取&#xff1a; 1. time time_t time(time_t *tloc); 功能&#xff1a;返回1970-01-01到现在的秒数&#xff08;格林威治时间&#xff09; 参数&#xff1a; tloc:存放秒数空间首地址 返回值: 成功返回秒数 失败返回-1 2. localtime struct tm *localtime(const tim…