项目作者: liuwenru

项目描述 :
Fabric JAVA SDK测试样例
高级语言: Java
项目地址: git://github.com/liuwenru/FabricJavaSDKExamples.git
创建时间: 2017-12-12T10:55:59Z
项目社区:https://github.com/liuwenru/FabricJavaSDKExamples

开源协议:

下载


FabricJavaSDKExamples

Fabric JAVA SDK测试样例

一、调用链码说明(不使用Fabric-CA模块)

1.1 测试代码结构说明

  1. ├── pom.xml
  2. ├── doc # 运行结果图片
  3. ├── cc # 使用Go实现的链码
  4. ├── src
  5. ├── main
  6. ├── java
  7. └── ijarvis
  8. └── intelliq
  9. ├── FabricApp.java # 初始化Fabric Client对象以及连接组织信息
  10. ├── LedgerRecord.java # 链码中数据结构Bean
  11. └── SampleUser.java # 抽象超级账本中用户信息(实际就是MSP下user文件夹中生成的用户身份文件)
  12. └── resources
  13. └── log4j.xml
  14. └── test
  15. ├── java
  16. └── ijarvis
  17. └── intelliq
  18. └── AppTest.java # Junit测试代码文件
  19. └── resources
  20. ├── crypto-config # 测试环境下所有证书以及MSP文件集合
  21. ├── ordererOrganizations
  22. └── example.com
  23. └── peerOrganizations
  24. ├── org1.example.com
  25. └── org2.example.com
  26. └── log4j.xml

由于调用链码调用初始化需要初始化fhclient等等一系列的对象,所以建议使用Junit运行代码。

1.2、 核心代码说明

使用SDk调用链码主要的步骤是:

  • 1、初始化HFClient
  • 2、实例化已经实现接口User的类加载已有的证书文件以及连接用户的私钥文件
  • 3、调用client.setUserContext(peer0org1);方法更新client的配置文件
  • 4、通过client获取通道对象(channel),客户端设置发起交易需要使用的Orderer以及Peer对象
  • 5、通过channel对象设置调用链码的名称参数等等信息发起调用链码
  1. package ijarvis.intelliq.Fabric;
  2. // 省略相关的包导入
  3. public class SampleUser implements User {
  4. private final String certFolder;
  5. private final String userName;
  6. public SampleUser(String certFolder, String userName) {
  7. this.certFolder = certFolder;
  8. this.userName = userName;
  9. }
  10. //省略相关Set和Get方法
  11. /**
  12. *
  13. * 重要实现方法,不使用CA需要自己实现如何加载私钥以及证书信息
  14. */
  15. @Override
  16. public Enrollment getEnrollment() {
  17. return new Enrollment() {
  18. @Override
  19. public PrivateKey getKey() {
  20. try {
  21. return loadPrivateKey(Paths.get(certFolder, "/keystore/ea2db84973c9c54436c47d7e10b9b63420f654ecd7c541fab14646e976294393_sk"));
  22. } catch (Exception e) {
  23. return null;
  24. }
  25. }
  26. @Override
  27. public String getCert() {
  28. try {
  29. return new String(Files.readAllBytes(Paths.get(certFolder, "/signcerts/Admin@org1.example.com-cert.pem")));
  30. } catch (Exception e) {
  31. return "";
  32. }
  33. }
  34. };
  35. }
  36. //测试代码所以固定写死相关的MSPID
  37. @Override
  38. public String getMspId() {
  39. return "Org1MSP";
  40. }
  41. /***
  42. * 实现加载证书服务
  43. */
  44. public static PrivateKey loadPrivateKey(Path fileName) throws IOException, GeneralSecurityException {
  45. PrivateKey key = null;
  46. InputStream is = null;
  47. try {
  48. is = new FileInputStream(fileName.toString());
  49. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  50. StringBuilder builder = new StringBuilder();
  51. boolean inKey = false;
  52. for (String line = br.readLine(); line != null; line = br.readLine()) {
  53. if (!inKey) {
  54. if (line.startsWith("-----BEGIN ") && line.endsWith(" PRIVATE KEY-----")) {
  55. inKey = true;
  56. }
  57. continue;
  58. } else {
  59. if (line.startsWith("-----END ") && line.endsWith(" PRIVATE KEY-----")) {
  60. inKey = false;
  61. break;
  62. }
  63. builder.append(line);
  64. }
  65. }
  66. //
  67. byte[] encoded = DatatypeConverter.parseBase64Binary(builder.toString());
  68. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
  69. KeyFactory kf = KeyFactory.getInstance("ECDSA");
  70. key = kf.generatePrivate(keySpec);
  71. } finally {
  72. is.close();
  73. }
  74. return key;
  75. }
  76. }

1.3、其他说明

如果觉得所给测试用例代码不够明确,可以参考官方网站此处的代码示例
本代码只是将官方代码进行简化方便做实验以及测试。

二、使用CA Server调用链码

与不通过CA模块调用的链码相比其实只差一个步骤,在不使用CA模块时构造SampleUser时我们要自己实现getEnrollment的方法,在该方法中需要我们自定义去加载私钥以及证书字节,但是有了CA模块后我们只需要在构建Sampleuser时调用

  1. user1.setEnrollment(hfcaClient.enroll(user1.getName(), "admin"));

即可实现从CA中获取到私钥以及证书,发起ECer交易。详细的测试可以参见代码src/test/java/ijarvis/intelliq/FabricCA/FabricCATestUseCAServer.java

三、链码操作

本节主要介绍测试环境中链码的安装部署与实例化操作,希望通过该方法可以快速的验证测试链码环境中的问题

  1. # 安装链码
  2. Shell> peer chaincode install -n epointchaincodecommon -p epointchaincodecommon -v 0.1
  3. # 实例化链码操作
  4. Shell> peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -c '{"Args":["init"]}' -P "OR ('Org1MSP.member','Org2MSP.member')" -n epointchaincodecommon -v 0.1
  5. # 调用插入KV操作链码
  6. Shell> peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n epointchaincodecommon -v 0.1 -c '{"Args":["addkv","liuwenru","刘文儒"]}'
  7. # 调用更新KV操作链码
  8. Shell> peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n epointchaincodecommon -v 0.1 -c '{"Args":["updatekv","liuwenru","刘美丽"]}'
  9. # 调用查询KV操作链码
  10. Shell> peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n epointchaincodecommon -v 0.1 -c '{"Args":["query","liuwenru"]}'
  11. # 根绝给定的Key查询该账本中所有的历史操作
  12. Shell> peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n epointchaincodecommon -v 0.1 -c '{"Args":["queryhistory","liuwenru"]}'
  13. # 调用删除链码操作,注意,此删除操作只会删除账本中当前的值,对于账本中的历史值是不会删除的
  14. Shell> peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n epointchaincodecommon -v 0.1 -c '{"Args":["delkv","liuwenru"]}'

四、调用结果展示

五、学习笔记目录列表