Skip to content

Instantly share code, notes, and snippets.

@LuoZijun
Last active March 29, 2021 13:15
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LuoZijun/58479ef0eb195afad268ec577b4e1959 to your computer and use it in GitHub Desktop.
Save LuoZijun/58479ef0eb195afad268ec577b4e1959 to your computer and use it in GitHub Desktop.
Fabric 分析笔记

Hyperledger Fabric 分析笔记

Date

04/03 2017

FabricGithub

https://github.com/hyperledger/fabric

FabricVersion

v1.0.0-alpha

介绍

Hyperledger Fabric 项目是 一个分布式中心化区块链。

Fabric CA(Certificate Authority)

它的作用在于为 整个网络的通信节点颁发 数字证书,使整个网络的通信运行在一个安全的加密环境中。该功能并不是必须的(如果你不需要 TLS 加密)

Fabric Orderer

为区块链写入操作提供时序保证(即分布式开发里面的数据竞态问题), 具体实现可以是共识算法(SBFT)或者是分布式的消息订阅消费系统(如 Kafka

Fabric Peer

区块链节点当中的 终端用户或程序(User or Application) , 以 背书(EndorserPeer) 角色或 数据写入(CommitterPeer) 角色运行

Fabric Chaintool

chaintoolChainCode (指智能合约或链码) 的编译器,采用 Clojure 语言编写,所以你得需要 一个 Java 环境 。。。。。

Fabric Configtxgen

这是一个数字证书生成 工具,当然你也可以使用 fabric-ca-server 来生成 证书。

可执行文件列表:

peer

github.com/hyperledger/fabric/peer/main.go

orderer

github.com/hyperledger/fabric/orderer/main.go

ca-server

github.com/hyperledger/fabric-ca/cmd/fabric-ca-server/main.go

ca-client

github.com/hyperledger/fabric-ca/cmd/fabric-ca-client/main.go

configtxgen

github.com/hyperledger/fabric/common/configtx/tool/configtxgen/main.go

cert-gen

github.com/hyperledger/fabric/core/comm/testdata/certs/generate.go

chaintool

https://github.com/hyperledger/fabric-chaintool

架构运作模式

Node:

一个 Orderer 和 若干个 Peer 组成 一个 节点(Node)

        Orderer
  |     |     |     |
Peer0 Peer1 Peer2 PeerN

Network:

若干个 节点(Node) 组成 区块链网络.

水平网络:

    Node0  <--> Node1 <--> Node2 <--> NodeN

垂直网络

    Node0  <--> Node1  <--> Node2  <--> NodeN
                 |           |
        Node1-1 (Sub Node)  Node2-1(Sub Node)

消歧义: ChainChannel

以太坊 区块链架构当中, Chain 指 一个独立的 区块链。比如代号 FrontierHomestead以太坊 并没有 Channel 的概念。

Fabric 架构里面, Channel 概念和 Chain 概念比较模糊(体现在代码层次上) , 当然从文档描述上来看, Channel 指 一条 Chain 里面的多个分区。即 多个 Channel 共用一条 Chain

值得一提的是, 在 Fabric 当前的存储结构中,并没有把该概念清晰的体现出来。

Fabric 存储结构:

/var/hyperledger/production/ledgersData/chains/chains/
    channel-1/
    channel-2/

实际上应该是这样:

/var/hyperledger/production/ledgersData/chains/chains/
    chain-1/
        channel-1/
        channel-2/

该概念目前在代码当中的定位并不清晰 ,比如 配置层面 (Config) , Fabric 也把 ChainChannel 一直在混用:

peer channel create --chain testchain
# 正确的应该是: peer channel create --chain Homestead --channel testchannel

官方测试结果

以下测试数据来源 Hyperledger Fabric 项目组官方报告。

版本 v1.0.0-alpha

共识算法测试:

  1. [通过] SOLO
  2. [通过] Kafka (基于 分布式消息订阅消费系统 Apache Kafka 实现的 所谓 "共识" )
  3. [未测试] SBFT

Note

经过测试, v1.0.0-alpha 版本的 SBFT 共识算法无法通过。

详细测试结果及场景: v1.0 Release Testing

已知BUG

官方 BUG 汇报收集地址 : fab-issues

已复现严重(并且至今未修复):

  • [严重] [FAB-2951] , Instantiate Chaincode Fails (GRPC: Timed OUT)
  • [严重] [FAB-2922] , Chaincode names and version with periods fail query.

Note

这些 BUG 意味着 我们的 代码无法正常 运行下去。

未复现 BUG:

  • [严重] [FAB-2955] , back to register enroll unroll seem to fail - timing related.
  • [严重] [FAB-2957] , After upgrading the chaincode to newer version, unable to query the older version of chaincode
  • [严重] [FAB-2942] , Enabling TLS causes problems for peer who isn't a gossip leader
  • [严重] [FAB-2865] , Modifying chaincode and compiling causes a failure on cli install command

Note

这些 BUG 意味着,我们可以通过 预设的 DEMO 测试,但在正常操作可能会出现的问题(比如升级 ChainCode, GetChainCode 等 )

编译目标

二进制目标文件:

bin/peer
bin/orderer
bin/ca-server
bin/ca-client
bin/configtxgen
bin/certgen
bin/chaintool

前置依赖:

# java >= 8
brew install caskroom/cask/java
# Golang >= 1.8
brew install golang@1.8

Makefile:

PROJECT_NAME   = fabric
BASE_VERSION   = v1.0.0-alpha

export GOPATH = $(PWD)

ifeq ($(shell uname),Darwin)
    export GOROOT = /usr/local/Cellar/go/1.8/libexec
endif

ifeq ($(shell uname),Linux)
    export GOROOT = /usr/local/go
endif

# Go version  >= 1.8
GO             = $(GOROOT)/bin/go
export ORDERER_CFG_PATH = $(PWD)/config/orderer

$(GOPATH)/src/github.com/hyperledger/fabric: 
    $(GO) get github.com/hyperledger/fabric;
    cd $(GOPATH)/src/github.com/hyperledger/fabric;
    git checkout $(BASE_VERSION);

$(GOPATH)/src/github.com/hyperledger/fabric-ca:
    $(GO) get github.com/hyperledger/fabric-ca;
    @cd $(GOPATH)/src/github.com/hyperledger/fabric-ca;
    git checkout $(BASE_VERSION);

$(GOPATH)/src/github.com/hyperledger/fabric/common/configtx/tool/configtx/configtxgen/main.go:
    $(GO) get github.com/hyperledger/fabric;
    @cd $(GOPATH)/src/github.com/hyperledger/fabric;
    git checkout $(BASE_VERSION);

$(GOPATH)/src/github.com/hyperledger/fabric-chaintool:
    $(GO) get github.com/hyperledger/fabric-chaintool;
    @cd $(GOPATH)/src/github.com/hyperledger/fabric-chaintool;
    git checkout v0.10.3;


default: all

all: peer orderer ca-server ca-client configtxgen certgen

peer: bin/peer
orderer: bin/orderer
ca-server: bin/ca-server
ca-client: bin/ca-client
configtxgen: bin/configtxgen
certgen: bin/certgen
chaintool: bin/chaintool

bin/peer: $(GOPATH)/src/github.com/hyperledger/fabric
    echo 'GOPATH: $(GOPATH) ';
    $(GO) build -o bin/peer github.com/hyperledger/fabric/peer;

bin/orderer: $(GOPATH)/src/github.com/hyperledger/fabric
    echo 'GOPATH: $(GOPATH) ';
    $(GO) build -o bin/orderer github.com/hyperledger/fabric/orderer;

bin/ca-server: $(GOPATH)/src/github.com/hyperledger/fabric-ca
    echo 'GOPATH: $(GOPATH) ';
    $(GO) build -o bin/ca-server github.com/hyperledger/fabric-ca/cmd/fabric-ca-server;

bin/ca-client: $(GOPATH)/src/github.com/hyperledger/fabric-ca
    echo 'GOPATH: $(GOPATH) ';
    $(GO) build -o bin/ca-client github.com/hyperledger/fabric-ca/cmd/fabric-ca-client;

bin/configtxgen: $(GOPATH)/src/github.com/hyperledger/fabric/common/configtx/tool/configtxgen/main.go
    echo 'GOPATH: $(GOPATH) ';
    echo "Building configtxgen";
    $(GO) build -o bin/configtxgen github.com/hyperledger/fabric/common/configtx/tool/configtxgen;

bin/certgen: $(GOPATH)/src/github.com/hyperledger/fabric/core/comm/testdata/certs/generate.go
    echo 'GOPATH: $(GOPATH) ';
    $(GO) build -o bin/certgen $(GOPATH)/src/github.com/hyperledger/fabric/core/comm/testdata/certs/generate.go;

bin/chaintool: $(GOPATH)/src/github.com/hyperledger/fabric-chaintool
    echo 'GOPATH: $(GOPATH) ';
    cd $(GOPATH)/src/github.com/hyperledger/fabric-chaintool;
    make
    cp target/chaintool $(GOPATH)/bin/
    cd $(GOPATH)/


.PHONY: config
config:
    echo "ORDERER_CFG_PATH: $(ORDERER_CFG_PATH)"
    echo "Generating genesis block ... "
    ./bin/configtxgen -profile TwoOrgs -outputBlock config/orderer/orderer.block

    echo "Generating channel configuration transaction ... "
    ./bin/configtxgen -profile TwoOrgs -outputCreateChannelTx config/orderer/channel.tx -channelID "article"

Docker Images:

docker pull hyperledger/fabric-ccenv:x86_64-1.0.0-alpha    ## Chaintool Env
docker pull hyperledger/fabric-javaenv:x86_64-1.0.0-alpha  ## Chaintool
docker pull hyperledger/fabric-peer:x86_64-1.0.0-alpha
docker pull hyperledger/fabric-ca:x86_64-1.0.0-alpha
docker pull hyperledger/fabric-orderer:x86_64-1.0.0-alpha

# Optional
docker pull hyperledger/fabric-couchdb:x86_64-1.0.0-alpha   ## LevelDB or CouchDB
docker pull hyperledger/fabric-kafka:x86_64-1.0.0-alpha     ## Kafka
docker pull hyperledger/fabric-zookeeper:x86_64-1.0.0-alpha ## Kafka Broker
docker pull hyperledger/fabric-sdk-py:0.1                   ## Python SDK

# Version Tag
docker tag hyperledger/fabric-ccenv:x86_64-1.0.0-alpha hyperledger/fabric-ccenv:latest
docker tag hyperledger/fabric-javaenv:x86_64-1.0.0-alpha hyperledger/fabric-javaenv:latest
docker tag hyperledger/fabric-peer:x86_64-1.0.0-alpha hyperledger/fabric-peer:latest
docker tag hyperledger/fabric-ca:x86_64-1.0.0-alpha hyperledger/fabric-ca:latest
docker tag hyperledger/fabric-orderer:x86_64-1.0.0-alpha hyperledger/fabric-orderer:latest
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment