README.md 15.7 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:
S
Serg Metelin 已提交
14

15
* Clang 4.0.0
16 17
* CMake 3.5.1
* Boost 1.64
S
Serg Metelin 已提交
18
* OpenSSL
19 20
* LLVM 4.0
* [secp256k1-zkp (Cryptonomex branch)](https://github.com/cryptonomex/secp256k1-zkp.git)
S
Serg Metelin 已提交
21
* [binaryen](https://github.com/WebAssembly/binaryen.git)
22

23
### Clean install Ubuntu 16.10
24 25 26

Install the development toolkit:

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

Install Boost 1.64:

39
```commandline
40 41 42 43
cd ~
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/
S
Serg Metelin 已提交
44 45
echo "export BOOST_ROOT=$HOME/opt/boost_1_64_0" >> ~/.bash_profile
source ~/.bash_profile
46 47
./bootstrap.sh "--prefix=$BOOST_ROOT"
./b2 install
S
Serg Metelin 已提交
48
source ~/.bash_profile
49 50
```

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

S
Serg Metelin 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
Also, to use the WASM compiler, eos has an external dependency on [binaryen](https://github.com/WebAssembly/binaryen.git):

```commandline
cd ~
git clone https://github.com/WebAssembly/binaryen.git
cd ~/binaryen
git checkout tags/1.37.14
cmake . && make

```

Add BINARYEN_ROOT to your .bash_profile:

```commandline
echo "export BINARYEN_ROOT=~/binaryen" >> ~/.bash_profile
source ~/.bash_profile
```
D
Daniel Larimer 已提交
80

S
Serg Metelin 已提交
81
By default LLVM and clang do not include the WASM build target, so you will have to build it yourself:
82

83 84 85 86 87 88 89 90 91 92 93
```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
94
```
95

96
### macOS Sierra 10.12.6
97 98

macOS additional Dependencies:
S
Serg Metelin 已提交
99

100 101 102 103 104 105 106
* Brew
* Newest XCode

Upgrade your XCode to the newest version:

```commandline
xcode-select --install
107 108
```

109
Install homebrew:
110 111

```commandline
112 113 114 115 116 117 118 119
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
120
```
121

122 123 124 125 126 127 128 129 130 131
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
132
```
133

S
Serg Metelin 已提交
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
Install [binaryen v1.37.14](https://github.com/WebAssembly/binaryen.git):

```commandline
cd ~
git clone https://github.com/WebAssembly/binaryen.git
cd ~/binaryen
git checkout tags/1.37.14
cmake . && make
```

Add BINARYEN_ROOT to your .bash_profile:

```commandline
echo "export BINARYEN_ROOT=~/binaryen" >> ~/.bash_profile
source ~/.bash_profile
```


152 153 154
Build LLVM and clang for WASM:

```commandline
155 156 157 158 159 160 161 162 163 164 165 166
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
```

167 168 169 170 171
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
S
Serg Metelin 已提交
172
source ~/.bash_profile
173 174
```

S
Serg Metelin 已提交
175 176
## Building and running a node

N
Nathan Hourt 已提交
177
### Getting the code
S
Serg Metelin 已提交
178

N
Nathan Hourt 已提交
179 180 181 182 183 184 185 186
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`

187 188 189 190 191
### 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.

192
```commandline
S
Serg Metelin 已提交
193
cd ~
194
git clone https://github.com/eosio/eos --recursive
S
Serg Metelin 已提交
195 196
mkdir -p ~/eos/build && cd ~/eos/build
cmake -DBINARYEN_BIN=~/binaryen/bin ..
197 198 199 200
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 已提交
201 202 203 204 205

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

For a debug build, add `-DCMAKE_BUILD_TYPE=Debug`. Other common build types include `Release` and `RelWithDebInfo`.

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

S
Serg Metelin 已提交
208 209 210 211 212
EOS comes with a number of programs you can find in `~/eos/build/programs`. They are listed below:

* eosd - server-side blockchain node component
* eosc - command line interface to interact with the blockchain
* eos-walletd - EOS wallet
S
Serg Metelin 已提交
213
* launcher - application for nodes network composing and deployment; [more on launcher](https://github.com/EOSIO/eos/blob/master/testnet.md)
S
Serg Metelin 已提交
214

N
Nathan Hourt 已提交
215
### Creating and launching a single-node testnet
S
Serg Metelin 已提交
216

S
Serg Metelin 已提交
217
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` 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 已提交
218

N
Nathan Hourt 已提交
219
Edit the `config.ini` file, adding the following settings to the defaults already in place:
N
Nathan Hourt 已提交
220 221

```
N
Nathan Hourt 已提交
222 223 224 225 226
# 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
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
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
S
Serg Metelin 已提交
248
# Load the block producer plugin, so you can produce blocks
N
Nathan Hourt 已提交
249
plugin = eos::producer_plugin
S
Serg Metelin 已提交
250
# Wallet plugin
251
plugin = eos::wallet_api_plugin
S
Serg Metelin 已提交
252
# As well as API and HTTP plugins
253 254
plugin = eos::chain_api_plugin
plugin = eos::http_plugin
N
Nathan Hourt 已提交
255 256
```

J
Joel Smith 已提交
257
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 已提交
258

S
Serg Metelin 已提交
259 260 261 262 263 264 265 266 267 268 269 270 271 272
When running `eosd` you should get log messages similar to below. It means the blocks are successfully produced.

```
1575001ms thread-0   chain_controller.cpp:235      _push_block          ] initm #1 @2017-09-04T04:26:15  | 0 trx, 0 pending, exectime_ms=0
1575001ms thread-0   producer_plugin.cpp:207       block_production_loo ] initm generated block #1 @ 2017-09-04T04:26:15 with 0 trxs  0 pending
1578001ms thread-0   chain_controller.cpp:235      _push_block          ] initc #2 @2017-09-04T04:26:18  | 0 trx, 0 pending, exectime_ms=0
1578001ms thread-0   producer_plugin.cpp:207       block_production_loo ] initc generated block #2 @ 2017-09-04T04:26:18 with 0 trxs  0 pending
1581001ms thread-0   chain_controller.cpp:235      _push_block          ] initd #3 @2017-09-04T04:26:21  | 0 trx, 0 pending, exectime_ms=0
1581001ms thread-0   producer_plugin.cpp:207       block_production_loo ] initd generated block #3 @ 2017-09-04T04:26:21 with 0 trxs  0 pending
1584000ms thread-0   chain_controller.cpp:235      _push_block          ] inite #4 @2017-09-04T04:26:24  | 0 trx, 0 pending, exectime_ms=0
1584000ms thread-0   producer_plugin.cpp:207       block_production_loo ] inite generated block #4 @ 2017-09-04T04:26:24 with 0 trxs  0 pending
1587000ms thread-0   chain_controller.cpp:235      _push_block          ] initf #5 @2017-09-04T04:26:27  | 0 trx, 0 pending, exectime_ms=0
```

S
Serg Metelin 已提交
273 274
## Accounts and smart contracts

S
Serg Metelin 已提交
275
EOS comes with example contracts that can be uploaded and run for testing purposes. To upload and test them, please follow the steps below.
S
Serg Metelin 已提交
276

S
Serg Metelin 已提交
277
### Example smart contracts
278 279 280

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

S
Serg Metelin 已提交
281 282 283 284
Run the node:

```commandline
cd ~/eos/build/programs/eosd/
S
Serg Metelin 已提交
285
./eosd
S
Serg Metelin 已提交
286
```
287

S
Serg Metelin 已提交
288
### Run eos-walletd and importing account key
S
Serg Metelin 已提交
289

290
Before running API commands you need to import the private key of an account you will be authorizing the transactions under into the EOS wallet.
S
Serg Metelin 已提交
291

292
As you've previously added `plugin = eos::wallet_api_plugin` into `config.ini`, EOS wallet will be running as a part of `eosd` process.
S
Serg Metelin 已提交
293

294
For testing purposes you can use a pre-created account `inita` from the `genesis.json` file.
S
Serg Metelin 已提交
295 296 297 298 299

To login you need to run a command importing an active (not owner!) private key from `inita` account (you can find it in `~/eos/build/programs/eosd/data-dir/config.ini`) to the wallet.

```commandline
cd ~/eos/build/programs/eosc/
300 301
./eosc wallet create # Outputs a password that you need to save to be able to lock/unlock the wallet
./eosc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
S
Serg Metelin 已提交
302 303
```

304
Now you can issue API commands under `inita` authority.
S
Serg Metelin 已提交
305 306 307

### Create accounts for your smart contracts

308
First, generate public/private key pairs for the `owner_key` and `active_key`. You will need them to create an account:
309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327

```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
328
./eosc create account inita currency PUBLIC_KEY_1 PUBLIC_KEY_2 
329 330 331 332
```

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

333 334 335
Check that account was successfully created: 

```commandline
S
Serg Metelin 已提交
336
./eosc get account currency
337 338 339 340 341 342
```

You should get a response similar to this:

```json
{
S
Serg Metelin 已提交
343
  "name": "currency",
344 345 346 347 348 349 350
  "eos_balance": 0,
  "staked_balance": 1,
  "unstaking_balance": 0,
  "last_unstaking_time": "2106-02-07T06:28:15"
}
```

S
Serg Metelin 已提交
351
### Upload sample contract
352

353
Before uploading a contract, you can verify that there is no current contract:
D
Daniel Larimer 已提交
354 355 356 357 358 359

```commandline
./eosc get code currency 
code hash: 0000000000000000000000000000000000000000000000000000000000000000
```

360
With an account for a contract created, you can upload a sample contract:
361 362

```commandline
363
./eosc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi
S
Serg Metelin 已提交
364 365 366 367
```

As a response you should get a json with a `transaction_id` field. Your contract was successfully uploaded!

368
You can also verify that the code has been set:
D
Daniel Larimer 已提交
369 370 371 372 373 374

```commandline
./eosc get code currency
code hash: 9b9db1a7940503a88535517049e64467a6e8f4e9e03af15e9968ec89dd794975
```

375
Next you can verify that the currency contract has the proper initial balance:
D
Daniel Larimer 已提交
376 377 378 379 380 381 382 383 384 385 386 387 388

```commandline
./eosc get table currency currency account
{
  "rows": [{
     "account": "account",
     "balance": 1000000000
     }
  ],
  "more": false
}
```

S
Serg Metelin 已提交
389 390
### Push a message to a sample contract

391
To send a message to a contract you need to create a new user account who will be sending the message.
S
Serg Metelin 已提交
392 393 394 395 396 397 398

Firstly, generate the keys for the account:

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

S
Serg Metelin 已提交
401 402 403
And then create the `tester` account:

```commandline
404
./eosc create account inita tester PUBLIC_USER_KEY_1 PUBLIC_USER_KEY_2 
S
Serg Metelin 已提交
405 406
```

407
After this you can send a message to the contract:
S
Serg Metelin 已提交
408 409

```commandline
410
./eosc push message currency transfer '{"from":"currency","to":"inita","amount":50}' --scope currency,inita --permission currency@active
D
Daniel Larimer 已提交
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
```

As a confirmation of a successfully submitted transaction you will get a json with a `transaction_id` field.

### Reading Currency Contract Balance

```commandline
./eosc get table inita currency account
{
  "rows": [{
      "account": "account",
      "balance": 50 
       }
    ],
  "more": false
}
./eosc get table currency currency account
{
  "rows": [{
      "account": "account",
      "balance": 999999950
    }
  ],
  "more": false
}
S
Serg Metelin 已提交
436 437
```

S
Serg Metelin 已提交
438 439
## Running local testnet

S
Serg Metelin 已提交
440
To run a local testnet you can use a `launcher` application provided in `~/eos/build/programs/launcher` folder.
S
Serg Metelin 已提交
441

S
Serg Metelin 已提交
442
For testing purposes you will run 2 local production nodes talking to each other.
S
Serg Metelin 已提交
443 444 445 446

```commandline
cd ~/eos/build
cp ../genesis.json ./
447
./programs/launcher/launcher -p2 -s testnet.json --skip-signature -l local
S
Serg Metelin 已提交
448 449
```

S
Serg Metelin 已提交
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
This command will generate 2 data folder for each instance of the node: `tn_data_0` and `tn_data_1`, as well as `testnet.json` file for the testnet configuration.

You should see a following response:

```commandline
adding hostname ip-XXX-XXX-XXX
found interface 127.0.0.1
found interface XXX.XX.XX.XX
spawning child, programs/eosd/eosd --skip-transaction-signatures --data-dir tn_data_0
spawning child, programs/eosd/eosd --skip-transaction-signatures --data-dir tn_data_1
```

To confirm the nodes are running, run following `eosc` commands:
```commandline
~/eos/build/programs/eosc
./eosc -p 8888 get info
./eosc -p 8889 get info
```

S
Serg Metelin 已提交
469
For each you should get a json with a blockchain information.
S
Serg Metelin 已提交
470

S
Serg Metelin 已提交
471 472
You can read more on launcher and its settings [here](https://github.com/EOSIO/eos/blob/master/testnet.md)

S
Serg Metelin 已提交
473
## Run eos in docker
peterwillcn's avatar
peterwillcn 已提交
474

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

peterwillcn's avatar
peterwillcn 已提交
477 478 479 480
 - [Docker](https://docs.docker.com)
 - [Docker-compose](https://github.com/docker/compose)
 - [Docker-volumes](https://github.com/cpuguy83/docker-volumes)

481
Build eos image
peterwillcn's avatar
peterwillcn 已提交
482

S
Serg Metelin 已提交
483 484 485 486 487
```
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 已提交
488 489
```

S
Serg Metelin 已提交
490 491
We recommend 6GB+ of memory allocated to Docker to successfully build the image.

S
Serg Metelin 已提交
492
Now you can start the Docker container:
peterwillcn's avatar
peterwillcn 已提交
493

S
Serg Metelin 已提交
494
```
peterwillcn's avatar
peterwillcn 已提交
495
sudo rm -rf /data/store/eos # options 
peterwillcn's avatar
peterwillcn 已提交
496
sudo mkdir -p /data/store/eos
S
Serg Metelin 已提交
497
docker-compose -f Docker/docker-compose.yml up
peterwillcn's avatar
peterwillcn 已提交
498 499
```

500
Get chain info:
501 502 503 504 505

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

S
Serg Metelin 已提交
506 507
### Run contract in docker example

508
You can run the `eosc` commands via `docker exec` command. For example:
S
Serg Metelin 已提交
509

S
Serg Metelin 已提交
510
```
511
docker exec docker_eos_1 eosc contract exchange build/contracts/exchange/exchange.wast build/contracts/exchange/exchange.abi
S
Serg Metelin 已提交
512
```