【问题标题】:Explicit Type Conversion in RemixRemix 中的显式类型转换
【发布时间】:2021-08-09 22:25:49
【问题描述】:

这个函数:

  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".

我做错了什么? pragma solidity ^0.8.4;

【问题讨论】:

    标签: type-conversion typeerror solidity contract remix


    【解决方案1】:

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

    Solidity v0.8.0 Breaking Changes > New Restrictions

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

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

    【讨论】:

    • 太棒了!如果它解决了您的问题,请记住将其标记为问题的解决方案:)
    猜你喜欢
    • 2010-09-15
    • 2016-11-23
    • 1970-01-01
    • 2016-06-03
    • 2015-11-12
    • 2011-07-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多