链客,专为开发者而生,有问必答!node
此文章来自区块链技术社区,未经容许拒绝转载。linux
1、编译git
一、环境准备github
须要提早在linux或者mac机器上安装以下软件docker
1)Go,注意设置好gopath(笔者安装的是go1.8.3,对应的源码是v1.0.0这个tag,版本不对可能会出现编译不过或者运行出现问题)bash
2)Docker服务器
3)一些依赖包(笔者当时没有装特殊的依赖包,因此这里不写了)网络
二、源码下载架构
首先先建立源码目录(注意这里必须是gopath下的这个目录,不然编译不过)区块链
$ mkdir -p $GOPATH/src/github.com/hyperledger
$ cd $GOPATH/src/github.com/hyperledger
而后在该目录下复制仓库
$ git clone http://gerrit.hyperledger.org...
笔者用的是v1.0.0的tag因此还须要
$ git checkout v1.0.0
三、编译
在源码目录中make
不过这样要求比较高,耗时比较长,会从网上下载一些docker镜像等等,读者若是嫌费时间或者因为网络缘由搞不定,能够一个一个make
好比make native是编译一些bin好比order,peer等
而make order和make peer是编译两个关键程序
因为编译不是本文的重点因此简单提一下,若是有疑问欢迎给笔者留言交流
2、运行
本身配置联盟比较麻烦,比较建议是下载一个开源项目使用docker运行,如下是简单的方式
一、环境要求:
安装docker-compose
二、下载开源项目
$ git clone https://github.com/yeasy/dock...
$ cd docker-compose-files/hyperledger_fabric/v1.0.0
三、下载镜像
$ sudo bash scripts/ download_images.sh
四、启动
$ make start
后面的具体方式能够看Makefile,有运行、中止、初始化、测试链码等命令
3、架构
联盟链的概念比较多,从比特币转过来的同窗可能刚开始会晕(由于我当时研究的时候看各类文章就很晕),因此我这里尽可能把个人理解路径写出来
一、主程序
联盟链真正运行时只有两个主程序
1)peer,这个程序是参与实体的运行终端,也是命令行的终端(客户端),能够理解为比特币中的主程序。
2)order,一个排序服务,类比到比特币,暂时简单理解为主程序中的挖矿部分,由于联盟链把这部分功能单独隔离了出来。随着代码的深刻了解,能够发掘其其余功能。
二、讲解模型
其中order服务是一个单独的服务,能够理解为一个专门各个组织公认的权威服务器(也能够是服务集群),主要用来对交易进行排序,而后生成区块(挖矿)
Org表明组织,讲解的模型中有两个组织,org1和org2,能够对应的是清华大学和北京大学
而peer通常表明的是组织内的子部门,好比org1.peer1表明清华大学的计算机学院,org2.peer2表明北京大学的计算机学院。
三、启动命令行
对应上图中的讲解模型每个节点中的运行的命令行以下
1)order服务:order start
2)org1.peer1 : peer node start
3)org2.peer1 : peer node start
4)org1.peer2:peer node start
5)org2.peer2:peer node start
这里除了order运行是order start之外其余的所有是peer node start,那怎么区分他们的功能呢?
答案是经过msp和tls两个目录(这个后续再继续讲)
在各个节点运行事后,网络是这样的
也就是网络其实尚未互联起来
四、网络互联
要完成网络须要三步
1)建立通道
建立通道,能够单独在一个机器上运行
peer channel create
-o orderer.example.com:7050
-c testchannel
-f ./ testchannel.tx
ps:为了简单,这里省略了一些证书信息的配置(后文会讲解)
其中当前须要理解的参数是-o orderer.example.com:7050 表明了order的url,-c testchannel表明了通道的名字
这个命令其实就是经过链接到orderer.example.com:7050服务上,让服务器增长了一个通道的配置(配置文件是testchannel.tx),这个配置中包括了一些信息,好比证书信息,机构信息,以及一些权限设置等等。而后order会返回一个testchannel.block的文件(也是一些配置信息),加入通道时候会用到。
这一步并无构建网络,网络模型依然以下
只是order服务中多了一个叫testchannel的通道
2)加入通道
命令为
CORE_PEER_ADDRESS=peer1.org1.example.com:7051
peer channel join
-b testchannel.block
ps:这里省略了msp配置的信息
主要参数列出来
一、CORE_PEER_ADDRESS代表要加入通道的地址(由于实际操做时候是用的cli在另外的机器上操做要加入通道的peer)
二、testchannel.block 建立通道时候的返回文件
该命令执行完之后,网络模型变成了
能够看到org1的peer1和order链接陈功了,依次执行
CORE_PEER_ADDRESS=peer2.org1.example.com:7051
peer channel join
-b testchannel.block
CORE_PEER_ADDRESS=peer1.org2.example.com:7051
peer channel join
-b testchannel.block
CORE_PEER_ADDRESS=peer2.org2.example.com:7051
peer channel join
-b testchannel.block
最后网络模型变成了
3)设置锚节点
各个节点都加入网络后,细心的读者可能会发现,和咱们要达到的网络模型还少了几条线,也就是各个节点的互通线没有链接。而这个的完成须要gossip协议,而gossip协议是一个节点相互发现的协议,其中有一项就是须要一些锚点,fabric中通常每个组织一到多个锚点。这个概念在讲解gossip协议的时候会进一步说明,在这里就只须要知道锚点的设置是为了网络互通就能够了,实在要理解,暂时理解为p2p协议中的初始域名服务器。命令以下:
peer channel update
-o orderer.example.com:7050
-c testchannel
-f ./Org1MSPanchors.tx \
其中-c表明了通道名称,-f表示了锚点信息(里边会包含锚点的url好比peer1)-o指定了order节点。
在org1和org2中中分别生成锚点配置文件,而后执行以上命令就能把锚点信息更新到通道的配置中,这样各个节点就能够经过从order中更新配置,知道锚点,而后经过gossip协议进行全网互联,互联后网络模型以下