新手教程 EOS.IO - 最强大的分布式应用的基础设施 -- 翻译

loyo · 2018年02月01日 · 最后由 strahe 回复于 2018年02月01日 · 3844 次阅读

EOS.IO - 最强大的分布式应用的基础设施

欢迎来到EOS.IO源代码库! EOS.IO软件使开发人员能够创建和部署
高性能,可横向扩展的区块链基础设施,并在此基础上创建分布式应用

这个代码目前是alpha质量和快速迭代的。 这就是说,
早期的开发者可以做包括运行一个私有的多节点测试网络
开发应用程序(智能合约)在内的很多事情。

wiki 上所说的公共测试网络正在运行dawn-2.x分支。 “master”分支不再与公共测试网兼容。 下面提供了用于构建任一选项的指令。

资源

  1. EOS.IO 官网
  2. 文档
  3. 博客
  4. 社区电报群
  5. 开发者电报群
  6. 白皮书
  7. 发展规划
  8. EOS中文爱好者社区

目录

  1. 开始
  2. 安装一个构建/开发环境
    1. 自动构建脚本
      1. 在Ubuntu 16.10 安装本地节点](#autoubuntulocal
      2. 在Ubuntu 16.10 安装公共测试节点
      3. 在MacOS Sierra 10.12.6 安装本地节点
      4. 在MacOS Sierra 10.12.6 安装公共测试节点
  3. 构建EOS并运行节点
    1. 获取代码
    2. 源码构建
    3. 创建并启动单节点测试网
  4. 示例智能合约演示
    1. 示例合约
    2. 建立一个钱包导入入账户密匙
    3. 为你的智能合约创建一个账户
    4. 发布一个示例合约到区块链上
    5. 用 "currency" 智能合约转账
    6. 查看智能合约账户
  5. 运行多节点本地测试网络
  6. 运行链接公共测试网络本地节点
  7. Doxygen 文档
  8. 在Docker中运行EOS
  9. 手动安装依赖关系
    1. 在Ubuntu 16.10上安装
    2. 在MacOS Sierra 10.12.6

开始

以下说明详细介绍了获取软件,构建软件,运行产生区块的简单测试网络,创建帐户并将样本合同上传到区块链的过程。

安装一个构建/开发环境

自动构建脚本

对于Ubuntu 16.10和MacOS Sierra,有一个自动构建脚本,可以安装所有依赖项并构建EOS。

调用build.sh以下输入:

  • 平台 [ubuntu|darwin]
  • 模式设置 [full|build]

第二个可选的输入可以是fullbuild,其中full意味着它安装依赖和构建eos。 如果你省略了这个输入,那么构建脚本将安装依赖关系,然后构建eos。

./build.sh <architecture> <optional mode>

选择是否建立本地测试网或公共测试网,并跳转到下面的相应部分。 按照描述递归克隆EOS存储库,并运行位于根目录“eos”文件夹中的build.sh。

在Ubuntu 16.10 安装本地节点

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

cd eos
./build.sh ubuntu

现在你可以进行下一步 - 创建并启动单节点测试网

在Ubuntu 16.10 安装公共测试节点

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

cd eos
git checkout dawn-2.x
./build.sh ubuntu

现在你可以进行下一步 - 在公共测试网络运行节点

在MacOS Sierra 10.12.6 安装本地节点

在运行脚本之前确保你更新了 XCode 和 brew:

xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

然后递归地克隆EOS资源库,并在root的eos文件夹中运行build.sh:

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

cd eos
./build.sh darwin

现在你可以进行下一步 - 创建并启动单节点测试网

在MacOS Sierra 10.12.6 安装公共测试节点

在运行脚本之前确保你更新了 XCode 和 brew:

xcode-select --install
ruby -e "$(curl -fsSl https://raw.githubusercontent.com/Homebrew/install/master/install)"

然后递归地克隆EOS库,拣出与公共testnet兼容的分支,并在根目录eos文件夹中运行build.sh。

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

cd eos
git checkout dawn-2.x
./build.sh darwin

现在你可以进行下一步 - 在公共测试网络运行节点

构建EOS并运行节点

获取代码

要下载所有代码,请下载EOS源代码和一个或两个子模块的递归。 最简单的方法是做一个递归克隆:

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

如果repo被克隆而没有--recursive标志,通过在repo中运行这个命令,子模块可以在事后被检索:

git submodule update --init --recursive

源码构建

环境变量WASM_LLVM_CONFIG用于查找我们最近构建的WASM编译器。
这是编译eos/contracts文件夹内的示例合同和它们各自的测试所需的。

cd ~
git clone https://github.com/eosio/eos --recursive
mkdir -p ~/eos/build && cd ~/eos/build
cmake -DBINARYEN_BIN=~/binaryen/bin -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib ..
make -j4

源代码构建也支持。 要在编译器中覆盖clang的默认选项,请将这些flags添加到CMake命令中:

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

对于调试版本,添加-DCMAKE_BUILD_TYPE = Debug。 其他常见的构建类型包括ReleaseRelWithDebInfo

要在构建完成后运行测试套件,在tests文件夹中运行chain_test可执行文件。

EOS带有一些你可以在〜/eos/build/programs中找到的程序。 如下所列:

  • eosiod - 服务器端区块链节点组件
  • eosioc - 与区块链进行交互的命令行界面
  • eosio-walletd - EOS 钱包
  • launcher - 节点网络组成和部署的应用; 更多关于launcher

创建并启动单节点测试网

在成功构建项目之后,eosiod二进制文件应该存在于build/programs/eosiod目录中。 运行eosiod - 它可能会退出一个错误,但如果没有,立即用Ctrl-C关闭它。 如果退出时出现错误,请注意eosiod创建了一个名为data-dir的目录,其中包含默认配置(config.ini)和其他一些内部参数。 这个默认的数据存储路径可以通过将--data-dir/path/to/ data传递给eosiod来覆盖。 这些说明将继续使用默认目录。

编辑config.ini文件,将以下设置添加/更新为已有的默认值:

# 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
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
# Load the block producer plugin, so you can produce blocks
plugin = eosio::producer_plugin
# Wallet plugin
plugin = eosio::wallet_api_plugin
# As well as API and HTTP plugins
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin

现在应该可以运行eosiod并且看到它开始生成块。
运行eosiod时,你应该得到类似于下面的日志消息。 这意味着块已经成功生产。

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

示例 "Currency" 智能合约演示

EOS附带示例合同,可以上传并运行用于测试。 接下来我们演示如何上传和与样本合同Currency进行交互。

示例合约

首先, 运行节点:

cd ~/eos/build/programs/eosiod/
./eosiod

建立一个钱包导入入账户密匙

正如您之前在config.ini中添加plugin=eosio::wallet_api_plugin,EOS钱包将作为eosiod进程的一部分运行。 每份合同都需要一个关联账户,所以首先要创建一个钱包。

cd ~/eos/build/programs/eosioc/
./eosioc wallet create # Outputs a password that you need to save to be able to lock/unlock the wallet

为了本演练的目的,导入inita帐户的私钥,这是一个包含在genesis.json中的测试帐户,以便您可以在现有帐户的权限下发布API命令。 下面引用的私钥在你的config.ini文件中找到,并提供给你用于测试。

./eosioc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

为你的智能合约 "currency" 创建一个账户

首先,生成一些公钥/私钥对,稍后将其分配为“owner_key”和“active_key”。

cd ~/eos/build/programs/eosioc/
./eosioc create key # owner_key
./eosioc create key # active_key

这将输出两对公钥和私钥:

Private key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Public key: EOSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

注意:
保存这些值供将来参考。

运行create命令,其中inita是授权创建currency帐户的帐户,PUBLIC_KEY_1PUBLIC_KEY_2create key命令生成的值

./eosioc create account inita currency PUBLIC_KEY_1 PUBLIC_KEY_2

然后您应该得到一个JSON响应,并返回一个确认成功执行的事务ID。

继续并检查帐户是否成功创建。

./eosioc get account currency

如果一切顺利,您将收到类似于以下内容的输出:

{
  "account_name": "currency",
  "eos_balance": "0.0000 EOS",
  "staked_balance": "0.0001 EOS",
  "unstaking_balance": "0.0000 EOS",
  "last_unstaking_time": "2035-10-29T06:32:22",
...

现在将前面生成的活动私钥导入钱包中:

./eosioc wallet import XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

发布一个示例合约到区块链上

在上传合约之前,确认区块链上没有currency的合约:

./eosioc get code currency
code hash: 0000000000000000000000000000000000000000000000000000000000000000

通过创建合同的帐户,上传示例合约:

./eosioc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi

您的合同已成功上传,你应该得到一个带有'transaction_id`字段的JSON返回值。

您也可以使用以下命令验证代码是否已经设置:

./eosioc get code currency

它会返回类似于:

code hash: 9b9db1a7940503a88535517049e64467a6e8f4e9e03af15e9968ec89dd794975

在使用货币合约之前,您必须发行货币。

./eosioc push action currency issue '{"to":"currency","quantity":"1000.0000 CUR"}' --permission currency@active

接下来验证货币合约是否具有适当的初始余额:

./eosioc get table currency currency account
{
  "rows": [{
     "currency": 1381319428,
     "balance": 10000000
     }
  ],
  "more": false
}

用 "currency" 智能合约转账

任何人都可以随时向任何合约发送任何消息,但合约可能会拒绝没有得到必要许可的消息。 消息不会从任何人发送,而是经过“一个或多个帐户和权限级别的许可”发送。 以下命令显示发送到"currency"合约的“转账”消息。

消息的内容是:
'{"from":"currency","to":"inita","quantity":"20.0000 CUR","memo":"any string"}'
在这种情况下要求currency智能合约转账一定的代币给其他人。这需要currency合约的权限。

./eosioc push action currency transfer '{"from":"currency","to":"inita","quantity":"20.0000 CUR","memo":"my first transfer"}' --permission currency@active

下面是一个泛化,显示currency帐户只被引用一次,以指定哪个合同传递transfer消息。

./eosioc push action currency transfer '{"from":"${usera}","to":"${userb}","quantity":"20.0000 CUR","memo":""}' --permission ${usera}@active

作为成功提交的事务的确认,您将收到包含“transaction_id”字段的JSON输出。

查看智能合约"currency" 账户

因此,现在检查上一个交易涉及的两个账户的状态。

./eosioc get table inita currency account
{
  "rows": [{
      "currency": 1381319428,
      "balance": 200000
       }
    ],
  "more": false
}
./eosioc get table currency currency account
{
  "rows": [{
      "currency": 1381319428,
      "balance": 9800000
    }
  ],
  "more": false
}

正如预期的那样,接收账户inita现在有20代币余额,发送账户现在比初始提供的代币少了*20 *

运行多节点本地测试网络

要运行一个本地测试网,你可以使用〜/eos/build/programs/launcher文件夹中提供的launcher应用程序。

出于测试目的,您将运行两个互相通信的本地生产节点。

cd ~/eos/build
cp ../genesis.json ./
./programs/launcher/launcher -p2 --skip-signature

该命令将为节点的每个实例生成两个数据文件夹:“tn_data_00”和“tn_data_01”。

您应该看到以下返回:

spawning child, programs/eosiod/eosiod --skip-transaction-signatures --data-dir tn_data_0
spawning child, programs/eosiod/eosiod --skip-transaction-signatures --data-dir tn_data_1

确认节点正在运行,运行以下eosioc命令:

~/eos/build/programs/eosioc
./eosioc -p 8888 get info
./eosioc -p 8889 get info

对于每个命令,你都应该得到一个带有区块链信息的JSON响应。

你可以阅读更多关于启动器及其设置 这里

运行链接公共测试网络本地节点

为了运行连接到由block.one运行的公共测试网络的本地节点,提供了一个脚本:

cd ~/eos/build/scripts
./start_npnode.sh

该命令将使用为“testnet_np”实例提供的数据文件夹。

您应该看到以下回应:

Launched eosd.
See testnet_np/stderr.txt for eosd output.
Synching requires at least 8 minutes, depending on network conditions.

确认eosd操作和同步:

tail -F testnet_np/stderr.txt

如果要退出,请使用Ctrl-C。 在同步期间,您将看到类似于以下的日志消息:

3439731ms            chain_plugin.cpp:272          accept_block         ] Syncing Blockchain --- Got block: #200000 time: 2017-12-09T07:56:32 producer: initu
3454532ms            chain_plugin.cpp:272          accept_block         ] Syncing Blockchain --- Got block: #210000 time: 2017-12-09T13:29:52 producer: initc

