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
只是告诉人类(和计算机)后面的数字是十六进制格式,而不是十进制。
编辑:看来您要问的问题是如何通过 0x0100000000000000000000000000000
。 0x01
转换为 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 输入,因为调用消息不是简单地从左到右一点一点地填充。
我正在通过 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
只是告诉人类(和计算机)后面的数字是十六进制格式,而不是十进制。
编辑:看来您要问的问题是如何通过 0x0100000000000000000000000000000
。 0x01
转换为 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 输入,因为调用消息不是简单地从左到右一点一点地填充。