官方hyperledger fabric java sdk 修改整合版
這個版本根據官方hyperledger/fabric-sdk-java項目修改而來。
項目源碼地址:
準備工作
本文只關注java sdk,fabric服務器部分只大概講一下。
在java sdk跑起來之前,首先要把fabric服務器跑起來。
跑起來之後,需要把orderer的證書複製到java服務器這邊用來調用使用。
除了invoke不用一定是管理員權限外,其他對鏈碼的操作都需要是管理員權限。
拿過來證書後,首先需要註冊一下,或者已經通過註冊了的話可以把密碼拷貝過來供enroll使用
(我自己搭建測試節點環境是參考了這篇博客,很詳細 超級賬本HyperLedger:Fabric的全手動、多服務器部署教程
enroll user這個步驟是調用其他接口時用來驗證身份的,既可以通過ca服務器把賬號密碼傳過去直接enroll,也可以讀取已經enroll的本地用戶證書使用
// 從本地直接讀取用戶證書使用
private SampleUser setupPeerAdmin(SampleOrg sampleOrg) throws Exception {
// peerAdmin
String domainName = sampleOrg.getDomainName();
String orgName = sampleOrg.getName();
File adminKeystore = Paths.get(FAB_CONFIG.getChannelPath(), "crypto-config/peerOrganizations/",
domainName, format("/users/Admin@%s/msp/keystore", domainName)).toFile();
File adminCert = Paths.get(FAB_CONFIG.getChannelPath(), "crypto-config/peerOrganizations/", domainName,
format("/users/Admin@%s/msp/signcerts/Admin@%s-cert.pem", domainName, domainName)).toFile();
SampleUser peerOrgAdmin = sampleStore.getMember(orgName + "Admin", orgName, sampleOrg.getMSPID(),
Util.findFileSk(adminKeystore),
adminCert);
return peerOrgAdmin;
}
功能劃分
sdk的功能在com.routz.fabric_java_sdk_integration.FabTest
類裏都有測試用例,所有功能提供如下:
用戶:
register user
enroll user
通道:
construct channel
鏈碼:
install chaincode
check install status
instantied chaincode proposal
query instantied chaincode proposal status
install upgrade proposal
upgrade chaincode
invoke chaincode
query chaincode
配置
用戶密碼,通道名稱, 鏈碼路徑等配置
com.routz.fabric_java_sdk_integration.util.FabricUtils
裏面配置的鏈碼路徑和版本
private static final String FUNCTION_NAME = "checkin";
private static final String CHAIN_CODE_NAME = "checkin_go";
private static final String CHAIN_CODE_PATH = "github.com/chickin_1_13";
private static final String CHAIN_CODE_VERSION = "1.21";
private static final String CHAIN_CODE_FILEPATH = "sdkintegration/gocc/chicken";
private static final TransactionRequest.Type CHAIN_CODE_LANG = TransactionRequest.Type.GO_LANG;
com.routz.fabric_java_sdk_integration.util.FabConfig
裏面配置用戶名密碼,通道名稱,組織名稱,是否使用tls等屬性
private static final String ORG_NAME = "peerOrg1";
private static final String CHANNEL_NAME = "foo";
private static final String testUser1 = "user1";
private static final String adminPass = "adminpw";
private static final String sercet1 = "MzoRLMuNWNnY";
private static final boolean runningFabricCATLS = false;
private static final boolean runningFabricTLS = false;
由於配置文件比較多,我用絕對路徑把證書等各種文件放在了/var/fabj/src/test/fixture
路徑下
上面說的一些配置只是爲了簡化寫到了代碼裏,可以根據實際情況修改
組織節點配置
在src\main\resources\fabric_config.yaml
裏配置有組織節點的信息配置,自己的節點按如下格式配置,啓動時就會把信息讀取進來
orgs:
peerOrg1:
name: peerOrg1
mspid: Org1MSP
domainName: org1.example.com
peerLocations:
peer0.org1.example.com: grpc://192.168.1.40:7051
peer1.org1.example.com: grpc://192.168.1.41:7056
ordererLocations:
orderer.example.com: grpc://192.168.1.40:7050
caName: ca0
caLocation: http://192.168.1.43:7054
peerOrg2:
name: peerOrg2
mspid: Org2MSP
domainName: org2.example.com
peerLocations:
peer0.org2.example.com: grpc://192.168.1.40:8051
ordererLocations:
orderer.example.com: grpc://192.168.1.40:7050
caLocation: http://192.168.1.43:8054
生成通道
官方自帶通道foo和bar的tx文件,如果要自定義創建通道時,要先在服務器上生成*.tx文件,拷貝到項目路徑下,將路徑作爲參數調用
參考sdk
生成*.tx文件的命令:
cd /項目路徑/src/test/fixture/sdkintegration/e2e-2Orgs/v1.3
configtxgen --configPath . -outputCreateChannelTx 通道名.tx -profile TwoOrgsChannel_v13 -channelID 通道名
這樣就在目錄下生成通道名.tx
文件了
示例鏈碼
在下有個模擬物聯網設備打卡簽到的簡單鏈碼,我爲什麼這樣寫呢?可以參考我寫的一篇博客hyperledger fabric java sdk 多線程併發調用時遇到 TransactionEventException的解決辦法
我對 fabric 瞭解還不夠,深感自己學識淺薄,這個sdk還有很大優化餘地,有任何問題都可以提出來,我會盡力與你探討和解決,區塊鏈行業還算起步階段,各種資料,社區都還不足,希望能與你共同呵護行業的發展~