# 复杂环境合约调试方法

Original: <https://lifelonglearn.ing/debugging-contracts-in-complex-environments>

Author: [奶爸](https://lifelonglearn.ing/users/3b04650c-8231-499b-8ef0-381fc4d7efb0)

Published: 2021-05-19T08:11:38Z

Updated: 2026-09-27T06:57:43Z

Version: 1

前言：首先自然是尽自己所能在本地搭建起测试环境，如果我们对于一些逻辑复杂、牵涉甚广的合约，没有时间去理解逻辑并在本地搭建起来的呢？就看奶爸接下来的介绍吧。

当我们构造测试环境时 我们会按照下面路径由简至繁的去构造

## 本地环境

现在 hardhat、truffle 开发环境都已经十分完善了，尤其是 hardhat，他的本地调试还可以打日志。当我们开发需要与外部系统集成的时候由简单到复杂按下面路径升级：

1. 能 Mock 的关联度较小的逻辑，可以 Mock
2. 不能 Mock 的场景耦合度较高的，完整构造出测试环境

## 测试网环境

如果有些复杂项目，实在没有时间研究，本地环境没法搭建起来的，优先考虑测试链上面，有目标项目部署的环境。

比如 Uniswap 在 Kovan、Ropsten 的测试环境（或其他项目的测试链部署），因为这些测试链有些都开放主动去申请大批量的 Native Token。测试起来无需考虑成本且无限接近线上环境。

## 成本低的 EVM 体系链

（此方案是提供给上面两条路都不通的朋友）

比如 Ethereum 上面的项目，在 XDai 上如果也有部署，那么我们可以首选去一个 Gas 费低的链上面测试

## 在 Gas 费极高的链上无负担调试

到了这一步就是必须要在成本较高的主网上面调试了，这两天做了个闪电贷的合约，借了点U去合约里面把其他资产套出来，然后再还回去。中间有些代码，在测试网上面测试通过以后，到主网就不行了。

开始是狠了狠心，花了1k人民币去强制执行了一次，结果很尴尬，合约都是 `revert`，没有返回一个错误信息。

> 合约内部尽量使用 `require(condition, msg);` 来进行条件约束

1k人民币白花了，然后奶爸就将合约中所有 `revert` 的地方都加上了说明信息，这下总该好了吧。但是一朝被蛇咬，十年怕井绳。

> 从成功的地方寻找蛛丝马迹

看着巨大的 `gasLimit` 奶爸望而却步，踌躇不前。然后突然想起去看一下在测试网上面成功的 **Transaction** 中找一些蛛丝马迹，发现 Gas 消耗在 80万 左右。

> 从一个能接受的GasLimit（100万）强制执行起

奶爸一下就觉醒了，gasLimit 设置为 80 万，Gas 费几十块，立马强制执行，这下因为有错误信息，通过两次试错之后。成功执行。

## 写在后面

> 或者 把桌子升起来站会试试
