07.30 「区块链学习笔记」EOS开发系列第一篇|开发环境搭建(macOS)

卷首语

从2017年末开始,区块链(blockchain)突然成为了一个热点话题。“区块链+X”成了创业者津津乐道的口头禅,CryptoCurrency都成了大爷大妈口中的时髦用语。

大家可能都见过那张【区块链从业人员vs人工智能从业人员平均工资】的对比图,许多非区块链技术人员甚至其他行业的小白看完之后,纷纷表示按捺不住“All in 区块链”的跳槽心情。

区块链就像一个围城,一方面城内人才荒,另一方面城外的人想进来,却连门都找不到。在比特币更多只剩下投资价值、以太坊无法改善交易拥堵的今天,被称为区块链3.0的EOS被大家寄予厚望。

当笔者尝试在google中搜索【blockchain eos get started】关键词时,总搜索结果180W条,但第一页中真正在讲解入门的博客仅3篇,从第4页开始,被大量的bitcoin、ethereum等其他区块链项目信息“滥竽充数”。因此,EOS开发者社区现正式推出EOS开发入门教程第二卷——火箭入门EOS开发系列:本系列将帮助你以最快的方式迅速走通EOS技术开发全流程,并上手开发智能合约。在这个系列你将至少学到:

EOS基础环境搭建
EOS重要组成部分EOS白皮书概念结合应用深入理解EOS智能合约实战开发

本文作为系列第一篇文章,主要介绍了如何搭建EOS本地环境、运行节点并进行简单的交互:如创建钱包。(笔者用的是macOS系统)

EOS主网正式上线,想必大家都很激动吧。我的第一感觉是,虽然EOS离自己的目标仍然还有一段路要走,但是它依然是被寄予厚望的公链项目。现在似乎是更加深入了解EOS的好时候,一开始,我们会学习一些和EOS平台交互的简单操作。

在正式开始之前,有一点需要提醒大家,你需要掌握下面这些基本知识:

命令行的简单操作(会切换目录就行啦)git的简单实用(会git clone就行啦)

即使你还没有接触过这些,百度一下,十分钟搞定。

NO1. git clone

首先进入一个你想要放置eos项目的目录,把下面这行命令复制到终端里,然后按下enter:(对我来说,我想把eos放在目录`/Users/hammer/blockchain`中)

cd /Users/hammer/blockchain

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

这会帮你安装一大堆“东西”,`--recursive`可以确保你安装了属于这个项目的所有"东西"。它会层级式地复制这个目录,一直复制到目录树的最底层(大家可以想象一下俄罗斯套娃)。关于git的使用解释到这儿就可以啦。现在,让我们进入这个目录里看看:

cd eos

ls

输入上面的命令就会显示如下界面:

真的有好多东西!你肯定想,如果有其他更轻量级的方法来和EOS主网交互,该是一件多棒的事情。不过,既然你都读到这儿了,我猜你可能也是蛮拼(认真)的。做到这儿,我们的主要目的就是在本地搭EOS。就在你刚刚下载的目录里,有一个脚本可以实现这个功能。比较逊的就是,整个安装工程太浩大了,大概1G多,里面有超级多的依赖包。

并且它需要你提前安装有xcode,mongodb,homebrew还有一堆其他的东西。因为我事先已经装好这些了,所以可能会更省心一些。如果你还没装,估计就要耗时更久了。其实里面的有些依赖,EOS也并不是非要不可(但是你就要装啊...)。

对于一个 ***getting_start*** 文章来说,上面这些对于小白的杀伤力依然太强了。咱们就拿MongoDB来举个例子,mongodb简而言之就是一个数据库。那么为什么一个数据库会跟区块链项目扯上关系?是不是区块链就是个数据库?看上去EOS似乎使用mongodb作为主要数据的辅助支撑。这样的话就能理解,为什么大家都说从区块链上查数据是件很痛苦的事情了。我们进一步猜mongodb复制了区块链的部分数据并且支持标准化的查询语法进行访问。(不得不说想象力对理解一个陌生又复杂的系统,确实是个好东西。)

NO2. build

为了搭建EOS,我们要使用刚刚下载的文件夹里的一个文件:`eosio_build.sh`.以`.sh`结尾说明这是一个shell脚本。一句话概括就是。这是一个可以直接通过命令行执行的文件。

./eosio_build.sh

执行这个脚本需要花一段时间,并且它很有可能失败一两次,告诉你还需要安装其他的软件。对我来说,安装软件最折磨人的地方,永远是那些【为了安装要再安装】的环节。如果你也遇到了这些问题,深呼吸试试? 不过能读到这儿的基本就剩下程序员了吧,那对这种问题估计也见怪不怪了。如果你是一个为了区块链,连英语和计算机都敢自学的小白,那这些问题对你还算问题么。(为你打call)【我自己遇到的问题和解决办法都贴在了下面的`附录1`里,希望能对大家有所帮助】

