Почему PUSH1 0x60 PUSH1 x40 MSTORE хранит 0x60 в ячейке памяти 0x50 (а не 0x40)?

Согласно надежности браузера, после выполнения

000 PUSH1 60
002 PUSH1 40
004 MSTORE

Память это:

0x00: 00000000000000000000000000000000  ????????????????
0x10: 00000000000000000000000000000000  ????????????????
0x20: 00000000000000000000000000000000  ????????????????
0x30: 00000000000000000000000000000000  ????????????????
0x40: 00000000000000000000000000000000  ????????????????
0x50: 00000000000000000000000000000060  ????????????????

И еще, судя по тому, что я могу прочитать в желтой бумаге и других ресурсах , 0x60 должен храниться по адресу 0x40. Врет ли мне browser-solidity или я чего-то не понимаю?

Ответы (1)

Каждое слово в EVM имеет ширину 32 = 0x20 байт, поэтому, когда вы PUSH1 40сохраняете слово по адресу 0x40, оно заполняет все байты до 0x5f. EVM использует формат с обратным порядком байтов , поэтому младшие байты слова сохраняются в конце. Таким образом, в вашем примере байт «0x60» правильно записан в ячейку 0x5f.

Структура данных из Browser Solidity немного вводит в заблуждение — вы видите только полслова в строке; все слово занимает две строки.