教程 | 使用WeBASE開(kāi)發(fā)智能合約Java應(yīng)用
區(qū)塊鏈中間件平臺(tái)WeBASE功能豐富、操作友好,備受社區(qū)關(guān)注。WeBASE也不斷迭代優(yōu)化,致力于為社區(qū)帶來(lái)更好的開(kāi)發(fā)體驗(yàn)。
在 WeBASE 的合約IDE中,“Java項(xiàng)目導(dǎo)出”功能除了提供可直接使用的SDK Client實(shí)例等功能之外,新增了導(dǎo)出腳手架時(shí)選中多個(gè)私鑰用戶、封裝了ServiceManaver類(lèi)以支持切換不同的私鑰來(lái)調(diào)用合約的功能。
下面我們以合約倉(cāng)庫(kù)中的存證合約模板為例,一起熟悉一下WeBASE的“Java項(xiàng)目導(dǎo)出”功能,然后盡情地使用WeBASE開(kāi)發(fā)智能合約Java應(yīng)用吧。
前期準(zhǔn)備
我們用 WeBASE-Front 節(jié)點(diǎn)前置進(jìn)行操作。首先打開(kāi)“合約管理”中的“合約倉(cāng)庫(kù)”,導(dǎo)出一份“存證合約”模板到合約IDE中,存證合約模板包含存證實(shí)體 Evidence 和業(yè)務(wù)合約 EvidenceSignersData 兩個(gè)合約。

在合約倉(cāng)庫(kù)中查看應(yīng)用模板的“預(yù)覽和說(shuō)明”,可以看到合約的簡(jiǎn)介文檔。

我們導(dǎo)出存證合約模板到合約IDE后,分別創(chuàng)建一個(gè)名為 Issuer 和 Alice 的私鑰用戶,后面將用這兩個(gè)私鑰來(lái)發(fā)起合約的部署、調(diào)用等交易。
首先,我們?cè)诤霞sIDE中編譯 EvidenceSignersData 合約,并使用 Issuer 用戶部署。部署時(shí) EvidenceSignersData 的構(gòu)造函數(shù)需要傳入私鑰地址,用于初始化存證的 evidenceSigners,入?yún)⒏袷绞堑刂窋?shù)組address[],如下圖所示,我們填入 Issuer 用戶的地址作為初始的 evidenceSigners。

通過(guò)合約代碼邏輯,我們可以了解到,調(diào)用 EvidenceSignersData 合約 newEvidence 方法創(chuàng)建一個(gè)新的存證時(shí),需要使用部署時(shí)傳入的evidenceSigners地址,也就是上文傳入的 Issuer 私鑰地址。
生成腳手架
合約部署后,我們執(zhí)行導(dǎo)出操作,窗口會(huì)嘗試自動(dòng)填入當(dāng)前連接的節(jié)點(diǎn)信息,如果節(jié)點(diǎn)前置未配置鏈節(jié)點(diǎn)的路徑,則可以手動(dòng)填入節(jié)點(diǎn)信息。填入后,我們可以通過(guò)“檢測(cè)”按鈕檢查能否連上節(jié)點(diǎn)。同時(shí),我們?cè)谟脩舻妮斎肟蛑羞x中多個(gè)私鑰用戶,表示導(dǎo)出時(shí)將選中的私鑰導(dǎo)入到即將生成的腳手架中。
值得注意的是,在最新版的WeBASE中點(diǎn)擊“導(dǎo)出Java項(xiàng)目”按鈕后,只要在彈窗里的合約列表中選中合約即可;如果合約是未編譯的,IDE就會(huì)嘗試自動(dòng)完成合約編譯,實(shí)現(xiàn)了無(wú)需關(guān)閉窗口即可完成編譯的操作。

最后選中需要導(dǎo)出的合約后,點(diǎn)擊確認(rèn)按鈕將會(huì)導(dǎo)出合約對(duì)應(yīng)的Java項(xiàng)目腳手架。下面我們通過(guò)Java的IDE打開(kāi)這個(gè)Java腳手架,了解一下腳手架包含了哪些內(nèi)容。
運(yùn)行腳手架
我們用Java的IDE打開(kāi)腳手架項(xiàng)目后,可以看到項(xiàng)目是基于Gradle進(jìn)行構(gòu)建的。

如上圖所示,項(xiàng)目的配置文件中配置了system.peer為節(jié)點(diǎn)的IP與端口,包含了節(jié)點(diǎn)的證書(shū)路徑、合約的地址、加載的私鑰地址以及項(xiàng)目的端口等。
基于WeBASE導(dǎo)出的Java項(xiàng)目也包含了WeBASE-Front節(jié)點(diǎn)前置中配置的sdk證書(shū),如下圖所示,用戶無(wú)需編寫(xiě)Java-SDK中的Client初始化的代碼,直接獲取config包中SdkBeanConfig類(lèi)初始化的Client的Bean實(shí)例即可。

