EVM 命令行界面在输入中丢弃标题零

EVM command line interface drops heading zeros in input

我正在通过 evm 命令行执行虚拟(智能)合约,以了解如何将输入传递给合约。我正在使用以下合约字节码:

60003500
PUSH1 0x00
CALLDATALOAD
STOP

如果我提供 0x101 作为输入,我会得到预期的结果:

>>> evm --code 60003500 --input 101 --debug run
0x
#### TRACE ####
PUSH1           pc=00000000 gas=10000000000 cost=3

CALLDATALOAD    pc=00000002 gas=9999999997 cost=3
Stack:
00000000  0x0

STOP            pc=00000003 gas=9999999994 cost=0
Stack:
00000000  0x101000000000000000000000000000000000000000000000000000000000000  # AS EXPECTED

虽然,如果我输入 0x001,标题零似乎被 evm 删除(请参阅最后一行的堆栈状态)。

>>> evm --code 60003500 --input 001 --debug run
0x
#### TRACE ####
PUSH1           pc=00000000 gas=10000000000 cost=3

CALLDATALOAD    pc=00000002 gas=9999999997 cost=3
Stack:
00000000  0x0

STOP            pc=00000003 gas=9999999994 cost=0
Stack:
00000000  0x1000000000000000000000000000000000000000000000000000000000000   # NOT AS EXPECTED

我正在使用 evm version 1.10.17-stable-25c9b49f。为什么 evm 会去掉前导零?

查看霍尔格的评论。前导零不会更改数字的值。

这里有一个十进制的例子来演示:

12 = 1*10 + 2*1 = 10 + 2 = 12

012 = 0*100 + 1*10 + 2*1 = 0 + 10 + 2 = 12

十六进制数前面的0x只是告诉人类(和计算机)后面的数字是十六进制格式,而不是十进制。

编辑:看来您要问的问题是如何通过 0x01000000000000000000000000000000x01 转换为 0x100000000000000000000000000000 的原因是因为它首先计算为 0x1,然后是 right-shifted,直到所有剩余位都用零填充。要表示 0x0100000000000000000000000000000,您必须输入 0x0100000000000000000000000000000.

事实证明,evm 中存在奇数长度输入的小错误。所以 none 问题中的例子实际上给出了预期的结果,尽管我说第一个是预期的。

这是一个简化的例子。以下两个命令向智能合约发送相同的调用消息:

evm --code 60003500 --input 1 -debug run

evm --code 60003500 --input 01 -debug run

两种情况下的通话信息都是0x0100000000000000000000000000000000000000000000000000000000000000。因此,错误不是第二个命令的前导零被删除,而是当存在 odd-length 输入时,前导零被添加到输入中。

我最终对 post an issue which was later fixed 有疑虑有了足够的信心。对于旧版本,简单的解决方法是始终提供 even-length 输入,因为调用消息不是简单地从左到右一点一点地填充。