<p align="center">
<img
    src="https://neo-cdn.azureedge.net/images/neo_logo.svg"
    width="250px">
</p>
<p align="center">
  <b>Go</b> Node and SDK for the <a href="https://neo.org">NEO</a> blockchain.
</p>

<hr />

[![codecov](https://codecov.io/gh/nspcc-dev/neo-go/branch/master/graph/badge.svg)](https://codecov.io/gh/nspcc-dev/neo-go)
[![CircleCI](https://circleci.com/gh/nspcc-dev/neo-go/tree/master.svg?style=svg)](https://circleci.com/gh/nspcc-dev/neo-go/tree/master)
[![Report](https://goreportcard.com/badge/github.com/nspcc-dev/neo-go)](https://goreportcard.com/report/github.com/nspcc-dev/neo-go)
![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/nspcc-dev/neo-go?sort=semver)
![License](https://img.shields.io/github/license/nspcc-dev/neo-go.svg?style=popout)

# Overview

This project aims to be a full port of the original C# [NEO project](https://github.com/neo-project).
A complete toolkit for the NEO blockchain, including:

- Consensus node (WIP)
- [RPC node & client](https://github.com/nspcc-dev/neo-go/tree/master/pkg/rpc/README.md)
- [RPC client](https://github.com/nspcc-dev/neo-go/blob/master/pkg/rpc/README.md)
- CLI tool
- [Smart contract compiler](https://github.com/nspcc-dev/neo-go/blob/master/pkg/vm/compiler/README.md)
- [NEO virtual machine](https://github.com/nspcc-dev/neo-go/blob/master/pkg/vm/README.md)

# Getting started

## Installation

Go: 1.11+

Install dependencies.

`neo-go` uses [GoModules](https://github.com/golang/go/wiki/Modules) as dependency manager:

```
make deps
```

## How to setup a node

### Docker

Each tagged build is built to docker hub and the `:latest` tag pointing at the latest tagged build.

By default the `CMD` is set to run a node on `testnet`, so to do this simply run:

```bash
 docker run -d --name neo-go -p 20332:20332 -p 20333:20333 cityofzion/neo-go
```

Which will start a node on `testnet` and expose the nodes port `20333` and `20332` for the `JSON-RPC` server.


### Building

Build the **neo-go** CLI:

```
make build
```

Quick start a NEO node on the private network. This requires the [neo-privatenet](https://hub.docker.com/r/cityofzion/neo-privatenet/) Docker image running on your machine.

```
make run
```

To run the binary directly:

```
./bin/neo-go node -seed 127.0.0.1:20333,127.0.0.1:20334
```

By default the node will run on the `private network`, to change his:

```
./bin/neo-go node --mainnet
```

Available network flags:
- `--mainnet, -m`
- `--privnet, -p`
- `--testnet, -t`

If you want in-depth customization for your node, there are `yaml` config files for each `network` available in the `config` directory. Those files are automatically loaded, corresponding the provided `netmode` flag.

```yaml
ProtocolConfiguration:
  Magic: 56753
  AddressVersion: 23
  StandbyValidators:
  - 02b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc2
  - 02103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e
  - 03d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699
  - 02a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd62
  SeedList:
  - 127.0.0.1:20333
  - 127.0.0.1:20334
  - 127.0.0.1:20335
  - 127.0.0.1:20336
  SystemFee:
    EnrollmentTransaction: 1000
    IssueTransaction: 500
    PublishTransaction: 500
    RegisterTransaction: 10000

ApplicationConfiguration:
  DataDirectoryPath: "./chains/privnet"
  RPCPort: 20332
  NodePort: 20333
  Relay: true
  DialTimeout: 3
  ProtoTickInterval: 2
  MaxPeers: 50
```

## Writing smart contracts in Go
In depth documentation about the **neo-go** compiler and smart contract examples can be found inside the [compiler package](https://github.com/nspcc-dev/neo-go/tree/master/pkg/vm/compiler).

### Compile a smart contract

```
./bin/neo-go contract compile -i mycontract.go
```

By default the filename will be the name of your `.go` file with the `.avm` extension, the file will be located in the same directory where you called the command from. If you want another location for your compiled contract:

```
./bin/neo-go contract compile -i mycontract.go --out /Users/foo/bar/contract.avm
```

### Debugging your smart contract
You can dump the opcodes generated by the compiler with the following command:

```
./bin/neo-go contract inspect -i mycontract.go
```

This will result in something like this:

```
INDEX    OPCODE    DESC
0        0x54      PUSH4
1        0xc5      NEWARRAY
2        0x6b      TOALTSTACK
3        0x5a      PUSH10
4        0x6a      DUPFROMALTSTACK
5        0x0       PUSH0
6        0x52      PUSH2
7        0x7a      ROLL
8        0xc4      SETITEM
9        0x6a      DUPFROMALTSTACK
10       0x0       PUSH0
11       0xc3      PICKITEM
12       0x5a      PUSH10
13       0xa2      GTE
14       0x64      JMPIFNOT
15       0x7       7
15       0x0       0
17       0x51      PUSH1
18       0x6c      FROMALTSTACK
19       0x75      DROP
20       0x66      RET
21       0x0       PUSH0
22       0x6c      FROMALTSTACK
23       0x75      DROP
24       0x66      RET
```

# Contributing

Feel free to contribute to this project after reading the
[contributing guidelines](https://github.com/nspcc-dev/neo-go/blob/master/CONTRIBUTING.md).

Before starting to work on a certain topic, create an new issue first,
describing the feature/topic you are going to implement.

# Contact

- [@roman-khimov](https://github.com/roman-khimov) on GitHub
- [@volekerb](https://github.com/volekerb) on Github
- [@anthdm](https://github.com/anthdm) on Github
- Reach out to us on the [NEO Discord](https://discordapp.com/invite/R8v48YA) channel

# License

- Open-source [MIT](https://github.com/nspcc-dev/neo-go/blob/master/LICENSE.md)