区块链研究实验室 |使用Truffle Debugger调试智能合约- part I

与传统的集中式软件开发一样,在智能合约的开发生命周期中,漏洞会蔓延到智能合约开发人员的代码中。虽然智能合约可能存在错误,但仍有“Etherillion”原因,所以在智能合约部署到主网之前必须删除所有Bug,否则,我们将面临资金损失的风险,并最终失去智能合约的可信度。

有几个框架可以用于开发智能合约。在本文中,重点是Truffle框架。Truffle旨在通过为智能合约开发提供开发环境、测试框架和调试工具来简化开发人员的工作。智能合约错误可能很难找到,错误消息可能非常模糊。当使用Truffle构建智能合约时,Truffle调试器在调试合约时非常方便。这是因为在调试智能合约时,您没有实时运行代码;相反,您正在逐步进入区块链上该交易的历史执行,并将该执行映射到其关联的代码上。让我们简单地讨论一下Truffle调试器,然后以一个示例说明如何使用该工具。

Truffle Debugger

Truffle Debugger是集成到Truffle框架中的命令行工具,它允许使用智能合约代码和事务工件调试智能合约事务。当调试器启动时,命令行界面提供在事务处理过程中对其进行事务处理或创建的地址列表、事务的初始入口点和使用调试器的可用命令列表。下面突出显示了一些调试器命令:

[o] step over:

此命令评估虚拟机相对于合同评估的指令,直到当前智能合约文件中的下一行,跳过当前执行点(如果有)引用的函数。

[i] step into:

此命令进入当前执行点调用的函数。

[u] step out:

此命令将使调试器跳出当前函数,直到它之后执行的下一行。

[n] step next:

此命令将执行当前函数调用中的下一个逻辑语句或表达式。

[;] step instruction:

此命令逐步执行虚拟机评估的每个单独指令。

到目前为止,我们已经讨论了调试和Truffle debugging,让我们来举一个例子来学习一下。

调试食品车智能合约

下面的智能合约模拟了一个简单的食品推车,允许任何人将食品添加到购物车出售,并允许任何有足够以太的人从购物车上购买食品。此合同仅用于说明学习,不应在生产环境中使用。 在我们开始此示例之前,需要以下内容来执行此示例而不会出现任何问题:

  • Truffle 版本4.0以上

  • Solidity编译器0.4.24或更高版本

  • 私有区块链(ganache cli v6.1.6或更高版本)

第1步:建立智能合约

让我们首先为这个项目创建一个目录并构建智能合约。 在终端输入以下命令:

mkdir FoodCart

进入文件夹并创建一个空的Truffle项目。

cd FoodCart
truffle init

导航到contracts文件夹并创建FoodCart.sol智能合约文件

cd contracts
touch FoodCart.sol

在您选择的任何一个IDE中打开您的FoodCart项目。我将使用Visual Studio代码。打开foodcart.sol合同并在下面的智能合同中键入:

区块链研究实验室 |使用Truffle Debugger调试智能合约- part I_第1张图片

区块链研究实验室 |使用Truffle Debugger调试智能合约- part I_第2张图片

区块链研究实验室 |使用Truffle Debugger调试智能合约- part I_第3张图片

在我们继续进行之前,让我解释一下上面的智能合约。 FoodCart智能合约可分为6个部分:

  1. 状态变量:状态变量,所有者和skuCount分别存储所有者的地址和添加到FoodCart的食物数量。映射foodItems将skus映射到食物项目。

  2. 枚举:State枚举是一种用户定义的数据类型,用于保存购物车上食品的状态。枚举中列出的类型可以明确地转换为整数和从整数转换,即(ForSale = 0,Sold = 1)。

  3. 事件:出售和出售事件记录出售或出售食品的详细信息。这些事件可以通过JavaScript中的回调调用,它们的内容可以用于使使用DAPP更具交互性。

  4. struct:struct FoodItem是一个用户定义的类型,它保存食品的属性。可以使用结构上的点表示法访问这些属性。

  5. 函数修饰符:修饰符doFoodItemExist,isFoodItemForSale和hasBuyerPaidEnough是在执行应用它们的函数之前自动检查条件的函数。这个智能合约中使用的功能修饰符的作用从名称中可以明显看出。

  6. 函数:函数addFoodItem,buyFoodItem和fetchFoodItem将食品添加到合同中,允许购买食品并允许分别查看食品的详细信息。构造函数使用部署合同的地址初始化所有者状态变量。匿名的应付函数允许以太网发送到此合同。

第2步:部署智能合约

让我们在专用网络上部署智能合约。

在您的IDE中,在migrations文件夹中创建一个名为2_foodcart_migration.js的新文件。创建后打开此文件并添加此代码:

区块链研究实验室 |使用Truffle Debugger调试智能合约- part I_第4张图片

这段代码将使框架能够将foodcart.sol合同部署到私有区块链中。

打开终端并导航到此项目的文件夹中,然后键入以下命令:

truffle develop

这个命令启动了一个开发区块链,我们可以用它测试我们的合同。运行该命令将产生以下结果:

区块链研究实验室 |使用Truffle Debugger调试智能合约- part I_第5张图片

上图显示,开发区块链已在端口9545上启动,测试账户也已创建供使用,终端导航到一个新的提示truffle(develop)>。

在truffle(develop)>prompt中,键入compile命令来编译合同。编译结果存储在项目目录的build文件夹中。

truffle(develop)> compile

运行compile命令应该产生以下结果:

最后,让我们将已编译的合同迁移到区块链进行部署。 在终端上,键入migrate命令以将合同迁移到已为我们启动的开发区块链。

truffle(develop)> migrate

运行migrate命令将产生以下结果:

区块链研究实验室 |使用Truffle Debugger调试智能合约- part I_第6张图片

本文转载公众号:区块链研究实验室,专注区块链技术,产品社群,经济模型等全方位的知识体系输出,为大家带来不一样的社群学习体验。欢迎联系作者微信加入社群:csschan1120

你可能感兴趣的:(区块链,以太坊,区块链技术,智能合约,truffle)