区块链中文技术社区 - 2019年4月
type: channel
link: https://www.bcskill.com/index.php/2019/04/
description: 区块链,EOS,Ethereum,IPFS,Dapp技能学习
items: state_history_plugin 的使用
items: 开源EOS浏览器eosweb
items: EOS mongo_db_plugin 支持多线程
items: recipe for target 'all' failed appbase_version
items: EOS虚拟机与智能合约详解与分析
items: plugin依赖关系图
items: push_action调用流程图
items: std::string 与 abieos::public_key 互转
items: EOSIO Block Producer Heartbeat
items: fabric配置讲解

state_history_plugin 的使用
type: item
date: 2019-04-30T18:53:00+08:00
description: 发现今天更新了1.8.0RC版本，readme中说mongo插件已经废弃，马上将被删除， Mongo DB plugin deprecated The Mongo DB plugin has been deprecated and will be removed from the EOSIO source in a future release. Users are recommended to switch to non-deprecated history solutions such as the ones built off of the state_history_plugin. 之前一直没时间研究state_history_plugin EOSIO推荐的方案，最近抽空试一试 优点是分离了入库的逻辑, 不用replay就能自由的同步的其他数据库 源代码地址 插件源码地址：https://github.com/EOSIO/eos/tree/master/plugins/state_history_plugin 应用API：https://github.com/acoutts/EOS-state-history-API 安装依赖 安装postgresql sudo apt-get install postgresql 待续。。 参考 https://cloud.tencent.com/developer/news/368043 https://www.jianshu.com/p/50bf6429a1ce https://eosio.stackexchange.com/questions/3832/difference-between-history-plugin-and-state-history-plugin https://developers.eos.io/eosio-nodeos/docs/monitoring-with-state-history https://developers.eos.io/eosio-nodeos/docs/monitoring-with-3rd-party https://eosio.github.io/history-tools/ https://github.com/tmuskal/jsclient-eosio-state-history-plugin

开源EOS浏览器eosweb
type: item
date: 2019-04-30T16:49:16+08:00
description: 网站主页：https://eosweb.net/ 开源地址：https://github.com/orange1337/eosweb

EOS mongo_db_plugin 支持多线程
type: item
date: 2019-04-30T12:05:20+08:00
description: https://github.com/llxisdsh/mongo_db_plugin_mt

