首页 > 解决方案 > 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;

标签: type-conversiontypeerrorsoliditycontractremix

解决方案


从 Solidity 0.8.0 开始,您不能再address直接转换为bytes32. 您必须执行两个单独的转换:首先到bytes20,它将类型从address固定字节更改为,然后才bytes32将长度扩展到。

请参阅Solidity v0.8.0 重大更改 > 新限制

显式类型转换有新的限制。int仅当符号、宽度或类型类别( 、addressbytesNN等)最多有一次更改时才允许转换。要执行多项更改,请使用多次转换。

  • address(uint)and uint(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
));

推荐阅读