目录
Fabric学习资料
基本介绍:HyperLedger Fabric(后文简称Fabric)是其中发展最好的一个企业级区块链平台,最初由Digital Asset和IBM 贡献,目前已经应用于沃尔玛的食物溯源链和马士基的物流跟踪链中, 代表了当下企业级区块链应用的最高水平。可以认为Fabric是一种联盟链平台, 它适合构建跨越多个企业边界的去中心化应用。由于Fabric项目的目标是应用于相对可信的企业联盟环境,因此其设计思路与比特币、以太坊 等公链平台有明显的差异。Fabric借鉴了区块链的数据结构,但引入了相当多的身份验证与 权限控制机制,以及数据隐私保护机制,以适应企业级应用的要求。同时由于企业联盟环境 要比完全开放的公链环境可控,因此Fabric没有强调其共识体系对拜占庭容错的实现,允许使用 非拜占庭容错算法建立共识,从而可以达到相当实用的交易吞吐量。
Fabric定位于企业级的分布式账本技术,它的主要目的是为跨越多个企业边界的活动提供不可篡改的分布式记账平台。例如在食物溯源应用中,为了让消费者可以了解到所购买食物是否安全,就必须将从农场到加工商、分销商、 零售商乃至监管机构等各个环节的检验与放行信息记录到区块链上,以保证溯源信息的透明与可信。
因此Fabric是一种联盟链(Consortium BlockChain),它适合在多个企业间实现分布式记账,这一 定位使Fabric的实现与以太坊这样的公链有了明显的差异:
- 分布式账本 vs. 区块链:分布式账本是比区块链更加宽泛的概念,可以认为区块链只是分布式账本的一种实现技术, 其他的分布式账本实现还包括哈希图等。
- 去中心化 vs. 分布式:Fabric淡化了去中心化,而以分布式代替,这一思路带来了系统设计 与实现上的巨大影响。 例如,在Fabric中,采用中心化的CA机制来发放证书,只有持有有效证书的节点和用户才可以访问区块链 上的账本数据。因此Fabric是许可制的区块链,这与不需要许可 的以太坊这样的公链形成了鲜明的对比。
- 拜占庭容错 vs. 崩溃容错:由于采用许可机制,Fabric也淡化了对不可信环境下共识达成的依赖性,而假设联盟链中的企业有可能是值得信赖的,因此并不依赖于工作量证明这样的拜占庭容错算法-虽然Fabric模块化的设计可以支持引入不同的共识算法实现,但目前的产品化方案是Kafka共识,它显然是不能对抗拜占庭错误的-不过对不可信环境支持的淡化处理有利于提高交易的吞吐量,这对于企业级应用也是有益的。
- 数据隐私保护:Fabric强化了隐私保护能力。例如Fabric支持在同一套企业网络上建立多个不同 的通道,每一个通道都有自己的区块链和访问控制,彼此互不影响,这有利于复用基础设施,例如不同企业间的销售部门可以建立一个通道来分享市场数据,而这些企业间的研发部门可以建立另一个通道来分享技术数据。
1、架构概述
Fabric的架构中包含相当多的细节,为了便于理解,我们先观察最基本的两个 组成部分:
- 对等节点(Peer):对等节点负责交易区块链的保存以及状态的更新
- 排序节点(Orderer)排序器则负责确定应用所提交的交易的先后执行顺序,并将交易打包成块后分发给主导对等节点,再由主导对等节点通过gossip协议扩散至其他对等节点,对等节点进行验证后执行交易从而更新其状态。在1.4.4版本以后,Fabric提供了三种排序器实现:一个用于开发的单节点Solo排序器, 一个基于Kafka和Zookeeper实现的崩溃容错排序器,以及一个基于Etcd的Raft共识排序器。
2、身份验证
和大多数区块链一样,Fabric也采用非对称加密技术来标识用户的身份,区别在于 Fabric取消了用户自己生成身份标识的权利,而采用中心化的CA来统一颁发证书。
在一个Fabric网络中可以使用单一的CA,也可以存在多个不同的CA,例如每个参与机构都由自己的CA为自己组织内的节点和用户颁发证书,并单独为排序节点 建立一个CA。CA颁发的证书中包含了用户公钥和唯一标识名称等信息,同时也包含了CA的签名,因此第三方可以验证用户持有的证书是否由CA签发,从而验证用户的身份。
3、使用OpenSSL构建CA证书
我们可以使用OpenSSL来建立一个CA,并为Peer、Orderer和用户颁发证书。由于CA需要为自己签名,因此我们首先需要生成CA的自签名证书。
3.1、CA自签名证书
生成CA自签名证书主要包括三个环节
-
创建根密钥:首先使用Ecparam子命令选择prime256v1椭圆曲线参数创建根密钥,这是Fabric中使用 的非对称加密算法
openssl ecparam -genkey \ # 生成椭圆曲线私钥 -name prime256v1 \ # 使用prime256v1椭圆曲线参数 -out ca-key_.pem # 生成的EC私钥存入ca-key_.pem文件 # 执行命令 root@jtyoui-PC:/mnt# openssl ecparam -genkey -name prime256v1 -out ca-key_.pem root@jtyoui-PC:/mnt# ls ca-key_.pem root@jtyoui-PC:/mnt# cat ca-key_.pem -----BEGIN EC PARAMETERS----- BggqhkjOPQMBBw== -----END EC PARAMETERS----- -----BEGIN EC PRIVATE KEY----- MHcCAQEEINvGtiRUFFmDF8mZITfXVcBKGCWGyPnkdJKKtvGvVaRWoAoGCCqGSM49 AwEHoUQDQgAEp/5H83fZa8KJGNd6315SgkWwjnhUzKBu5+C8wZRZ2Hc1K09FjmTd r/rmUtjv8WfwIVei4ZxuOIfHpoL8xZ1N2w== -----END EC PRIVATE KEY-----
-
转换为不加密的PKCS8私钥:然后将上述输出文件转换为不加密的PKCS8格式私钥并保存在ca-key.pem文件中, 以便后续在其他命令中利用私钥签名。
openssl pkcs8 -topk8 \ # 将输入私钥转换为PKCS8格式 -nocrypt \ # 不加密输出的PKCS8私钥 -in ca-key_.pem \ # 输入私钥为ca-key_.pem -out ca-key.pem # 输出存入ca-key.pem # 执行命令 root@jtyoui-PC:/mnt# openssl pkcs8 -topk8 -nocrypt -in ca-key_.pem -out ca-key.pem root@jtyoui-PC:/mnt# ls ca-key.pem ca-key_.pem root@jtyoui-PC:/mnt# cat ca-key.pem -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg28a2JFQUWYMXyZkh N9dVwEoYJYbI+eR0koq28a9VpFahRANCAASn/kfzd9lrwokY13rfXlKCRbCOeFTM oG7n4LzBlFnYdzUrT0WOZN2v+uZS2O/xZ/AhV6LhnG44h8emgvzFnU3b -----END PRIVATE KEY-----
-
利用PKCS8私钥生成证书签名请求:其中的配置文件 CA.conf中声明了CSR相关信息,例如唯一标识名称、启用的扩展等信息。
openssl req -new \ # 生成证书签名请求 -key ca-key.pem \ # 使用ca-key.pem中的私钥 -out ca-csr.pem \ # 输出的CSR存入ca-csr.pem文件 -config CA.conf # 使用ca.conf中的信息
# CA.conf配置文件解读:来源地址 http://www.jinbuguo.com/linux/openssl_install.html ##### 证书请求配置的"基本字段",其它附属字段都以它为入口 ##### [req] # 此处的设置相当于在命令行上使用 -sha256 选项(对应于"-digest")。 default_md = sha256 # 保存生成的密钥文件的默认文件名。对应 -keyout 命令行选项。 default_keyfile = ca-key.pem # 定义输入用户信息选项的"特征名称"字段名,该扩展字段定义了多项用户信息。 distinguished_name = req_distinguished_name # 如果设为no,那么 req 指令将直接从配置文件中读取证书字段的信息,而不是提示用户输入。 prompt = no # 生成自签名根证书时要使用的证书扩展项字段名,该扩展字段定义了要加入到根证书中的一系列 X.509v3 扩展项。 # 对应 -extensions 命令行选项。 x509_extensions = v3_ca # 证书请求扩展的字段名,该扩展字段定义了要加入到证书请求中的一系列 X.509v3 扩展项。 # 对应 -reqexts 命令行选项。 req_extensions = v3_req # 为一些字段设置默认的字符串类型,比如证书请求中的城市和组织名称。可能的取值和解释如下: # default: 包含了 PrintableString, T61String, BMPString 三种类型 # pkix : 包含了 PrintableString, BMPString 两种类型 # utf8only: 只使用 UTF8 字符串。推荐使用这个,这样可以完美的包含任意字符。 # nombstr : 包含了 PrintableString, T61String 两种类型 string_mask = utf8only # 如果设为yes,那么命令行与配置文件中的字符串都将按照UTF-8编码看待。默认值no表示仅使用ASCII编码。 # 对应 -utf8 命令行选项。 utf8 = yes ##### "特征名称"字段包含了用户的标识信息,对应 -subj 命令行选项 ##### [req_distinguished_name] countryName=CN # 必须是两字母国家代码 stateOrProvinceName="北京" # 省份或直辖市 localityName="北京市" # 城市 organizationName="中国农业科学院" # 组织名或公司名 organizationalUnitName="区块链实验室" #部门名称 commonName="Root" # 全限定域名或个人姓名 emailAddress="Root@qq.com" # Email地址 ##### 为签发的证书设置扩展项 ##### [user_cert] basicConstraints=critical,CA:false,pathlen:1 keyUsage=critical,keyCertSign,cRLSign subjectKeyIdentifier=hash ##### 要加入到证书请求中的一系列 X.509v3 扩展项,对应 -addext 命令行选项 ##### [v3_req] # 基本约束(该证书是否为CA证书)。"CA:FALSE"表示非CA证书(不能签发其他证书的"叶子证书")。 basicConstraints=critical,CA:true,pathlen:1 # 密钥用法:防否认(nonRepudiation)、数字签名(digitalSignature)、密钥加密(keyEncipherment)。 # 密钥协商(keyAgreement)、数据加密(dataEncipherment)、仅加密(encipherOnly)、仅解密(decipherOnly) keyUsage=critical,keyCertSign,cRLSign # 使用者密钥标识符(根据RFC3280规范自动生成) subjectKeyIdentifier=hash #### 生成自签名证书(RootCA)时使用的 X.509v3 证书扩展项,对应 -addext 命令行选项 ##### [v3_ca] # 基本约束(该证书是否为CA证书)。"CA:TRUE"表示是CA证书(可签发其他证书)。 # "pathlen:N"后缀表示允许签发下级CA证书的深度("0"表示禁止签发下级CA证书),"critical"表示关键扩展。 # 例如"critical,CA:TRUE, pathlen:0"表示禁止签发下级CA证书(仅能签发"叶子证书")。 keyUsage=critical,keyCertSign,cRLSign # 密钥用法:证书撤销列表签名(cRLSign)、证书签发(keyCertSign)、数字签名(digitalSignature) basicConstraints=critical,CA:true,pathlen:1 # 使用者密钥标识符(根据RFC3280规范自动生成) subjectKeyIdentifier=hash
# 配置文件解读完毕 # 执行命令 root@jtyoui-PC:/mnt# openssl req -new -key ca-key.pem -out ca-csr.pem -config ./CA.conf root@jtyoui-PC:/mnt# ls CA.conf ca-csr.pem ca-key.pem ca-key_.pem root@jtyoui-PC:/mnt# cat ca-csr.pem -----BEGIN CERTIFICATE REQUEST----- MIIBrzCCAVUCAQAwgZ4xCzAJBgNVBAYTAkNOMQ8wDQYDVQQIDAbljJfkuqwxEjAQ BgNVBAcMCeWMl+S6rOW4gjEeMBwGA1UECgwV5Lit5Zu95Yac5Lia56eR5a2m6Zmi MRswGQYDVQQLDBLljLrlnZfpk77lrp7pqozlrqQxDzANBgNVBAMMBuW8oOS8nzEc MBoGCSqGSIb3DQEJARYNanR5b3VpQHFxLmNvbTBZMBMGByqGSM49AgEGCCqGSM49 AwEHA0IABKf+R/N32WvCiRjXet9eUoJFsI54VMygbufgvMGUWdh3NStPRY5k3a/6 5lLY7/Fn8CFXouGcbjiHx6aC/MWdTdugVDBSBgkqhkiG9w0BCQ4xRTBDMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR60Eoi7YyL fS7ukUdSgqJYRXnMxDAKBggqhkjOPQQDAgNIADBFAiAQXZJdRO6pPOKNJnqLzZSz cjKP5IZJE5Q8Xi47vqKKZwIhAK2PSJQs72nrfZuGWH0XuWqOtTVBe88w30+Fr8M2 rV9r -----END CERTIFICATE REQUEST-----
-
由于我们是要生成自签名的根证书,因此直接使用根密钥签发请求文件ca-csr.pem,就得到了自签名的根证书ca-cert.pem。
openssl x509 -req \ # 生成x509证书 -extensions v3_ca \ # 在证书中添加ca_cert段声明的扩展 -extfile CA.conf \ # 包含扩展声明的文件 -in ca-csr.pem \ # 输入文件为ca-csr.pem -out ca-cert.pem \ # 输出文件为ca-cert.pem -signkey ca-key.pem \ # 用来自签名的私钥 -CAcreateserial \ # 创建证书序列号 -days 3650 # 证书有效期为3650天,大约10年 # 执行命令 root@jtyoui-PC:/mnt# openssl x509 -req -extensions v3_ca -extfile CA.conf -in ca-csr.pem -out ca-cert.pem -signkey ca-key.pem -CAcreateserial -days 3650 Signature ok subject=C = CN, ST = \E5\8C\97\E4\BA\AC, L = \E5\8C\97\E4\BA\AC\E5\B8\82, O = \E4\B8\AD\E5\9B\BD\E5\86\9C\E4\B8\9A\E7\A7\91\E5\AD\A6\E9\99\A2, OU = \E5\8C\BA\E5\9D\97\E9\93\BE\E5\AE\9E\E9\AA\8C\E5\AE\A4, CN = \E5\BC\A0\E4\BC\9F, emailAddress = jtyoui@qq.com Getting Private key root@jtyoui-PC:/mnt# ls ca-cert.pem CA.conf ca-csr.pem ca-key.pem ca-key_.pem root@jtyoui-PC:/mnt# cat ca-cert.pem -----BEGIN CERTIFICATE----- MIIChTCCAiugAwIBAgIUV9zbtDoeqtZ9SE57UgGH+wgV9B8wCgYIKoZIzj0EAwIw gZ4xCzAJBgNVBAYTAkNOMQ8wDQYDVQQIDAbljJfkuqwxEjAQBgNVBAcMCeWMl+S6 rOW4gjEeMBwGA1UECgwV5Lit5Zu95Yac5Lia56eR5a2m6ZmiMRswGQYDVQQLDBLl jLrlnZfpk77lrp7pqozlrqQxDzANBgNVBAMMBuW8oOS8nzEcMBoGCSqGSIb3DQEJ ARYNanR5b3VpQHFxLmNvbTAeFw0yMTA0MjEwNjQ5MzFaFw0zMTA0MTkwNjQ5MzFa MIGeMQswCQYDVQQGEwJDTjEPMA0GA1UECAwG5YyX5LqsMRIwEAYDVQQHDAnljJfk uqzluIIxHjAcBgNVBAoMFeS4reWbveWGnOS4muenkeWtpumZojEbMBkGA1UECwwS 5Yy65Z2X6ZO+5a6e6aqM5a6kMQ8wDQYDVQQDDAblvKDkvJ8xHDAaBgkqhkiG9w0B CQEWDWp0eW91aUBxcS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASn/kfz d9lrwokY13rfXlKCRbCOeFTMoG7n4LzBlFnYdzUrT0WOZN2v+uZS2O/xZ/AhV6Lh nG44h8emgvzFnU3bo0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB /wIBATAdBgNVHQ4EFgQUetBKIu2Mi30u7pFHUoKiWEV5zMQwCgYIKoZIzj0EAwID SAAwRQIgStoxjS8rYfYQN+FGjRvOyRBpt83ai8vVDcCmkUdhjHsCIQCHow7d7mQx vleKuu8OPUjRMilJI3Lr7/GY6Q597FEV+g== -----END CERTIFICATE-----
-
CA颁发的证书中包含了用户公钥和唯一标识名称等信息,同时也包含了CA的签名, 因此第三方可以验证用户持有的证书是否由CA签发,从而验证用户的身份。
root@jtyoui-PC:/mnt# openssl x509 -in ca-cert.pem -text Certificate: Data: Version: 3 (0x2) Serial Number: 57:dc:db:b4:3a:1e:aa:d6:7d:48:4e:7b:52:01:87:fb:08:15:f4:1f Signature Algorithm: ecdsa-with-SHA256 Issuer: C = CN, ST = \E5\8C\97\E4\BA\AC, L = \E5\8C\97\E4\BA\AC\E5\B8\82, O = \E4\B8\AD\E5\9B\BD\E5\86\9C\E4\B8\9A\E7\A7\91\E5\AD\A6\E9\99\A2, OU = \E5\8C\BA\E5\9D\97\E9\93\BE\E5\AE\9E\E9\AA\8C\E5\AE\A4, CN = \E5\BC\A0\E4\BC\9F, emailAddress = jtyoui@qq.com Validity Not Before: Apr 21 06:49:31 2021 GMT Not After : Apr 19 06:49:31 2031 GMT Subject: C = CN, ST = \E5\8C\97\E4\BA\AC, L = \E5\8C\97\E4\BA\AC\E5\B8\82, O = \E4\B8\AD\E5\9B\BD\E5\86\9C\E4\B8\9A\E7\A7\91\E5\AD\A6\E9\99\A2, OU = \E5\8C\BA\E5\9D\97\E9\93\BE\E5\AE\9E\E9\AA\8C\E5\AE\A4, CN = \E5\BC\A0\E4\BC\9F, emailAddress = jtyoui@qq.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:a7:fe:47:f3:77:d9:6b:c2:89:18:d7:7a:df:5e: 52:82:45:b0:8e:78:54:cc:a0:6e:e7:e0:bc:c1:94: 59:d8:77:35:2b:4f:45:8e:64:dd:af:fa:e6:52:d8: ef:f1:67:f0:21:57:a2:e1:9c:6e:38:87:c7:a6:82: fc:c5:9d:4d:db ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Key Usage: critical Certificate Sign, CRL Sign X509v3 Basic Constraints: critical CA:TRUE, pathlen:1 X509v3 Subject Key Identifier: 7A:D0:4A:22:ED:8C:8B:7D:2E:EE:91:47:52:82:A2:58:45:79:CC:C4 Signature Algorithm: ecdsa-with-SHA256 30:45:02:20:4a:da:31:8d:2f:2b:61:f6:10:37:e1:46:8d:1b: ce:c9:10:69:b7:cd:da:8b:cb:d5:0d:c0:a6:91:47:61:8c:7b: 02:21:00:87:a3:0e:dd:ee:64:31:be:57:8a:ba:ef:0e:3d:48: d1:32:29:49:23:72:eb:ef:f1:98:e9:0e:7d:ec:51:15:fa -----BEGIN CERTIFICATE----- MIIChTCCAiugAwIBAgIUV9zbtDoeqtZ9SE57UgGH+wgV9B8wCgYIKoZIzj0EAwIw gZ4xCzAJBgNVBAYTAkNOMQ8wDQYDVQQIDAbljJfkuqwxEjAQBgNVBAcMCeWMl+S6 rOW4gjEeMBwGA1UECgwV5Lit5Zu95Yac5Lia56eR5a2m6ZmiMRswGQYDVQQLDBLl jLrlnZfpk77lrp7pqozlrqQxDzANBgNVBAMMBuW8oOS8nzEcMBoGCSqGSIb3DQEJ ARYNanR5b3VpQHFxLmNvbTAeFw0yMTA0MjEwNjQ5MzFaFw0zMTA0MTkwNjQ5MzFa MIGeMQswCQYDVQQGEwJDTjEPMA0GA1UECAwG5YyX5LqsMRIwEAYDVQQHDAnljJfk uqzluIIxHjAcBgNVBAoMFeS4reWbveWGnOS4muenkeWtpumZojEbMBkGA1UECwwS 5Yy65Z2X6ZO+5a6e6aqM5a6kMQ8wDQYDVQQDDAblvKDkvJ8xHDAaBgkqhkiG9w0B CQEWDWp0eW91aUBxcS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASn/kfz d9lrwokY13rfXlKCRbCOeFTMoG7n4LzBlFnYdzUrT0WOZN2v+uZS2O/xZ/AhV6Lh nG44h8emgvzFnU3bo0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB /wIBATAdBgNVHQ4EFgQUetBKIu2Mi30u7pFHUoKiWEV5zMQwCgYIKoZIzj0EAwID SAAwRQIgStoxjS8rYfYQN+FGjRvOyRBpt83ai8vVDcCmkUdhjHsCIQCHow7d7mQx vleKuu8OPUjRMilJI3Lr7/GY6Q597FEV+g== -----END CERTIFICATE-----
- Issuer字段标识签发此证书的CA机构的唯一标识名
- Subject字段标识此证书持有者的唯一标识名
- 在唯一标识名中最常用的字段是常用名CN字段
由于证书中包含用户公钥以及CA签名这些二进制数据,为了便于在网络环境中 传输交换,通常会编码为仅包含ASCII码的 PEM 格式,即Privacy-Enhanced Mail - 隐私增强邮件。
利用CA的证书可以验证一个指定的证书是否由该CA签发,例如
openssl verify -CAfile ca-cert.pem xx-cert.pem
3.2、签发用户证书
一旦有了根证书,我们就可以签发用于节点、排序器或应用用户的证书了。 前面的步骤基本一样,都是生成EC私钥、转换为PCKS8格式、生成证书签名请求,只是分别由申请用户和CA完成。
# 设置配置文件USER.conf
[req]
default_md = sha256
default_keyfile = ca-key.pem
distinguished_name = req_distinguished_name
prompt = no
x509_extensions = v3_ca
req_extensions = v3_req
string_mask = utf8only
utf8 = yes
[req_distinguished_name]
countryName=CN
stateOrProvinceName="北京"
localityName="北京市"
organizationName="中国农业科学院"
organizationalUnitName="区块链实验室"
commonName="张伟"
emailAddress="jtyoui@qq.com"
[user_cert]
basicConstraints=critical,CA:false,pathlen:1
keyUsage=critical,keyCertSign,cRLSign
subjectKeyIdentifier=hash
[v3_req]
basicConstraints=critical,CA:false,pathlen:1
keyUsage=critical,keyCertSign,cRLSign
subjectKeyIdentifier=hash
[v3_ca]
keyUsage=critical,keyCertSign,cRLSign
basicConstraints=critical,CA:false,pathlen:1
subjectKeyIdentifier=hash
执行下面代码,用CA证书来签发用户证书
openssl ecparam -name prime256v1 -genkey -out user-key_.pem
openssl pkcs8 -topk8 -nocrypt -in user-key_.pem -out user-key.pem
openssl req -new -key user-key.pem -out user-csr.pem -config USER.conf
openssl x509 -req -extensions user_cert -extfile CA.conf -in user-csr.pem -out user-cert.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
验证是否签发成功
root@jtyoui-PC:/mnt# openssl verify -CAfile ca-cert.pem user-cert.pem
user-cert.pem: OK
3.3、代理数据下载
我把这些数据打包到OSS服务上,只需要下载运行sh文件即可
wget http://oss.jtyoui.com/fabric/ca.tar.gz
tar -zxvf ca.tar.gz && cd artifact
sh ./run.sh
4、MSP成员服务提供器
在Fabric中,判定机制由成员服务提供器(MSP)来实现。每一个需要保护的资源都有自己的MSP,并利用MSP实现从身份向角色的转换。例如,对于Orderer和Peer而言,它们都需要一个本地的MSP配置目录来建立其MSP实例,并且按照约定的目录结构来组织各种文件
- admincerts:该目录中的所有PEM证书对应有管理员角色
- cacerts:该目录的每个PEM证书都是CA根证书
- keystore:该目录中包含节点私钥的单一PEM证书
- signcerts:该目录中包含节点的X509证书
- crls:可选,该目录中包含所有已回收的证书
- intermediatecerts:可选,该目录中的PEM证书对应中间CA证书
- config.yaml:可选
- tlscacerts:可选,该目录中包含用于TLS的CA根证书
- tlsintermediatecerts:可选,该目录中包含用于TLS的CA中间证书
我们可以将之前使用openssl创建的证书和user私钥整理为MSP配置目录
mkdir -p msp/admincerts && cp ./artifact/user-cert.pem msp/admincerts # 赋予user管理员角色
mkdir -p msp/cacerts && cp ./artifact/ca-cert.pem msp/cacerts # CA证书
mkdir -p msp/signcerts && cp ./artifact/user-cert.pem msp/signcerts # 当前身份为user
mkdir -p msp/keystore && cp ./artifact/user-key.pem msp/keystore # 当前身份的私钥
root@jtyoui-PC:/mnt/artifact# tree msp
msp/
├── admincerts
│ └── user-cert.pem
├── cacerts
│ └── ca-cert.pem
├── keystore
│ └── user-key.pem
└── signcerts
└── user-cert.pem
4 directories, 4 files
5、启动最小的Fabric网络
有了MSP配置,我们就可以启动一个最简单的Fabric网络了
在这个网络中,只包含一个Orderer节点和一个Peer节点,而且两个节点使用同一个MPS配置。下载安装报,在官网下载:
# 官网下载
curl -L http://oss.jtyoui.com/fabric/hyperledger-fabric-linux-amd64-1.4.11.tar.gz -o /mnt/fabric-1.4.11.tar.gz
# 解压
cd /mnt && tar -zxvf fabric-1.4.11.tar.gz
chmod +x bin/
cp -r bin/* /usr/local/bin/
root@jtyoui-PC:/mnt# configtxgen -version
configtxgen:
Version: 1.4.11
Commit SHA: 77facb430
Go version: go1.14.12
OS/Arch: linux/amd64
5.1、启动排序节点
启动排序节点之前,需要首先生成一个创世块,排序节点将利用这个创世块启动整个Farbic网络的系统通道。可以使用官方提供的configtxgen工具来生成Farbic网络系统通道的创世块。configtxgen依赖于配置文件configtx.yaml中定义的网络结构 、访问策略等信息,并提供了不同的Profile以便应用于不同的场景, 可以认为Profile是网络结构、访问策略等网络配置信息的组合套餐。
# 生成创世块并存入genesis.block
>> configtxgen -outputBlock genesis.block
# 该执行必须在官方config配置文件下
root@jtyoui-PC:/mnt/config# ls
configtx.yaml core.yaml genesis.block msp orderer.yaml
有了创世块,我们就可以启动排序节点了。排序节点程序依赖于配置文件 orderer.yaml。同样,Fabric提供了默认的配置文件,我们只需要做简单 的个性化调整即可。
ORDERER_GENERAL_GENESISFILE=./genesis.block # 创建块文件的路径
ORDERER_FILELEDGER_LOCATION=./data/orderer # 系统通道账本(区块链)数据的路径
# 执行命令
>> ORDERER_GENERAL_GENESISPROFILE=SampleInsecureSolo ORDERER_FILELEDGER_LOCATION=./data/orderer orderer
5.2、启动对等节点
类似的,对等节点依赖于配置文件core.yaml,我们也可以在Farbic提供的 默认配置文件上进行自定义调整。
CORE_PEER_FILESYSTEMPATH=./peer # 通道账本(区块链)数据的路径
CORE_PEER_LISTENADDRESS=127.0.0.1:7051 # 节点监听地址
CORE_PEER_CHAINCODELISTENADDRESS=127.0.0.1:7052 # 节点链码服务监听地址
CORE_CHAINCODE_MODE=dev # 链码服务设置为开发模式
# 执行命令
>> CORE_PEER_FILESYSTEMPATH=./data/peer CORE_PEER_LISTENADDRESS=127.0.0.1:7051 CORE_PEER_CHAINCODELISTENADDRESS=127.0.0.1:7052 peer node start --peer-chaincodedev
5.3、查看创世块文件
jtyoui@jtyoui-PC:/mnt/config$ tree data/
data/
├── orderer
│ ├── chains
│ │ └── test-system-channel-name
│ │ └── blockfile_000000
│ └── index
│ ├── 000001.log
│ ├── CURRENT
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000000
└── peer
├── chaincodes
└── ledgersData
├── bookkeeper
│ ├── 000001.log
│ ├── CURRENT
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000000
├── chains
│ └── index
│ ├── 000001.log
│ ├── CURRENT
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000000
├── configHistory
│ ├── 000001.log
│ ├── CURRENT
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000000
├── fileLock
│ ├── 000001.log
│ ├── CURRENT
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000000
├── historyLeveldb
│ ├── 000001.log
│ ├── CURRENT
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000000
├── ledgerProvider
│ ├── 000001.log
│ ├── CURRENT
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000000
├── pvtdataStore
│ ├── 000001.log
│ ├── CURRENT
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000000
└── stateLeveldb
├── 000001.log
├── CURRENT
├── LOCK
├── LOG
└── MANIFEST-000000
16 directories, 46 files
6、通道初始化与节点加入
当我们启动排序节点时,利用创世块也同时启动了保存整个网络配置的系统通道。
#!/bin/bash
configtxgen -outputCreateChannelTx data/ch1.tx -profile SampleSingleMSPChannel -channelID ch1
peer channel create -f data/ch1.tx -c ch1 -o localhost:7050 --outputBlock data/ch1.block
peer channel join -b data/ch1.block -o localhost:7050
## 查看加入的通道
root@jtyoui-PC:/mnt/config# peer channel list
2021-04-21 21:36:09.887 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Channels peers has joined:
ch1