# Harmony
[![Build Status ](https://travis-ci.com/harmony-one/harmony.svg?token=DnoYvYiTAk7pqTo9XsTi&branch=master )](https://travis-ci.com/harmony-one/harmony)
< a href = 'https://github.com/jpoles1/gopherbadger' target = '_blank' > ![gopherbadger-tag-do-not-edit](https://img.shields.io/badge/Go%20Coverage-45%25-brightgreen.svg?longCache=true& style=flat)< / a >
< a href = "https://discord.gg/kdf8a6T" > ![Discord](https://img.shields.io/discord/532383335348043777.svg)< / a >
[![Coverage Status ](https://coveralls.io/repos/github/harmony-one/harmony/badge.svg?branch=master )](https://coveralls.io/github/harmony-one/harmony?branch=master)
[![Go Report Card ](https://goreportcard.com/badge/github.com/harmony-one/harmony )](https://goreportcard.com/report/github.com/harmony-one/harmony)
## Installation Requirements
GMP and OpenSSL
```bash
brew install gmp
brew install openssl
```
## Dev Environment Setup
The required go version is: **go1.12**
```bash
export GOPATH=$HOME/< path_of_your_choice >
export CGO_CFLAGS="-I$GOPATH/src/github.com/harmony-one/bls/include -I$GOPATH/src/github.com/harmony-one/mcl/include -I/usr/local/opt/openssl/include"
export CGO_LDFLAGS="-L$GOPATH/src/github.com/harmony-one/bls/lib -L/usr/local/opt/openssl/lib"
export LD_LIBRARY_PATH=$GOPATH/src/github.com/harmony-one/bls/lib:$GOPATH/src/github.com/harmony-one/mcl/lib:/usr/local/opt/openssl/lib
export LIBRARY_PATH=$LD_LIBRARY_PATH
DYLD_LIBRARY_PATH → DYLD_FALLBACK_LIBRARY_PATH
DYLD_LIBRARY_PATH has a “look here first before usual places” semantics,
in order to let users use an alternative version of a shared library.
On the other side, DYLD_FALLBACK_LIBRARY_PATH has a “look here if not
found in usual places” semantics, in order to let users specify
additional locations where a shared library is found.
In our case, if a binary refers to a common shared library found in
usual places, we want to use it; we simply want to specify additional
locations where BLS/MCL/OpenSSL libraries are found. So it is more
appropriate to use DYLD_FALLBACK_LIBRARY_PATH.
This also fixes a nasty symbol table mismatch, which is the main reason
for this change: Certain commonly used shared libraries - such as
libJPEG.dylib, co-located within the ImageIO framework and expected by
the main ImageIO library – are often also found in Homebrew or MacPorts
root (/opt/local//lib for MacPort). If DYLD_LIBRARY_PATH included
/opt/local/lib for OpenSSL, many system programs linked against ImageIO
will erroneously pick up libJPEG.dylib in /opt/local/lib, which lacks
certain internal symbols that the framework version has. Using
DYLD_FALLBACK_LIBRARY_PATH makes dyld honor the full path to the
framework version of libJPEG, which is hardcoded in the main ImageIO
framework library.
6 years ago
export DYLD_FALLBACK_LIBRARY_PATH=$LD_LIBRARY_PATH
mkdir -p $HOME/< path_of_your_choice > /src/github.com/harmony-one
cd $HOME/< path_of_your_choice > /src/github.com/harmony-one
git clone git@github.com:harmony-one/mcl.git
cd mcl & & make -j4 & & cd ..
git clone git@github.com:harmony-one/bls.git
cd bls & & make -j4 & & cd ..
git clone git@github.com:harmony-one/harmony.git
cd harmony
go get ./...
git submodule update --init --recursive
```
## Build
Note : Some of our scripts require bash 4.x support, please [install bash 4.x ](http://tldrdevnotes.com/bash-upgrade-3-4-macos ) on MacOS X.
Make sure you set `export GO111MODULE=on` .
### Build all executables
You can run the script `./scripts/go_executable_build.sh` to build all the executables.
### Build individual executables
Initialize BLS
```
source scripts/setup_bls_build_flags.sh
```
Harmony server / main node:
```
go build -o bin/harmony cmd/harmony/main.go
```
Wallet:
```
go build -o bin/wallet cmd/client/wallet/main.go
```
Tx Generator:
```
go build -o bin/txgen cmd/client/txgen/main.go
```
## Usage
You may build the src/harmony.go locally and run local test.
### Running local test
The deploy.sh script creates a local environment of Harmony blockchain devnet based on the configuration file.
The configuration file configures number of nodes and their IP/Port.
The script starts one local beacon chain node, the blockchain nodes, and run a transactional generator program which generates and sends simulated transactions to the local blockchain.
```bash
./test/deploy.sh ./test/configs/ten-oneshard.txt
```
## Testing
Make sure you use the following command and make sure everything passed before submitting your code.
```bash
./test/test_before_submit.sh
```
## License
Harmony is licensed under the MIT License. See [`LICENSE` ](LICENSE ) file for
the terms and conditions.
Harmony includes third-party open source code. In general, a source subtree
with a `LICENSE` or `COPYRIGHT` file is from a third party, and our
modifications thereto are licensed under the same third-party open source
license.
Also please see [our Fiduciary License Agreement ](FLA.md ) if you are
contributing to the project. By your submission of your contribution to us, you
and we mutually agree to the terms and conditions of the agreement.
## Contributing To Harmony
See [`CONTRIBUTING` ](CONTRIBUTING.md ) for details.
## Development Status
### Features Done
- Basic consensus protocol with O(n) complexity
- Basic validator server
- P2p network connection and unicast
- Account model and support for Solidity
- Simple wallet program
- Mock beacon chain with static sharding
- Information disposal algorithm using erasure encoding (to be integrated)
- Blockchain explorer with performance report and transaction lookup
- Transaction generator for loadtesting
### Features To Be Implemented
- Full beacon chain with multiple validators
- Resharding
- Staking on beacon chain
- Fast state synchronization
- Distributed randomness generation with VRF and VDF
- Kademlia routing
- P2P network and gossiping
- Full protocol of consensus with BLS multi-sig and view-change protocol
- Integration with WASM
- Cross-shard transaction