fabric
<h4>1.fabric是什么?</h4>
<h5>- 做企业级联盟链的基础设施</h5>
<h5>- 可插拔的共识机制(solo和kafka等)</h5>
<h5>- 多链多通道隔离,做业务隔离,保护业务数据隐私</h5>
<h4>2.fabric的channel</h4>
<ul>
<li>每个channel可以理解成独立的fabric实例</li>
<li>不同的channel是私有的子网,类似于微信群,隔离业务数据</li>
<li>peer是微信里的人,peer可以加入不同的channel</li>
<li>还可以设置允许什么人加入</li>
</ul>
<h4>3.fabric的chaincode</h4>
<ul>
<li>chaincode(链码)就是智能合约,是一个应用程序</li>
<li>用于更新账本数据,由peer去执行chaincode</li>
<li>在fabirc里,chaincode是数据唯一的更新的方式</li>
<li>chaincode属于某一个channel的</li>
</ul>
<h5>chaincode是生命周期</h5>
<ul>
<li>安装链码</li>
<li>实例化(调用init方法)</li>
<li>调用使用(调用invoke方法)</li>
<li>每个chaincode有不同的背书策略(如何去达成共识)
可能有的chaincode是所有人都同意才可以
可能有的chaincode是至少有一个人同意才可以
可能有的chaincode是有4个人同意才可以
<h4>4. fabirc系统架构</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/bb43300b03acffe57596f8f82a50f602?showdoc=.jpg" alt="" /></p>
<h5>应用层</h5></li>
<li>API:提供了GRPC,RPC框架</li>
<li>SDK:在API基础上封装的SDK,go、java、python、nodejs</li>
<li>事件:分布式系统中,达成共识需要一定时间,fabric使用异步通信模式开发,触发回调函数执行</li>
<li>身份:依托于底层的成员服务,是联盟链的认证功能,例如CA</li>
<li>账本:区块链的查询数据,是账本中查出来的,区块高度+交易ID,不重复</li>
<li>交易: 对区块链数据进行修改,先提交交易到背书节点,签名认证之后再执行</li>
<li>智能合约:做合约的安装、实例化和升级
<h5>区块链底层</h5></li>
<li>成员服务:提供证书,用于加密和签名</li>
<li>共识服务:fabric的共识大概分为3个阶段
<ul>
<li>首先客户端向背书节点发送一个背书提案,背书节点进行交易模拟,将背书结果和签名返回给客户端</li>
<li>然后将背书后的交易,交给排序节点进行排序,由排序节点生成区块,向全网广播,网络节点接收到广播后,先验证区块交易的正确性</li>
<li>验证通过后,存入本地账本</li>
<li>PS:排序节点与组织的锚节点使用的是GRPC通信,组织内使用的是gossip协议通信</li>
</ul></li>
<li>链码服务:提供安全的、可隔离的交易环境,所以fabric使用docker,链码直接与docker通信
<h4>5.网络拓扑图</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/daa958c7682a5fd331b02a8a5132642d?showdoc=.jpg" alt="" /></p></li>
<li>客户端节点:应用程序和底层的交互媒介,与上层和peer和orderer连接发挥作用,连接peer做交易模拟</li>
<li>peer节点:
<ul>
<li>包含了锚节点(主节点),在一个组织内可以有多个peer,一个组织中锚节点只有一个,锚节点作用(与orderer进行通信),锚节点需要HA支持,若锚节点挂了,组织内会选举新的节点与orderer节点进行通信
背书节点(Endorse)理解为担保,与智能合约绑定的,每一个智能合约安装到区块链中,会有一个专属的背书策略</li>
<li>记账节点(committer)所有的peer节点都是记账节点,用于验证从orderer接收到的区块,验证交易的有效性,验证通过后,同步到本地账本</li>
<li>orderer节点:排序节点,接收全网客户端节点的交易信息,按照一定规则进行排序,将排序好的交易,按照固定的时间间隔打包成区块,与其他组织的主节点进行通信,排序可以用solo(整个网络中只有一个排序节点)和kafka(分布式消息队列)模式</li>
</ul></li>
<li>注册登记:由客户端发起,向CA机构表明自己的身份,获取证书,上图中是第三方的CA,也可以使用官方提供的CA</li>
<li>交易提案:向组织的背书节点提交请求,对应peer节点,组织可以理解为现实中的商业主体,组织是独立的,有两个数据来源</li>
<li>提交交易:客户端节点向排序节点发请求,orderer内部进行排序打包成区块,广播给其他组织的锚节点,上图是基于kafka的实现的,每个组织会选择一个orderer节点进行通信
<h4>6.交易流程图</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f67a8772ece6892118e53efdae548aa3?showdoc=.jpg" alt="" /></p></li>
<li>客户端提交交易,最终到记账节点同步数据</li>
<li>智能合约安装要指定背书节点,正常情况下,背书节点返回相同的结果,但签名是不一样的</li>
<li>背书节点是模拟的过程,不会持久化</li>
<li>1,2,3步是交易模拟,4,5,6步的交易排序,7,8,9是交易同步和记账,交易模拟对应智能合约,交易排序对应共识机制,同步和记账对应账本存储
<h4>7.fabirc账本存储</h4></li>
<li>peer节点做账本存储</li>
<li>orderer是临时存储区块,peer节点是账本存储的持久化,会改变世界状态</li>
<li>文件系统,区块是存储为文件</li>
<li>区块索引,用于查询区块,是用levleDB实现的</li>
<li>状态数据库,一般存放区块链最新状态,数据不需要HA,可以从文件系统再次获取,couchDB支持模糊查询
<h4>交易读写集</h4></li>
<li>读集:包含键的列表,键的提交版本,读取对应的值,返回的是已提交的状态的值(读已提交),不能读取交易过程中写入的数据</li>
<li>写集:包含键的列表,写入的数据的值,如果多次写入,以最后一次为准</li>
<li>版本号:用区块高度和交易编号组成的</li>
<li>交易验证阶段是对读写集进行验证(验证读集)
<ul>
<li>验证读集的版本号是否等于世界状态的版本号
<h4>8.fabirc链码</h4></li>
</ul></li>
<li>执行环境:以太坊虚拟智能合约执行环境EVM,fabric执行环境是docker</li>
<li>链码
<ul>
<li>应用层和区块链底层的中间点</li>
<li>每一个链码执行环境是一个独立的docker</li>
<li>使用GRPC协议与背书节点通信,只有背书节点才能运行智能合约</li>
</ul></li>
<li>链码的生命周期
<ul>
<li>打包,智能合约的编写和编译</li>
<li>安装,将打包好的文件,上传到背书节点</li>
<li>实例化,实际的安装了,执行Init方法,只执行一次,构造函数</li>
<li>升级,升级和修复链码</li>
<li>交互,自己定义的方法的调用</li>
</ul></li>
<li>链码的交互流程</li>
</ul>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/072180b86ac77f195f0499a99c48212c?showdoc=.jpg" alt="" /></p>
<pre><code>搭建网络
⽣成初始区块:
../bin/cryptogen generate --config=./crypto-config.yaml
export FABRIC_CFG_PATH=$PWD
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
⽣成通道的创世交易:
export CHANNEL_NAME=mychannel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
⽣成锚节点配置更新文件:
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
启动网络:
CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=600 docker-compose -f docker-compose-cli.yaml up -d
进⼊ docker 容器:
docker exec -it cli bash
创建通道:
export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
加入通道:
peer channel join -b mychannel.block
安装链码:
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
实例化链码:
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
查询:
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
转账:
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'</code></pre>