Remix 中的显式类型转换

TNJ*_*ing 1 type-conversion contract typeerror solidity 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))
            ^^^^^^^^^^^^^^^^^^^
        ));
}
Run Code Online (Sandbox Code Playgroud)

正在消除此错误:

TypeError: Explicit type conversion not allowed from "address" to "bytes32".
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?杂注可靠性^0.8.4;

cam*_*eel 6

从 Solidity 0.8.0 开始,您不能再address直接转换为bytes32. 您必须执行两次单独的转换:首先是 to 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
));
Run Code Online (Sandbox Code Playgroud)