链资讯 链资讯
Ctrl+D收藏链资讯
首页 > BNB > 正文

ANT:以太坊智能合约逆向分析与实战:(5)深入EVM之合约的部署与调用_Radiant Capital

作者:

时间:

当我们部署和调用合约的时候,EVM都在做些什么?

如果你开发过以太坊智能合约,想必你应该熟悉这样的操作(此处以remix为例):

编写solidity代码->编译->部署->交互。合约的编写与部署似乎并不是一件很麻烦的操作:编写阶段就不说了,Solidity语言大家都应该会;到了编译阶段,本地的solc编译器会把Solidity代码编译成字节码;而在部署阶段,部署者通过发起一笔特殊交易calldata带上编译后的字节码,等交易上链之后,就完成了合约的部署;而合约交互,就是call合约里的某个函数,等待函数的响应和返回,一切就是这样的简单。

但是正如开车一样,当你踩住油门后,车辆开始前进。然而这看似简单的操作背后是汽油爆燃、活塞往复、数百个齿轮啮合传动、轮胎与地面滚动摩擦的复杂行为。部署和调用合约也是如此,它涉及到EVM的堆栈操作,内存读写,存储访问等一系列底层操作。当部署合约时,EVM把收到的calldata翻译成操作指令,把它们按照给定的长度和参数读入内存;当调用合约时,EVM又根据收到的calldata,通过函数选择器来确定调用哪一段代码,并返回数值。如果只讲理论未免过于枯燥,为了便于讲解,我们这次用ethernaut的一道题目作为例子,详细了解EVM是如何部署和运行合约的,以及如何充当人肉编译器,徒手编写智能合约。

以太坊EIP-4844的第五个开发测试网将于下周启动:4月22日消息,Galaxy 研究副总裁 Christine Kim 发布博客对第 107 次以太坊核心开发者共识会议进行总结。Christine Kim 表示,本次会议在对上海升级的成功进行简短确认后,便开始讨论 Deneb 的准备工作。其中,以太坊核心开发者 Tim Beiko 表示,EIP-4844 的第五个开发测试网将于下周某个时候启动。同时,共识会议上,开发者拟将 EIP-4788 与 3175 和 EIP-4844 一起纳入 Deneb 升级。

关于 EIP-6914,开发者同意继续敲定代码更改细节,并将其实施推到 Deneb 之后的硬分叉。此外,开发者讨论了信标链认证子网(attnets),Lighthouse(CL)客户端团队的 Adrian Manning 提出了一个将验证者节点订阅到长期的 attnets 解决方案,并表示此更改不必通过硬分叉来执行。[2023/4/22 14:19:48]

这个题目是这样的:我们需要部署一个合约,当我们调用合约**whatIsTheMeaningOfLife()**函数的时候,它需要返回一个数字“42”。看起来很简单对吧?我们分分钟编写完毕:

报告:以太坊合并可能对DeFi协议、稳定币产生负面影响:金色财经报道,根据DappRadar发布的一份报告,以太坊即将到来的合并可能会大大影响DeFi协议在链上的运作方式。报告指出,合并可能会减慢交易时间,或者造成DeFi借贷协议服务中断,给平台带来麻烦。这可能会使稳定币价值暴跌,并使DeFi借贷池缩小。DappRadar的数据分析师Pedro Herrera表示,合并对以太坊市场供应的负面影响可能会影响DeFi流动性池,即使以太坊权益证明机制的过渡顺利进行。(CoinDesk)[2022/8/27 12:51:55]

慢着,题目后面还有个小小的附加要求:“所部署的合约大小不超过10个操作码”。好吧,这个要求的确够“小”,要知道连合约头部的“函数选择器”都不止10个操作码好吧?可是“函数选择器”是什么,为什么会出现在合约里面呢?带着你的疑问,继续向下看。

我们通过./solc--asm--bintarget.sol来看看这个合约的最终编译结果:

608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063650500c114602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b6000602a905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea26469706673582212206ef8c7b5177952a701b3b46b69cb3ec296f4c54c946692e8ec901f5e43c1e78a64736f6c63430008110033

数据:以太坊网第一季度交易额预计将达1.6万亿美元:Messari研究显示,以太坊网络目前正在加快步伐,今年第一季度的交易额预计将达到1.6万亿美元。在过去12个月里,以太坊已经结算了2.1万亿美元的交易。?如果Messari预测的1.6万亿美元是准确的,那么以太坊的季度结算额将比2020年第一季度增长1280%,比2019年第一季度增长超过5000%。Messari的研究人员Ryan Watkins指出,这些数据反驳了一种说法,即以太坊在高昂的gas费中流失了大量用户。[2021/2/25 17:51:06]

这么一大坨十六进制数据,就是上述Solidity程序编译之后的字节码。当我们部署合约时,把这一堆data发给以太坊节点,等广播完成后,合约就部署完毕了。这是solc编译器编译Solidity程序得到的代码,看似杂乱无章的的数据,其实都是和opcodes一一对应的。我们来一段一段地看这些代码:

合约部署代码:

608060405234801561001057600080fd5b5060b68061001f6000396000f3fe

合约运行代码:

6080604052348015600f57600080fd5b506004361060285760003560e01c8063650500c114602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b6000602a905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fe

以太坊链上锚定BTC的代币总量达到21838个:Btconethereum.com数据显示,以太坊链上锚定BTC的代币总量升至21838个,约合2.52亿美元。其中,WBTC总量为16472个,renBTC总量为2575个,sBTC总量为1130个。[2020/8/10]

auxdata:

a26469706673582212206ef8c7b5177952a701b3b46b69cb3ec296f4c54c946692e8ec901f5e43c1e78a64736f6c63430008110033

