磨链(mochain)社区-4.11分享-Fabric学习笔记-
群内分享
Fabric 学习笔记-架构初探
作者-趣链科技-清源
原文链接:https://zhuanlan.zhihu.com/p/35255567
本文介绍了Fabric的架构,以及通过一个简单的Demo来熟悉整个交易流程。
Hyperledger fabric V1.0的架构
如下图所示:
application提供各种语言的SDK接口。
membership也就是fabric-ca提供成员服务,用来管理身份,提供授权和认证。
peer负责模拟交易和记账
Endorser(背书)用来当peer执行一个交易以后返回yes/no。
Committer将验证过的区块追加到通道上各个账本的副本。
Ledger就是账本啦。
Chaincode用来编写业务逻辑,交易指令用来修改资产,可以理解为 fabric 网络对外提供的一个交互接口(智能合约)。
Event是fabric提供的一个事件框架,比如链代码事件,拒绝事件,注册事件等,在编写代码的时候可以订阅这些事件来实现自己的业务逻辑。
o-service用来实现共识。
交易流程
交易过程如下图所示:
Application向一个或多个peer节点发送对交易的背书请求。
Peer的endorse执行背书,但并不将结果提交到本地账本,只是将结果返回给应用。
应用收集所有背书节点的结果后,将结果广播给orderers,orderers执行共识,生成block,通过消息通道批量的将block发布给peer节点,更新lerdger。
可以看一下下面这张图,一样的过程,更加突出了多个peer背书的过程。
在介绍一下在交易过程中扮演重要角色的channel
channel是构建在Fabric网络上的私有区块链,实现了数据的隔离和保密。channel是由特定的peer所共享的,并且交易方必须通过该通道的正确验证才能与账本进行交互。
如下图所示:
可以看到不同颜色的channel隔离了不同的peer之间的通信。
构建Fabric网络
Fabric提供了一个first-network的demo来学习整个流程。
first-network有两个组织,每个组织各有两个个peer节点,以及一个排序服务。两个peer节点无法达成共识,三个peer节点无法容错,四个peer节点刚好完成演示。
Demo启动以后会自动完成一笔转账,并且打印出整个操作过程。
启动网络以后可以看到非常多的日志,这里我们只追踪关键步骤。
...
##########################################################
######### Generating Orderer Genesis block ##############
##########################################################
2018-02-05 15:13:08.760 CST [common/configtx/tool] main -> INFO 001 Loading configuration
2018-02-05 15:13:08.816 CST [common/configtx/tool] doOutputBlock -> INFO 002 Generating genesis block
2018-02-05 15:13:08.819 CST [common/configtx/tool] doOutputBlock -> INFO 003 Writing genesis block
#################################################################
### Generating channel configuration transaction 'channel.tx' ###
#################################################################
2018-02-05 15:13:08.845 CST [common/configtx/tool] main -> INFO 001 Loading configuration
2018-02-05 15:13:08.849 CST [common/configtx/tool] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
2018-02-05 15:13:08.850 CST [common/configtx/tool] doOutputChannelCreateTx -> INFO 003 Writing new channel tx
#################################################################
####### Generating anchor peer update for Org1MSP ##########
#################################################################
2018-02-05 15:13:08.876 CST [common/configtx/tool] main -> INFO 001 Loading configuration
2018-02-05 15:13:08.880 CST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2018-02-05 15:13:08.881 CST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
...
可以看到,在转账之前首先进行了fabric网络的初始化过程,创建了创世区块,配置了channel和生成了membership(MSP)身份服务。
Channel name : mychannel
Creating channel...
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
CORE_PEER_LOCALMSPID=Org1MSP
CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
CORE_PEER_TLS_ENABLED=true
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ID=cli
CORE_LOGGING_LEVEL=DEBUG
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
2018-02-05 07:13:13.382 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-02-05 07:13:13.382 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-02-05 07:13:13.406 UTC [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized
2018-02-05 07:13:13.409 UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP
dd
接着可以看到在转账前首先创建了channel,其中包括了身份认证的ca文件,key以及通信的socket信息和MSP的信息。
Attempting to Query PEER0 ...3 secs
2018-02-05 07:13:55.998 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-02-05 07:13:55.998 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-02-05 07:13:55.998 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc
2018-02-05 07:13:55.998 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc
2018-02-05 07:13:55.999 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A95070A6708031A0C08B388E0D30510...6D7963631A0A0A0571756572790A0161
2018-02-05 07:13:55.999 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: D6BB27BAC40E5A58ED3CF0AFB147280B60E305053D9B97A38461A398736ED7C7
Query Result: 100
接着在很不起眼的地方看到了上面这些日志,差点看瞎我~重点来了~
在转账之前使用默认的ESCC(背书链码),VSCC(验证链码),以及自身的签名查询了Peer0得到余额是100。
2018-02-05 07:14:14.950 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> DEBU 009 ESCC invoke result: version:1 response: payload:"\n \370\316\5...,k\363_(\n\212\027" >
2018-02-05 07:14:14.952 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 00a Chaincode invoke successful. result: status:200
2018-02-05 07:14:14.953 UTC [main] main -> INFO 00b Exiting.....
===================== Invoke transaction on PEER0 on channel 'mychannel' is successful =====================
调用链码进行转账操作,发现两边的状态码都是200表示转账成功,其中payload是发送转账的一些具体信息。
Attempting to Query PEER3 ...3 secs
2018-02-05 07:14:18.566 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-02-05 07:14:18.566 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-02-05 07:14:18.566 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc
2018-02-05 07:14:18.566 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc
2018-02-05 07:14:18.567 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A95070A6708031A0C08CA88E0D30510...6D7963631A0A0A0571756572790A0161
2018-02-05 07:14:18.567 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: 9E93A6D0549C627788C5074633DE28C9D08F36A4763EFF55479613B2DD32CADB
Query Result: 90
2018-02-05 07:14:37.014 UTC [main] main -> INFO 007 Exiting.....
最后查询Peer3发现余额只有90了,这样就完成了一个最小区块链网络的交易示例。
群内讨论
群内线下活动:
磨链线下聚会-北京 4.15号 下午14:00
地址:北京中关村 3W咖啡
分享内容:
1.北京单向科技 李强:白话DAG : 新一代区块链3.0前沿技术。
磨链线下聚会-深圳 4.21号 下午14:00
地址:深圳南山区蛇口海上世界海景广场15E 牵牛投资俱乐部
分享内容:
1、陈日红 资深区块链开发 比特币技术原理分享
2、南瓜地 区块链技术爱好者 区块链学习之路
磨链(mochain)计划各学习小组动态
磨链(mochain)学习小组清单
PS:想加入学习小组,请加磨链组织者微信(jackyjin09)。欢迎每一位区块链技术爱好者加入磨链,一块琢磨区块链技术
关于磨链和相关合作
磨链”---取磨炼之意,旨在普及区块链技术,磨炼技术,更好投身区块链行业。有兴趣一块琢磨区块链技术,联系笔者微信(jackyjin09)。
磨链社区是一个纯粹的技术社区,欢迎相关技术合作,在不违反原则的前提下,积极参与合作。
你可以在这里找到我们:
磨链社区公众号:
1. 磨链社区:http://mochain.info
2. Github : https://github.com/mochain
3. Gitter 聊天: https://gitter.im/mochain
4. 知识星球: https://t.zsxq.com/M3BMVZN
5. 知乎:https://www.zhihu.com/people/mochain
(持续更新中)