区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现

简介:

  兄弟连区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。

Fabric1.0源代码笔记之Peer peer channel命令及子命令实现

1、peer channel create子命令实现(创建通道)

1.1、初始化Orderer客户端

const (
    EndorserRequired    EndorserRequirement = true
    EndorserNotRequired EndorserRequirement = false
    OrdererRequired     OrdererRequirement  = true
    OrdererNotRequired  OrdererRequirement  = false
)

cf, err = InitCmdFactory(EndorserNotRequired, OrdererRequired)
//代码在peer/channel/create.go

cf, err = InitCmdFactory(EndorserNotRequired, OrdererRequired)代码如下:

type ChannelCmdFactory struct {
    EndorserClient   pb.EndorserClient //EndorserClient
    Signer           msp.SigningIdentity //Signer
    BroadcastClient  common.BroadcastClient //BroadcastClient
    DeliverClient    deliverClientIntf //DeliverClient
    BroadcastFactory BroadcastClientFactory //BroadcastClientFactory,type BroadcastClientFactory func() (common.BroadcastClient, error)
}

func InitCmdFactory(isEndorserRequired EndorserRequirement, isOrdererRequired OrdererRequirement) (*ChannelCmdFactory, error) {
    var err error
    cmdFact := &ChannelCmdFactory{}
    cmdFact.Signer, err = common.GetDefaultSignerFnc() //GetDefaultSignerFnc = GetDefaultSigner

    cmdFact.BroadcastFactory = func() (common.BroadcastClient, error) {
        return common.GetBroadcastClientFnc(orderingEndpoint, tls, caFile) //GetBroadcastClientFnc = GetBroadcastClient
    }

    //peer channel join或list需要endorser,本处暂未使用
    if isEndorserRequired {
        cmdFact.EndorserClient, err = common.GetEndorserClientFnc()
    }

    //peer channel create或fetch需要orderer
    if isOrdererRequired {
        var opts []grpc.DialOption
        if tls {
            if caFile != "" {
                creds, err := credentials.NewClientTLSFromFile(caFile, "")
                opts = append(opts, grpc.WithTransportCredentials(creds))
            }
        } else {
            opts = append(opts, grpc.WithInsecure())
        }
        conn, err := grpc.Dial(orderingEndpoint, opts...)
        client, err := ab.NewAtomicBroadcastClient(conn).Deliver(context.TODO())
        cmdFact.DeliverClient = newDeliverClient(conn, client, chainID) //构造deliverClient
    }
    return cmdFact, nil
}

//代码在peer/channel/channel.go

1.2、发送创建区块链的交易

err = sendCreateChainTransaction(cf)
//代码在peer/channel/create.go

sendCreateChainTransaction(cf)代码如下:

func sendCreateChainTransaction(cf *ChannelCmdFactory) error {
    var err error
    var chCrtEnv *cb.Envelope

    if channelTxFile != "" { //peer channel create -f指定通道交易配置文件
        chCrtEnv, err = createChannelFromConfigTx(channelTxFile) //获取创世区块
    } else {
        chCrtEnv, err = createChannelFromDefaults(cf) //没有指定通道交易配置文件
    }

    chCrtEnv, err = sanityCheckAndSignConfigTx(chCrtEnv) //检查和签名交易配置
    var broadcastClient common.BroadcastClient
    broadcastClient, err = cf.BroadcastFactory()
    defer broadcastClient.Close()
    err = broadcastClient.Send(chCrtEnv)
    return err
}
//代码在peer/channel/create.go

1.3、获取创世区块并写入文件

var block *cb.Block
block, err = getGenesisBlock(cf) //获取创世区块
b, err := proto.Marshal(block) //块序列化
err = ioutil.WriteFile(file, b, 0644) //写入文件
//代码在peer/channel/create.go

2、peer channel join子命令实现(加入通道)

2.1、初始化Endorser客户端

cf, err = InitCmdFactory(EndorserRequired, OrdererNotRequired)
//代码在peer/channel/join.go

2.2、构造ChaincodeInvocationSpec消息(cscc.JoinChain)

spec, err := getJoinCCSpec()
invocation := &pb.ChaincodeInvocationSpec{ChaincodeSpec: spec}
//代码在peer/channel/join.go

spec, err := getJoinCCSpec()代码如下:

