EOS实战与源码分析(txt+pdf+epub+mobi电子书下载)

作者:刘文彬

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

EOS实战与源码分析

EOS实战与源码分析试读:

前言

2017年,区块链、加密货币、ICO(公募)的声音吵闹了整个夏天,截至9月,声音才渐渐消失。许多技术人员借此了解了区块链技术,并且被区块链的技术蓝图所震撼,激发了强大的兴趣,为自己能够置身于一个技术蓬勃发展的时代而感到荣幸。

笔者正是其中之一。在同样的时间,一头扎进区块链的世界,从区块链1.0时代的比特币到2.0时代的以太坊,再到3.0时代的EOS。呈现在眼前的区块链世界就像一个技术万花筒,深深地吸引笔者不断向前探索。

目前,EOS是区块链炙手可热的技术之一。它如同一个完整的操作系统,用户或者机构可基于它构建各种应用程序。下一代区块链不是ICO,而是大规模的各行各业的DApp的兴起,所以能够做好大型商业应用基建工作的公链将成为未来区块链的宠儿。目前,呼喊着百万级TPS、手续费为0、快速部署DApp的EOS无疑切中了所有的要点。

笔者作为EOS开源项目的贡献者,在超级节点的运维工作过程中,系统地研究了区块链的底层技术。后来笔者深入区块链的应用领域,总结了很多心得体会。本书共有8章,可分为使用手册与源码分析两部分。使用手册部分主要介绍如何快速启动单节点EOS链、终端交互命令cleos的使用,并模拟公链的配置与启动。源码分析部分主要介绍源代码调试、EOS数据持久化机制、系统智能合约架构以及插件系统。

无论是正在使用EOS的软件工程师、测试工程师、运维工程师、架构师,还是热衷新技术的产品经理、管理人员,本书都具备很强的辅导和参考价值。

EOSIO是构建EOS的开源项目,是一个由block.one公司开发的、基于区块链结构设计的、能够支持水平和垂直扩展的、去中心化的应用平台,提供了账户、认证、数据库、异步通信和跨平台、跨集群的定时应用。同时,有望支持每秒百万级事务,完全零费率,并可以快速且容易地部署去中心化应用。

希望能与热爱区块链技术的朋友共同研究EOS技术,笔者的博客地址是http://www.cnblogs.com/Evsward,欢迎各位朋友前来留言讨论。

EOS中的易混淆名词

● EOS,目前指的是基于ERC20在以太坊上发行的代币体系,用于block.one公司

开发软件与社区运营。

● EOSIO,由block.one开发的可构建公链的软件源代码。

● EOS platform,采用EOSIO软件构建的公链平台。

● DApp,此处指的是未来在EOS公链平台上基于EOSIO软件开发部署的去中心化应用,通常是由智能合约实现的,但在EOS中也可以通过插件的方式实现。

名词解释

EOS中有很多专用名词,下面通过表格列举展示。EOS专用名词解释续表续表

读者服务

轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。

● 提交勘误:您对书中内容的修改意见可在【提交勘误】处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。

● 与读者交流:在页面下方【读者评论】处留下您的疑问或观点,与其他读者一同学习交流。

页面入口:http://www.broadview.com.cn/36928第1章 加密算法1.1 单向哈希函数

单向哈希函数,又称单向散列函数,可以把任何数据变为一段无现实意义的定长数据串。因此,单向哈希函数有两个重要功能:一是将不同长度结构的数据因子转化为等长数据;二是在不传输明文数据的前提下,只是对比加密数据串就可以确定明文数据是否一致,常用于网络文件防篡改、文件完整性校验等场景。

单向哈希函数的特点是正向容易逆向困难,目标是生成速度越快越好,而反推明文数据则越困难、越慢越好。除以上标准,评判一种哈希函数是否优秀的关键是碰撞率要足够低。不同的明文数据生成相同的加密数据串,这种情况被称为哈希函数发生了碰撞。碰撞的出现会造成数据危险,因此一个哈希函数的碰撞率足够低是至关重要的。常见的算法有MD4(已淘汰)、MD5、SHA-224、SHA-256、SHA-384和SHA-512。从速度和碰撞率来讲,目前较常用的是SHA-256。

