HyperLedger/Fabric JAVA-SDK with 1.1
該項目可直接在github上訪問。
該項目介紹如何使用fabric-sdk-java框架,基於fabric-sdk-java v1.1正式版開發,可向下兼容1.0版本。
該項目沒有對原JAVA-SDK做修改,主要是結合HyperLedger Fabric與fabric-sdk-java中的交互方式做了個人感覺更為清晰的描述,希望能夠幫助更多的人盡快熟悉fabric-sdk-java的操作流程和方式。
sdk-advance
sdk-advance是基於fabric-sdk-java v1.1的服務,其主要目的是為了更簡單的使用fabric-sdk-java,對原有的調用方法做了進一步封裝,主要提供了各種中轉對象,如智能合約、通道、排序服務、節點、用戶等等,最終將所有的中轉對象交由一個中轉組織來負責配置,其對外提供服務的方式則交給FabricManager來掌管。
該項目僅作為學習分享的形式提交維護,關於生產部署方面,sdk-advance與app的交互可自行選擇采用thrift或protobuf等數據傳輸協議實現,這里並沒有提供該方案的具體實現,需要自己動手解決。
sdk-advance-intermediate
intermediate系列對象是該項目的主要封裝對象,間接屏蔽了真實應用層與fabric-sdk-java之間的直接交互。
- IntermediateOrderer
對於Orderer,我們需要知道所選組織名稱,同時還需要知道Orderer的服務器域名及真實訪問地址。這里的服務器域名是指由crypto-config.yaml中進行指定。
該對象主要提供了對Orderer的服務器域名及真實訪問地址的封裝。 - IntermediatePeer
Peer是部署於本地節點的配置對象,主要包括當前指定的組織節點域名、當前指定的組織節點事件域名、當前指定的組織節點訪問地址、當前指定的組織節點事件監聽訪問地址以及當前peer是否增加Event事件處理。這里的主要配置信息也由crypto-config.yaml中進行指定 - IntermediateChannel
每一個Peer所加入的Channel都有獨立的通道信息,包括名稱或通道tx文件等。IntermediateChannel中定義了通道名稱,除此之外,還針對上面兩個對象進行了調用,並最終生成了Channel對象。
IntermediateChannel中已經開始提供對外服務了,主要依賴於Channel對象所提供的,包括最基本的Peer加入頻道的方法。
另外,IntermediateChannel還提供了一系列基本的溯源方法,包括查詢當前頻道的鏈信息,包括鏈長度、當前最新區塊hash以及當前最新區塊的上一區塊hash、在指定頻道內根據transactionID查詢區塊、在指定頻道內根據hash查詢區塊以及在指定頻道內根據區塊高度查詢區塊等方法。 - IntermediateChaincodeID
IntermediateChaincodeID對象與IntermediateChannel相似,除了包含了必須的成員參數外,也提供了一些對外服務。在IntermediateChaincodeID中主要對智能合約名稱、包含智能合約的go環境路徑、智能合約安裝路徑、智能合約版本號、指定ID的智能合約以及單個提案請求的超時時間以毫秒為單位和事務等待時間以秒為單位。
同時對外提供了安裝智能合約、實例化智能合約、升級智能合約、執行智能合約以及查詢智能合約的服務。 - IntermediateUser
Fabric中有用戶的概念,當然除了用戶之外,在1.1中也有組織、節點等基於CA服務的概念。IntermediateUser主要就是用來處理用戶CA信息的,目前尚未對此類服務提供更好的封裝策略,后續更新中會逐步加入進來,以便提供更簡便的實現方案。當前的具體實現可參考IntermediateOrg。 - IntermediateOrg
上述無論是排序服務、節點服務或是通道、合約等內容,都應該被同一個組織所擁有,這里的同一個是指單體組織,而不是只為一個組織服務,整個基於Fabric的區塊鏈網絡至少應該為一個組織提供服務。
在IntermediateOrg中集合了已有的對象信息,並從中生成了組織用戶以便調用Fabric網絡中的接口數據。案例中的方案並非最優方案,關於Fabric CA的實踐還沒有完成(按照官方的Demo實現無法跑通,如果有能夠實現的朋友,歡迎提交代碼)。
sdk-advance-manager
- OrgManager
組織生成器,該對象已經完全暴露給APP所使用,可以通過SimpleManager對象查看其主要用法。通過OrgManager對外暴露的服務生成系列Intermediate對象,並最終使用use方法確定調用的組織具體對象來生成真正提供Fabric區塊鏈網絡服務的FabricManager。
在使用OrgManager的時候,如果有進一步開發SAAS或更深層BAAS服務的想法,建議不要直接使用SimpleManager中的方案,而是結合關系型數據庫如MySQL等解決方案,將組織中的相關數據持久化,以便后台可以直接獲取並調用。 - FabricManager
區塊鏈網絡服務管理器FabricManager,作為APP直接調用Fabric區塊鏈網絡的入口對象,該對象提供了Channel和ChaincodeID相關的所有接口。
simple
simple是一個基於spring-boot的項目,在simple中主要關注SimpleManager對象的使用,該對象的使用建議根據自身業務的實際需求重新包裝上線,但直接基於此項目應用也沒什么大問題。我的這個simple中的ip的自己申請的服務器,大家可以隨便測試,但不保證有效期,建議自行搭建本地服務測試。
simple-demo
調用示例:
1 OrgManager orgManager = new OrgManager(); 2 orgManager 3 .init("Org1") 4 .setUser("Admin", getCryptoConfigPath("aberic"), getChannleArtifactsPath("aberic")) 5 .setCA("ca", "http://118.89.243.236:7054") 6 .setPeers("Org1MSP", "org1.example.com") 7 .addPeer("peer0.org1.example.com", "peer0.org1.example.com", "grpc://118.89.243.236:7051", "grpc://118.89.243.236:7053", true) 8 .setOrderers("example.com") 9 .addOrderer("orderer.example.com", "grpc://118.89.243.236:7050") 10 .setChannel("mychannel") 11 .setChainCode("test2cc", "/code", "chaincode/chaincode_example02", "1.2", 90000, 120) 12 .openTLS(true) 13 .openCATLS(false) 14 .setBlockListener(map -> { 15 logger.debug(map.get("code")); 16 logger.debug(map.get("data")); 17 }) 18 .add(); 19 FabricManager fabricManager = orgManager.use("Org1"); 20 fabricManager.install(); 21 fabricManager.instantiate(argArray); 22 fabricManager.upgrade(argArray); 23 fabricManager…