超级账本源码解析之MSP

本系列目录:超级账本源码(V1.3)解析目录

Cryptogen

为了更好的理解Fabric中MSP是如何工作的,我们先通过源码来看一下Fabric提供的Cryptogen这个命令行工具到底做了什么。

核心代码在common/tools/cryptogen这个目录下,目录树如下:

cryptogen
├── ca
│   ├── ca_test.go
│   └── generator.go
├── csp
│   ├── csp.go
│   └── csp_test.go
├── main.go
├── metadata
│   ├── metadata.go
│   └── metadata_test.go
└── msp
    ├── generator.go
    ├── msp_internal_test.go
    └── msp_test.go

该命令需要指定一个配置文件作为输入,我们使用了first-network中默认的配置文件crypto-config.yaml,运行该命令后,生成了crypto-config目录,里面包含了生成的相关证书和秘钥等文件。

crypto-config.yaml文件如下:

# ---------------------------------------------------------------------------
# "OrdererOrgs" - Definition of organizations managing orderer nodes
# ---------------------------------------------------------------------------
OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Specs:
      - Hostname: orderer

# ---------------------------------------------------------------------------
# "PeerOrgs" - Definition of organizations managing peer nodes
# ---------------------------------------------------------------------------
PeerOrgs:
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Template:
      Count: 2  # peer数量
    Users:
      Count: 1  # user数量
      
  - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

执行cryptogen generate --config=crypto-config.yaml后,对每一个Org(Orderer、Org1 、Org2)依次生成了

  1. 签名CA的私钥和自签名证书
  2. TLS CA的私钥和自签名证书
  3. 该Org的msp,其中包含签名CA和TLS CA的证书(cacerts和tlscacerts),以及一个管理员证书(admincerts,临时的),如果支持nodeOU还会成成一个config.yaml
  4. 生成该Org的peer的证书相关的材料:包含一对公私钥(以及签名CA签名的证书)和另一对公私钥(以及tls CA签名的证书),同时将两个CA的证书复制到该peer的msp目录下,将签名公钥对应的证书作为临时的管理员证书(admincerts)
  5. 生成该Org的user的证书相关的材料:除了crypto-config.yamlCount指定的user数量外,还生成了一个管理员用户admin,都是两对公私钥以及对应CA为其签名的证书,将签名CA颁发的证书同时作为该user的管理员证书,同时将admin用户的管理员证书复制到该Org的msp以及peer的msp下的管理员证书目录(替换掉临时的证书)

总之,每个组织都有自己的CA(一个签名CA、一个TLS CA),该组织的成员(peer或者user)下的msp目录都含有这两个CA的证书和该成员自身的公私钥及证书(由签名CA颁发),每个组织默认生成一个管理员用户(admin),该admin的证书被复制到该组织的msp目录以及各peer的msp目录下。

MSP初始化

在peer启动时,调用了peer/common/common.go中的InitCmd函数,然后调用了InitCrypto函数,其中设置了该peer的加密参数,并调用了msp/mgmt/mgmt.go中的LoadLocalMspWithType函数初始化该peer的msp。

LoadLocalMspWithType函数读取了该peer对应的msp目录下的相关文件生成了msp config,并最终调用了msp/mspimpl.go下的Setup根据该config初始化了MSP。

func (msp *bccspmsp) preSetupV1(conf *m.FabricMSPConfig) error {
	// setup crypto config
	if err := msp.setupCrypto(conf); err != nil {
		return err
	}

	// Setup CAs
	if err := msp.setupCAs(conf); err != nil {
		return err
	}

	// Setup Admins
	if err := msp.setupAdmins(conf); err != nil {
		return err
	}

	// Setup CRLs
	if err := msp.setupCRLs(conf); err != nil {
		return err
	}

	// Finalize setup of the CAs
	if err := msp.finalizeSetupCAs(conf); err != nil {
		return err
	}

	// setup the signer (if present)
	if err := msp.setupSigningIdentity(conf); err != nil {
		return err
	}

	// setup TLS CAs
	if err := msp.setupTLSCAs(conf); err != nil {
		return err
	}

	// setup the OUs
	if err := msp.setupOUs(conf); err != nil {
		return err
	}

	return nil
}