在互联网中,单向哈希函数是常见的解决方案。在登录过程中,服务器端及网络传输中只保存登录密码的加密数据串而不保存明文。用户登录时输入的明文密码,会先在客户端通过单向哈希函数处理,得到的加密数据串再经由网络传输到服务器端,与数据库中的加密数据串进行比对,如果一致则密码正确,如果不一致则密码错误。这种方法避免了明文密码传输泄露的风险。

然而,黑客专门制作了一个字典表,保存了一批明文数据与加密数据串的映射关系。例如,将123456使用SHA-256算法得到加密数据串,与123456相对应,以此类推,最终获得一个容量很大的字典表。接着,黑客通过截取网络传输数据或者盗取公司数据库,得到加密数据串,然后在字典表中遍历查找,如成功找到即可破解明文密码。

字典表越来越大,遍历查找会越来越慢。为了加快速度,黑客把具有相同特征的加密数据串统一分组,然后创建一个彩虹表保存特征与一组加密串的映射关系。例如,字典表中所有以0开头的加密串都将被归纳到彩虹表索引为0的那一项中。当黑客截取到的加密数据串以0为开头时,则只需要通过彩虹表查询到对应的那一组加密串,然后在组内遍历即可,可参照桶排序的原理。彩虹表技术大大提升了字典查找速度。

黑客破译了明文密码,并从字典表攻击升级到效率更高的彩虹表攻击。针对这些攻击手段,防御方可采用加盐的方式,将一段新字符串(盐)与明文数据拼接组成新的源数据,即可避免通用的字典表攻击。除非黑客盗取了盐或者采用笨方法愿意专门制作一个针对某加盐网站的字典表,那么就需要不断地尝试明文与密文的映射。随着防御方不断地更换盐,黑客也需要重新生成字符串,并刷新自己的数据库,这就是黑客机会成本的提高。1.2 对称加密

或许受到“加盐”的提示,从对称加密开始,有了密钥的概念。密钥用于加密和解密,掌握在数据使用的双方手里,不对外透露。如果密钥泄露,则数据无安全可言。对称加密算法有DES、3DES、AES、IDEA,推荐使用AES和IDEA。

黑客可以通过选择密文/明文攻击或者唯密文/明文攻击。其原理是要先掌握一定的明文片段、密文信息、加密算法,通过攻击解密服务,可在不知道密钥的情况下解密完整明文。所以,防御者要注意保护明文信息、加密算法类型及密文信息。在网络传输之前,对明文数据使用单向哈希函数做一步数据混淆是不错的选择。1.3 非对称加密

密钥分为公钥和私钥。解密者先使用随机数算法随机生成一个数据串作为私钥,然后利用私钥通过截取、重组、哈希等操作生成公钥。公钥生成后会被发布出去,加密者拿到公钥加密明文数据,解密者通过自己的私钥解密,外人无法通过公钥解密。非对称加密算法包括RSA、椭圆曲线加密(ECC)、SM2,区块链普遍使用的是ECC。非对称加密算法包含随机数算法及公钥生成算法。ECC 的随机数算法从概念上很容易理解,但伪随机的种子发生器是核心,目前使用的是美国国家标准协会(NIST)和美国国家安全局(NSA)发布的标准。公钥生成算法是通过数学模型生成的,特点是正向快速、逆向困难,包括secp256k1和secp256r1两种。secp256k1是比特币率先使用的;虽然secp256r1更有优势,但其也有潜在的漏洞,由于比特币没有使用secp256r1,因此还有“比特币躲过secp256r1子弹”的说法。目前这两种算法EOS均支持。1.4 本章小结

区块链的基础是加密算法。加密算法随着计算机网络场景的不断丰富而发展,最初的加密形态源自单向哈希函数,通过比对密文判断数据准确性,可保护敏感信息不泄露。接着演进出密钥的方式,利用同一把钥匙进行加解密,这就是对称加密算法,也称作单密钥加密算法。后来,密钥又分为公钥和私钥,公钥公开,私钥私有,这就是非对称加密算法。非对称加密算法衍生出很多对区块链非常重要的实用场景,如公钥加密、私钥解密,以及私钥签名、公钥验证。

