README.md 9.6 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

## Getting Started
8
The following instructions overview the process of getting the software, building it, running a simple test network that produces blocks, account creation and uploading a sample contract to the blockchain.
N
Nathan Hourt 已提交
9

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
* CMake 3.5.1
* Boost 1.64
S
Serg Metelin 已提交
17
* OpenSSL
18 19 20
* LLVM 4.0
* [secp256k1-zkp (Cryptonomex branch)](https://github.com/cryptonomex/secp256k1-zkp.git)

21
### Clean install Ubuntu 16.10
22 23 24

Install the development toolkit:

25
```commandline
26
sudo apt-get update
27 28 29
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 \
30
                     autotools-dev build-essential \
31
                     libbz2-dev libicu-dev python-dev \
32 33 34 35 36
                     autoconf libtool git
```

Install Boost 1.64:

37
```commandline
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
```

S
Serg Metelin 已提交
47
### LLVM with WASM build target
D
Daniel Larimer 已提交
48

49
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.
50

51 52 53 54 55 56 57 58 59 60 61
```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
62
```
63

64
### macOS Sierra 10.12.6
65 66 67 68 69 70 71 72 73

macOS additional Dependencies:
* Brew
* Newest XCode

Upgrade your XCode to the newest version:

```commandline
xcode-select --install
74 75
```

76
Install homebrew:
77 78

```commandline
79 80 81 82 83 84 85 86
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
87
```
88

89 90 91 92 93 94 95 96 97 98
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
99
```
100 101 102 103

Build LLVM and clang for WASM:

```commandline
104 105 106 107 108 109 110 111 112 113 114 115
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
```

116 117 118 119 120 121 122
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 已提交
123 124 125 126 127 128 129 130 131
### 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`

132 133 134 135 136
### 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.

S
Serg Metelin 已提交
137 138 139 140 141 142
Also, to use the WASM compiler, eos has an external dependency on 
 - [binaryen](https://github.com/WebAssembly/binaryen.git)
   * need to checkout tag 1.37.21
   * also need to run "make install"
   * if installed in a location outside of PATH, need to set BINARYEN_ROOT to cmake

143 144 145
#### On Ubuntu:

```commandline
146 147 148
git clone https://github.com/eosio/eos --recursive
mkdir -p eos/build && cd eos/build
export BOOST_ROOT=$HOME/opt/boost_1_64_0
149
cmake -DWASM_LLVM_CONFIG=~/wasm-compiler/llvm/bin/llvm-config -DBOOST_ROOT="$BOOST_ROOT" ..
150 151 152 153
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 已提交
154 155 156

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

157 158 159 160 161 162 163 164 165
#### On macOS:

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

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

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

N
Nathan Hourt 已提交
170
### Creating and launching a single-node testnet
N
Nathan Hourt 已提交
171 172
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 已提交
173
Edit the `config.ini` file, adding the following settings to the defaults already in place:
N
Nathan Hourt 已提交
174 175

```
N
Nathan Hourt 已提交
176 177 178 179 180
# 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
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
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 已提交
202 203
# Load the block producer plugin, so we can produce blocks
plugin = eos::producer_plugin
204 205 206
# As well as API and HTTP plugins
plugin = eos::chain_api_plugin
plugin = eos::http_plugin
N
Nathan Hourt 已提交
207 208
```

J
Joel Smith 已提交
209
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 已提交
210

211 212 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
### 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 
```

S
Serg Metelin 已提交
240 241 242 243
sudo rm -rf /data/store/eos # options 
sudo mkdir -p /data/store/eos
docker-compose -f Docker/docker-compose.yml up

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

246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
Check that account was successfully created: 

```commandline
./eosc get account exchange
```

You should get a response similar to this:

```json
{
  "name": "exchange",
  "eos_balance": 0,
  "staked_balance": 1,
  "unstaking_balance": 0,
  "last_unstaking_time": "2106-02-07T06:28:15"
}
```

264
### Run example contract
265

266
With an account for a contract created, you can upload a sample contract:
267 268 269 270 271 272

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

S
Serg Metelin 已提交
273
## Run eos in docker
peterwillcn's avatar
peterwillcn 已提交
274

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

peterwillcn's avatar
peterwillcn 已提交
277 278 279 280
 - [Docker](https://docs.docker.com)
 - [Docker-compose](https://github.com/docker/compose)
 - [Docker-volumes](https://github.com/cpuguy83/docker-volumes)

281
Build eos image
peterwillcn's avatar
peterwillcn 已提交
282

S
Serg Metelin 已提交
283 284 285 286 287
```
git clone https://github.com/EOSIO/eos.git --recursive
cd eos
cp genesis.json Docker 
docker build -t eosio/eos -f Docker/Dockerfile .
peterwillcn's avatar
peterwillcn 已提交
288 289
```

S
Serg Metelin 已提交
290
Starting the Docker this can be tested from container's host machine:
peterwillcn's avatar
peterwillcn 已提交
291

S
Serg Metelin 已提交
292
```
peterwillcn's avatar
peterwillcn 已提交
293
sudo rm -rf /data/store/eos # options 
peterwillcn's avatar
peterwillcn 已提交
294
sudo mkdir -p /data/store/eos
S
Serg Metelin 已提交
295
docker-compose -f Docker/docker-compose.yml up
peterwillcn's avatar
peterwillcn 已提交
296 297
```

S
Serg Metelin 已提交
298
Get chain info
299 300 301 302 303

```
curl http://127.0.0.1:8888/v1/chain/get_info
```

S
Serg Metelin 已提交
304 305
### Run contract in docker example

306
You can run the `eosc` commands via `docker exec` command. For example:
S
Serg Metelin 已提交
307
```
308
docker exec docker_eos_1 eosc contract exchange contracts/exchange/exchange.wast contracts/exchange/exchange.abi
S
Serg Metelin 已提交
309
```