## 0x Devnet

A private, single-node PoA Ethereum network for testing purposes only. It uses
Geth and the PoA implementation called "Clique".

## Usage

The devnet requires Docker to run (the latest version is recommended). To start
the network, run:

```
docker run -it --rm -p 8501:8501 -p 8546:8546 0xorg/devnet
```

This will download the latest version of the `0xorg/devnet` container, which is
[hosted on DockerHub](https://hub.docker.com/r/0xorg/devnet).

Depending on your OS and how you installed docker, you may need to prefix any
docker commands with `sudo`.

The Docker container exposes the HTTP JSON RPC API at port 8501, and this is the
primary way you are expected to interact with the devnet. The following
endpoints are supported: `personal,db,eth,net,web3,txpool,miner,debug`.

It also exposes the WS JSON RPC API at port 8546. The following
endpoints are supported: `personal,db,eth,net,web3,txpool,miner,debug`.

You can stop the network with `docker stop` and it will automatically clean up
after itself. (`docker stop` typically requires you to use `docker ps` to find
the name of the currently running container).

### Configuration

The devnet network only has a single node and uses PoA instead of PoW. That
means that one node, called the "sealer", is the ultimate authority for
validating transactions and adding new blocks to the chain. Since there is no
PoW it also means that mining does not require significant computational
resources. You can learn more about PoA and the Geth-specific implementation
called "Clique" in [EIP-225](https://github.com/ethereum/EIPs/issues/225).

The address of the "sealer" is `0xe8816898d851d5b61b7f950627d04d794c07ca37`. The
password associated with the account is "password" and the (encrypted) private
keys are visible in the **node0/keystore** directory. This account is already
"unlocked" in the Geth node by default, so you can do things like sign and send
transactions from this account using the JSON RPC endpoints directly.

There are also a number of other addresses that have hard-coded starting
balances for testing purposes. You can see the details in the **genesis.json**
file. All of these accounts are also unlocked by default.

### Additional JSON RPC Methods

In addition to the
[standard JSON RPC methods](https://github.com/ethereum/wiki/wiki/JSON-RPC) and
the
[Geth Management API](https://github.com/ethereum/go-ethereum/wiki/Management-APIs)
The devnet node supports some additional JSON RPC methods:

#### debug_increaseTime

Increases the timestamp of the next mined block.

##### Parameters

`Number` - The number of seconds by which to increase the time offset.

##### Returns

`Number` - The total number of seconds by which the time offset has been
increased (this includes all calls to `debug_increaseTime`).

##### Example

```js
// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"debug_increaseTime","params":[100],"id":67}'

// Result
{
  "id":67,
  "jsonrpc": "2.0",
  "result": "5000"
}
```

### Mining

The node will automatically (nearly instantly) mine a block whenever new
transactions are added to the transaction pool. If there are no transactions in
the pool, it will wait.

To stop mining, use the
[`miner.stop`](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#miner_stop)
method.

To start mining again, you can use the
[`miner.start`](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#miner_start)
JSON RPC method.

## Contributing

We strongly recommend that the community help us make improvements and determine
the future direction of the protocol. To report bugs within this package, please
create an issue in this repository.

Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting
started.

### Building

In the package root directory, run:

```
docker build -t 0xorg/devnet .
```

### Publishing

To publish the docker image, you need to be logged in to DockerHub and have the
appropriate credentials (if you need access, contact @fabioberger). Then run:

```
docker push 0xorg/devnet
```