本章提到了一些区块链相关的名词概念,下文将对这些概念展开讨论并研究其原理。通过这些概念的引导,可以大致描述出一个EOS的生态范围。EOS是第三代区块链产品,值得技术人员深入研究。加密货币是比特币时期区块链最大的应用场景,以太坊为区块链增加了智能合约,EOS 站在巨人的肩膀上,通过更多的创新点,区块链将更加贴近商业和社会,也会有更多的应用场景。第2章 启动单节点EOS链2.1 源代码结构

首先通过命令从EOSIO官方GitHub库拉取代码:

获得源代码以后,观察项目结构。有几个目录要说明:build,脚本编译后的输出目录;contracts,智能合约目录,包含大量的智能合约,有系统合约,也有例子程序及正在开发中的合约,可用于学习研究;plugins,插件目录,包含大量功能性插件;program,包含几个程序命令,如cleos、nodeos;script,包含编译使用的各种脚本;tutorials,启动时序脚本;unittests,单元测试文件目录;tests,使用Python编写的测试文件目录。2.2 编译工程

EOS的编译很简单,可以使用源代码自带的脚本:

编译成功界面如图2.1所示。图2.1 编译成功界面2.2.1 脚本eosio_build.sh

eosio_build.sh 是自动编译脚本,调用了 CMake 工具。该脚本的源代码内容可以分为四部分。(1)CMake设置,包括CMake工具的位置、待编译文件路径等参数。(2)目前支持Linux各发行版及Mac OS(Darwin)。针对不同的操作系统个性化设置CMake,如不同操作系统的文件路径可能不同,CMake依赖的编译器可能不同,有的基于Clang,有的基于G++、GCC,或者同一个编译器但要指定不同的版本。(3)CMake启动,包括异常处理、日志输出的控制等。(4)根据不同的操作系统分发脚本,如Ubuntu系统的机器会调用/scripts/eosio_build_ubuntu.sh。

不同操作系统的脚本内容不同,但工作大体可分为两个部分。

● 系统设置,操作系统相关属性的设置,操作系统必要配置的检查,包括内存、操作系统内核版本及磁盘空间等。

● 依赖包检查,如果检查发现没有依赖包,则需要下载安装。安装时又包含不同工具的个性化配置。例如,MongoDB的安装,脚本中包含MongoDB配置文件的创建和编辑。2.2.2 常见错误

● 机器硬件配置缺陷,如内存不足、磁盘空间不足,都会有相应日志提示,提高硬件配置即可通过。

● 依赖包安装时的网络问题,迟迟无法下载,导致超时退出。可以注释掉脚本中curl命令的自动下载部分,手动获得安装包,然后将其放到脚本的处理位置,由脚本完成安装配置。

● 源代码编译出错。一般不会出现,因为脚本属于EOS源代码的一部分,程序员提交源码修改时都会在GitHub中完成全平台自动化编译测试,如果编译器版本的设置有问题会第一时间被更新。后文在调试环境搭建时,会遇到编译器问题,当前脚本的编译器设置可以作为参考。2.3 安装命令

编译完成后,会在 build/program 目录中生成一系列命令。为方便起见,安装这些命令至环境变量中,可于任意位置调出使用。安装命令比较简单,进入build目录,执行命令sudo make install。需要注意的是,如果环境变量PATH并未设置该路径,则需要手动配置。在这些命令中,cleos、nodeos和keosd的关系如图2.2所示。

keosd和nodeos是两个服务进程,cleos是客户端进程,与服务进程交互。图2.2 cleos、nodeos和keosd的关系2.4 启动nodeos

nodeos是区块链节点组件,也是EOS节点核心守护进程,服务器程序,可配置不同的插件启动一个EOS链环境,是整个EOS程序的入口,启动节点的工具。2.4.1 nodeos命令详解

