19

Is there a way to directly be able to retrieve CHAIN_ID information about the executing chain from a smart contract?

I know that for any chain that has EIP-155 implemented, CHAIN_IDs are retrievable from the v component of a signature but would require the passing of one for extraction.

Since CHAIN_ID is information about the chain I suspect that there should be a way to access this. Is there a way for Solidity to directly get this information?

Shiri
  • 786
  • 1
  • 8
  • 19
  • 2
    Alternative: Because you are deploying the contract on a different chain you can give the chain id as a constructor parameter. – Mikko Ohtamaa Aug 17 '18 at 14:40

3 Answers3

34

chainid is available in native solidity 0.8.0. So you can get chain id like block timestamp or block number.

Here is the code.

block.chainid;

Documentation https://docs.soliditylang.org/en/v0.8.0/units-and-global-variables.html

Solidity update PR is here. https://github.com/ethereum/solidity/pull/10557

taijusanagi
  • 636
  • 6
  • 4
18

As of version 0.5.12, Solidity includes an assembly function chainid() that provides access to the new CHAINID opcode:

function getChainID() external view returns (uint256) {
    uint256 id;
    assembly {
        id := chainid()
    }
    return id;
}

To use it, ensure you set the compiler's EVM version to Istanbul with the --evm-version istanbul flag.

Related documentation: Solidity Assembly - v0.5.12

iamdefinitelyahuman
  • 2,876
  • 1
  • 12
  • 32
3

There isn't as of yet, but Istanbul (the upcoming hardfork) includes eip-1344, which includes a CHAINID opcode that pushes the chain id to the stack. I assume Solidity will add block.chainId or something similar, or at least add it to Solidity Assembly so that libraries can access it.

natewelch_
  • 12,021
  • 1
  • 29
  • 43