这个命令成功完成的画面是:

NO3. make install

一旦`eosio_build`完成之后,你需要在之前下载的`eos`文件夹中继续找一个叫`build`的文件夹,并执行以下指令:

cd build

sudo make install

然后继续等它完成。完成之后,你就可以继续往下走了:

cd programs/nodeos

./nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin

运气好的话,EOS本地安装就完成啦。它会产生block并且记录下来,打印在命令行中。**COOL !**(虽然有点复杂)。但是我还要很负责地告诉你,现在还没到抱怨复杂的时候,我们离深入了解EOS还差得早呢。顺便贴一下成功运行的样子

NO4. 创建钱包

到这里,我们的安装工作就告一段落了,下面就到了真正开始操作EOS的时候了。我们先来补充一点背景知识。下面这张图展示了,EOS开发系统里主要部分是如何交互的:

你现在就是图中那个小人。现在有三个可用的EOS服务。你正在使用的是`cleos`服务。`cleos` = `cli` + `eos`,简单来说,这是一个用命令行和EOS进行交互并且管理钱包的工具。这个服务同时也会使用`nodeos`(后台运行的eos主程序)和`keosd`(保证钱包中密钥安全的组件)。下面就到了激动人心的创建钱包环节:

cleos wallet create

如果看到了这个画面,JUST CELEBRATE!【在创建钱包大家通常也会遇到一个问题,在`附录2`中我贴出了解决办法】除了像刚才那样创建默认钱包外,还可以创建自己命名的钱包。比如就叫`mywallet`,**记住打印出来的密码哦**:

cloes wallet create -n mywallet

创建的钱包文件在`~/eosio-wallet/`文件夹中,安全起见的话,也可以备份该文件到硬盘再删除,需要用了再拷贝回来。

#附录1 - build过程中遇到的问题

我自己在`./eosio_build.sh`的过程中,遇到了2个error,这里贴出来供大家参考:

问题1. LLVM_DIR UNSET

详细错误如下:

CMake Error at libraries/wasm-jit/Source/Runtime/CMakeLists.txt:26 (find_package):

Could not find a package configuration file provided by "LLVM" (requested

version 4.0) with any of the following names:

LLVMConfig.cmake

llvm-config.cmake

Add the installation prefix of "LLVM" to CMAKE_PREFIX_PATH or set

"LLVM_DIR" to a directory containing one of the above files. If "LLVM"

provides a separate development package or SDK, be sure it has been

installed.

-- Configuring incomplete, errors occurred!

See also "/Users/hammer/blockchain/eos/build/CMakeFiles/CMakeOutput.log".

>>>>>>>>>>>>>>>>>>>> CMAKE building EOSIO has exited with the above error

【解决办法】:

指定`LLVM_DIR`的值。我自己用的是`zsh`,所以修改的是`~/.zshrc`文件,使用`bash`的小伙伴修改`~/.bash_profile`即可。

在`~/.zshrc`文件中追加一行:(记得先检查下你的`/usr/local/Cellar/`里到底有没有`llvm@4`以及相应版本的文件夹)

export LLVM_DIR=/usr/local/Cellar/llvm@4/4.0.1

最后别忘记`source`生效:

source ~/.zshrc

问题2. WRONG WITH GETTEXT

详细错误如下:

Undefined symbols for architecture x86_64:

"_libintl_bindtextdomain", referenced from:

_main in main.cpp.o

"_libintl_gettext", referenced from:

eosio::client::localize::localized_with_variant(char const*, fc::variant_object const&) in main.cpp.o

eosio::client::localize::localized_with_variant(char const*, fc::variant_object const&) in help_text.cpp.o

"_libintl_textdomain", referenced from:

_main in main.cpp.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation

【解决办法】

在命令行中输入:

brew unlink gettext && brew link --force gettext

然后重新进入eos文件夹中执行`./eosio_build.sh`即可。

#附录2 - 在创建钱包时遇到的问题

在执行`cleos wallet create`的时候,会遇到一个很常见的问题,提示你要kill keosd。

详细错误如下:

"/usr/local/bin/keosd" launched

Unable to connect to keosd, if keosd is running please kill the process and try again.

多半是因为端口配置的问题。(虽然官网中说cleos运行时会自动启动keosd,我也没遇到这个问题,但是有小伙伴反映了有这个问题,现在贴一下解决办法)。在之前说的eos钱包的目录`~/eosio-wallet`中有一个`config.ini`文件,在里面找到`http-server-address`那一行,替换成如下端口号:

http-server-address = 127.0.0.1:8900

将keosd监听端口改为8900,然后再执行如下命令启动keosd:

keosd&

之后我们再来创建钱包:

cleos wallet create -n test

TADA!成功!

今天简单介绍了如何入门EOS,下一章将手把手教会你如何连接EOS主网。