constructor - ChainID Solidity 版本 0.6.12

标签 constructor solidity smartcontracts

我已经在许多工厂合约中看到过这段代码:

constructor() public {
    uint chainId;
    assembly {
        chainId := chainid
    }
    DOMAIN_SEPARATOR = keccak256(
        abi.encode(
            keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
            keccak256(bytes(name)),
            keccak256(bytes('1')),
            chainId,
            address(this)
        )
    );
}

但是,当我使用时这有效 pragma Solidity =0.5.16; 但如果我使用 pragma Solidity =0.6.12;,我会收到错误:

ParseError:预期为“(”,但得到了“}”} ^

我尝试执行以下操作:

constructor() public {
    uint chainId;
    assembly {
        chainId := chainid()
    }...

但是随后我在变量和函数上收到多个错误:

类型错误:覆盖公共(public)状态变量缺少字符串公共(public)常量名称 = ...

如何在 Solidity 0.6.12 版本中编写装配线?

谢谢,

使用 0.5.16 版本不是一个选项,因为许多导入使用 0.6.12 并且它们无法工作...

最佳答案

//SPDX-License-Identifier: MIT
pragma solidity =0.6.12;

contract Test {

string public constant name = "Your Contract name";    

constructor() public {
uint chainId;
assembly {
        chainId := chainid()
    }
bytes32 DOMAIN_SEPARATOR;
DOMAIN_SEPARATOR = keccak256(
    abi.encode(
        keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
        keccak256(bytes(name)),
        keccak256(bytes('1')),
        chainId,
        address(this)
    )
);}}

试试这个。如果您将代码升级到版本 0.8.0 及更高版本,则全局命名空间中有一个可用的变量,称为 block.chainid

关于constructor - ChainID Solidity 版本 0.6.12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68240992/

相关文章:

c++ - 如何在不使用异常的情况下检查 constructor() 中的失败?

java - java中的参数化构造函数是否必须有主体?

go - 以太坊简单存储 : get() func always returns zero?

javascript - 当 JS 将数值作为参数传递给 Solidity 函数时,为什么最好将它们用引号引起来?

ethereum - Solidity Assembly、mstore 函数和一个字的宽度(以字节为单位)

ethereum - 使用智能合约功能从 Uniswap 获取货币对价格

java - 模拟类的构造函数内的方法

c# - 无法使用构造函数实例化类

ethereum - 返回错误 : The method web3_clientVersion does not exist/is not available

python - 编译AggregatorV2V3Interface导致TypeError : Interfaces cannot inherit.接口(interface)