Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DappTools - 安装与使用

DappTools - 安装与使用

作者头像
Tiny熊
发布于 2021-10-27 03:31:19
发布于 2021-10-27 03:31:19
98600
代码可运行
举报
运行总次数:0
代码可运行

本文作者:bixia1994[1]

DappTools

DappTools是Samczsun推荐使用的一个调试EVM[2]的神器,故下载到服务器上进行初步的学习使用。

安装

官网的安装脚本异常简单,但我实际上安装到服务器上时还是踩了不少的坑,花费了很多的时间。

首先是安装条件:它仅支持linux和Mac环境,并不支持windows环境,所以在windows上就不要想了

其次是安装脚本的预置条件:

需要首先为centos添加一个alice的普通用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
useradd alice

然后再给alice赋值一定的权限:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chown alice /nix //安装时会把一些二进制文件拷贝到这个地方
chown alice /run/user/0 //也是安装时存放用户数据的地方

然后运行官网提供的脚本,记住此时是以alice为用户的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
su alice
curl -L https://nixos.org/nix/install | sh
. "$HOME/.nix-profile/etc/profile.d/nix.sh"
curl https://dapp.tools/install | sh

如果出现任何的permission denied,则使用root用户给alice进行赋权即可。

环境变量

再安装完成dapptools后,需要先配置一定的环境变量,这样才好继续使用。这里需要用到的有两个环境变量:ETH_RPC_URL 和 ETHERSCAN_API_KEY。前者用来访问链,后者用来从etherscan上拉取对应地址的ABI文件等

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export ETH_RPC_URL="https://eth-mainnet.alchemyapi.io/v2/XXXXX"
export ETHERSCAN_API_KEY="XXXX"

使用

在使用之前,需要先进行一下初始化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
su alice
cd /run/user/0/samczsun
. "$HOME/.nix-profile/etc/profile.d/nix.sh"
source .env

dapptools最牛逼的一点在于它可以把主网上的合约代码和合约的ABI拉取到本地,然后再本地通过形式化的执行来跑一遍整个流程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//第一步:拉取主网上的合约代码和合约ABI
seth bundle-source 0x6b175474e89094c44da98b954eedeac495271d0f > daisrc.json
//第二步:利用hevm进行形式化的执行
hevm symbolic --address 0x6b175474e89094c44da98b954eedeac495271d0f --rpc $ETH_RPC_URL  --debug --sig "transfer(address,uint256)" --json-file daisrc.json

Hack Replay - COMP

https://twitter.com/msolomon44/status/1443581033220227073

这里有一个dapptools分析compound[3]的COMPtoken分发错误的帖子,可以使用dapptools来进行分析。这个例子也体现出了dapptools的优势所在,即它可以实时的debug一笔交易,而不像hardhat[4]或者remix需要手动部署合约。实际上即使使用了hardhat去fork了特定的blocknumber,也无法去debug它的OPCODE,对于事实上的交易顺序也是没办法重现的。

简单来讲就是COMP的一个提案62错误的给某些用户分发了错误数量的COMP Token。

这笔交易中,一个用户Claim了91170个COMP Token。https://etherscan.io/tx/0xf4bfef1655f2092cf062c008153a5be66069b2b1fedcacbf4037c1f3cc8a9f45

第一步:检查用户是否提交了可疑的数据

从etherscan我们可以看到用户调用了函数claimComp,holder为0x09d413391e975b553b7b8d19bc11f8a6c2eb889

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Function: claimComp(address holder, address[] cTokens) ***

MethodID: 0x1c3db2e0
 //holder
 // offset
 //len
 //addr[0]
 //addr[1]
 //addr[2]
 //addr[3]
 //addr[4]
 //addr[5]
 //addr[6]
 //addr[7]

第二步:利用seth快速写一个bash脚本,找到该用户参与到的COMP池子,即调用getAssetIn函数,从而检查用户提交的8个cToken地址是否都是该用户参与的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
user=0x309d413391e975b553b7b8d19bc11f8a6c2eb889
comptroller=0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b

