接入 Fabric 1.4

WeCross Fabric Stub 是 WeCross Router的插件,让Router具备接入Fabric 1.4的链的能力。其要点包括:

  • 插件安装
  • 接入配置:用于接入相应的Fabric 1.4链
  • 账户配置:用于用相应账户发交易

插件安装

在生成router时,默认安装Fabric 1.4插件,安装目录为router下的plugin目录:

  1. cd ~/wecross/routers-payment/127.0.0.1-8251-25501/
  2. tree plugin/
  3. plugin/
  4. └── fabric1-stub-XXXXX.jar

用户如有特殊需求,可以自行编译,替换plugin目录下的插件。

手动安装

下载编译

  1. git clone https://github.com/WeBankFinTech/WeCross-Fabric1-Stub.git
  2. cd WeCross-Fabric1-Stub
  3. bash gradlew assemble # 在 dist/apps/下生成fabric1-stub-XXXXX.jar

安装插件

  1. cp dist/apps/fabric1-stub-XXXXX.jar ~/wecross/routers-payment/127.0.0.1-8250-25500/plugin/

注:若router中配置了两个相同的插件,插件冲突,会导致router启动失败。

账户配置

在router中配置Fabric账户,用户可在sdk中指定router用相应的账号发交易。

完整配置

配置完成的账户如下,在accounts目录中

  1. accounts/ # router的账户目录,所有账户的文件夹放在此目录下
  2. └── fabric_admin # 目录名即为此账户名,SDK发交易时,指定的即为处的账户名
  3. ├── account.toml # 账户配置文件
  4. ├── user.crt # Fabric的用户证书
  5. └── user.key # Fabric的用户私钥

其中 account.toml为账户配置文件

  1. [account]
  2. type = 'Fabric1.4' # 采用插件的名字
  3. mspid = 'Org1MSP' # 账户对应机构的MSP ID
  4. keystore = 'user.key' # 账户私钥文件名字,指向与此文件相同目录下的私钥文件
  5. signcert = 'user.crt' # 账户证书名字,指向与此文件相同目录下的证书文件

配置步骤

生成配置文件

为router生成某个账户的配置,在router目录下执行

  1. cd ~/wecross/routers-payment/127.0.0.1-8251-25501/
  2.  
  3. # 举例1:生成名字为fabric_admin的账户配置 -t 指定使用Fabric1.4插件生成 -n 设置一个账户名
  4. bash add_account.sh -t Fabric1.4 -n fabric_admin
  5.  
  6. # 举例2:生成名字为fabric_user1的账户配置 -t 指定使用Fabric1.4插件生成 -n 设置一个账户名
  7. bash add_account.sh -t Fabric1.4 -n fabric_user1

生成后,conf/accounts目录下出现对应名字的账户目录,接下来需将相关账户文件拷贝入目录中。

拷贝账户文件