我们先简单地把这堆代码分为合约的部署代码、运行代码、auxdata三部分,如何理解这三种代码呢?我觉得可以理解为向太空发射卫星:“部署代码”就是运载火箭,而“运行代码”就是卫星。运载火箭只在发射卫星时才起到作用,一旦卫星进入轨道,火箭就废弃了,只留下卫星在太空中与地球通信。部署合约也是如此,在部署合约时,部署代码把一些初始化工作作完之后,就把合约的运行代码送入EVM,只留下运行代码在链上与用户进行交互。

那么言归正传,我们题目要求我们合约运行代码的opcedes不超过10条,那么,这段代码对应的opcodes是多少条呢?答:71条。

声音 | 风投经理:底部未明 但现在是买入以太坊的好时机:据cryptocoinspy消息,知名VC(风险投资)经理Fred Wilson最近写了一篇题为《流血》(Bleeding)的文章。文章中指出,比特币从高点下跌了80%,以太坊从高点下跌了90%;比特币将在某个时点形成底部时可以买入,不过他不确定比特币的“流血”是否已经结束。然而,他似乎暗示以太坊现在可能是买入的好时机。据此前消息,Fred Wilson曾在他的博客中表示,加密可能会在短期内下降得更多,但是留在市场上的投资者可能会获得回报。[2018/11/26]

那么问题来了,如何把71条opcodes精简到10条以内呢?这就需要我们对EVM运行智能合约的方式有着一定的了解。如果不了解也没关系,拿起你手边的EVM指令集,我们一起来看看吧:

首先我们要知道,EVM执行代码时是按照自上而下的顺序执行的,代码中没有其他入口点,始终从顶部(也就是第一行opcode)开始执行。。也就是说,当我们部署合约时,EVM会从第一个bytecode开始读起。

所以我们看字节码最前面的部分,也就是它的部署代码:608060405234801561001057600080fd5b5060b68061001f6000396000f3fe

对照EVM指令,我们可以识别出这段代码的含义:

然后我们看合约的运行代码:

6080604052348015600f57600080fd5b506004361060285760003560e01c8063650500c114602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b6000602a905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fe

综合以上可以发现,合约的运行代码的架构是这样的:

初始化操作、函数选择器这些,是solc在编译Solidity程序的时候自动生成的。如果我们砍掉这些复杂的东西,直接把我们想要的核心功能编码上去,不就可以在10条以内opcodes实现既定功能了吗?

通过分析图4的whatIsTheMeaningOfLife()函数调用栈可以得知,让智能合约返回“42”(十六进制0x2a)的关键在于先用mstore指令将0x2a放入Memory,再用return指令将内存里的0x2a返回即可。至于那些函数名称和函数签名,只是高级语言的编译产物,直接用汇编实现的话,我们直接用这段代码读写内存,完全没有必要搞那些花里胡哨:

以上代码相当于构造了一个十分小的合约“运行代码”。前面我们说过,EVM执行代码时是按照自上而下的顺序执行的,代码中没有其他入口点,始终从顶部(也就是第一行opcode)开始执行。而且我们编写的代码并没有函数选择器,也就是说,当外部账户调用该它时,无论传递给它什么样的参数、什么样的函数签名,EVM都只会从它的处开始执行,老老实实地走到,然后return给我们一个0x20.

但这只是运行代码,还记得本文开头说的那三段字节码吗?是的,我们还差一个“运载火箭”,把这段运行代码给发射出去:

部署代码的结构基本没怎么变,之前已有解析,此处就不罗嗦了,唯一的区别是把复制到内存的长度由b6改为0a?:608060405234801561001057600080fd5b50600a8061001f6000396000f3fe

然后把他们拼接到一起,记得部署代码在前、运行代码在后,最后我们把这段代码发射出去就OK了:

你将得到一个超级小巧、只有10个字节、无论传递什么参数都只会返回?42?的“智能合约”

全文完。

关于作者:

https://twitter.com/0xNezha

来源:bress

标签:ANTRADPARCODEGot GuaranteedRadiant CapitalPARADOX币Decode Coin

BNB热门资讯
NFT:跨链桥是否有安全的未来?_AZU币

Chainalysis估计,在13次单独的跨链桥黑客攻击中,有20亿美元的加密货币被盗,其中大部分是今年被盗的。到目前为止,对跨链桥的攻击占2022年被盗资金总额的69%.

NFT:金色观察 | 排行前五的web3风投公司2022年都投了什么_RES

本文为GlobalCoinResearch近日出品的前十大web3风险投资公司的上半部分。GlobalCoinResearch对十大web3风险投资公司和更广泛的行业活动进行全面和最新的分析——.

BASE:Celsius前CEO在公司申请破产前提取1000万美元加密货币_ELS

《华尔街日报》10月7日消息,加密贷款机构CelsiusNetworkLLC当地时间周三提交给破产法院的文件显示,在该公司申请破产保护前的两个月里.

比特币:数据分析:比特币筑底即将完成_AIN

最近几周,比特币价格异常稳定,与股票、信贷和外汇市场形成鲜明对比,在这些市场中,加息、通货膨胀和美元强势继续造成了剧烈的冲击。在这种背景下,比特币一直非常稳定.

比特币:来自波哥大的见闻与思考_APPICS

能来参加波哥大的ETHDevCon,是出国后的一大惊喜。大会讨论了很多干货,既具备现实的迫切性又具备对未来的引导性。遗憾的是条件所限,国内媒体几乎没有报道,讨论廖廖.

元宇宙:元宇宙新基建四小天王_PICO

元宇宙宏观、庞大而又复杂,当下各路玩家对元宇宙进行了诸多幻想。有人认为元宇宙是电影头号玩家里开放世界;有人认为元宇宙就是在现有的互联网下增加AI、AR/VR技术;还有人说元宇宙是下一代互联网.