建议从终端中打印出nodeos的帮助信息:nodeos--help。nodeos 命令的帮助信息比较多,当前nodeos版本的帮助信息可分为四个部分。(1)插件配置参数,包括bnet_plugin、chain_plugin、history_plugin、http_client_plugin、http_plugin、login_plugin、mongo_db_plugin、net_plugin、producer_plugin和txn_test_gen_plugin。(2)插件命令行参数,只有chain_plugin需要该参数。(3)应用配置参数,--plugin,用于配置初始化插件列表。(4)应用命令行参数,除命令帮助和版本号外,比较重要的是配置数据位置--data-dir(可用缩写-d代替),以及配置文件config.ini的位置参数--config-dir。

配置文件参数和命令行参数的区别如下。(1)配置文件参数,在配置文件config.ini中配置。如果未手动修改,可以通过命令nodeos--print-default-config查看默认的config.ini文件的内容。在初次启动nodeos时会生成config.ini文件,并写入默认配置。有了该文件之后,可手动更改其中的配置项。nodeos启动时会自动读取。(2)命令行参数,是在命令nodeos后面添加的参数,这些参数可能不会包含在config.ini中。(3)配置文件参数的配置项全部可作为命令行参数,反之则不行。如果命令行和配置文件含有相同的配置项,以命令行为准。2.4.2 启动一个独立节点

通过以下命令启动一个独立节点的EOS区块链环境:

启动成功,打开本地config.ini文件,配置producer-name为eosio,enable-stale-production为true,解开注释signature-provider并使用其默认key,最后配置plugin,此处建议配置mongo_db_plugin、history_plugin和chain_api_plugin。nodeos启动成功日志如图2.3所示。

● 插件初始化,包括chain_plugin、mongo_db_plugin、http_plugin、net_plugin。

● nodeos的main入口函数会有一些日志输出,包括命令版本、根目录位置。

● Controller是区块链的控制程序,管理数据结构,包括对区块日志数据及状态表数据的应用与管理。

● 插件启动,可以在日志输出中明显地看到这部分内容。nodeos通过调用http_plugin的add_api函数启用了一系列RPC服务。

● 最后开始出块,查看日志,由produce_plugin的produce_block函数负责出块。节点启动以后,会在eosio根目录下查看到完整的节点文件结构,如图2.4所示。图2.3 nodeos启动成功日志图2.4 节点文件结构

查看该目录结构,config.ini是配置文件。data文件夹是区块数据存储位置,它包括blocks 和 state 两个目录。blocks 是区块链日志文件,保存区块链的区块数据,其中reversible 目录下存放的是内存映射的可逆区块文件,该文件大小是可配置的。state 目录下存放的是状态数据库文件,也是内存映射的方式,其大小是可配置的。2.4.3 RPC API

通过启动日志可以看到,有大量 http_plugin 的 add api url 信息,这些信息是在config.ini文件中加载chain_api_pluigin以后产生的,chain_api_plugin依赖http_plugin获得RPC服务的能力。这些服务包含但不限于以下几点。

● http://127.0.0.1:8888/v1/chain/get_info,获取区块链信息。

● http://127.0.0.1:8888/v1/chain/get_block,获取区块链某个区块的信息。

● http://127.0.0.1:8888/v1/chain/get_block_header_state,获取某个区块的区块头信息。

● http://127.0.0.1:8888/v1/chain/get_account,获得某账户的信息。

● http://127.0.0.1:8888/v1/chain/get_abi,获得某账户的ABI(应用程序二进制接口)信息,它是一个JSON对象,描述了一个智能合约的内容。

● http://127.0.0.1:8888/v1/chain/get_code,获得某账户的 code,描述了合约是如何运行的,也可理解为合约的owner。

● http://127.0.0.1:8888/v1/chain/get_raw_code_and_abi,获得某账户的wasm和ABI信息。

● http://127.0.0.1:8888/v1/chain/get_table_rows,获得StateDB中某table的数据,table可在智能合约中定义。

● http://127.0.0.1:8888/v1/chain/get_currency_balance,获得某账户的某token的余额。