当您看到类似于以下内容的日志消息时,同步已完成:

42467ms            net_plugin.cpp:1245           start_sync           ] Catching up with chain, our last req is 351734, theirs is 351962 peer ip-10-160-11-116:9876
42792ms            chain_controller.cpp:208      _push_block          ] initt #351947 @2017-12-12T22:59:44  | 0 trx, 0 pending, exectime_ms=0
42793ms            chain_controller.cpp:208      _push_block          ] inito #351948 @2017-12-12T22:59:46  | 0 trx, 0 pending, exectime_ms=0
42793ms            chain_controller.cpp:208      _push_block          ] initd #351949 @2017-12-12T22:59:48  | 0 trx, 0 pending, exectime_ms=0

这个eosd实例监听端口127.0.0.1:8888上的http请求9877上的所有接口
为p2p请求,并包括钱包插件。

Doxygen 文档

您可以在Doxygen参考中找到更详细的API文档。
对于master分支:https://eosio.github.io/eos/
对于公共testnet分支:http://htmlpreview.github.io/?https://github.com/EOSIO/eos/blob/dawn-2.x/docs/index.html

在Docker中部署eos

你可以找到docker的安装信息 Docker Readme

手动安装依赖

如果您更愿意手动构建依赖项,请按照以下步骤操作。