func getJoinCCSpec() (*pb.ChaincodeSpec, error) {
    gb, err := ioutil.ReadFile(genesisBlockPath)
    input := &pb.ChaincodeInput{Args: [][]byte{[]byte(cscc.JoinChain), gb}}
    spec := &pb.ChaincodeSpec{
        Type:        pb.ChaincodeSpec_Type(pb.ChaincodeSpec_Type_value["GOLANG"]),
        ChaincodeId: &pb.ChaincodeID{Name: "cscc"},
        Input:       input,
    }
    return spec, nil
}
//代码在peer/channel/join.go

2.3、创建cscc Proposal并签名

creator, err := cf.Signer.Serialize()
//从CIS创建Proposal,CIS即ChaincodeInvocationSpec
//调用CreateChaincodeProposal(typ, chainID, cis, creator)
//而后调用CreateChaincodeProposalWithTransient(typ, chainID, cis, creator, nil)
prop, _, err = putils.CreateProposalFromCIS(pcommon.HeaderType_CONFIG, "", invocation, creator)
var signedProp *pb.SignedProposal
signedProp, err = putils.GetSignedProposal(prop, cf.Signer)
//代码在peer/channel/join.go

CreateChaincodeProposalWithTransient(typ, chainID, cis, creator, nil)代码如下:

func CreateChaincodeProposalWithTransient(typ common.HeaderType, chainID string, cis *peer.ChaincodeInvocationSpec, creator []byte, transientMap map[string][]byte) (*peer.Proposal, str    ing, error) {
    //创建随机Nonce
    nonce, err := crypto.GetRandomNonce()
    //计算交易ID
    //digest, err := factory.GetDefault().Hash(append(nonce, creator...),&bccsp.SHA256Opts{})
    txid, err := ComputeProposalTxID(nonce, creator)
    return CreateChaincodeProposalWithTxIDNonceAndTransient(txid, typ, chainID, cis, nonce, creator, transientMap)
}
//代码在protos/utils/proputils.go

CreateChaincodeProposalWithTxIDNonceAndTransient(txid, typ, chainID, cis, nonce, creator, transientMap)代码如下:

func CreateChaincodeProposalWithTxIDNonceAndTransient(txid string, typ common.HeaderType, chainID string, cis *peer.ChaincodeInvocationSpec, nonce, creator []byte, transientMap map[string][]byte) (*peer.Proposal, string, error) {
    ccHdrExt := &peer.ChaincodeHeaderExtension{ChaincodeId: cis.ChaincodeSpec.ChaincodeId}
    ccHdrExtBytes, err := proto.Marshal(ccHdrExt)
    cisBytes, err := proto.Marshal(cis)
    ccPropPayload := &peer.ChaincodeProposalPayload{Input: cisBytes, TransientMap: transientMap}
    ccPropPayloadBytes, err := proto.Marshal(ccPropPayload)
    var epoch uint64 = 0
    timestamp := util.CreateUtcTimestamp()
    hdr := &common.Header{ChannelHeader: MarshalOrPanic(&common.ChannelHeader{
        Type:      int32(typ),
        TxId:      txid,
        Timestamp: timestamp,
        ChannelId: chainID,
        Extension: ccHdrExtBytes,
        Epoch:     epoch}),
        SignatureHeader: MarshalOrPanic(&common.SignatureHeader{Nonce: nonce, Creator: creator})}
    hdrBytes, err := proto.Marshal(hdr)
    return &peer.Proposal{Header: hdrBytes, Payload: ccPropPayloadBytes}, txid, nil
}
//代码在protos/utils/proputils.go

2.4、提交并处理Proposal

var proposalResp *pb.ProposalResponse
proposalResp, err = cf.EndorserClient.ProcessProposal(context.Background(), signedProp)
//代码在peer/channel/join.go

3、peer channel update(更新锚节点配置)

cf, err = InitCmdFactory(EndorserNotRequired, OrdererRequired)
fileData, err := ioutil.ReadFile(channelTxFile)
ctxEnv, err := utils.UnmarshalEnvelope(fileData)
sCtxEnv, err := sanityCheckAndSignConfigTx(ctxEnv)
var broadcastClient common.BroadcastClient
broadcastClient, err = cf.BroadcastFactory()
defer broadcastClient.Close()
return broadcastClient.Send(sCtxEnv)
//代码在peer/channel

