区块链测试网服务开发
1、準備一個空白的springboot項目
pom.xml依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.1</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.yuyun</groupId><artifactId>springboot</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot</name><description>springboot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project>application.yml
server:port: 8112HelloController.java
@RestController public class HelloController {@RequestMapping("hello")public String index(){return "hello";} }運行一下看看能不能用
2、引入jar包
下載:bsn-sdk-java-jar-with-dependencies.jar
方法一
將下載后的jar包放在項目的lib目錄下:
pom.xml文件中引入
<dependency><groupId>com.example.javacc</groupId><artifactId>bsn-sdk-java</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>${project.basedir}/lib/bsn-sdk-java-jar-with-dependencies.jar</systemPath> </dependency>方法二:
也可以將jar包放入D盤,然后cmd進入D盤,直接用命令
mvn install:install-file -Dfile=D:\bsn-sdk-java-jar-with-dependencies.jar -DgroupId=com.example.javacc -DartifactId=bsn-sdk-java -Dversion=1.0-SNAPSHOT -Dpackaging=jar將其導入到本地的maven倉庫,再在pom.yml文件中引入
<dependency><groupId>com.example.javacc</groupId><artifactId>bsn-sdk-java</artifactId><version>1.0-SNAPSHOT</version> </dependency>3、搬源碼
將下載后的源碼打開,找到test下的.java文
將里面的文件copy到自己新建的項目下,記得將readme_CN.md也復制一下,有用
服務的平臺類型是Fabric-2.3.2-secp256r1,選擇Fabric
4、下載秘鑰
查看我的服務,然后把下圖所示的內容記下來,并且下載證書
下載后的文件里面有個ReadMe.txt文件,仔細閱讀里面的內容
證書下載壓縮包含用戶鏈下應用證書和網關證書兩大部分:
1、userAppCert目錄:用于存放鏈下應用證書,具體文件如下:
【1】secp256r1目錄:如果您發布測試網服務算法類型為secp256r1時,使用該目錄證書進行簽名以及驗證。
【1】public_cert.pem:應用證書公鑰文件,主要用于網關對接受的簽名數據進行驗證或公開給其它使用者。
【2】private_key.pem:應用證書私鑰文件,主要用于請求網關時對數據進行簽名以及驗證。
【2】secp256k1目錄:如果您發布測試網服務算法類型為secp256k1時,使用該目錄證書進行簽名。
【1】public_cert.pem:應用證書公鑰文件,主要用于網關對接受的簽名數據進行驗證或公開給其它使用者。
【2】private_key.pem:應用證書私鑰文件,主要用于請求網關時對數據進行簽名。
【3】sm2目錄:如果您發布測試網服務算法類型為國密(sm2)時,使用該目錄證書進行簽名以及驗證。
【1】public_cert.pem:應用證書公鑰文件,主要用于網關對接受的簽名數據進行驗證或公開給其它使用者。
【2】private_key.pem:應用證書私鑰文件,主要用于請求網關時對數據進行簽名。
2、gatewayCert目錄:用于存放網關證書,具體文件如下:
【1】gateway_public_cert_secp256r1.pem:網關公鑰secp256r1證書,如果您發布測試網服務算法類型為secp256r1時,用該公鑰證書對網關響應時的數據進行驗簽。
【2】gateway_public_cert_secp256k1.pem:網關公鑰secp256k1證書,如果您發布測試網服務算法類型為secp256k1時,用該公鑰證書對網關響應時的數據進行驗簽。
【3】gateway_public_cert_sm2.pem:網關公鑰國密(sm2)證書,如果您發布測試網服務算法類型為國密(sm2)時,用該公鑰證書對網關響應時的數據進行驗簽。
3、fabricMsp目錄:為Fabric上傳公鑰模式中的本地證書,具體文件如下:
【1】keystore目錄:用戶證書的私鑰。
【2】{testuser}@{AppCode}-cert.pem:Fabric的用戶證書文件。
【注】使用方式: 為將fabricMsp中的{testuser}@{AppCode}-cert.pem文件修改為【子用戶名@AppCode-cert.pem】,并將該文件夾路徑配置到config中的mspDir參數。
4、此類證書文件,只限于測試網與節點網關數據交互簽名與驗簽使用,不用于任何應用業務處理!
因為我建的服務平臺類型為Fabric-2.3.2-secp256r1,所以找到下面的文件,將其移動到springboot項目的resources目錄下
5、初始化config
初始化config有兩種方法,可以通過實例化配置對象或讀取json文件來初始化配置
api:="" //節點網關地址 userCode:="" //用戶編號 appCode :="" //應用編號 puk :="" //應用公鑰內容 prk :="" //應用私鑰內容 mspdir:="" //注冊用戶證書存放目錄方法一:實例化配置對象
秘鑰位置如圖:
沒用到MspDir,所以就沒加MspDir參數
public void initConfig() throws IOException {Config config = new Config();config.setAppCode("app008809d6356825a4c249be16572723c6225");config.setUserCode("USER0001202112061433104102226");config.setApi("http://52.83.209.158:17502");config.setPrk(Common.readFile("cert/private_key.pem"));config.setPuk(Common.readFile("cert/public_key.pem"));config.setMspDir("");config.initConfig(config); }方法二:讀取JSON文件
現在項目里面新建一個config.json文件,格式如下:
{ "userPrivateKey":"-----BEGIN PRIVATE KEY-----\nMIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg8Flin1KdqsLIsAy/\nmnE5a0RURsqAlxOud0OX5o0Uf0egCgYIKoZIzj0DAQehRANCAASSyO4FdX4teW13\nF44IzByoW4kGM7X+vS+3jGyijG4EtjvffOY5DJtAC09cxvLCOR2dR1YLhkHMg6EY\nvO1Y+aXq\n-----END PRIVATE KEY-----\n", "bsnPublicKey":"-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEksjuBXV+LXltdxeOCMwcqFuJBjO1\n/r0vt4xsooxuBLY733zmOQybQAtPXMbywjkdnUdWC4ZBzIOhGLztWPml6g==\n-----END PUBLIC KEY-----", "appCode":"app0001202111091107065973883", "userCode":"USER0001202103231633257714404", "nodeApi":"https://nanjingtxynode.bsngate.com:17602", "mspPath":""}使用下方的java代碼直接讀取JSON文件
public void initConfig() { String filePath="config/config.json"; Config config=Config.buildByConfigJson(filePath); config.initConfig(config);}測試運行一下看看能不能用:
6、子用戶注冊
public void userRegister() { try { initConfig(); //這里為示例,實際使用中,值需在程序生命周期內調用一次即可 ReqUserRegister register = new ReqUserRegister(); register.setName("test"); register.setSecret("123456"); ResUserRegister resUserRegister = FabricClient.userRegister(register); System.out.println(JSONObject.toJSONString(resUserRegister, SerializerFeature.PrettyFormat)); } catch (Exception e) { e.printStackTrace(); }}可能應為這是測試服務的問題,注冊用戶的時候無法注冊成功,但是換成正常建立的服務就沒得問題
7、數據操作
如果上面的子用戶注冊成功了,就可以在添加數據的時候加上子用戶名
ChainCode是服務部署成功后的鏈碼部署名稱,用到哪個鏈碼包就輸入對應的鏈碼部署名稱
public void reqChainCode() { try { initConfig(); ReqKeyEscrow reqkey = new ReqKeyEscrow(); String[] args = {"{\"baseKey\":\"161\",\"baseValue\":\"123\"}"}; reqkey.setArgs(args); reqkey.setFuncName("set"); reqkey.setChainCode("cc_630d65b3664c42e29570c3754889a7c4"); //reqkey.setUserName("test"); /子用戶名 ResKeyEscrow resKeyEscrow = FabricClient.reqChainCode(reqkey); System.out.println(JSONObject.toJSONString(resKeyEscrow, SerializerFeature.PrettyFormat)); } catch (Exception e) { e.printStackTrace(); }}里面的String[] args = {"{\"basekey\":\"161\",\"basevalue\":\"123\"}"};也可以換成
JSONObject jsonObject=new JSONObject();jsonObject.put("baseKey" , "161");jsonObject.put("baseValue" , "123");String[] args = {JSONObject.toJSONString(jsonObject)};FuncName的值有好幾個,分別是:
set 保存數據event_set 保存數據事件update 更新數據event_update 更新數據事件delete 刪除數據event_delete 刪除數據事件get 獲取數據getHistory 獲取歷史數據1. 增加數據(set)
輸入參數說明
baseKey:需要保存的唯一的主鍵標識
baseValue:保存的數據信息
例:{“baseKey”:“str”,“baseValue”:“this is string”}
其中baseKey是不能為空的字符串,baseValue可以是任意類型的數據。如果baseKey已經存在,則直接返回已經存在,不能添加;如果不存在,則添加數據。
2. 修改數據(update)
輸入參數說明
baseKey:需要修改的唯一的主鍵標識
baseValue:保存的數據信息
例:{“baseKey”:“str”,“baseValue”:“this is string”}
其中baseKey是不能為空的字符串,baseValue可以是任意類型的數據。如果baseKey不存在,則無法更新,如果已經存在,則修改數據。
3. 刪除數據(delete)
輸入參數說明
baseKey:需要刪除的唯一的主鍵標識的值
例:“str”
其中baseKey的值不能為空,且必須存在,否則將無法刪除。
4. 獲取數據(get)
輸入參數說明
baseKey:需要獲取的唯一的主鍵標識的值
例:“str”
其中baseKey的值不能為空,且必須存在,否則將無法獲取到相應的信息。
5. 獲取歷史記錄數據(getHistory)
輸入參數說明
baseKey:需要獲取的唯一的主鍵標識的值
例:“str”
其中baseKey的值不能為空。響應結果:交易Id(txId)、交易時間(txTime)、是否刪除(isDelete)、交易信息(dataInfo)。
保存數據,返回SUCCESS就保存成功了
demo:https://gitee.com/hyh17808770899/spring-boot/tree/master/springboot-bsn-test
總結
以上是生活随笔為你收集整理的区块链测试网服务开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java计算机毕业设计开放式教学评价管理
- 下一篇: 百练4080:Huffman编码树