一、意义:
在本节内容开始之前,我先跟读者朋友们一起分享一下公链、联盟链、私有链的优劣势。
1、公有链
任何节点都是向任何人开放的,每个人都可以参与到这个区块链中进行计算,而且任何人都可以下载获得完整区块链数据(全部账本)。比特币就是最典型的公有链。
优点:公有链最大的优点就是去中心化和安全性。目前像一般比较出名的数字货币:比特币、以太币、瑞波币等都是使用公有链来运行的。由此可见,这些数字货币安全性很高,同时也不受到谁的控制。
缺点:尽管公有链很好很安全,但是设想一下,这么多随意出入的节点是很难达成共识的(上一篇文章提到的共识)因为有些节点可能随时宕机,黑客也可能伪造很多虚假的节点。所以,公有链有一套很严格的共识机制,因此公有链最大的问题就是共识问题,共识问题直接导致了公有链处理数据的速度问题,因此如果你玩比特币就知道了,转账要很久才能到。
2、私有链
有些区块链的应用场景下,并不希望这个系统任何人都可以参与,任何人都可以查看所有数据,只有被许可的节点才可以参与并且查看所有数据,这种区块链结构我们称为私有链。
优点:私有链可以完全自己定制策略,因此速度极快
缺点:相比较而言,私有链不具备去中心化
3、联盟链
联盟链是指有若干机构或组织共同参与管理的区块链,他们各自运行着一个或多个节点,之中的数据只允许系统内不同的机构进行读取和发送交易,并且共同记录交易数据。R3组成的银行区块链联盟要构建的就是典型的联盟链。
优点:联盟链优点就是比公有链处理速度要快,因为节点的数量和身份都已经规定好了,所以可以使用相对松散的共识机制,因此数据的处理速度就会比公有链大大提高。目前,联盟链的发展速度很惊人。
缺点:尽管联盟链速度加快,但是相比公有链来说,联盟链并不是完全去中心化的。因为理论上联盟之间可以联合起来修改区块链数据。发币无意义。
从上述描述中,我们了解到了一点联盟链的优劣势。抛开这些争论,秉承存在即合理的原则。我们深入研究一下联盟链。目前联盟链大多数都是基于Hyper Ledger fabric来实现的。下面我们来认识一下Hyper Ledger fabric的概念。
二、HyperLedger fabric:
Hyperledger Fabric是Linux基金会所主导的Hyperledger(超级账本)的项目之一。Hyperledger Fabric旨在作为开发模块化体系结构的区块链应用程序的基础,以便诸如共识和会员服务等组件可以即插即用。它使用容器技术来托管构成系统应用逻辑的智能合约(也称为链代码)。 简而言之,Hyperledger Fabric就是开发联盟链应用的最好工具之一。
脚本安装Fabric(略)
由于fabric安装比较复杂,所以我单独写了一个文档。安装文档我将放入github中,待文章写毕,将安装文档上传github。
github链接:https://github.com/lsy-zhaoshuaiji/faricInstall
手动组件Fabric网络
1.生成模板,
cryptogen showtemplate > crypto-config.yaml
2.修改模板后生成
模板如下,请按照自己的需求修改
# ---------------------------------------------------------------------------
# "OrdererOrgs" - Definition of organizations managing orderer nodes
# ---------------------------------------------------------------------------
OrdererOrgs: # 排序节点组织信息
# ---------------------------------------------------------------------------
# Orderer
# ---------------------------------------------------------------------------
- Name: Orderer # 排序节点组织的名字
Domain: example.com # 根域名, 排序节点组织的根域名
Specs:
- Hostname: orderer # 访问这台orderer对应的域名为: orderer.example.com
- Hostname: order2 # 访问这台orderer对应的域名为: order2.example.com
# ---------------------------------------------------------------------------
# "PeerOrgs" - Definition of organizations managing peer nodes
# ---------------------------------------------------------------------------
PeerOrgs:
# ---------------------------------------------------------------------------
# Org1
# ---------------------------------------------------------------------------
- Name: Org1 # 第一个组织的名字, 自己指定
Domain: org1.example.com # 访问第一个组织用到的根域名
EnableNodeOUs: true # 是否支持node.js
Template: # 模板, 根据默认的规则生成2个peer存储数据的节点
Count: 2 # 1. peer0.org1.example.com 2. peer1.org1.example.com
Users: # 创建的普通用户的个数
Count: 3
# ---------------------------------------------------------------------------
# Org2: See "Org1" for full specification
# ---------------------------------------------------------------------------
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 2
Specs:
- Hostname: hello
Users:
Count: 1
修改后为:
# ---------------------------------------------------------------------------
# "OrdererOrgs" - Definition of organizations managing orderer nodes
# ---------------------------------------------------------------------------
OrdererOrgs:
# ---------------------------------------------------------------------------
# Orderer
# ---------------------------------------------------------------------------
- Name: Orderer
Domain: itcast.com
Specs:
- Hostname: orderer
# ---------------------------------------------------------------------------
# "PeerOrgs" - Definition of organizations managing peer nodes
# ---------------------------------------------------------------------------
PeerOrgs:
# ---------------------------------------------------------------------------
# Org1
# ---------------------------------------------------------------------------
- Name: OrgGo
Domain: orggo.itcast.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 3
# ---------------------------------------------------------------------------
# Org2: See "Org1" for full specification
# ---------------------------------------------------------------------------
- Name: OrgCpp
Domain: orgcpp.itcast.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 3
运行
cryptogen generate --config=crypto-config.yaml
3.创始块文件和通道文件的生成(复制时请保存在txt文件中,再修改文件名,不然会乱码)
命令介绍:
$ configtxgen --help
# 输出创始块区块文件的路径和名字
`-outputBlock string`
# 指定创建的channel的名字, 如果没指定系统会提供一个默认的名字.
`-channelID string`
# 表示输通道文件路径和名字
`-outputCreateChannelTx string`
# 指定配置文件中的节点
`-profile string`
# 更新channel的配置信息
`-outputAnchorPeersUpdate string`
# 指定所属的组织名称
`-asOrg string`
# 要想执行这个命令, 需要一个配置文件 configtx.yaml
```
配置文件模板:
```yaml
---
################################################################################
#
# Section: Organizations
#
# - This section defines the different organizational identities which will
# be referenced later in the configuration.
#
################################################################################
Organizations: # 固定的不能改
- &OrdererOrg # 排序节点组织, 自己起个名字
Name: OrdererOrg # 排序节点的组织名
ID: OrdererMSP # 排序节点组织的ID
MSPDir: crypto-config/ordererOrganizations/example.com/msp # 组织的msp账号信息
- &Org1 # 第一个组织, 名字自己起
Name: Org1MSP # 第一个组织的名字
ID: Org1MSP # 第一个组织的ID
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
AnchorPeers: # 锚节点
- Host: peer0.org1.example.com # 指定一个peer节点的域名
Port: 7051 # 端口不要改
- &Org2
Name: Org2MSP
ID: Org2MSP
MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
AnchorPeers:
- Host: peer0.org2.example.com
Port: 7051
################################################################################
#
# SECTION: Capabilities, 在fabric1.1之前没有, 设置的时候全部设置为true
#
################################################################################
Capabilities:
Global: &ChannelCapabilities
V1_1: true
Orderer: &OrdererCapabilities
V1_1: true
Application: &ApplicationCapabilities
V1_2: true
################################################################################
#
# SECTION: Application
#
################################################################################
Application: &ApplicationDefaults
Organizations:
################################################################################
#
# SECTION: Orderer
#
##########################