我有一个以参数bytes32
为参数的函数,以及一个使用bytes32
作为键的映射。
在geth中,我似乎可以调用contract.foo("0x123abc")
和contract.foo(0x123abc)
,但我不确定它们是否给出了相同的结果。
contract.mymap("0x123abc")
和contract.mymap(0x123abc)
也一样,他们是一样的吗?它们总是作为0x123abc0000000000000000000000000000000000000000000000000000000000
处理吗?字节类似于字符串,但我不确定它们之间的区别。
我不能在我的合同上测试我想要的任何东西,但是我检查了一下,map(0x1234567890abcdef123)
和map("0x1234567890abcdef123")
都在工作,但是结果不一样。我应该用哪一种?
发布于 2017-01-12 20:22:46
总是用引号。JavaScript的最大整数精度为64位。这意味着,如果您的数字超过8个字节,并且您输入它没有引号,您将立即失去精度。
例如:
0x1122334455667700 - 1
> 0x1122334455667700
0x1122334455667700 - 0x1122334455667701
> 0
正确的方法:
web3.toBigNumber("0x1122334455667700").minus(1).toString(16)
>'11223344556676ff'
bytes
和bytes32
实际上是非常不同的。bytes
与string
相同,而bytes32
与uint256
相同。
如果您的函数需要一个字节,web3将将您的字符串解释为ASCII,即"12345“将被解释为"\x30\x31\x32\x33\x34”。如果它需要一个数字类型(即bytes32
),它将将字符串解释为一个BigNumber。如果要确定并减少歧义,可以使用BigNumbers手动将数字转换为web3.toBigNumber()
。
例如,如果您对'0x123abc'
有问题,请尝试
web3.toBigNumber('0x123abc')
相反,
发布于 2017-01-12 19:07:42
来自ABI:
bytes
的右填充为零(长度为32)。带引号的"0x123abc“是bytes
。bytes32
、uint
、int
这样的类型是用零填充的(长度为32)。没有引号的0x123abc是一个数字(基数为16)。由于合同采用bytes32
,所以使用0x123abc而不带引号或其十进制等效值1194684,以减少与十六进制的混淆。(为了安全起见,请为'1194684‘使用引号,以便将其解释为BigNumber。)
编辑: Per @Tjaden使用'0x123abc',使用web3.toBigNumber('0x123abc')。
https://ethereum.stackexchange.com/questions/11347
复制相似问题