我已经在许多工厂合约中看到过这段代码:
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/