from web3.module import (
    Module,
)


class Net(Module):
    @property
    def listening(self):
        return self.web3.manager.request_blocking("net_listening", [])

    @property
    def peerCount(self):
        return self.web3.manager.request_blocking("net_peerCount", [])

    @property
    def version(self):
        return self.web3.manager.request_blocking("net_version", [])

web3/net.py
from web3.module import (
    Module,
)


class Net(Module):
    @property
    def listening(self):
        return self.web3.manager.request_blocking("net_listening", [])

    @property
    def peerCount(self):
        return self.web3.manager.request_blocking("net_peerCount", [])

    @property
    def chainId(self):
        return self.version

    @property
    def version(self):
        return self.web3.manager.request_blocking("net_version", [])

web3/net.py
diff --git a/docs/web3.net.rst b/docs/web3.net.rst
new file mode 100644
index 0000000000..296e95b3dc
--- /dev/null
+++ b/docs/web3.net.rst
@@ -0,0 +1,40 @@
+Net API
+===========
+
+.. py:module:: web3.net
+.. py:currentmodule:: web3.net
+
+.. py:class:: Net
+
+The ``web3.net`` object exposes methods to interact with the RPC APIs under
+the ``net_`` namespace.
+
+
+Properties
+----------
+
+The following properties are available on the ``web3.net`` namespace.
+
+.. py:method:: Net.chainId(self)
+
+    * Delegates to ``net_version`` RPC Method
+
+    Returns the current network chainId/version and is an alias of ``web3.net.version``.
+
+    .. code-block:: python
+
+        >>> web3.net.chainId
+        1
+
+
+.. py:method:: Net.version(self)
+
+    * Delegates to ``net_version`` RPC Method
+
+    Returns the current network chainId/version.
+
+    .. code-block:: python
+
+        >>> web3.net.version
+        1
+
diff --git a/web3/net.py b/web3/net.py
index 830799f6c7..859f0cc67a 100644
--- a/web3/net.py
+++ b/web3/net.py
@@ -12,6 +12,10 @@ def listening(self):
     def peerCount(self):
         return self.web3.manager.request_blocking("net_peerCount", [])
 
+    @property
+    def chainId(self):
+        return self.version
+
     @property
     def version(self):
         return self.web3.manager.request_blocking("net_version", [])

Consider adding Chain Id to library
* Version: 4.0.0-b
* Python: 3.6.3
* OS: linux

### What was wrong?

No clear way to access known chain ids.

### How can it be fixed?

Proposed syntax

```
>>> from web3 import Chains
>>> Chains.Ropsten.id
3
```

I ran into issues here: https://web3py.readthedocs.io/en/latest/web3.eth.account.html#sign-a-contract-transaction as `buildTransaction()` requires a `chainId`.  I didn't even know the chains had ids.

```
>>> unicorn_txn = unicorns.functions.transfer(
...     '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359',
...     1,
... ).buildTransaction({
...     'chainId': 1,
...     'gas': 70000,
...     'gasPrice': w3.toWei('1', 'gwei'),
...     'nonce': nonce,
... })
```

### Maybe this will help others

According to this answer https://ethereum.stackexchange.com/a/17101/7187 the chain ids are as follows:

0: Olympic, Ethereum public pre-release testnet
1: Frontier, Homestead, Metropolis, the Ethereum public main network
1: Classic, the (un)forked public Ethereum Classic main network, chain ID 61
1: Expanse, an alternative Ethereum implementation, chain ID 2
2: Morden, the public Ethereum testnet, now Ethereum Classic testnet
3: Ropsten, the public cross-client Ethereum testnet
4: Rinkeby, the public Geth PoA testnet
42: Kovan, the public Parity PoA testnet
77: Sokol, the public POA Network testnet
99: Core, the public POA Network main network
7762959: Musicoin, the music blockchain

Consider adding Chain Id to library
* Version: 4.0.0-b
* Python: 3.6.3
* OS: linux

### What was wrong?

No clear way to access known chain ids.

### How can it be fixed?

Proposed syntax

```
>>> from web3 import Chains
>>> Chains.Ropsten.id
3
```

I ran into issues here: https://web3py.readthedocs.io/en/latest/web3.eth.account.html#sign-a-contract-transaction as `buildTransaction()` requires a `chainId`.  I didn't even know the chains had ids.

```
>>> unicorn_txn = unicorns.functions.transfer(
...     '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359',
...     1,
... ).buildTransaction({
...     'chainId': 1,
...     'gas': 70000,
...     'gasPrice': w3.toWei('1', 'gwei'),
...     'nonce': nonce,
... })
```

### Maybe this will help others

According to this answer https://ethereum.stackexchange.com/a/17101/7187 the chain ids are as follows:

0: Olympic, Ethereum public pre-release testnet
1: Frontier, Homestead, Metropolis, the Ethereum public main network
1: Classic, the (un)forked public Ethereum Classic main network, chain ID 61
1: Expanse, an alternative Ethereum implementation, chain ID 2
2: Morden, the public Ethereum testnet, now Ethereum Classic testnet
3: Ropsten, the public cross-client Ethereum testnet
4: Rinkeby, the public Geth PoA testnet
42: Kovan, the public Parity PoA testnet
77: Sokol, the public POA Network testnet
99: Core, the public POA Network main network
7762959: Musicoin, the music blockchain

