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

loyo · February 01, 2018 · Last by strahe replied at February 01, 2018 · 5329 hits

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

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

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

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

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up