首页 > 解决方案 > ChainID Solidity 版本 0.6.12

问题描述

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

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: Expected '(' but got '}' } ^

我尝试执行以下操作:

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

但是后来我在变量和函数上遇到多个错误,说:

TypeError: overriding public state variable is missing string public constant name = ...

我如何在solidity 0.6.12版本中编写流水线?

谢谢,

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

标签: constructorsoliditysmartcontracts

解决方案


//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


推荐阅读