README.md 9.4 KB
Newer Older
N
Nathan Hourt 已提交
1 2
# Eos

peterwillcn's avatar
peterwillcn 已提交
3 4
[![Build Status](https://travis-ci.org/EOSIO/eos.svg?branch=master)](https://travis-ci.org/EOSIO/eos)

5
Welcome to the EOS.IO source code repository!
N
Nathan Hourt 已提交
6 7 8 9

## Getting Started
The following instructions overview the process of getting the software, building it, and running a simple test network that produces blocks.

10 11
## Setting up a build/development environment
This project is written primarily in C++14 and uses CMake as its build system. An up-to-date Clang and the latest version of CMake is recommended.
N
Nathan Hourt 已提交
12

13
Dependencies:
14
* Clang 4.0.0
15 16 17 18 19
* CMake 3.5.1
* Boost 1.64
* LLVM 4.0
* [secp256k1-zkp (Cryptonomex branch)](https://github.com/cryptonomex/secp256k1-zkp.git)

20
### Clean install Ubuntu 16.10
21 22 23

Install the development toolkit:

24
```commandline
25
sudo apt-get update
26 27 28
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
sudo apt-get install clang-4.0 lldb-4.0 cmake make \
                     libbz2-dev libssl-dev libgmp3-dev \
29
                     autotools-dev build-essential \
30
                     libbz2-dev libicu-dev python-dev \
31 32 33 34 35
                     autoconf libtool git
```

Install Boost 1.64:

36
```commandline
37 38 39 40 41 42 43 44 45 46
cd ~
export BOOST_ROOT=$HOME/opt/boost_1_64_0
wget -c 'https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2/download' -O boost_1.64.0.tar.bz2
tar xjf boost_1.64.0.tar.bz2
cd boost_1_64_0/
./bootstrap.sh "--prefix=$BOOST_ROOT"
./b2 install
```

As well as [secp256k1-zkp (Cryptonomex branch)](https://github.com/cryptonomex/secp256k1-zkp.git):
D
Daniel Larimer 已提交
47

48
```commandline
49
cd ~
D
Daniel Larimer 已提交
50
git clone https://github.com/cryptonomex/secp256k1-zkp.git
J
Joel Smith 已提交
51
cd secp256k1-zkp
D
Daniel Larimer 已提交
52 53 54 55 56
./autogen.sh
./configure
make
sudo make install
```
D
Daniel Larimer 已提交
57

58
By default LLVM and clang do not include the WASM build target, so you will have to build it yourself. Note that following these instructions will create a version of LLVM that can only build WASM targets.
59

60 61 62 63 64 65 66 67 68 69 70
```commandline
mkdir  ~/wasm-compiler
cd ~/wasm-compiler
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git
cd llvm/tools
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git
cd ..
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=.. -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
make -j4 install
71
```
72

73
### macOS Sierra 10.12.6
74 75 76 77 78 79 80 81 82

macOS additional Dependencies:
* Brew
* Newest XCode

Upgrade your XCode to the newest version:

```commandline
xcode-select --install
83 84
```

85
Install homebrew:
86 87

```commandline
88 89 90 91 92 93 94 95
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

Install the dependencies:

```commandline
brew update
brew install git automake libtool boost openssl llvm
96
```
97

98 99 100 101 102 103 104 105 106 107
Install [secp256k1-zkp (Cryptonomex branch)](https://github.com/cryptonomex/secp256k1-zkp.git):
        
```commandline
cd ~
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
./configure
make
sudo make install
108
```
109 110 111 112

Build LLVM and clang for WASM:

```commandline
113 114 115 116 117 118 119 120 121 122 123 124
mkdir  ~/wasm-compiler
cd ~/wasm-compiler
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git
cd llvm/tools
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git
cd ..
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=.. -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
make -j4 install
```

125 126 127 128 129 130 131
Add WASM_LLVM_CONFIG and LLVM_DIR to your .bash_profile:

```commandline
echo "export WASM_LLVM_CONFIG=~/wasm-compiler/llvm/bin/llvm-config" >> ~/.bash_profile
echo "export LLVM_DIR=/usr/local/Cellar/llvm/4.0.1/lib/cmake/llvm" >> ~/.bash_profile
```

N
Nathan Hourt 已提交
132 133 134 135 136 137 138 139 140
### Getting the code
To download all of the code, download Eos and a recursion or two of submodules. The easiest way to get all of this is to do a recursive clone:

`git clone https://github.com/eosio/eos --recursive`

If a repo is cloned without the `--recursive` flag, the submodules can be retrieved after the fact by running this command from within the repo:

`git submodule update --init --recursive`

141 142 143 144 145
### Using the WASM compiler to perform a full build of the project

The WASM_LLVM_CONFIG environment variable is used to find our recently built WASM compiler.
This is needed to compile the example contracts inside eos/contracts folder and their respective tests.

146 147 148
#### On Ubuntu:

```commandline
149 150 151
git clone https://github.com/eosio/eos --recursive
mkdir -p eos/build && cd eos/build
export BOOST_ROOT=$HOME/opt/boost_1_64_0
152
cmake -DWASM_LLVM_CONFIG=~/wasm-compiler/llvm/bin/llvm-config -DBOOST_ROOT="$BOOST_ROOT" ..
153 154 155 156
make -j4
```

Out-of-source builds are also supported. To override clang's default choice in compiler, add these flags to the CMake command:
N
Nathan Hourt 已提交
157 158 159

`-DCMAKE_CXX_COMPILER=/path/to/c++ -DCMAKE_C_COMPILER=/path/to/cc`

160 161 162 163 164 165 166 167 168
#### On macOS:

```commandline
git clone https://github.com/eosio/eos --recursive
mkdir -p eos/build && cd eos/build
cmake ..
make -j4
```

N
Nathan Hourt 已提交
169 170
For a debug build, add `-DCMAKE_BUILD_TYPE=Debug`. Other common build types include `Release` and `RelWithDebInfo`.

171
To run the test suite after building, run the `chain_test` executable in the `tests` folder.
N
Nathan Hourt 已提交
172

N
Nathan Hourt 已提交
173
### Creating and launching a single-node testnet
N
Nathan Hourt 已提交
174 175
After successfully building the project, the `eosd` binary should be present in the `programs/eosd` directory. Go ahead and run `eosd` -- it will probably exit with an error, but if not, close it immediately with Ctrl-C. Note that `eosd` will have created a directory named `data-dir` containing the default configuration (`config.ini`) and some other internals. This default data storage path can be overridden by passing `--data-dir /path/to/data` to `eosd`.

N
Nathan Hourt 已提交
176
Edit the `config.ini` file, adding the following settings to the defaults already in place:
N
Nathan Hourt 已提交
177 178

```
N
Nathan Hourt 已提交
179 180 181 182 183
# Load the testnet genesis state, which creates some initial block producers with the default key
genesis-json = /path/to/eos/source/genesis.json
# Enable production on a stale chain, since a single-node test chain is pretty much always stale
enable-stale-production = true
# Enable block production with the testnet producers
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
producer-name = inita
producer-name = initb
producer-name = initc
producer-name = initd
producer-name = inite
producer-name = initf
producer-name = initg
producer-name = inith
producer-name = initi
producer-name = initj
producer-name = initk
producer-name = initl
producer-name = initm
producer-name = initn
producer-name = inito
producer-name = initp
producer-name = initq
producer-name = initr
producer-name = inits
producer-name = initt
producer-name = initu
N
Nathan Hourt 已提交
205 206
# Load the block producer plugin, so we can produce blocks
plugin = eos::producer_plugin
207 208 209
# As well as API and HTTP plugins
plugin = eos::chain_api_plugin
plugin = eos::http_plugin
N
Nathan Hourt 已提交
210 211
```

J
Joel Smith 已提交
212
Now it should be possible to run `eosd` and see it begin producing blocks. At present, the P2P code is not implemented, so only single-node configurations are possible. When the P2P networking is implemented, these instructions will be updated to show how to create an example multi-node testnet.
peterwillcn's avatar
peterwillcn 已提交
213

214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
### Create accounts for your smart contracts

To publish sample smart contracts you need to create accounts for them.

At the moment for the testing purposes you need to run `eosd --skip-transaction-signatures` to successfully create accounts and run transactions.

First, generate public/private key pairs for the `owner_key` and `active_key`. We will need them to create an account:

```commandline
cd ~/eos/build/programs/eosc/
./eosc create key
./eosc create key
```

You will get two pairs of a public and private key:

```
Private key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Public key:  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

Save the values for future reference.

Run `create` command where `PUBLIC_KEY_1` and `PUBLIC_KEY_2` are the values generated by the `create key` command:

```commandline
./eosc create account inita exchange PUBLIC_KEY_1 PUBLIC_KEY_2 
```

You should get a json response back with a transaction ID confirming it was executed successfully.

### Run example contract
246

247
With an account for a contract created, you can upload a sample contract:
248 249 250 251 252 253 254

```commandline
cd ~/eos/build/programs/eosc/ 
./eosc contract exchange ../../../contracts/exchange/exchange.wast ../../../contracts/exchange/exchange.abi
```

## Run in docker
peterwillcn's avatar
peterwillcn 已提交
255

256 257
Simple and fast setup of EOS on Docker is also available. Firstly, install dependencies:

peterwillcn's avatar
peterwillcn 已提交
258 259 260 261
 - [Docker](https://docs.docker.com)
 - [Docker-compose](https://github.com/docker/compose)
 - [Docker-volumes](https://github.com/cpuguy83/docker-volumes)

262
Build eos image
peterwillcn's avatar
peterwillcn 已提交
263

264
```commandline
peterwillcn's avatar
peterwillcn 已提交
265
cd eos/Docker
266
cp ../genesis.json .
peterwillcn's avatar
peterwillcn 已提交
267
docker build --rm -t eosio/eos .
peterwillcn's avatar
peterwillcn 已提交
268 269 270 271
```

Start docker

272
```commandline
peterwillcn's avatar
peterwillcn 已提交
273
sudo rm -rf /data/store/eos # options 
peterwillcn's avatar
peterwillcn 已提交
274 275 276 277
sudo mkdir -p /data/store/eos
docker-compose -f docker-compose.yml up
```

278 279 280 281 282 283 284 285 286 287 288 289 290 291
When running eosd in the docker container you need to instruct the cpp socket to accept connections from all interfaces.  Adjust any address you plan to use by changing from `127.0.0.1` to `0.0.0.0` in your `Docker/config.ini` file.

For example:

```
# The local IP and port to listen for incoming http connections.
http-server-endpoint = 0.0.0.0:8888
```

After starting the Docker this can be tested from container's host machine:
```commandline
curl http://127.0.0.1:8888/v1/chain/get_info
```

292
You can run the `eosc` commands via `docker exec` command. For example:
293
```commandline
294
docker exec docker_eos_1 eosc contract exchange contracts/exchange/exchange.wast contracts/exchange/exchange.abi
295
```