区块链测试网服务开发
1、準(zhǔn)備一個(gè)空白的springboot項(xiàng)目
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";} }運(yùn)行一下看看能不能用
2、引入jar包
下載:bsn-sdk-java-jar-with-dependencies.jar
方法一
將下載后的jar包放在項(xiàng)目的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進(jìn)入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將其導(dǎo)入到本地的maven倉(cāng)庫(kù),再在pom.yml文件中引入
<dependency><groupId>com.example.javacc</groupId><artifactId>bsn-sdk-java</artifactId><version>1.0-SNAPSHOT</version> </dependency>3、搬源碼
將下載后的源碼打開,找到test下的.java文
將里面的文件copy到自己新建的項(xiàng)目下,記得將readme_CN.md也復(fù)制一下,有用
服務(wù)的平臺(tái)類型是Fabric-2.3.2-secp256r1,選擇Fabric
4、下載秘鑰
查看我的服務(wù),然后把下圖所示的內(nèi)容記下來(lái),并且下載證書
下載后的文件里面有個(gè)ReadMe.txt文件,仔細(xì)閱讀里面的內(nèi)容
證書下載壓縮包含用戶鏈下應(yīng)用證書和網(wǎng)關(guān)證書兩大部分:
1、userAppCert目錄:用于存放鏈下應(yīng)用證書,具體文件如下:
【1】secp256r1目錄:如果您發(fā)布測(cè)試網(wǎng)服務(wù)算法類型為secp256r1時(shí),使用該目錄證書進(jìn)行簽名以及驗(yàn)證。
【1】public_cert.pem:應(yīng)用證書公鑰文件,主要用于網(wǎng)關(guān)對(duì)接受的簽名數(shù)據(jù)進(jìn)行驗(yàn)證或公開給其它使用者。
【2】private_key.pem:應(yīng)用證書私鑰文件,主要用于請(qǐng)求網(wǎng)關(guān)時(shí)對(duì)數(shù)據(jù)進(jìn)行簽名以及驗(yàn)證。
【2】secp256k1目錄:如果您發(fā)布測(cè)試網(wǎng)服務(wù)算法類型為secp256k1時(shí),使用該目錄證書進(jìn)行簽名。
【1】public_cert.pem:應(yīng)用證書公鑰文件,主要用于網(wǎng)關(guān)對(duì)接受的簽名數(shù)據(jù)進(jìn)行驗(yàn)證或公開給其它使用者。
【2】private_key.pem:應(yīng)用證書私鑰文件,主要用于請(qǐng)求網(wǎng)關(guān)時(shí)對(duì)數(shù)據(jù)進(jìn)行簽名。
【3】sm2目錄:如果您發(fā)布測(cè)試網(wǎng)服務(wù)算法類型為國(guó)密(sm2)時(shí),使用該目錄證書進(jìn)行簽名以及驗(yàn)證。
【1】public_cert.pem:應(yīng)用證書公鑰文件,主要用于網(wǎng)關(guān)對(duì)接受的簽名數(shù)據(jù)進(jìn)行驗(yàn)證或公開給其它使用者。
【2】private_key.pem:應(yīng)用證書私鑰文件,主要用于請(qǐng)求網(wǎng)關(guān)時(shí)對(duì)數(shù)據(jù)進(jìn)行簽名。
2、gatewayCert目錄:用于存放網(wǎng)關(guān)證書,具體文件如下:
【1】gateway_public_cert_secp256r1.pem:網(wǎng)關(guān)公鑰secp256r1證書,如果您發(fā)布測(cè)試網(wǎng)服務(wù)算法類型為secp256r1時(shí),用該公鑰證書對(duì)網(wǎng)關(guān)響應(yīng)時(shí)的數(shù)據(jù)進(jìn)行驗(yàn)簽。
【2】gateway_public_cert_secp256k1.pem:網(wǎng)關(guān)公鑰secp256k1證書,如果您發(fā)布測(cè)試網(wǎng)服務(wù)算法類型為secp256k1時(shí),用該公鑰證書對(duì)網(wǎng)關(guān)響應(yīng)時(shí)的數(shù)據(jù)進(jìn)行驗(yàn)簽。
【3】gateway_public_cert_sm2.pem:網(wǎng)關(guān)公鑰國(guó)密(sm2)證書,如果您發(fā)布測(cè)試網(wǎng)服務(wù)算法類型為國(guó)密(sm2)時(shí),用該公鑰證書對(duì)網(wǎng)關(guān)響應(yīng)時(shí)的數(shù)據(jù)進(jìn)行驗(yàn)簽。
3、fabricMsp目錄:為Fabric上傳公鑰模式中的本地證書,具體文件如下:
【1】keystore目錄:用戶證書的私鑰。
【2】{testuser}@{AppCode}-cert.pem:Fabric的用戶證書文件。
【注】使用方式: 為將fabricMsp中的{testuser}@{AppCode}-cert.pem文件修改為【子用戶名@AppCode-cert.pem】,并將該文件夾路徑配置到config中的mspDir參數(shù)。
4、此類證書文件,只限于測(cè)試網(wǎng)與節(jié)點(diǎn)網(wǎng)關(guān)數(shù)據(jù)交互簽名與驗(yàn)簽使用,不用于任何應(yīng)用業(yè)務(wù)處理!
因?yàn)槲医ǖ姆?wù)平臺(tái)類型為Fabric-2.3.2-secp256r1,所以找到下面的文件,將其移動(dòng)到springboot項(xiàng)目的resources目錄下
5、初始化config
初始化config有兩種方法,可以通過(guò)實(shí)例化配置對(duì)象或讀取json文件來(lái)初始化配置
api:="" //節(jié)點(diǎn)網(wǎng)關(guān)地址 userCode:="" //用戶編號(hào) appCode :="" //應(yīng)用編號(hào) puk :="" //應(yīng)用公鑰內(nèi)容 prk :="" //應(yīng)用私鑰內(nèi)容 mspdir:="" //注冊(cè)用戶證書存放目錄方法一:實(shí)例化配置對(duì)象
秘鑰位置如圖:
沒用到MspDir,所以就沒加MspDir參數(shù)
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文件
現(xiàn)在項(xiàng)目里面新建一個(gè)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);}測(cè)試運(yùn)行一下看看能不能用:
6、子用戶注冊(cè)
public void userRegister() { try { initConfig(); //這里為示例,實(shí)際使用中,值需在程序生命周期內(nèi)調(diào)用一次即可 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(); }}可能應(yīng)為這是測(cè)試服務(wù)的問(wèn)題,注冊(cè)用戶的時(shí)候無(wú)法注冊(cè)成功,但是換成正常建立的服務(wù)就沒得問(wèn)題
7、數(shù)據(jù)操作
如果上面的子用戶注冊(cè)成功了,就可以在添加數(shù)據(jù)的時(shí)候加上子用戶名
ChainCode是服務(wù)部署成功后的鏈碼部署名稱,用到哪個(gè)鏈碼包就輸入對(duì)應(yīng)的鏈碼部署名稱
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的值有好幾個(gè),分別是:
set 保存數(shù)據(jù)event_set 保存數(shù)據(jù)事件update 更新數(shù)據(jù)event_update 更新數(shù)據(jù)事件delete 刪除數(shù)據(jù)event_delete 刪除數(shù)據(jù)事件get 獲取數(shù)據(jù)getHistory 獲取歷史數(shù)據(jù)1. 增加數(shù)據(jù)(set)
輸入?yún)?shù)說(shuō)明
baseKey:需要保存的唯一的主鍵標(biāo)識(shí)
baseValue:保存的數(shù)據(jù)信息
例:{“baseKey”:“str”,“baseValue”:“this is string”}
其中baseKey是不能為空的字符串,baseValue可以是任意類型的數(shù)據(jù)。如果baseKey已經(jīng)存在,則直接返回已經(jīng)存在,不能添加;如果不存在,則添加數(shù)據(jù)。
2. 修改數(shù)據(jù)(update)
輸入?yún)?shù)說(shuō)明
baseKey:需要修改的唯一的主鍵標(biāo)識(shí)
baseValue:保存的數(shù)據(jù)信息
例:{“baseKey”:“str”,“baseValue”:“this is string”}
其中baseKey是不能為空的字符串,baseValue可以是任意類型的數(shù)據(jù)。如果baseKey不存在,則無(wú)法更新,如果已經(jīng)存在,則修改數(shù)據(jù)。
3. 刪除數(shù)據(jù)(delete)
輸入?yún)?shù)說(shuō)明
baseKey:需要?jiǎng)h除的唯一的主鍵標(biāo)識(shí)的值
例:“str”
其中baseKey的值不能為空,且必須存在,否則將無(wú)法刪除。
4. 獲取數(shù)據(jù)(get)
輸入?yún)?shù)說(shuō)明
baseKey:需要獲取的唯一的主鍵標(biāo)識(shí)的值
例:“str”
其中baseKey的值不能為空,且必須存在,否則將無(wú)法獲取到相應(yīng)的信息。
5. 獲取歷史記錄數(shù)據(jù)(getHistory)
輸入?yún)?shù)說(shuō)明
baseKey:需要獲取的唯一的主鍵標(biāo)識(shí)的值
例:“str”
其中baseKey的值不能為空。響應(yīng)結(jié)果:交易Id(txId)、交易時(shí)間(txTime)、是否刪除(isDelete)、交易信息(dataInfo)。
保存數(shù)據(jù),返回SUCCESS就保存成功了
demo:https://gitee.com/hyh17808770899/spring-boot/tree/master/springboot-bsn-test
總結(jié)
以上是生活随笔為你收集整理的区块链测试网服务开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java计算机毕业设计开放式教学评价管理
- 下一篇: 百练4080:Huffman编码树