MSP如何参与到Fabric中的各方面

接下来我们通过解析一个交易的完整生命周期来说明MSP的作用。

发起一个交易,从peer/chaincode/invoke.gochaincodeInvoke函数开始;

  1. InitCmdFactory中通过signer, err := common.GetDefaultSignerFnc()获取了该peer的私钥(signer)用来后续签名使用。
  2. peer/chaincode/common.gopeer/chaincode/common.go函数中完成交易流程
    1. 创建了proposal(包含了creator,也就是签名者(的公钥和mspid)),调用signedProp, err := putils.GetSignedProposal(prop, signer)对proposal签名
    2. 通过grpc调用了core/endorser/endorser.go中的ProcessProposal来为该交易背书,其中在preProcess函数中,调用了core/common/validation/msgvalidation.go中的ValidateProposalMessage函数
    3. ValidateProposalMessage函数中,err = checkSignatureFromCreator(shdr.Creator, signedProp.Signature, signedProp.ProposalBytes, chdr.ChannelId) 检查了该proposal的签名的有效性
    4. core/endorser/endorser.go中的endorseProposal函数最终调用core/handlers/endorsement/builtin/default_endorsement.go中的Endorse创建了endorsement,使用该peer的私钥为该交易签名背书
    5. 当client收集到足够的endorsement后,使用env, err := putils.CreateSignedTx(prop, signer, responses...)创建了该交易的envelop(包含了endorsement)并为其签名,发给orderer。
    6. orderer将envelop打包成block,最终发给fabric网络中的其他peer。
    7. 其他peer启动【VSCC】【MVCC】【Commit】过程,交易结束。其中在VSCC过程中验证了该tx的envelop签名,并检查该envelop中携带的的endorsements是否满足该chaincode的endorsement policy(TODO)。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hyperledger (超级本)是区块链行业中最大的项目之一,它由一组开源工具和多个子项目组成。该项目是由 Linux 基金会主办的一个全球协作项目,其中包括一些不同领域的LEADER们,这些leader的目标是建立一个强大的、业务驱动的区块链框架。 区块链网络主要有三种类型:公共区块链、联盟或联合区块链,以及私有区块链。Hyperledger 是一个区块链框架,旨在帮助公司建立私人或联盟许可的区块链网络,在该网络中,多个组织可以共享控制和操作网络内节点的权限。 因为区块链是一个透明的,基于不可变模式的安全的去中心化系统,所以它被认为是传统的供应链行业改变游戏规则的一种解决方案。它可以通过以下方式支持有效的供应链系统: 跟踪整个区块链中的产品 校验和验证区块链中的产品 在供应链参与者之间共享整个区块链的信息 提供可审核性 本文通过食品供应链的例子来解释 Hyperledger 区块链是如何改变传统供应链系统的。 食品行业供应链 传统供应链效率低下的主要原因是由于缺乏透明度而导致报告不可靠和竞争上的劣势。 在传统的供应链模式中,有关实体的信息对该区块链中的其他人来说并不完全透明,这就导致了不准确的报告和缺乏互操作性问题。电子邮件和印刷文档提供了一些信息,但它们不可能包含完整详细的可见性数据,因为很难在整个供应链中去追踪产品。这也使消费者几乎不可能知道产品的真正价值和来源。 食品行业的供应链环境复杂,多个参与者需要协作将货物运送到最终目的地 —— 客户手中。下图显示了食品供应链(多级)网络中的主要参与者。  典型的食品供应链 该区块链的每个阶段都会引入潜在的安全问题、整合问题和其他低效问题。目前食品供应链中的主要威胁仍然是假冒食品和食品欺诈。 基于 Hyperledger 区块链的食品跟踪系统可实现对食品信息全面的可视性和和可追溯性。更重要的是,它以一种不变但可行的方式来记录产品细节,确保食品信息的真实性。最终用户通过在不可变框架上共享产品的详细信息,可以自我验证产品的真实性。 Hyperledger Fabric Hyperledger Fabric 是 Hyperledger 项目的基石。它是基于许可的区块链,或者更准确地说是一种分布式分类帐技术(DLT),该技术最初由 IBM 公司和 Digital Asset 创建。分布式分类帐技术被设计为具有不同组件的模块化框架(概述如下)。它也是提供可插入的共识模型的一种灵活的解决方案,尽管它目前仅提供基于投票的许可共识(假设今天的 Hyperledger 网络在部分可信赖的环境中运行)。 鉴于此,无需匿名矿工来验证交易,也无需用作激励措施的相关货币。所有的参与者必须经过身份验证才能参与到该区块链进行交易。与以太坊一样,Hyperledger Fabric 支持智能合约,在 Hyperledger 中称为Chaincodes(链码),这些合约描述并执行系统的应用程序逻辑。 然而,与以太坊不同,Hyperledger Fabric 不需要昂贵的挖矿计算来提交交易,因此它有助于构建可以在更短的延迟内进行扩展的区块链。 Hyperledger Fabric 不同于以太坊或比特币这样的区块链,不仅在于它们类型不同,或者说是它与货币无关,而且它们在内部机制方面也不同。以下是典型的 Hyperledger 网络的关键要素: 本(Ledgers):存储了一系列块,这些块保留了所有状态交易的所有不可变历史记录。 节点(Nodes):区块链的逻辑实体。它有三种类型: 客户端(Clients):是代表用户向网络提交事务的应用程序。 对等体(Peers):是提交交易并维护分类帐状态的实体。 排序者(Orderers) 在客户端和对等体之间创建共享通信渠道,还将区块链交易打包成块发送给遵从的对等体节点。 除了这些要素,Hyperledger Fabric 还有以下关键设计功能: 链码(Chaincode):类似于其它诸如以太坊的网络中的智能合约。它是用一种更高级的语言编写的程序,在针对分类帐当前状态的数据库执行。 通道(Channels):用于在多个网络成员之间共享机密信息的专用通信子网。每笔交易都在一个只有经过身份验证和授权的各方可见的通道上执行。 背书人(Endorsers) 验证交易,调用链码,并将背书的交易结果返回给调用应用程序。 成员服务提供商(Membership Services Providers)(MSP)通过颁发和验证证书来提供身份验证和身份验证过程。MSP 确定信任哪些证书颁发机构(CA)去定义信任域的成员,并确定成员可能扮演的特定角色(成员、管理员等)。 Hyperledger 交易验证流程 首先,客户端通过向基于 Hyperledger Fabric 的应用程序客户端发送请求来启动交易,该客户端将交易提议提交给背书对等体。这些对等体通过执行由交易指定的链码(使用该状态的本地副本)来模拟该交易,并将结果发送回应用程序。此时,应用程序将交易与背书相结合,并将其广播给 排序服务(Ordering Service)。排序服务检查背书并为每个通道创建一个交易块,然后将其广播给通道中的其它节点,对的体验证该交易并进行提交。 Hyperledger Fabric 区块链可以通过透明的、不变的和共享的食品来源数据记录、处理数据,及运输细节等信息将食品供应链中的参与者们连接起来。链码由食品供应链中的授权参与者来调用。所有执行的交易记录都永久保存在分类帐中,所有参与者都可以查看此信息。 Hyperledger Composer 除了 Fabric 或 Iroha 等区块链框架外,Hyperledger 项目还提供了 Composer、Explorer 和 Cello 等工具。 Hyperledger Composer 提供了一个工具集,可帮助你更轻松地构建区块链应用程序。 它包括: CTO,一种建模语言 Playground,一种基于浏览器的开发工具,用于快速测试和部署 命令行界面(CLI)工具 Composer 支持 Hyperledger Fabric 的运行时和基础架构,在内部,Composer 的 API 使用底层 Fabric 的 API。Composer 在 Fabric 上运行,这意味着 Composer 生成的业务网络可以部署到 Hyperledger Fabric 执行。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值