Go Node and SDK for the NEO blockchain.


[![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 Install dependencies. `neo-go` uses [dep](https://github.com/golang/dep) as its dependency manager. After installing `deps` you can run: ``` 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)