如何调试以太坊智能合约

在区块链中调试事务不同于调试传统的应用程序构建在C ++或JavaScript上,因为您没有实时运行代码,而是在区块链中,历史事务执行与关联代码映射以调试事务。

智能合约是在区块链顶部运行的一段代码,智能合约需要以精确的方式理解,调试智能合约正逐步分析事务如何在内部工作和继续或实际事务失败的位置。

让我们首先讨论关于调试事务的详细内容的错误类型。

可靠性中的错误类型 – 1.语法错误

当智能合约代码的语法出现问题时会出现语法错误,当您的代码出现语法错误时,您的智能合约将无法在区块链上编译或部署。

语法错误可以使用remix轻松诊断,如下图所示,当在remix IDE中从上面的代码中删除分号(;)时,它会显示带有语法错误解决方案的错误消息。

使用truffle,remix或任何IDE可以轻松诊断语法错误。

2.运行时错误

只有当您将智能合约部署到区块链并且您的可靠性代码已编译为EVM(以太坊虚拟机)已理解的字节码时,才会出现运行时错误。 EVM被定义为以太坊的一个组件,它运行可靠性代码,当EVM认为您的智能合约代码出错或者您正在根据代码逻辑进行交易时,会出现运行时错误。

运行时错误比语法错误更难诊断,因为在部署区块链之前未识别这些错误,只有在智能合约中发生状态更改时才会出现这些错误,我们将讨论有关运行时错误和运行时错误调试的更多信息。细节。

3.逻辑错误

逻辑错误无法使用任何IDE或工具进行调试,因为EVM不捕获逻辑错误,根据EVM,一切都很完美,代码可以轻松运行。当开发人员在攻击者的智能合约中出错并打开循环漏洞时,就会出现逻辑错误。

逻辑错误的示例:著名的DAO攻击(Reentrancy)是一个逻辑错误的示例,其中开发人员在更新用户余额之前犯了错误并转移了以太。

审计智能合约可以识别逻辑错误,因为有时根据开发人员的心态,一切进展顺利,智能合约中可能没有错误,但审计员可以运行智能合约,意图找到循环漏洞,检查业务逻辑和找到智能合约中的安全漏洞。

正式验证可能会用于智能合约的逻辑验证。

运行时错误的类型

没气了

如果您没有提供足够的气体来执行交易,或者天然气不足以完成交易,则会出现气体错误。

还原

当您尝试执行无法根据智能合约的逻辑执行的事务时,将发生事务恢复,因此EVM将返回错误并恢复事务。

操作码无效

当您尝试调用不存在的代码时,会出现无效的操作码。

跳转无效

当您尝试调用不存在的函数时会发生无效跳转,例如,如果通过另一个不存在的合约调用合约函数,则会发生无效跳转。使用汇编语言并指向错误的内存时,也会发生此类错误。

堆栈溢出

当你试图以递归方式调用函数并且没有条件来阻止它时发生堆栈溢出,在固态堆栈中最多可以是1024帧,因此一个函数只能调用自己1024倍,如果超过该堆栈将发生溢出。

堆栈下溢

当您尝试弹出不存在的变量时,堆栈下溢以汇编语言发生。

示例Smart Contract代码,用于调试所有类型的错误和事务 – pragma solidity 0.4.24;合约样本{uint256 public amountInContract;解决公共金额的问题; constructor(address _owner)public payable {require(_owner= address(0));要求(msg.value> 0.1以太); amountInContract = msg.value; amountOwner = _owner; } function()external {revert();函数withdraw()public {require(msg.sender == amountOwner); msg.sender.transfer(地址(本).balance);调试器提供了逐步调试任何事务(创建或调用)并可视化内存/存储空间的功能。它有助于通过操作码和每步后的剩余气体来追踪气体成本。调试交易 –

在上面的代码中,指定的构造函数是可以支付的,而部署合约构造函数需要将ether值发送到0.1以上。如果发送的ether少于0.1或地址为零,则会抛出错误并恢复事务。

如下所示,事务被还原,因此我们将使用remix IDE逐步调试事务。

步骤1.部署事务使用remix提交给以太坊区块链后,交易失败,如上所示。现在按下remix IDE中的调试器按钮来调试事务并找出事务失败的可能原因。

步骤2.要开始调试,请提供块编号和事务哈希,然后按开始调试按钮,这将启动调试过程。

如上所示,在调试事务时显示汇编语言操作以及使用的气体和剩余气体,还在混合IDE中突出显示代码,其中实际事务与操作码并行失败,如下所示。

事务在程序集操作码中恢复。在实际事务还原的位置突出显示代码。

如上图所示,交易在etherscan中被恢复,发送的值为0.1以太,小于所需值;这就是在这种情况下交易失败的原因。

此过程可用于调试任何事务,以了解有关使用的气体,每个步骤的剩余气体,状态变化以及可视化存储器/存储空间的更多信息。

使用Truffle框架也可以完成智能合约调试,需要事务哈希来调试事务。

谢谢阅读。另外,请查看我之前关于以太坊网络潜在攻击的博客给Mint GasTokens。

让我们更多地讨论区块链安全问题,在我的电报处理器上ping我 – @ abhi_blockchain,与QuillAudits一起为你的dapps和智能合约提供著名的安全平台。

资讯来源:由0x资讯编译自HACKERNOON。版权归作者所有,原文链接:https://hackernoon.com/how-to-debug-ethereum-smart-contracts-7efd883d8cc3?source=collection_category—4——5———————。未经许可,不得转载
提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