/blockatlas

Clean and lightweight cross-chain transaction API

Primary LanguageGoMIT LicenseMIT

Block Atlas by Trust Wallet

Go Version GoDoc Build Status Codacy Badge Go Report Card Docker

BlockAtlas is a clean explorer API and transaction observer for cryptocurrencies.

BlockAtlas connects to nodes or explorer APIs of the supported coins and maps transaction data, account transaction history into a generic, easy to work with JSON format. It is in production use at the Trust Wallet app, the official cryptocurrency wallet of Binance. Also is in production at the BUTTON Wallet, Telegram based non-custodial wallet. The observer API watches the chain for new transactions and generates notifications by webhooks.

Supported Coins

Setup

Requirements

From Source

There are multiple services:

  1. Platform API - to get transactions, staking, tokens, domain lookup for supported coins in common format
  2. Observer API - to subscribe several addresses on different supported coins and receive webhook
  3. Swagger API - swagger for all handlers of 1-3 APIs. You need to route requests to them on you own (nginx)

There are workers that are linked with Observer API and Market API:

  1. Platform Observer - fetching latest blocks, parse them to common block specification, check subscribed addresses - send webhook. We use Redis to get information about subscribed addresses per coin with webhooks and caching latest block that was processed by observer

Observer API <-> Redis <-> Platform Observer

IMPORTANT

You can run platform API for specific coin only!

cd cmd/platform_api
ATLAS_PLATFORM=ethereum go run main.go

You will run platform API for Ethereum coin only. You can run 30 coins with 30 binaries for scalability and sustainability. Howevever, you can run all of them at once by using ATLAS_PLATFORM=all env param

It works the same for platoform_observer - you can run all observer at 1 binary or 30 coins per 30 binaries

# Download source to $GOPATH
go get -u github.com/trustwallet/blockatlas
cd $(go env GOPATH)/src/github.com/trustwallet/blockatlas

# Start platform_observer with the path to the config.yml ./ 
go build -o platform-observer-bin cmd/platform_observer/main.go && ./platform-observer-bin -c config.yml

# Start Platform API server at port 8420 with the path to the config.yml ./ 
go build -o platform-api-bin cmd/platform_api/main.go  && ./platform-api-bin -p 8420 -c config.yml

# Start Observer API server at port 8422 with the path to the config.yml ./ 
go build -o observer-api-bin cmd/observer-api/main.go  && ./observer-api-bin -p 8422 -c config.yml

# Startp Swagger API server at port 8422 with the path to the config.yml ./ 
go build -o swagger-api-bin cmd/swagger-api/main.go  && ./swagger-api-bin -p 8423

OR

make go-build

Then

make start

Docker

Build and run from local Dockerfile:

You should change config.yml:

redis: redis://redis:6379

Then build:

docker-compose build

Run all services:

docker-compose up

If you need to start one service:

# Run only platform API 
docker-compose start platform_api
# Run only observer for addresses and api for it
docker-compose start platform_observer observer_api redis
# Run swagger api
docker-compose start swagger_api

Configuration

Block Atlas can run just fine without configuration. By default, all coins offering public RPC/explorer APIs are enabled.

If you want to use custom RPC endpoints, or enable coins without public RPC (like Nimiq), you can configure Block Atlas over config.yml or environment variables.

Config File

Config is loaded from config.yml if it exists in the working directory. The repository includes a default config for reference with all available config options.

Example (config.yml):

nimiq:
  api: http://localhost:8648
#...

Environment

The rest gets loaded from environment variables. Every config option is available under the ATLAS_ prefix. Nested keys are joined via _ (Example nimiq.api => NIMIQ_API)

Example:

ATLAS_NIMIQ_API=http://localhost:8648

Docs

Swagger API docs provided at path /swagger/index.html

Updating Docs

  • After creating a new route, add comments to your API source code, See Declarative Comments Format.

  • Download Swag for Go by using:

    $ go get -u github.com/swaggo/swag/cmd/swag

  • Run the Swag in your Go project root folder.

    $ swag init -g ./cmd/platform_api/main.go -o ./docs

Contributing

If you'd like to add support for a new blockchain, feel free to file a pull request. Note that most tokens that run on top of other chains are already supported and don't require code changes (e.g. ERC-20).

The best way to submit feedback and report bugs is to open a GitHub issue. Please be sure to include your operating system, version number, and steps to reproduce reported bugs.

More resources for developers are in CONTRIBUTING.md.