包括前期的操作系统环境、前期的软件获取、前期的项目源码获取、中期的测试、最后可能遇到的问题和解决方案。PS:本文所说的网络问题,均无任何含义,只是网络问题。
我使用的是deepin 20Beta,它比较适合习惯用windows操作系统的用户。
linux内核版本:Linux version 5.3.0-3-amd64
作为前期的准备,我们需要安装git、go和docker三个软件。git用于获取源码,go用于编译,docker作为容器获取镜像。
hyperledger的源码是在github上,所以需要用git进行获取,而系统默认无git,安装就完事了。注意,以下所有代码均默认已有root权限
// 安装代码如下
// 获取root权限,输入root密码回车即可
sudo su
// deepin安装git,注意,如果是centos,用yum install +软件名
apt-get install git
//没报错即安装完成
hyperledger的fabric采用go语言编写,所以需要先下载go语言安装包:
由于网络问题,我们选择并点击go语言中文网获取linux的安装包,右键获取链接。
打开终端,输入以下命令获取:
// 也可以下载下来进行解压,都行
//2020-08-07,此时链接可用
wget https://studygolang.com/dl/golang/go1.14.6.linux-amd64.tar.gz
//在get到go语言的安装包后解压到/usr/local/software下
// 先新建/usr/local/software文件夹再解压
mkdir /usr/local/software
tar -zxvf go1.14.6.linux-amd64.tar.gz -C /usr/local/software
到此时,go已经解压完成在/usr/local/software/go文件夹中
hyperledger使用docker打包应用为镜像进行移植,使得所有的客户端均可获取到每个版本对应的镜像。
Deepin的安装教程类似Ubuntu的安装,参考教程
// 安装代码如下
// 先更新本地的软件源,使用中科大的
cp /etc/apt/sources.list /etc/apt/sources.list.bak
sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
apt update
// 更新完成后先安装需要的包,共5个
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
// 由于安装docker需要类似先注册一下,所以先添加 Docker 的官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
// 添加 Docker-ce 软件源
add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
// 再次更新并安装
apt-get update
apt-get install docker-ce
//设置开机自启动
systemctl enable docker
systemctl start docker
//没报错即安装完成
地址:https://github.com/hyperledger
我们需要获取两个子项目:fabric和fabric-samples,fabric通过编译成二进制文件,提供给其他子项目使用。
但在实际过程中我们实际上只会用到了一个子项目:fabric-samples
先通过git获取到这两个子项目的源码:
以hyperledger/fabric-samples为例:
具体的代码如下:
fabric-samples的链接:https://github.com/hyperledger/fabric-samples.git
fabric的链接:https://github.com/hyperledger/fabric.git
//2020-08-07
// 注意git clone 下来的项目是在你目前所在的目录下,所以我们需要先进入对应的目录再git
// 我们在根目录/下创建了个workspace,一个go用于以后的go开发路径,并继续创建github.com作为存放git项目的文件目录
mkdir /workspace \
/workspace/go /workspace/go/bin \
/workspace/github.com \
/workspace/github.com/hyperledger
// 进入目录/workspace/github.com/hyperledger/
cd /workspace/github.com/hyperledger/
// 获取源码,由于网络问题,会有点慢
git clone https://github.com/hyperledger/fabric.git
git clone https://github.com/hyperledger/fabric-samples.git
// 注意,通过这种方式获取的是master的,也就是最新的源码
// 获取完成后更改权限
chmod 777 -R /workspace/github.com/hyperledger/
当源码获取完成后,前期安装的软件需要进行环境配置
// vim进行修改/etc/profile
vim /etc/profile
// 按i并移动光标在最后添加如下内容:
#workspace
export WORKSPACE=/workspace
#go
export GOROOT=/usr/local/software/go
export GOBIN=$GOROOT/bin
export GOPATH=$WORKSPACE/go
#hyperledger
export FABRIC=$WORKSPACE/github.com/hyperledger
#path
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin:$FABRIC/fabric-samples/bin
#END
// 添加完成按esc并输入:wq进行保存
// 修改生效
source /etc/profile
当修改完成后,通过输入 go version测试,结果如下
2. docker添加镜像加速器
由于国内网络问题,当通过docker获取镜像时,往往速度不如人意(谁试谁知道)这时候镜像加速器让你感受到网速的美妙:
以阿里云镜像加速器为例:通过搜索容器镜像服务找到最下面的镜像加速器,而右边则是你的地址。
// 具体教程可参考上图
mkdir /etc/docker
vim /etc/docker/daemon.json
// 添加你的加速器地址
{
"registry-mirrors":["https://xxxx.mirror.aliyuncs.com"]}
// 保存并退出
systemctl daemon-reload
systemctl restart docker
完成后输入 docker version测试,结果如下,说明docker正常启动
当添加完成加速器后,可以去https://hub.docker.com/u/hyperledger/来获取hyperledger的docker镜像。
我们需要以下镜像:
以hyperledger/fabric-peer为例,https://hub.docker.com/r/hyperledger/fabric-peer
点击进入即可获取fabric-peer的镜像,通过右边代码进行获取
// 输入复制代码,即可pull对应的镜像文件
docker pull hyperledger/fabric-peer
// 所有的镜像均可按此方式进行
注:官方给了一个脚本bootstrap.sh(具体路径如下图),可以通过执行此文件来获取所有的镜像。但是,由于网络问题,执行此文件通常会以失败告终。只能说,官方的想法是很好,但是网络问题,无解。所以还是老老实实的一个一个pull。
通过pull相关的镜像文件,最后通过docker images进行查看。如果出现的镜像和所需镜像均吻合,则镜像下载完成。
至此,基本上所有的文件都已经准备完毕。开始区块链的入门吧!
我们之前git了两个子项目,fabric和fabric-samples,先进入fabric-samples来看看如何上手吧。
fabric-samples中包括了很多,但是作为入门我也不清楚,先进入test-network来开始入门的测试
注意,我们的是最新的版本,而网上的教程大多是V1.0时候的fabric-samples,所以会出现比如测试路径名称不同:
比如当你选择fabric-samples版本为1.0时,显示的可执行文件为byfn.sh,如下图所示
而如果是master(2020-08-07)时
进入后可以看到一个可执行文件network.sh
具体的获取方法如上,只是注意需要修改镜像对应的版本,即pull时添加上对应的tag即可
命令行进入此路径执行此文件
// 防止万一,直接绝对路径执行
./$FABRIC/fabric-samples/test-network/xxx.sh
如果是releas-1.0版本,即网上常见的版本时,通过./byfn.sh执行时,显示常用的3个命令-up、-down、-generate
通过./byfn.sh generate执行区块链网络创建
而在创建完成后即可通过./byfn.sh up开始区块链的网络。这里报错,说明没有安装docker-compse安装即可
重新通过./byfn.sh up开始区块链的网络,一切正常显示:START
区块链网络搭建完成,添加了一个名为mychannel的通道,并添加了两个用户a和b,完成了交易,最后查询query a的账户,由原来的100变为现在的90.
此时docker images查看docker 镜像,可以看到多出3个测试镜像。
查看执行结果,红色部分为翻译
./network.sh 包括以下几个执行命令
通过 ./network.sh up createChannel -c testchannel 来新建并加入一个名为testchannel的通道
最后结果:
这里通过peer相关的命令行来手动完成交易:
具体细节如下图:
fabric的结构包括:网络、通道、orderer、peer和链码chaincode。
各个部分间的关系如下图所示。在一个大的区块链网络中,存在多个peer 节点,不同节点间通过channel进行交易,并通过链码(智能合约)对自身账本进行读写等操作,并将修改后的交易信息交给orderer节点进行排序,orderer节点确定交易是否可行,并将最终的正确交易数据排好序,发送至各个peer节点,完成所有节点账本的同步。
当我们执行例子中的可执行文件时,显示没有二进制文件:
Starting nodes with CLI timeout of '5' tries and CLI delay of '3' seconds and using database 'leveldb' with crypto from 'cryptogen'
ERROR! Peer binary and configuration files not found..
通过fabric/scripts/bootstrap.sh进行查看
如果是git master的版本时,打开进入master对应的bootstrap.sh,可以看到fabric的版本为:VERSION=2.2.0,fabric-ca的版本为:CA_VERSION=1.4.8
于是通过进入fabric/ca1.5以上版本:https://hyperledger.lanzous.com/b01hlg8gf和fabric/ca1.1-1.5版本:https://hyperledger.lanzous.com/b01hlg8ti下载fabric和fabric-ca的对应版本二进制文件并解压到本地的fabric-samples即可
进入本地目录修改版本
cd /workspace/github.com/hyperledger/fabric
// 查看目前的git对应版本
git branch -a
// 当显示已有的版本后,可以修改对应的版本
// git checkout +xxx
// 如修改为release-2.0版本
git checkout release-2.0
错误代码:
ERROR! Fabric Docker image version of x.x.x does not match the versions supported by the test network.
报错显示:
这里就先查看docker的镜像文件,看看是不是没有对应的版本镜像就行。
docker images
// 发现的确没有2.2.0版本的镜像
// 那就很简单
// pull + 路径 + tag,看哪些不是2.2的,pull就是了
pull hyperledger/fabric-tools:2.2
// 如果镜像里出现其他的,可以通过
// docker rmi + 镜像ID
// 进行删除
注意,这种情况下可能会出现:同名同id不同tag的镜像需要删除:
参考教程:https://blog.csdn.net/qq_37674858/article/details/80282068?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-1&spm=1001.2101.3001.4242
通过docker rmi 镜像名称:镜像tag
// 例子:删除2.2版本,留下2.2.0版本
docker rmi hyperledger/fabric-ccenv:2.2
具体如图所示:
或者一个比较直接的方法:修改network.sh内容,将其中对image的tag进行直接指定:修改此处:#default image tag
Chrome 61 发布后,被爆存在安全漏洞,而 Chrome 团队在修复安全漏洞的过程中发现一些漏洞是由 V8 的 escape analysis 引起的,编号为 #765433 #752423 等。escape analysis 学名是逃逸分析。在编译优化理论中,逃逸分析是一种确定指针动态范围的方法——分析在程序的哪些地方可以访问到指针。V8 v6.1 及更早版本使用了一个复杂
MongoDB作为最像关系型数据的非关系型数据库,有许多类似SQL的功能,他是一个基于分布式文件储存的数据库,由C++编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。MongoDB的主要特点:MongoDB 的...
Nginx配置指令try_files try_files指令是按顺序检测文件的存在性,并且返回第一个找到文件的内容,如果第一个找不到就会自动找第二个,依次查找.其实现的是内部跳转.以下举例说明:案例1(跳转到变量):1234567891011121314server{list...
Linux C 标准程序,万变不离其宗,记录下。
一.INSERT … SELECT语法介绍上图来自官方文档,在其中,有这样一句话描述: 可以根据SELECT 语句的结果快速将多行插入到表中,该语句可以从一个或多个表中进行选择。在这段话下面,给我们提供了一个使用的demo。INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id FROM tbl_temp1 WHER...
Dipatcher类是消息分发的接口,OSD、MON、等类都继承该类,并实现了Dipatcher的消息分发接口class OSD : public Dispatcher,public md_config_obs_t{ /** OSD **/}class Monitor : public Dispatcher,public md_config_obs_t{public: // me string name;}在OSD::init()函数中把不同类型的D.
报错如下:---------------------------------------------------------------------------ModuleNotFoundError Traceback (most recent call last)<ipython-input-1-3821d4821701> in ...
最近下了Chrome的源码,安装了一个debug版的Chromium研究了一下,虽然很多地方都一知半解,但是还是有一点收获,将在这篇文章介绍DOM树是如何构建的,看了本文应该可以回答以下问题:IE用的是Trident内核,Safari用的是Webkit,Chrome用的是Blink,到底什么是内核,它们的区别是什么? 如果没有声明<!DOCTYPE html>会造成什么影响? ...
数组去重 Set()Set类似于数组,区别在于它所有的成员都是唯一的,不能有重复的值function dedupe(array) { return Array.from(new Set(array));}dedupe([1,1,2,3]) // [1, 2, 3]set对象的方法set方法详情点这里方法描述add添加某个值,返回Set对象本身。cl...
//密码应包括数字、小写字母、大写字母、特殊符号4类中至少3类; public boolean checkPwd(String pwd) { String PW_PATTERN = "^(?![a-zA-Z]+$)(?![a-z\\d]+$)(?![[email protected]#\\$%]+$)(?![A-Z\\d]+$)(?![[email protected]#\\$%]+$)(?![\\[email protected]#\\$%]+$)[a-zA-Z\\[email protected]#\\$%]+$"; return pwd.matc...
前言:哈哈,第一篇关于Java的博客了,暑假看了一些Java的设计模式,本来想着总结一下的,但是一耽误就到现在了,后面慢慢补上。今天我们来聊聊DAO1、DAO是个什么东西呢?看一下官方的介绍,DAO(Data Access Object,数据访问对象)的主要功能是数据操作,在程序的标准开发架构中属于数据层的操作。额,好像有点糊涂啊,用人类的语言解释一下也就是DAO是一种操作数据库的设计
三层交换vlan间通信 问题VLAN实现了广播域的隔离,同时也将VLAN间的通信隔离了。三层交换技术使得VLAN间可以通信。1)通过三层交换实现VLAN间通信 方案为了解决了传统路由器低速、复杂所造成的网络瓶颈问题,引入了三层交换技术。它根据实际应用时的情况,灵活地在网络第二层或者第三层进行网络分段。具有三层交换功能的设备是一个带有第三层路由功能的第二层交换机。简单地说,三层交换...