marketsString=$(seth call $comptroller "getAssetsIn(address)(address[])" $user)
echo $marketsString
marketsArray=(${marketsString//,/ })

for market in ${marketsArray[@]}; do
 marketName=$(seth call $market "name()(string)")
 echo $market $marketName
done

得到的结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5 Compound Ether
0x39AA39c021dfbaE8faC545936693aC917d5E7563 Compound USD Coin
0xC11b1268C1A384e55C48c2391d8d480264A3A7F4 Compound Wrapped BTC
0x6C8c6b02E7b2BE14d4fA6022Dfd6d75921D90E4E Compound Basic Attention Token
0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643 Compound Dai
0x35A18000230DA775CAc24873d00Ff85BccdeD550 Compound Uniswap
0x70e36f6BF80a52b3B46b3aF8e106CC0ed743E8e4 Compound Collateral
0x12392F67bdf24faE0AF363c24aC620a2f67DAd86 Compound TrueUSD
0xccF4429DB6322D5C611ee964527D42E5d685DD6a Compound Wrapped BTC
0xFAce851a4921ce59e912d19329929CE6da6EB0c7 Compound ChainLink Token

从上面的结果看,该用户确实在它提出的claimComp函数中拥有以上的token,说明函数调用并没有错

第三步:我们需要进一步检查comptorller合约和对应的实现合约impl合约

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
已知comptroller合约地址为:0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B
对应的实现合约地址为:0x374ABb8cE19A73f2c4EFAd642bda76c797f19233, 该实现合约也是62号提案更新过的合约地址

然后从etherscan上拿到对应的实现合约的源码,以方便我们进一步调试,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seth bundle-source 0x374ABb8cE19A73f2c4EFAd642bda76c797f19233 > impl.json

当运行上面的命令时会出现:报错:Argument list too long

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[alice@test samczsun]$ seth bundle-source 0x374ABb8cE19A73f2c4EFAd642bda76c797f19233 > impl.json
/nix/store/3fl61v0ssh5cdxqbvzvbqqx9a08j1wmg-seth-0.10.1/libexec/seth/seth-bundle-source: line 32: /nix/store/3fl61v0ssh5cdxqbvzvbqqx9a08j1wmg-seth-0.10.1/libexec/seth/seth: Argument list too long

可以参考github的issue:

https://github.com/dapphub/dapptools/issues/825

由于目前dapptools正在修复这个bug,故目前暂时无法获取到相应的数据。

然后定义一个局部变量txHash,即该用户的交易哈希

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
txHash=0xf4bfef1655f2092cf062c008153a5be66069b2b1fedcacbf4037c1f3cc8a9f45

第四步:debug这个tx

当拿到txHash和对应的合约json文件后,我们可调用seth的方法来展示这个交易的整个流程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seth run-tx $txHash --trace --source implementation.json

这行命令会显示出这笔交易中的所有内部交易,其效果与在ethtx.info网站上查询的交易信息一样

然后再执行如下命令,来逐行执行这笔交易中的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seth run-tx $txHash --source implementation.json --debug

这里使用的是Dai中的一笔普通的transfer交易来做示范,不过dapptools真的太牛了!可以debug主网上的交易,并且不需要过多的配置,比用hardhat要方便好多。hardhat压根没办法按照OPCODE的方式来进行debug,一个字 牛逼!

参考资料

[1]

bixia1994: https://learnblockchain.cn/people/3295

[2]

EVM: https://learnblockchain.cn/2019/10/05/evm-data

[3]

compound: https://learnblockchain.cn/article/1015

[4]

hardhat: https://learnblockchain.cn/docs/hardhat/getting-started/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Foundry的基本使用总结
foundry 系列的工具,主要包含三大组件,分别对应不同的功能,下面会每个组件依次试用。
Tiny熊
2022/11/07
3.1K0
Foundry的基本使用总结
2022十大智能合约开发工具
我们将研究十类工具,然后看看每个类别中最适合智能合约/区块链/solidity/vyper/rust/web3开发者的工具(我们现在有太多 “区块链开发者”的术语)。
Tiny熊
2022/02/22
2.1K0
2022十大智能合约开发工具
如何使用 Dapptools | 类似 MakerDAO 使用的代码
了解如何使用Dapptools[4],这是一个智能合约部署框架,适用于喜欢 bash 和命令行的 web3 开发人员。我们着眼于使用它端到端的学习区块链部署框架。
Tiny熊
2022/11/07
9740
如何使用 Dapptools | 类似 MakerDAO 使用的代码
[译]按照EIP-712规范签名完成委托和投票
Compound[4]的治理体系是由发放给用户的COMP代币[5]来驱动的。COMP代币持有者拥有与持有量1:1的投票权。投票权利可以委托给任意一个地址,让其去给提案投票。
Tiny熊
2020/08/18
2K0
NFT新手教程: 如何编写和部署NFT(第1部分)
随着 NFT 将区块链带入公众视野,现在是一个极好的机会,通过在以太坊区块链上发布自己的 NFT(ERC-721 代币)来宣传自己。
Tiny熊
2022/05/25
4.2K0
NFT新手教程: 如何编写和部署NFT(第1部分)
Web3 全栈指南
也许你刚刚用solidity[4]、rust 编写了一个链上程序,但是如果没有一个很好的前端交互,几乎没有人可以使用它。
Tiny熊
2022/11/07
5.4K0
Web3 全栈指南
如何编写 NFT 智能合约
在之前的教程中,我们向你展示了如何使用我们的生成艺术库[4]来创建一个头像集合[5],生成符合要求的 NFT 元数据,并将元数据 JSON 和媒体文件上传至 IPFS[6]。
Tiny熊
2022/11/07
1.3K0
如何编写 NFT 智能合约
一个蜜罐合约的解析(二)调用隐藏
上次发了,一个蜜罐合约的解析[2] 看的人很多,评论也不少,是我发的文章中评论最多的文章。
Tiny熊
2022/02/22
7350
一个蜜罐合约的解析(二)调用隐藏
以太坊主网部署终极指南
我们都喜欢以太坊,所以你已经创建了一些出色的智能合约。它们通过单元测试和测试网进行了密集的测试。现在终于到了上主网的时候了。但这是一个棘手的事情...
Tiny熊
2021/05/11
2.1K0
以太坊主网部署终极指南
hardhat 教程及 hardhat-deploy 插件使用
本文在官方 hardhat 教程的基础上,加入了 hardhat-deploy 插件的使用介绍,本文代码的 GitHub:https://github.com/wighawag/tutorial-hardhat-deploy
Tiny熊
2021/04/22
3.4K0
使用hardhat 开发以太坊智能合约-验证合约
在我们将真正的合约部署到正式区块链网络上之后, 在区块链浏览器里查看我们的合约,它应该是这样显示的
Tiny熊
2022/11/07
1.1K0
使用hardhat 开发以太坊智能合约-验证合约
Compound 的潜在风险和改进
Compound 在借款时会通过 borrowAllowed() 检查用户是否已经进入 cToken 市场
Tiny熊
2021/11/17
6131
Compound 的潜在风险和改进
Foundry教程|如何调试和部署Solidity智能合约
Foundry 是一个 Solidity 框架,用于构建、测试、模糊、调试和部署 Solidity 智能合约。在这个 Foundry 教程中,我们将介绍以下内容。
Tiny熊
2022/11/07
2.3K0
Foundry教程|如何调试和部署Solidity智能合约
LayerZero跨链协议入门教程
本教程用 LayerZero 建立一个简单的跨链消息转账合约,需要你对 Solidity Hardhat[4]有一定的程度了解。
Tiny熊
2022/05/25
1.2K0
LayerZero跨链协议入门教程
NFT新手教程:如何铸造一个NFT(第2部分)
铸造NFT是在区块链上发布 ERC-721 真实代币的行为。继续使用我们在NFT 教程第一部分[4]中的智能合约,让我们发挥 web3 技能,铸造一个 NFT。在本教程结束时,你将能够按照你的内心(和钱包)的愿望铸造更多的 NFT!
Tiny熊
2022/05/25
3.2K0
NFT新手教程:如何铸造一个NFT(第2部分)
探究Compound治理及构建治理界面
权力下放的主要目标是使协议能够发展成为具有弹性的金融基础设施,而没有可知的弱点,也无需依赖任何团队。通过这种方式,协议可以随着整个加密生态系统的增长而继续扩展,并且可以永久存在或至少伴随着以太坊。
Tiny熊
2020/10/23
1.4K0
探究Compound治理及构建治理界面
Uniswap V2部署
最近在研究uniswap v2[2]版本逻辑和代码,接下来我们以一篇uniswap v2版本的部署,开启uniswap[3]的学习之路。
Tiny熊
2021/12/15
1.9K0
Uniswap V2部署
用Hardhat和Ethers引入并测试知名NFT智能合约
本教程不涉及任何前端开发,但如果你有兴趣了解如何开始 Web3 dapp 开发,请随时在 dev.to 上查看教程:
Tiny熊
2022/11/07
1.3K0
用Hardhat和Ethers引入并测试知名NFT智能合约
使用 React 和 ethers.js 构建DApp
scaffold-eth[2] 因为引入内容太多了,对于我来说太复杂了, 不知道大家有没有同感,找到一篇使用 React 开发 DApp 的非常简单入门教程。翻译一下.
Tiny熊
2022/11/07
5.8K0
使用 React 和 ethers.js 构建DApp
逆向 EVM - 解析原始Calldata数据
你可能想知道如何破译和读取 evm 的 calldata,然后试图读取以太坊智能合约的交易 calldata,EVM(和其他 L1 分叉)以特定的方式对静态和动态类型的 calldata 进行编码和解码,在某种程度上让数据变得很困惑,起码最初是这样的。
Tiny熊
2023/01/09
1.6K0
逆向 EVM - 解析原始Calldata数据
相关推荐
Foundry的基本使用总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档