type-conversion - Remix 中的显式类型转换
问题描述
这个功能:
function initializeDomainSeparator() public {
// hash the name context with the contract address
EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(// solium-disable-line
EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,
keccak256(bytes(name)),
bytes32(address(this))
^^^^^^^^^^^^^^^^^^^
));
}
正在取消此错误:
TypeError: Explicit type conversion not allowed from "address" to "bytes32".
我究竟做错了什么?编译指示 ^0.8.4;
解决方案
从 Solidity 0.8.0 开始,您不能再address
直接转换为bytes32
. 您必须执行两个单独的转换:首先到bytes20
,它将类型从address
固定字节更改为,然后才bytes32
将长度扩展到。
显式类型转换有新的限制。
int
仅当符号、宽度或类型类别( 、address
、bytesNN
等)最多有一次更改时才允许转换。要执行多项更改,请使用多次转换。
address(uint)
anduint(address)
: 转换类型类别和宽度。address(uint160(uint))
分别用和替换它uint(uint160(address))
。
所以在你的情况下正确的转换是bytes32(bytes20(address(this)))
.
但abi.encodePacked()
不需要参数是字节类型,实际上您根本不需要在这里进行转换:
EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(// solium-disable-line
EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,
keccak256(bytes(name)),
this
));
推荐阅读
- matlab - 在 Matlab 中添加文件夹路径以在 Mac 上使用 Matlab 数据访问不同的文件夹
- python - 在从 AsyncHTMLSession 收到的响应的 html 上使用 render() 时出错
- java - 如何在 kotlin hashmap 中添加双精度类型?
- mongodb - MongoDB elemMatch 和文本搜索
- jquery - 如何删除或防止重复值表.map jquery
- firebase - events_intraday 表何时迁移到 BigQuery 上的 events_ 数据集?
- laravel - Laravel 验证;数组字段的人名
- c# - 身份服务器 4 和 ADFS
- c++ - 负索引是否一定意味着未定义的行为
- python - 在 Python 中使用数据类方法定义属性