● http://127.0.0.1:8888/v1/chain/abi_json_to_bin,编码action的data明文数据。

● http://127.0.0.1:8888/v1/chain/abi_bin_to_json,解码action的datahex数据为明文。

● http://127.0.0.1:8888/v1/chain/get_required_keys,获取依赖密钥。

● http://127.0.0.1:8888/v1/chain/get_currency_stats,获取某token的状态。

● http://127.0.0.1:8888/v1/chain/get_producers,获取生产者信息。

● http://127.0.0.1:8888/v1/chain/push_block,向区块链上推送一个区块。

● http://127.0.0.1:8888/v1/chain/push_transaction,向区块链上推送一个事务。

● http://127.0.0.1:8888/v1/chain/push_transactions,向区块链上推送一个事务数组。

这些接口均在 chain_api_pluigin 源代码中实现。在配置链环境时,首先要配置chain_plugin作为功能支持,chain_api_pluigin是基于chain_pluigin功能对外提供的RPC接口。其他相同的模式包括history_plugin和history_api_plugin、net_plugin和net_api_plugin、producer_plugin和producer_api_plugin,都有相关的RPC接口。2.5 钱包服务keosd

keosd 是钱包服务,用于存储私钥。该服务由于其隐私性,必须在用户本地运行,存储用户私钥。keosd进程除非有特殊需求,否则不必单独启动,通过cleos wallet的相关操作即可自动启动。第一次启动会自动创建钱包文件,默认位置在根目录下,具体如图2.5所示。图2.5 钱包目录位置及内容

钱包目录包含config.ini,文件内容取自nodeos配置文件的一部分,一般不需要改动。*.wallet是钱包文件,私钥会保存在钱包文件中。wallet.lock文件用于给钱包上锁,默认钱包如果15min无活动则会自动上锁,需要通过cleos wallet unlock解锁。关于钱包的操作还有很多,但都依托于cleos wallet命令。2.6 Docker启动

前面介绍了手动拉取EOS源代码、安装依赖库、编译程序和安装命令,最后手动启动nodeos、keosd服务。如果以上这些内容都已熟练掌握,现在需要一种更加方便的方式,那么可以选择Docker启动的方式。

删除旧的Docker版本:

安装docker-engine,选择community免费版本即可,选择匹配本地操作系统的安装包下载,下载地址为 https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/dockerce_*_ubuntu_amd64.deb,下载成功之后,在同级目录下执行:

安装成功以后,通过以下命令测试Docker是否能够正常工作。

Docker经测试运行正确,开始启动节点和钱包。

这条长命令完成了对节点和钱包的设置,主要包括以下几点。

● 为容器起名字eosio。

● 转发本地端口7777(nodeos)和5555(keosd)。

● 在本地磁盘上建立Docker容器的工作卷。

● 拉取eosio/eos最新版本的镜像。

通过命令exec运行keosd程序和nodeos程序,后面的参数包括插件配置、数据目录、配置文件目录、http插件设置、历史插件的筛选设置。

进入日志查看nodeos出块情况:

如果希望进入容器内部,就如同远程登录一台云主机,使用以下命令:

如果需要退出容器,输入exit即可。

节点启动成功后,能够对外提供RPC服务,如获取区块链信息:

外部可以通过cleos远程交互:

如果希望cleos命令更加简单,则可以在.bash_rc文件中加入别名:

保存,使用source命令重新载入.bash_rc文件,之后可直接使用:

关于Docker当前的容器,可以通过命令查看:

查看Docker所有image:

停止容器:

启动容器:

停止容器以后,可以删除容器:2.7 本章小结

本章研究了如何搭建一个单节点的EOS环境。首先介绍了EOSIO/eos项目的源代码结构、编译方法、命令的生成及命令之间的关系。然后实际操作了如何通过命令nodeos启动链,分析了启动日志,并介绍了钱包服务keosd。在EOS的编译阶段,通过脚本源代码,研究了编译逻辑、内容与过程。最后介绍了如何使用容器技术Docker启动节点和钱包服务。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?