Remix调试solidity之疑问

问题描述:为什么将0x80存在内存位置0x50
指令序列:

0000 PUSH1 80
0002 PUSH1 40
0004 MSTORE
0005 CALLVALUE

Stack

0: 0x0000000000000000000000000000000000000000000000000000000000000000

内存Memory

0x0: 00000000000000000000000000000000	????????????????
0x10: 00000000000000000000000000000000	????????????????
0x20: 00000000000000000000000000000000	????????????????
0x30: 00000000000000000000000000000000	????????????????
0x40: 00000000000000000000000000000000	????????????????
0x50: 00000000000000000000000000000080	????????????????

上面是问题。下面给出解答。

  • 栈中的元素0x0000000000000000000000000000000000000000000000000000000000000000是因为CALLVALUE操作码执行后的结果。否则,如果只有前3条指令,栈应为空。

  • 下面模拟指令0执行,栈中元素为0x0000000000000000000000000000000000000000000000000000000000000080PUSH1是将1个字节大小的值放在栈上。栈的每个slot是一个字(256比特)。

    0:0x0000000000000000000000000000000000000000000000000000000000000080

  • 继续模拟指令2执行,将40压栈。此时栈的状态如下:
    0:0x0000000000000000000000000000000000000000000000000000000000000040
    1:0x0000000000000000000000000000000000000000000000000000000000000080

  • 接下来执行指令5,在本文的上下文中,MSTORE操作码的功能是将从栈中弹出两个slot中的数据,并完成M[S[0]]:=S[1]。其中M为内存,S为栈。

  • 按照所述,那为何将0x80存在了内存位置0x50

  • 因为内存是按字寻址的字节数组。在内存地址0x40存放占一个字的数据(显然要做内存扩展)。0x40-0x4f存放16字节。0x50-0x5f存放16字节。而EVM是采用大端序,因此0x80恰好存在0x50

00000000000000000000000000000000 (16字节)
00000000000000000000000000000080 (16字节)

在remix的调试界面中, 整个字跨了2行。

相同的疑惑参见stackexchange,btw,该问题得到了ConsenSys的开发者Ben Edgington的解答。Cool。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值