raw包:智能合約Solidity代碼轉(zhuǎn)為Java代碼的類(lèi) service包:在WeBASE 合約IDE中選中的智能合約對(duì)應(yīng)的合約Service類(lèi)。

和raw包中的合約Java類(lèi)一樣,每個(gè)合約Service類(lèi)的實(shí)例都會(huì)綁定一個(gè)私鑰。如果需要使用多個(gè)私鑰時(shí),則需要使用不同的私鑰來(lái)初始化一個(gè)新的合約Service類(lèi)。
此外,WeBASE v1.5.2的更新封裝了一個(gè) ServiceManager 類(lèi),可以根據(jù)私鑰管理多個(gè)合約Service類(lèi)實(shí)例。ServiceManager 根據(jù)項(xiàng)目配置文件 application.properties 中配置的system.hexPrivateKey 獲取多個(gè)私鑰,并且通過(guò)這些私鑰初始化多個(gè)合約Service實(shí)例,保存在一個(gè)Map中。其中,Map以私鑰的地址為Key,以綁定了私鑰的合約Service實(shí)例為Value。

基于腳手架二次開(kāi)發(fā)
我們進(jìn)行業(yè)務(wù)的二次開(kāi)發(fā)時(shí),比如需要調(diào)用存證合約進(jìn)行存證時(shí)(合約的newEvidence方法),怎么通過(guò)腳手架的代碼進(jìn)行合約調(diào)用呢?
在前文部署存證合約時(shí)我們使用了 Issuer 的私鑰地址初始化了 EvidenceSignersData 的合約,因此調(diào)用 newEvidence 方法時(shí),同樣需要使用 Issuer 私鑰來(lái)進(jìn)行存證操作。因此我們可以在 ServiceManager 類(lèi)中通過(guò)Issuer 的地址來(lái)獲取綁定了Issuer 綁定的合約EvidenceSignersDataService實(shí)例。通過(guò)該實(shí)例調(diào)用合約即可。
如下圖所示,我們用一個(gè)單元測(cè)試來(lái)演示存證的核心業(yè)務(wù)代碼,代碼中通過(guò)Spring自帶的 Autowired+Qualifier 獲取 ServiceMap 實(shí)例。
我們通過(guò) Issuer 的地址“0x7553be421a08b702a337a2c2713656138049a9ad” 來(lái)獲取ServiceMap 中綁定了 Issuer 私鑰的 EvidenceSignersDataService 實(shí)例。這樣我們?cè)谡{(diào)用 EvidenceSignersDataService 實(shí)例中的 newEvidence() 方法時(shí),實(shí)例會(huì)使用 Issuer 的私鑰來(lái)發(fā)起交易,如果使用 Alice 私鑰或者其他私鑰,合約則會(huì)返回報(bào)錯(cuò)。

當(dāng)然,我們也可以直接使用腳手架提供的Bean實(shí)例,結(jié)合raw包中的原生合約Java類(lèi)或Java-SDK組裝交易進(jìn)行合約調(diào)用。完成應(yīng)用的二次開(kāi)發(fā)后,也可以通過(guò)WeBASE-APP-SDK接入到WeBASE應(yīng)用管理中進(jìn)行應(yīng)用的運(yùn)維管理。WeBASE應(yīng)用管理地址:
https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-APP-SDK/index.html
構(gòu)建Jar并運(yùn)行
在完成基于腳手架的區(qū)塊鏈應(yīng)用的二次開(kāi)發(fā)后,我們就可以通過(guò)腳手架提供的gradle-wrapper工具進(jìn)行項(xiàng)目構(gòu)建。
# 修改為可執(zhí)行cd demo && chmod +x ./gradlew# 打包./gradlew build -x test# 查看文件ls ./dist
執(zhí)行"gradlew build -x test"即可構(gòu)建得到一個(gè)dist安裝包,如下圖所示:

進(jìn)入dist目錄后,查看application.propertiest文件中連接的節(jié)點(diǎn)IP端口正確后,使用"java -jar demo.jar"命令即可運(yùn)行項(xiàng)目,連接節(jié)點(diǎn)成功后會(huì)打印塊高信息如"Chain connect successful. Current block number 261",應(yīng)用成功啟動(dòng)后最后一行日志會(huì)打印如"Started Application in 5.812 seconds"的日志信息。
即刻使用
上述優(yōu)化及功能所涉及的最新代碼和技術(shù)文檔已同步更新,歡迎體驗(yàn)和star支持。如需咨詢技術(shù)問(wèn)題,歡迎本公眾號(hào)對(duì)話框回復(fù)【小助手】進(jìn)技術(shù)交流群。
向我們報(bào)告問(wèn)題,歡迎提交issue:
https://github.com/WeBankFinTech/WeBASE/issues

