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