感谢关注兄弟连区块链教程分享!

相关文章
|
1月前
|
存储 供应链 监控
区块链技术在供应链管理中的应用与前景分析
随着信息化时代的到来,供应链管理面临着越来越多的挑战和机遇。本文主要探讨了区块链技术在供应链管理中的应用,以及未来的发展前景。通过对区块链技术的特点和优势进行分析,结合实际案例和趋势展望,展示了区块链技术在提升供应链透明度、效率和安全性方面的潜力,以及未来发展的可能方向。
|
21天前
|
存储 供应链 安全
基于区块链技术的智能合约安全性分析
【5月更文挑战第31天】本文深入探讨了区块链技术中智能合约的安全性问题,通过分析现有智能合约的安全漏洞和攻击手段,提出了一系列增强智能合约安全性的策略。文章首先介绍了区块链和智能合约的基本概念,随后详细讨论了智能合约面临的安全挑战,包括代码漏洞、重入攻击等问题,并对比分析了不同平台下智能合约的安全性差异。最后,文章提出了一系列提高智能合约安全性的建议,旨在为区块链应用的健康发展提供参考。
|
1天前
|
区块链
近期区块链市场趋势分析
**区块链市场趋势摘要:** - 跨链技术成熟,提升互操作性,助力区块链网络融合。 - DeFi持续繁荣,智能合约与AMM创新活跃,市场竞争驱动市场壮大。 - NFT市场多样化,拓展至游戏、音乐等领域,实用性增强。 - 区块链寻求绿色转型,通过PoS共识与绿色能源减少能耗。 - 技术模块化、可组合性提升,降低成本,增强系统灵活性。 这些趋势展现区块链潜力,带来机遇与挑战,促进行业创新。
|
27天前
|
存储 算法 安全
区块链系统开发技术规则分析
区块链核心技术包括:1) 哈希算法,利用单向函数将任意数据转化为固定长度代码,确保安全验证;2) 非对称加密,使用公钥和私钥一对进行加密解密,保证信息安全;3) 共识机制,如PoW、PoS、DPoS等,实现快速交易验证和确认;4) 智能合约,自动执行的可信代码,一旦编写即不可更改,用于自动化交易;5) 分布式存储,将数据分散存储在网络各处,涵盖结构化、非结构化和半结构化数据。
|
1月前
|
供应链 区块链 数据安全/隐私保护
探索区块链技术在金融领域的应用与前景分析
本文将深入探讨区块链技术在金融领域的具体应用场景,分析其优势与挑战,并展望未来发展趋势。通过案例分析和技术解析,揭示区块链技术在金融行业中的革新意义及前景。
221 15
|
11月前
Minecraft Fabric 教程 #8 添加附魔书
这就创建了一个FireBoom附魔书 onTargetDamaged //当目标被攻击 在mc FireballEntity类有一个 方法就是当火球碰撞了就创建一个火焰爆炸的效果
49 0
|
11月前
Minecraft Fabric 教程 #4 添加分组
在 ItemGroup 显示 使用 FabricItemGroupBuilder
40 0
|
9月前
|
区块链
区块链的发币流程技术分析
区块链现在是发展的如火如荼,很多人都想趁着这个风口,投入区块链创业的浪潮中。 那么我们该怎么做才能抓住这个机会呢? 进行区块链发币要求是很多的,主要有以下几个步骤。
|
9月前
|
安全 算法 区块链
区块链交易所开发技术说明:智能合约设计与实现步骤实现分析
智能合约是区块链技术的核心应用,其能够自动执行、验证和执行合同,并以可验证的方式进行操作。在区块链交易所中,智能合约扮演着重要的角色,它们保证了交易的透明性、效率和安全性。作为一名专业的交易所开发团队一员,在交易所开发这块拥有相对成熟的开发技术,目前已经有成熟的区块链交易所开发案例。本文将介绍如何设计和实现可靠的智能合约来支持区块链交易所。
|
9月前
|
区块链 安全 数据安全/隐私保护
区块链LP流动性SWAP博饼交易所系统开发分析模式
Web3在生态的每一个要素中,都体现出了去中心化的特点。

热门文章

最新文章