内容简介:兄弟连区块链教程Fabric1.0源代码分析scc(系统链码)cscc(通道相关),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。cscc代码在core/scc/cscc/configure.go。peer.CreateChainFromBlock(block)代码如下:
兄弟连区块链教程Fabric1.0源代码分析scc(系统链码)cscc(通道相关),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。
Fabric 1.0源代码笔记 之 scc(系统链码) #cscc(通道相关)
1、cscc概述
cscc代码在core/scc/cscc/configure.go。
2、PeerConfiger结构体
type PeerConfiger struct { policyChecker policy.PolicyChecker } //代码在core/scc/cscc/configure.go
3、Init方法
func (e *PeerConfiger) Init(stub shim.ChaincodeStubInterface) pb.Response { //初始化策略检查器,用于访问控制 e.policyChecker = policy.NewPolicyChecker( peer.NewChannelPolicyManagerGetter(), mgmt.GetLocalMSP(), mgmt.NewLocalMSPPrincipalGetter(), ) return shim.Success(nil) } //代码在core/scc/cscc/configure.go
4、Invoke方法
func (e *PeerConfiger) Invoke(stub shim.ChaincodeStubInterface) pb.Response { //args[0]为JoinChain或GetChannels args := stub.GetArgs() fname := string(args[0]) //Invoke function sp, err := stub.GetSignedProposal() //获取SignedProposal switch fname { case JoinChain: //加入通道 //此处args[1]为创世区块 block, err := utils.GetBlockFromBlockBytes(args[1]) cid, err := utils.GetChainIDFromBlock(block) err := validateConfigBlock(block) err = e.policyChecker.CheckPolicyNoChannel(mgmt.Admins, sp) return joinChain(cid, block) case GetConfigBlock: err = e.policyChecker.CheckPolicy(string(args[1]), policies.ChannelApplicationReaders, sp) return getConfigBlock(args[1]) case GetChannels: err = e.policyChecker.CheckPolicyNoChannel(mgmt.Members, sp) return getChannels() } } //代码在core/scc/cscc/configure.go
5、其他方法
//校验创世区块 func validateConfigBlock(block *common.Block) error func joinChain(chainID string, block *common.Block) pb.Response func getConfigBlock(chainID []byte) pb.Response func getChannels() pb.Response //代码在core/scc/cscc/configure.go
5.1、joinChain
func joinChain(chainID string, block *common.Block) pb.Response { err := peer.CreateChainFromBlock(block) //创建chain peer.InitChain(chainID) err := producer.SendProducerBlockEvent(block) return shim.Success(nil) } //代码在core/scc/cscc/configure.go
5.1.1、创建Chain(或channel)
peer.CreateChainFromBlock(block)代码如下:
func CreateChainFromBlock(cb *common.Block) error { cid, err := utils.GetChainIDFromBlock(cb) //获取ChainID var l ledger.PeerLedger l, err = ledgermgmt.CreateLedger(cb) //创建Ledger return createChain(cid, l, cb) } //代码在core/peer/peer.go
createChain(cid, l, cb)代码如下:
func createChain(cid string, ledger ledger.PeerLedger, cb *common.Block) error { envelopeConfig, err := utils.ExtractEnvelope(cb, 0) //获取配置Envelope configtxInitializer := configtx.NewInitializer() //type initializer struct gossipEventer := service.GetGossipService().NewConfigEventer() //获取gossipServiceInstance gossipCallbackWrapper := func(cm configtxapi.Manager) { ac, ok := configtxInitializer.ApplicationConfig() if !ok { // TODO, handle a missing ApplicationConfig more gracefully ac = nil } gossipEventer.ProcessConfigUpdate(&chainSupport{ Manager: cm, Application: ac, }) service.GetGossipService().SuspectPeers(func(identity api.PeerIdentityType) bool { // TODO: this is a place-holder that would somehow make the MSP layer suspect // that a given certificate is revoked, or its intermediate CA is revoked. // In the meantime, before we have such an ability, we return true in order // to suspect ALL identities in order to validate all of them. return true }) } trustedRootsCallbackWrapper := func(cm configtxapi.Manager) { updateTrustedRoots(cm) } configtxManager, err := configtx.NewManagerImpl( envelopeConfig, configtxInitializer, []func(cm configtxapi.Manager){gossipCallbackWrapper, trustedRootsCallbackWrapper}, ) if err != nil { return err } // TODO remove once all references to mspmgmt are gone from peer code mspmgmt.XXXSetMSPManager(cid, configtxManager.MSPManager()) ac, ok := configtxInitializer.ApplicationConfig() if !ok { ac = nil } cs := &chainSupport{ Manager: configtxManager, Application: ac, // TODO, refactor as this is accessible through Manager ledger: ledger, } c := committer.NewLedgerCommitterReactive(ledger, txvalidator.NewTxValidator(cs), func(block *common.Block) error { chainID, err := utils.GetChainIDFromBlock(block) if err != nil { return err } return SetCurrConfigBlock(block, chainID) }) ordererAddresses := configtxManager.ChannelConfig().OrdererAddresses() if len(ordererAddresses) == 0 { return errors.New("No ordering service endpoint provided in configuration block") } service.GetGossipService().InitializeChannel(cs.ChainID(), c, ordererAddresses) chains.Lock() defer chains.Unlock() chains.list[cid] = &chain{ cs: cs, cb: cb, committer: c, } return nil } //代码在core/peer/peer.go
补充initializer:
type initializer struct { *resources ppr *policyProposerRoot } //代码在common/configtx/initializer.go
感谢关注兄弟连区块链教程分享!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 区块链教程Fabric1.0源代码分析blockfile区块文件存储2
- 兄弟连区块链教程Fabric1.0源代码分析blockfile区块文件存储一
- Fabric 1.0源代码分析(2) blockfile(区块文件存储)
- 区块链教程Fabric1.0源代码分析configtx#genesis
- 区块链教程Fabric1.0源代码分析Ledger(账本)二
- 区块链教程Fabric1.0源代码分析Ledger(账本)一
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C和C++代码精粹
阿林森 / 董慧颖 / 人民邮电出版社 / 2003-4-1 / 59.00
《C和C++代码精粹》基于作者备受好评的C/C++ User Journal杂志上的每月专栏,通过大量完全符合ISO标准C++的程序集合,说明了C++真正强大的威力,是C和C++职业程序员的实践指南。可以帮助有一定经验的C和C++程序员深入学习这两种密切相关的语言,对书中代码的参悟和应用,可以帮助他们从根本上提高使用程序的效率。一起来看看 《C和C++代码精粹》 这本书的介绍吧!