当我们与多个 DEFI 协议交互时,往往只能在主网上测试,我们应该怎么做呢?
而你是一个才华横溢且有抱负的开发人员,希望创建下一个革命性的金融应用程序,这将有助于拯救我们所有人并恢复和平。你知道你的应用程序需要与主网上已建立的协议进行交互,例如Uniswap(交易所),Compound/Aave(借/贷),Nexus Mutual(保险)等。你想要快速构建它。
唯一的问题是,你不知道从哪里开始,并且你有很多问题:
– 你如何编写合约?
– 你如何测试合约?
– 你如何与**其他协议交互**?
– 你如何调试交易?
好吧,幸运的是,亲爱的有抱负的开发人员,我花费了8个月的投入到这个领域,专门为你准备了这篇文章。
**免责声明: 本文是对我“非常”个人的经验的总结。**
### 智能合约框架
如果你的目标是快速交付高质量代码,则[Dapp.tools](https://github.com/dapphub/dapptools/)是你应该选择的工具。如果你想进行更深入的探讨,我也写过[单独文章](https://kndrck.co/posts/hevm_seth_cheatsheet/),。
但是,如果你希望使用其他框架,则我建议按以下顺序选择:
– [brownie (python)](https://github.com/eth-brownie/brownie)
– [buidler.dev(JS)](https://buidler.dev/)
– [waffle (JS)](https://getwaffle.io/)
– [Truffle(JS)](https://www.trufflesuite.com/)
### 在沙盒环境中进行测试
对我来说,我发现的最高效测试设置是使用EVM实现而不是实际的测试网运行代码。这样,我可以测试逻辑,而无需等待交易出块。仅此一项就极大地提高了我们的迭代速度。
如果你想进行确定性测试(不会在星期二通过,而星期五失败),我强烈建议你使用[dapp.tools](https://github.com/dapphub/dapptools/).其背后使用[hevm](https://github.com/dapphub/dapptools/tree/master/src/hevm),这是[Haskell](https://www.haskell.org/)的EVM实现
使用Haskell编写的EVM(而不是Python或JS)可以立即提供更严格的保证。如果失败,则可能与你的代码有关,而不是与EVM的实现有关。
其他EVM实现包括:
– [geth – testnet](https://geth.ethereum.org/)
– [py-evm](https://github.com/ethereum/py-evm)
– [ganache-cli](https://github.com/trufflesuite/ganache-cli)
– [builder-evm](https://github.com/nomiclabs/buidler/tree/development/packages/buidler-core)
### 协议交互
> 在真实的产品中进行测试 – [Andre Cronje](https://twitter.com/AndreCronjeTech)
忽略所有其他网络,例如Rinkeby,Kovan或Goerli。你唯一需要关注的应该是主网,网络ID为1。
如果你正在与多个协议(例如OneInch,Curve,Uniswap,Aave,Compound等)进行交互,则很有可能。并非所有协议都将部署到同一测试网中。但是有100%的可能性将它们都部署在主网上。因此,你需要将主网用作测试网。
在流行的EVM实现中,例如[hevm](https://github.com/dapphub/dapptools/tree/master/src/hevm), [buidler-evm](https://github.com/nomiclabs/buidler/tree/development/packages/buidler-core),和[ganache-cli](https://github.com/trufflesuite/ganache-cli),有一个选项可以[从主网 fork ](https://studydefi.com/forking-off-mainnet/). 可以检索主网状态(即Uniswap上的流动性),并在本地沙盒环境中针对该状态运行测试。
> 我在后台使用[ganache-cli](https://github.com/trufflesuite/ganache-cli)缓存数据,然后再将其发送到hevm。这样可以大大减少测试时间,尤其是当测试需要与主网协议进行大量交互时
### 调试失败的交易
#### 在沙箱中
如果你使用的是[dapp.tools](https://github.com/dapphub/dapptools), [buidler](https://github.com/nomiclabs/buidler),或[brownie](https://twitter.com/BrownieEth/status/1284038341084807169),那应该恭喜你,他们已经将日志记录和堆栈跟踪内置到了测试框架本身(`dapp.tools`的`-v`),调试合约应该快速简单。

> hevm 堆栈跟踪
但是,如果你使用的是[ganache-cli](https://github.com/trufflesuite/ganache-cli)的框架。那就得放慢你脚步,去放置revert消息,以找出问题所在。
有一些人会说,ganache-cli有一个[debugger](https://www.trufflesuite.com/docs/truffle/getting-started/debugging-your-contracts)。我很清楚并且已经使用过它,但是由于花费了很多时间和精力,最终还是回到了使用revert消息。
#### 在主网上
哇,在主网上失败的交易,我该如何调试? [Ethtx.info](https://ethtx.info/)和[bloxy.info](https://bloxy.info/)提供了有关指定交易哈希的详细堆栈跟踪(我怀疑它背后使用的是openethereum的[debug_tracetransaction](https://geth.ethereum.org/docs/rpc/ns-debug #debug_tracetransaction)。

> ethtx.info堆栈跟踪示例
### 有用的链接
– [etherscan](https://etherscan.io/) – 通用区块链浏览器
– [bloxy](https://bloxy.info/) – 更高级的区块链浏览器
– [ethtx](https://ethtx.info/) – 堆栈跟踪
– [4bytes](https://www.4byte.directory/) – 函数签名数据库
– [furucombo](https://furucombo.app/) – 聚合了 defi 操作
– [dapp-pm](https://github.com/hjubb/dapp-pm/) – Dapp软件包管理器
– [eth95](https://eth95.dev/) – 可与本地沙盒合约快速交互的简单的UI
– [daistats](https://daistats.com/#/) – DAI统计信息一目了然
– [sassal.eth的建议](https://twitter.com/sassal0x/status/1204171618919956481) – DeFi工具上的Twitter 时间线
### 结论
[dapp.tools](https://dapp.tools/) 很不错。
——
本翻译由 [Cell Network](https://www.cellnetwork.io/?utm_souce=learnblockchain) 赞助支持。
现在是2022年。为应对covid-19经济衰退而采取的量化宽松政策已导致眼镜蛇效应.全世界已经陷入了更严重的衰退。传统金融已经一去不复返了,而以太坊则是新金融科技革命的唯一希望,即这场革命可以使世界摆脱这场经济噩梦。
而你是一个才华横溢且有抱负的开发人员,希望创建下一个革命性的金融应用程序,这将有助于拯救我们所有人并恢复和平。你知道你的应用程序需要与主网上已建立的协议进行交互,例如Uniswap(交易所),Compound/Aave(借/贷),Nexus Mutual(保险)等。你想要快速构建它。
唯一的问题是,你不知道从哪里开始,并且你有很多问题:
- 你如何编写合约?
- 你如何测试合约?
- 你如何与其他协议交互?
- 你如何调试交易?
好吧,幸运的是,亲爱的有抱负的开发人员,我花费了8个月的投入到这个领域,专门为你准备了这篇文章。
免责声明: 本文是对我“非常”个人的经验的总结。
智能合约框架
如果你的目标是快速交付高质量代码,则Dapp.tools是你应该选择的工具。如果你想进行更深入的探讨,我也写过单独文章,。
但是,如果你希望使用其他框架,则我建议按以下顺序选择:
- brownie (python)
- buidler.dev(JS)
- waffle (JS)
- Truffle(JS)
在沙盒环境中进行测试
对我来说,我发现的最高效测试设置是使用EVM实现而不是实际的测试网运行代码。这样,我可以测试逻辑,而无需等待交易出块。仅此一项就极大地提高了我们的迭代速度。
如果你想进行确定性测试(不会在星期二通过,而星期五失败),我强烈建议你使用dapp.tools.其背后使用hevm,这是Haskell的EVM实现
使用Haskell编写的EVM(而不是Python或JS)可以立即提供更严格的保证。如果失败,则可能与你的代码有关,而不是与EVM的实现有关。
其他EVM实现包括:
- geth – testnet
- py-evm
- ganache-cli
- builder-evm
协议交互
在真实的产品中进行测试 – Andre Cronje
忽略所有其他网络,例如Rinkeby,Kovan或Goerli。你唯一需要关注的应该是主网,网络ID为1。
如果你正在与多个协议(例如OneInch,Curve,Uniswap,Aave,Compound等)进行交互,则很有可能。并非所有协议都将部署到同一测试网中。但是有100%的可能性将它们都部署在主网上。因此,你需要将主网用作测试网。
在流行的EVM实现中,例如hevm, buidler-evm,和ganache-cli,有一个选项可以从主网 fork . 可以检索主网状态(即Uniswap上的流动性),并在本地沙盒环境中针对该状态运行测试。
我在后台使用ganache-cli缓存数据,然后再将其发送到hevm。这样可以大大减少测试时间,尤其是当测试需要与主网协议进行大量交互时
调试失败的交易
在沙箱中
如果你使用的是dapp.tools, buidler,或brownie,那应该恭喜你,他们已经将日志记录和堆栈跟踪内置到了测试框架本身(dapp.tools
的-v
),调试合约应该快速简单。
hevm 堆栈跟踪
但是,如果你使用的是ganache-cli的框架。那就得放慢你脚步,去放置revert消息,以找出问题所在。
有一些人会说,ganache-cli有一个debugger。我很清楚并且已经使用过它,但是由于花费了很多时间和精力,最终还是回到了使用revert消息。
在主网上
哇,在主网上失败的交易,我该如何调试? Ethtx.info和bloxy.info提供了有关指定交易哈希的详细堆栈跟踪(我怀疑它背后使用的是openethereum的[debug_tracetransaction](https://geth.ethereum.org/docs/rpc/ns-debug #debug_tracetransaction)。
ethtx.info堆栈跟踪示例
有用的链接
- etherscan – 通用区块链浏览器
- bloxy – 更高级的区块链浏览器
- ethtx – 堆栈跟踪
- 4bytes – 函数签名数据库
- furucombo – 聚合了 defi 操作
- dapp-pm – Dapp软件包管理器
- eth95 – 可与本地沙盒合约快速交互的简单的UI
- daistats – DAI统计信息一目了然
- sassal.eth的建议 – DeFi工具上的Twitter 时间线
结论
dapp.tools 很不错。
本翻译由 Cell Network 赞助支持。
本文参与区块链开发网写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
- 发表于 2020-10-25 16:22
- 阅读 ( 3018 )
- 学分 ( 219 )
- 分类:以太坊