fabric-sample/first-networkcrypto-config为例,配置其中一个账户即可

  • 若配置 Org1 的 Admin
  1. # 拷贝用户私钥,命名为 user.key
  2. cp ~/demo/fabric/fabric-sample/first-network/crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp/keystore/*_sk accounts/fabric_admin/user.key
  3. # 拷贝用户证书,命名为 user.crt
  4. cp ~/demo/fabric/fabric-sample/first-network/crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp/signcerts/*.pem accounts/fabric_admin/user.crt
  • 若配置 Org1的 User1
  1. # 拷贝用户私钥,命名为 user.key
  2. cp ~/demo/fabric/fabric-sample/first-network/crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp/keystore/*_sk accounts/fabric_user1/user.key
  3. # 拷贝用户证书,命名为 user.crt
  4. cp ~/demo/fabric/fabric-sample/first-network/crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp/signcerts/*.pem accounts/fabric_user1/user.crt

编辑配置文件

编辑 account.toml

  1. vim conf/accounts/<account_name>/account.toml

内容为

  1. [account]
  2. type = 'Fabric1.4' # 采用插件的名字
  3. mspid = 'Org1MSP' # 账户对应机构的MSP ID
  4. keystore = 'user.key' # 账户私钥文件名字,指向与此文件相同目录下的私钥文件
  5. signcert = 'user.crt' # 账户证书名字,指向与此文件相同目录下的证书文件

插件配置

在router中配置需接入的链,访问链上资源。

完整配置

配置完成如下,在chains目录中

  1. chains # router的stub的配置目录,所有的stub都在此目录下配置
  2. └── fabric # 此链的名字,名字可任意指定,与链类型无关
  3. ├── orderer-tlsca.crt # orderer证书
  4. ├── org1-tlsca.crt # 需要连接的peer的证书1,有则配
  5. ├── org2-tlsca.crt # 需要连接的peer的证书2,有则配
  6. └── stub.toml # stub配置文件

其中,stub.toml 为接入的链的配置文件

  1. [common]
  2. name = 'fabric'
  3. type = 'Fabric1.4'
  4.  
  5. [fabricServices]
  6. channelName = 'mychannel'
  7. orgName = 'Org1'
  8. mspId = 'Org1MSP'
  9. orgUserName = 'fabric_admin'
  10. orgUserAccountPath = 'classpath:accounts/fabric_admin'
  11. ordererTlsCaFile = 'orderer-tlsca.crt'
  12. ordererAddress = 'grpcs://localhost:7050'
  13.  
  14. [peers]
  15. [peers.org1]
  16. peerTlsCaFile = 'org1-tlsca.crt'
  17. peerAddress = 'grpcs://localhost:7051'
  18. [peers.org2]
  19. peerTlsCaFile = 'org2-tlsca.crt'
  20. peerAddress = 'grpcs://localhost:9051'
  21.  
  22. # resources is a list
  23. [[resources]]
  24. # name cannot be repeated
  25. name = 'abac'
  26. type = 'FABRIC_CONTRACT'
  27. chainCodeName = 'mycc'
  28. chainLanguage = "go"
  29. peers=['org1','org2']

配置步骤

生成配置文件

  1. cd ~/wecross/routers-payment/127.0.0.1-8251-25501
  2. bash add_chain.sh -t Fabric1.4 -n fabric # -t 链类型,-n 指定链名字
  3.  
  4. # 查看生成目录
  5. tree conf/chains/fabric

生成的目录结构如下:

  1. conf/chains/fabric
  2. └── stub.toml # chain配置文件

拷贝链证书

fabric-sample/first-networkcrypto-config为例

  1. # 拷贝 orderer证书
  2. cp ~/demo/fabric/fabric-sample/first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem conf/chains/fabric/orderer-tlsca.crt
  3. # 拷贝 peer.org1 证书
  4. cp ~/demo/fabric/fabric-sample/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt conf/chains/fabric/org1-tlsca.crt
  5. # 拷贝 peer.org2 证书
  6. cp ~/demo/fabric/fabric-sample/first-network/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt conf/chains/fabric/org2-tlsca.crt

编辑配置文件

  1. vim conf/chains/fabric/stub.toml
  • 基础配置
  1. [common]
  2. name = 'fabric' # 指定的连接的链的名字,对应path中的{zone}/{chain}/{resource}的chain
  3. type = 'Fabric1.4' # 采用插件的名字
  • 配置链
  1. [fabricServices]
  2. channelName = 'mychannel'
  3. orgName = 'Org1' # 指定一个机构机构名
  4. mspId = 'Org1MSP' # 相应的机构MSP ID
  5. orgUserName = 'fabric_admin' # 机构的 admin 账户名
  6. orgUserAccountPath = 'classpath:accounts/fabric_admin'# 账户配置步骤已配置好的admin账户目录
  7. ordererTlsCaFile = 'orderer-tlsca.crt' # orderer证书名字,指向与此配置文件相同目录下的证书
  8. ordererAddress = 'grpcs://localhost:7050' # orderer的url
  9.  
  10. [peers] # peers列表
  11. [peers.org1]
  12. peerTlsCaFile = 'org1-tlsca.crt' # peer.org1证书名,指向与此配置文件相同目录下的证书
  13. peerAddress = 'grpcs://localhost:7051' # peer.org1的URL
  14. [peers.org2]
  15. peerTlsCaFile = 'org2-tlsca.crt' # peer.org2证书名,指向与此配置文件相同目录下的证书
  16. peerAddress = 'grpcs://localhost:9051' # peer.org2的URL
  • 配置跨链资源
  1. # resources is a list
  2. [[resources]]
  3. # name cannot be repeated
  4. name = 'HelloWeCross' # 资源名,对应path中的{zone}/{chain}/{resource}中的resource
  5. type = 'FABRIC_CONTRACT' # 合约类型,默认即可
  6. chainCodeName = 'mycc' # chaincode名字
  7. chainLanguage = "go" # chaincode编程语言
  8. peers=['org1','org2'] # 此chaincode对应的peers列表,在[peers]中需
  9.  
  10. [[resources]] # 另一个资源的配置
  11. name = 'HelloWorld'
  12. type = 'FABRIC_CONTRACT'
  13. chainCodeName = 'mygg'
  14. chainLanguage = "go"
  15. peers=['org1','org2']