标题很清楚。当我执行bytes32(1)时,它给我一个关于不能将constant_1转换为bytes32的错误。但我能做到零。我很害怕,因为我在合同上使用了bytes32(0),我很担心会出什么问题。
发布于 2022-05-03 12:48:25
您可以做bytes32(0),但不能做bytes32(1),这是为什么?
这种语法是不允许的,因为solidity 0.5.0:
类型系统:不允许从十进制文字到bytesXX类型的显式和隐式转换。
“解释”出现在文档中:
十进制数字文字不能隐式转换为固定大小的字节数组.十六进制数字字面值可以是,但只有在十六进制数正好符合字节类型的大小的情况下。作为例外,值为零的十进制和十六进制文本都可以转换为任意大小的字节类型。
因此,正如您所看到的,bytes32(0)是非常好的(因为值0的bytes32和uint256的内部表示是相同的)。对于任何其他值,都有一些模糊(在我看来)是右侧的bytesX pad,而左边的intX / uintX pad,因此要么使用显式转换,要么完全指定初始化litteral:
pragma solidity ^0.8.0;
contract Example {
function test() public view returns (bytes32, bytes32, bytes32) {
// Not allowed : do you mean 0x0000000000000000000000000000000000000000000000000000000000000001 <- left padding
// or 0x1000000000000000000000000000000000000000000000000000000000000000 <- right padding
// bytes32 a = bytes32(0x1);
// Allowed : Fully specified : left padding
bytes32 a = 0x0000000000000000000000000000000000000000000000000000000000000001;
// Allowed : Fully specified : right padding
bytes32 b = 0x1000000000000000000000000000000000000000000000000000000000000000;
// Allowed : Explicit conversion : left padding
bytes32 c = bytes32(uint256(1));
return (a, b, c);
}
}还不清楚为什么要使用十进制小数来初始化bytes32,但请记住,这不是它们的目的。它们是字节数组,而不是数值。
https://ethereum.stackexchange.com/questions/127442
复制相似问题