这个项目主要是用C ++ 14写的,使用CMake作为它的构建系统。 建议使用最新的Clang和最新版本的CMake。

依赖:

在Ubuntu 16.10上安装

安装开发工具包:

sudo apt-get update
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
sudo apt-get install clang-4.0 lldb-4.0 libclang-4.0-dev cmake make \
                     libbz2-dev libssl-dev libgmp3-dev \
                     autotools-dev build-essential \
                     libbz2-dev libicu-dev python-dev \
                     autoconf libtool git

安装Boost 1.64:

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/
echo "export BOOST_ROOT=$HOME/opt/boost_1_64_0" >> ~/.bash_profile
source ~/.bash_profile
./bootstrap.sh "--prefix=$BOOST_ROOT"
./b2 install
source ~/.bash_profile

安装 secp256k1-zkp (Cryptonomex branch):

cd ~
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
./configure
make
sudo make install

要使用WASM编译器,EOS具有外部依赖性 binaryen:

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

添加BINARYEN_ROOT到你的.bash_profile:

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

默认情况下,LLVM和clang不包含WASM构建目标,因此您必须自己构建它:

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

你的部署环境已经安装好了,你可以构建运行EOS节点.

在MacOS Sierra 10.12.6

macOS 添加依赖:

  • Brew
  • Newest XCode

升级XCode到最新版:

xcode-select --install

安装homebrew:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装依赖:

brew update
brew install git automake libtool boost openssl llvm@4 gmp ninja gettext
brew link gettext --force

安装 secp256k1-zkp (Cryptonomex branch):

cd ~
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
./configure
make
sudo make install

安装binaryen v1.37.14:

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

BINARYEN_ROOT 到你的 .bash_profile:

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

在WASM上构建 LLVM 和 clang:

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

WASM_LLVM_CONFIGLLVM_DIR 到你的 .bash_profile:

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
source ~/.bash_profile
共收到 3 条回复

我近期fork了社区的源码, 打算扩展一个专门同步官方文档的一个模块。

[quote="@strahe"]
我近期fork了社区的源码, 打算扩展一个专门同步官方文档的一个模块。
[/quote]
可以的,厉害了

[quote="@lome"]
[quote="@strahe"]
我近期fork了社区的源码, 打算扩展一个专门同步官方文档的一个模块。
[/quote]
可以的,厉害了
[/quote]

主要是官方文档是从代码中生成的, 没有好的方式同步和管理。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册