recipe for target 'all' failed appbase_version
type: item
date: 2019-04-29T15:13:00+08:00
description: 详细错误如下 [ 6%] Built target chainbase fatal: No names found, cannot describe anything. CMake Error at version.cmake:11 (message): git describe failed libraries/appbase/CMakeFiles/appbase_version.dir/build.make:57: recipe for target 'libraries/appbase/CMakeFiles/appbase_version' failed make[2]: *** [libraries/appbase/CMakeFiles/appbase_version] Error 1 CMakeFiles/Makefile2:1746: recipe for target 'libraries/appbase/CMakeFiles/appbase_version.dir/all' failed make[1]: *** [libraries/appbase/CMakeFiles/appbase_version.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... [ 29%] Built target softfloat [ 31%] Built target libc++ [ 35%] Built target fc Makefile:162: recipe for target 'all' failed make: *** [all] Error 2 >>>>>>>>>>>>>>>>>>>> MAKE building EOSIO has exited with the above error. 解决方案 由于当时是直接复制的项目，所以没有tag。（CMakeLists.txt）编译时至少需要有一个tag,appbase会以最新的tag作为版本信息。 最终会写入 build\libraries\appbase\version.cpp 中 所以新建一个tag就好了 参考：https://github.com/EOSIO/eos/issues/5345

EOS虚拟机与智能合约详解与分析
type: item
date: 2019-04-26T11:30:00+08:00
description: EOS虚拟机同经典的EVM，是EOS中运行智能合约的容器，但是从设计上讲它与EOS.IO是分离的。进 一步脚本语言和虚拟机的技术设计与EOS.IO分离。从宏观来讲任何语言或者虚拟机，只要满足条件适 合沙盒模式运行，同时满足一定的运行效率，都可以通过满足EOS.IO提供的API来加入到EOS.IO的消 息传递过程中。以下为github上官方的说明： The EOS.IO software will be first and foremost a platform for coordinating the delivery of authenticated messages (called Actions) to accounts. The details of scripting language and virtual machine are implementation specific details that are mostly independent from the design of the EOS.IO technology. Any language or virtual machine that is deterministic and properly sandboxed with sufficient performance can be integrated with the EOS.IO software API. 本文就EOSIO中的智能合约和虚拟机进行分析来从更加全面的角度来看EOS是如何构建和实现。 相关背景知识 LLVM相关内容 LLVM相关技术的理解对于我们深入理解EOS虚拟机的运行机制至关重要，所以必要的LLVM的相关知 识在这里是需要的。同时LLVM作为一个成熟的编译器后端实现，无论从架构还是相关设计思想以及相 关的工具的实现都是值得学习的。 LLVM架构概述 概括来讲LLVM项目是一系列分模块、可重用的编译工具链。它提供了一种代码良好的中间表示(IR)， LLVM实现上可以作为多种语言的后端，还可以提供与语言无关的优化和针对多种CPU的代码生成功能。 最初UIUC的Chris Lattner主持开发了一套称为LLVM(Low Level Virtual Machine)的编译器工具库套 件，但是后来随着LLVM的范围的不断扩大，则这个简写并不代表底层虚拟机的含义，而作为整个项目 的正式名称使用，并一直延续至今。所以现在的LLVM并不代表Low Level Virtual Machine。 The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name "LLVM" itself is not an acronym; it is the full name of the project. LLVM不同于传统的我们熟知的编译器。传统的静态编译器（如gcc）通常将编译分为三个阶段，分别 由三个组件来完成具体工作，分别为前端、优化器和后端，如下图所示。 LLVM项目在整体上也分为三个部分，同传统编译器一致，如下图所示，不同的语言的前端，统一的 优化器，以及针对不同平台的机器码生成。从图2我们也可以得到启发，如果想实现一门自定义的 语言，目前主要的工作可以集中在如何实现一个LLVM的前端上来。 LLVM的架构相对于传统编译器更加的灵活，有其他编译器不具备的优势，从LLVM整体的流程中我 们就可以看到这一点，如下图所示为LLVM整体的流程，编译前端将源码编译成LLVM中间格式的文 件，然后使用LLVM Linker进行链接。Linker执行大量的链接时优化，特别是过程间优化。链接得 到的LLVM code最终会被翻译成特定平台的机器码，另外LLVM支持JIT。本地代码生成器会在代码 生成过程中插入一些轻量级的操作指令来收集运行时的一些信息，例如识别hot region。运行时收 集到的信息可以用于离线优化，执行一些更为激进的profile-driven的优化策略，调整native code 以适应特定的架构。 从图中我们也可以得出LLVM突出的几个优势： 持续的程序信息，每个阶段都可以获得程序的信息内容 离线代码生成，产生较高的可执行程序 便捷profiling及优化，方便优化的实施 透明的运行时模型 统一，全程序编译 LLVM IR介绍与分析 根据编译原理可知，编译器不是直接将源语言翻译为目标语言，而是翻译…

plugin依赖关系图
type: item
date: 2019-04-25T15:56:35+08:00
description: 原文地址：https://github.com/maodaishan/eos_doc/blob/master/plugin%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB.PNG

push_action调用流程图
type: item
date: 2019-04-25T14:53:29+08:00
description: 转载自：https://github.com/maodaishan/eos_doc/blob/master/push_action%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B.jpg

std::string 与 abieos::public_key 互转
type: item
date: 2019-04-25T11:12:38+08:00
description: #include "abieos_numeric.hpp" #include <stdio.h> #include <cassert> using namespace abieos; int main() { std::string pubkey_str = std::string("EOS6S7kyRBUnwhKwfz41E7hCv9swCzT6AicNb7Skiz4LAeY7wG9WJ"); abieos::public_key pubkey = string_to_public_key(pubkey_str); std::string decoded_pubkey_str = public_key_to_string(pubkey); assert(decoded_pubkey_str == pubkey_str); printf("Succcess!\n"); } 源代码地址：https://github.com/cppfuns/abieos-numeric-c-14/blob/master/test.cpp

EOSIO Block Producer Heartbeat
type: item
date: 2019-04-24T16:37:00+08:00
description: 目前想检测侧链个节点的健康状况，此文将测试插件 插件源代码地址：https://github.com/LiquidEOS/eos-producer-heartbeat-plugin 前端项目地址：https://github.com/LiquidEOS/eos-producer-heartbeat 检测的原理就是，提前准备个账号，部署好收集节点信息的合约 合约地址：https://github.com/LiquidEOS/eos-producer-heartbeat/blob/master/eosio_docker/contracts/heartbeat/heartbeat.cpp 各个节点定时（heartbeat-period）将数据push到这个合约（heartbeat-contract）。 源代码编译插件 cd <eosio-source-dir> cd plugins git clone https://github.com/LiquidEOS/eos-producer-heartbeat-plugin.git producer_heartbeat_plugin cd producer_heartbeat_plugin git checkout tags/v1.5.01 cd ../.. git apply plugins/producer_heartbeat_plugin/install.patch ./eosio_build.sh -s "EOS" sudo ./eosio_install.sh 新创建账户，并设置权限 如果是测试，这一步非必要的。 创建key $ cleos create key --to-console Private key: 5JPxA1FPp2fMJj2hh1ax8cuJMQchffCi3GnBcobwL5SJhyxMS9n Public key: EOS6pZfrTRMesCnSaE1XwYSFFUtsdGeH6Ljj6xGWxFk4N5Z3T13KT 下文中 PRODUCERACCT 为出块节点账户 创建账户 cleos system newaccount PRODUCERACCT eosheartbeat EOS6pZfrTRMesCnSaE1XwYSFFUtsdGeH6Ljj6xGWxFk4N5Z3T13KT EOS6pZfrTRMesCnSaE1XwYSFFUtsdGeH6Ljj6xGWxFk4N5Z3T13KT --stake-net '50.00 EOS' --stake-cpu '50.00 EOS' --buy-ram-kbytes 10000 创建一个自定义的heartbeat权限 cleos set account permission PRODUCERACCT heartbeat '{"threshold":1,"keys":[{"key":"EOS6pZfrTRMesCnSaE1XwYSFFUtsdGeH6Ljj6xGWxFk4N5Z3T13KT","weight":1}]}' "active" -p PRODUCERACCT@active 将PRODUCERACCT的heartbeat权限，付给eosheartbeat，用于执行heartbeat cleos set action permission PRODUCERACCT eosheartbeat heartbeat heartbeat 黑名单合约权限，同上 cleos set action permission PRODUCERACCT theblacklist sethash heartbeat config添加插件支持 plugin = eosio::producer_heartbeat_plugin heartbeat-period = 1500 heartbeat-signature-provider = HEARTBEAT_PUB_KEY=KEY:HEARTBEAT_PRIVATE_KEY heartbeat-contract = eosheartbeat heartbeat-permission = heartbeat heartbeat-oncall = telegram:johndoe 稍后测试后，在做补充

fabric配置讲解
type: item
date: 2019-04-23T10:10:00+08:00
description: fabric配置讲解 在 fabric 源码 sampleconfig 目录的两个配置文件，core.yaml，orderer.yaml Peer 配置剖析 core.yaml ############################################################################### # # 日志部分 # ############################################################################### logging: ## 日志级别有： critical、 error、 warning、 notice、 info、 debug 级别由大到小， 级别越小输出越详细 level: info ## 全局的默认日志级别 ## 各个模块日志级别， 覆盖全局配置 cauthdsl: warning gossip: warning grpc: error ledger: info msp: warning policies: warning peer: gossip: warning # 日志的输出格式 format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}' ############################################################################### # # peer部分 # ############################################################################### peer: id: jdoe ## Peer节点ID networkId: dev ## 网络ID listenAddress: 0.0.0.0:7051 ## 节点监听的本地网络接口地址 chaincodeAddress: 0.0.0.0:7052 ## 链码容器连接时的监听地址 如未指定, 则使用listenAddress的IP地址和7052端口 address: 0.0.0.0:7051 ## 节点对外的服务地址 （对外的地址） addressAutoDetect: false ## 是否自动探测服务地址 (默认 关闭， 如果启用TLS时，最好关闭) gomaxprocs: -1 ## Go的进程限制数 runtime.GOMAXPROCS(n) 默认 -1 keepalive: ## 客户端和peer间的网络心跳连接配置 minInterval: 60s ## 最小的心跳间隔时间 client: ## 该节点和客户端 的交互配置 interval: 60s ## 和客户端 的心跳间隔 必须 interval >= minInterval timeout: 20s ## 和客户端 间的网络连接超时时间 deliveryClient: ## 交付客户端用于与订购节点通信的心跳 interval: 60s timeout: 20s gossip: ## 节点间通信的gossip 协议的P2P通信 【主要包含了 启动 及 连接】 bootstrap: 127.0.0.1:7051 ## 启动节点后 向哪些节点发起gossip连接，以加入网络，且节点相互间都是同一个组织的 useLeaderElection: true ## 是否启动动态选举 组织的Leader 节点 与 orgLeader 互斥 orgLeader: false ## 是否指定本节点为 组织Leader 节点 与 useLeaderElection 互斥 endpoint: ## 本节点在组织内的gossip id maxBlockCountToStore: 100 ## 保存到内存的区块个数上限 maxPropagationBurstLatency: 10ms ## 保存消息的最大时间，超过则触发转发给其他节点 maxPropagationBurstSize: 10 ## 保存的最大消息个数，超过则触发转发给其他节点 propagateIterations: 1 ## 消息转发的次数 propagatePeerNum: 3 ## 推送消息给指定个数的节点 pullInterval: 4s ## 拉取消息的时间间隔 (second) 必须大于 digestWaitTime + responseWaitTime pullPeerNum: 3 ## 从指定个数的节点拉取…