Fabric开发(五)Fabric源码赏析--核心包之 BCCSP包之 factory 工厂包

上面一章,我们大概讲解了fabric的目录架构,那么今天,我们开始选择一个核心包,来分析,我们首先从核心包之BCCSP(区块链加密服务提供者)开始赏析,我们今天选择 BCCSP包之 factory 工厂包。

  1. bccsp:加密模块。所有与加密有关的,比如证书、签名、哈希、椭圆曲线等都在这个模块里。前面说到了,Fabric高度模块化,优势体现之一就在这里,如果想更换其它加密算法,只要在这个模块里将接口重新继承一下并完成相关的代码即可。

    • 主要包含 factory 工厂包,mocks 模拟测试包,加解密关联包 pkcs11、signer 签名包、sw 加解密实现包以及工具包 utils。
    • factory 工厂包,主要描述了 sw 工厂的实现,pkcs11 的工厂方法实现,同时还包含了一部分 opts 的实现。
    • pkcs11 实现包,主要描述了对于标准算法的实现。
    • signer 签名包,主要描述了签名者相关实现。
    • sw 实现包,主要描述了可插拔式自定制算法的实现。
    • utils 工具包,主要描述了其他相关工具的实现。
    • 核心包之 BCCSP(区块链加密服务提供者)包之 factory 工厂包,提供工厂模式支持,将来包括若干类型的 BCCSP 实现。

    factory包中核心文件的内容及方法:

    • 核心文件 factory.go:

       -  方法:BCCSPFactory interface
      

      接口来获取 BCCSP 实例。

       -  方法:Name() string
      

      返回 BCCSP 实例。

       - 方法:Get(opts *FactoryOpts) (bccsp.BCCSP, error)
      

      输入opts,返回BCCSP的工厂实例

       - 方法:initBCCSP(f BCCSPFactory, config *FactoryOpts) error
      

      加载配置文件,如果格式或者内容有错,则报错,计入日志中并返回空。

    • 核心文件 nopkcs11.go:

        - 方法:InitFactories(config *FactoryOpts) error
      

      InitFactories 方法必须使用在工厂接口之前,并且可以接受配置文件为空或者一些默认配置。但如果 defaultBCCSP 没有被设置会报错。

        - 方法:GetBCCSPFromOpts(config *FactoryOpts) (bccsp.BCCSP, error)
      

      当一些可选的输入在配置文件中被正确读取的时候,GetBCCSPFromOpts 能够生成 BCCSP 实例。

    • 核心文件 opts.go:

        - 方法:GetDefaultOpts() *FactoryOpts
      

      为一些可选的设置提供实现,如生产者的名称 SW、哈希家族参数 SHA2、SecLevel 安全层级 256 级。临时属性 Ephemeral。

    • 核心文件 pkcs11.go:

        - 方法:InitFactories(config *FactoryOpts) error
      

      InitFactories 方法必须使用在工厂接口之前,并且可以接受配置文件为空或者一些默认配置。但如果 defaultBCCSP 没有被设置会报错。

        - 方法:setFactories(config *FactoryOpts) error
      

      主要是为了一些关键参数服务,读取参数后为空的来设定默认参数。包括 ProviderName、SwOpts、initBCCSP、Pkcs11Opts 等

        - 方法:GetBCCSPFromOpts(config *FactoryOpts) (bccsp.BCCSP, error)
      

      当一些可选的输入在配置文件中被正确读取的时候,GetBCCSPFromOpts 能够生成 BCCSP 实例。

        - 方法:func GetBCCSPFromOpts(config *FactoryOpts) (bccsp.BCCSP, error) 
      

      根据传入的配置,返回BCCSP实例

    • 核心文件 pkcs11factory.go:
      在这里公钥加密标准是 PKCS#11,整个母工厂是基于此标准的实现,因此名字设定为 PKCS11(即 PKCS11BasedFactoryName)。
      而且整个 PKCS11Factory 是一个(HSM)基于分级存储管理的 Bccsp 工厂实现。

        - 方法:(f PKCS11Factory) Get(config FactoryOpts) (bccsp.BCCSP, error)
      

      该方法主要是从加密标准着手,通过读取 PKCS11Factory 的配置文件 config 来生成工厂实例。在 beta 版本中,这里有个 TODO 特别进行了说明。大意是 PKCS11 是不需要密钥库(keystore)的,但目前还没有从 PKCS11 BCCSP 中拆分出去,所以这里留着待后续进行改进,因此代码实现中依然保留了一部分 keystore 的实现。

    • 核心文件 swfactory.go:
      通过可插拔式的软件算法实现,来实现的一个工厂。名字设定为 SW(即 SoftwareBasedFactoryName)

        - 方法:(f *SWFactory) Get(config *FactoryOpts) (bccsp.BCCSP, error)
      

      该方法的密钥库(keystore)是取决于 swOpts 中的配置信息来决定。前文配置的四个参数中 Ephemeral 为 true 时,通过 NewDummyKeyStore 来获取签文件方法。否则就是通过读取文件的方式来 NewFileBasedKeyStore 获取签名证书方法。

        - 结构:SwOpts struc
      

      这里主要是描述了 swopts 的参数构成,如有前文已经介绍的 SecLevel 安全等级、HashFamily 哈希选型,还有一些可选的密钥库(keystore)参数如 Ephemeral 临时性参数、及上述介绍了的密钥库(keystore)方法 FileKeystore 与 DummyKeystore。

        - 结构: FileKeystoreOpts struct
      

      该方法的结构体中主要是密钥库(keystore)的地址。

    工厂包小结
    整个工厂包可以看到更多还是关于配置的相关设置,同时考虑了 default 和例外的处理,同时对于初始化以及操作逻辑上做了特别的注释。

2020年7月30日整理

猜你喜欢

转载自blog.csdn.net/jambeau/article/details/107692732
今日推荐