币灵灵财经
首页 > 币圈新闻 > 文章正文

深入EVM-合约分类这件小事背后的风险

币灵灵财经 2024-11-25 21:52 1388

1、合约为什么要分类?

To 地址为某个符合 ERC 20 标准的合约

深入EVM-合约分类这件小事背后的风险

2、分类会有怎样的风险?

链上是一个没有身份没有法治的地方,你无法制止一笔正常的交易,哪怕他是恶意的。

165 标准的查询,只是在链上有限的操作码中,用最低成本去防止资金转入黑洞的方法。

3、合约分类方案设计

3.1、如何获取到代码?

深入EVM-合约分类这件小事背后的风险

3.2、如何从代码分类?

深入EVM-合约分类这件小事背后的风险

3.3、准确率提升 1-反编译

那进一步的准确方法则是做 Opcode 的反编译!反编译则是将获取到的字节码转到操作码的过程,更高级的反编译则是再转成伪代码,更利于人的阅读,这次我们用不上,反编译的方法列于文末的附录中。

solidity(高级语言)->bytecode(字节码)->opcode(操作码)

深入EVM-合约分类这件小事背后的风险

3.4、准确率提升 2-找代码块

深入EVM-合约分类这件小事背后的风险

那问题来到了,如何准确判断代码块了

深入EVM-合约分类这件小事背后的风险

3.5、准确率提升 3-找函数选择器

深入EVM-合约分类这件小事背后的风险

深入EVM-合约分类这件小事背后的风险

深入EVM-合约分类这件小事背后的风险

1、将 retrieve()的 4 字节函数签名(0x 2 e 64 cec 1)传入 stack 上,

2、EQ 操作码从 stack 区弹出 2 个变量,即0x 2 e 64 cec 1 和0x 6057361 d,并检查它们是否相等

3、PUSH 2 将 2 个字节的数据(这里为0x 003 b,十进制为 59)传入 stack,stack 区有一个叫做程序计数器的东西,它规定了下一个执行命令在字节码中的位置。这里我们设置 59 ,因为那是 retrieve()字节码的起始位置

4、JUMPI 代表"如果...,则跳转至...",它从 stack 中弹出 2 个值作为输入,如果条件为真,程序计数器将被更新至 59 。

深入EVM-合约分类这件小事背后的风险

4、方案总结

采用REVERT+JUMPDEST这 2 个连续的 opcode 作为代码块的区分

3. 对应的函数签名在 eip 中定义,并且有必选和可选的明确说明

4.1、唯一性证明

深入EVM-合约分类这件小事背后的风险