## 1基础知识：Solidity → 字节码 → 操作码

https://learnblockchain.cn/article/3870

## 21_Storage.sol 分析

https://remix.ethereum.org/

``608060405234801561001057600080fd5b506004361061003657**60003560e01c80632e64cec11461003b5780636057361d1461005957**5b600080fd5b610043610075565b60405161005091906100d9565b60405180910390f35b610073600480360381019061006e919061009d565b61007e565b005b60008054905090565b8060008190555050565b60008135905061009781610103565b92915050565b6000602082840312156100b3576100b26100fe565b5b60006100c184828501610088565b91505092915050565b6100d3816100f4565b82525050565b60006020820190506100ee60008301846100ca565b92915050565b6000819050919050565b600080fd5b61010c816100f4565b811461011757600080fd5b5056fea2646970667358221220404e37f487a89a932dca5e77faaf6ca2de3b991f93d230604b1b8daaef64766264736f6c63430008070033``

``60003560e01c80632e64cec11461003b5780636057361d1461005957``

``````60 00                       =   PUSH1 0x00
60 e0                       =   PUSH1 0xe0
1c                          =   SHR
80                          =   DUP1
63 2e64cec1                 =   PUSH4 0x2e64cec1
14                          =   EQ
61 003b                     =   PUSH2 0x003b
57                          =   JUMPI
80                          =   DUP1
63 6057361d                 =   PUSH4 0x6057361d
14                          =   EQ
61 0059                     =   PUSH2 0x0059
57                          =   JUMPI``````

## 3智能合约的函数调用和calldata

``0x6057361d000000000000000000000000000000000000000000000000000000000000000a``

https://emn178.github.io/online-tools/keccak_256.html

``````keccak256(“store(uint256)”) →  前四个字节 = 6057361d

keccak256(“retrieve()”) → 前四个字节 = 2e64cec1``````

``````6057361d = 函数签名 (4 字节)

000000000000000000000000000000000000000000000000000000000000000a = uint256 输入 (32 字节)``````

## 4操作码和调用栈

https://youtu.be/fDKUq38H2jk?t=176

`PUSH4``retrieve() (0x2e64cec1)&lt;span> &lt;/span>`的4 字节函数签名推入调用栈。

`EQ` 从栈中弹出 2 个值，在本例中为 `0x2e64cec1``0x6057361d` 并检查它们是否相等。如果是，则将 1 推回栈，如果不是推回 0。

`PUSH2` 将 2 个字节的数据推送到十六进制的调用栈 `0x003b` 中，等于十进制的 59。

`JUMPI` 代表“跳，如果”。它从栈中弹出 2 个值作为输入，第一个 (59) 是跳转位置，第二个 (0) 是是否应该执行此跳转的布尔值。其中 1 = 真，0 = 假。

`PUSH4``store(uint256) (0x6057361d)` 的 4 字节函数签名推送到调用栈上。

`PUSH2`，推送`store(uint256)`字节码的程序计数器位置，十六进制的`0x0059`等于十进制的89。

`JUMPI`，这次 bool 检查为真，表示跳转执行。这会将程序计数器更新为 89，这会将执行移动到字节码的不同部分。

## 5EVM 游乐场

EVM 游乐场还将帮助你理解程序计数器，在代码中，你将在每个命令旁边看到注释，其偏移量代表其程序计数器位置。

• 发表于 2022-03-30 09:17
• 阅读 ( 1597 )
• 学分 ( 5 )
• 分类：以太坊

XPTY

7 篇文章, 20 学分