Java SDK 快速開始
本文通過示例闡述如何 運(yùn)行應(yīng)用并展示 示例執(zhí)行流程。
運(yùn)行應(yīng)用
應(yīng)用運(yùn)行的過程主要分為 4 步:
準(zhǔn)備環(huán)境
準(zhǔn)備 SSL 連接文件。
要與 BaaS 平臺(tái)建立 SSL 連接,您需準(zhǔn)備四個(gè)證書文件:CA 機(jī)構(gòu)的根證書(
trustCa
)、客戶端的證書文件(client.crt
)、客戶端的私鑰文件(client.key
)以及用戶的賬戶私鑰文件(user.key
)。這四個(gè)文件的詳細(xì)說明如下。文件
說明
來源
client.crt
客戶端的證書文件
使用 BaaS 提供的 密鑰生成工具 生成證書請(qǐng)求文件
client.csr
,提交請(qǐng)求文件到 BaaS 平臺(tái)申請(qǐng)證書,申請(qǐng)成功后可下載此 crt 文件。client.key
客戶端的私鑰文件
通過 BaaS 提供的 密鑰生成工具 生成。
trustCa
存儲(chǔ) CA 證書的 trustStore
通過 BaaS 平臺(tái)下載,trustCa 文件密碼為 mychain。
user.key
賬戶私鑰文件
通過 BaaS 提供的 密鑰生成工具 手動(dòng)生成,或自動(dòng)生成。
獲取鏈節(jié)點(diǎn) IP 和端口號(hào)。
要與合約鏈交互,您需要獲取鏈節(jié)點(diǎn)的 IP 地址和端口號(hào)。在 BaaS 平臺(tái),通過查看目標(biāo)合約鏈詳情,在區(qū)塊瀏覽器中查看節(jié)點(diǎn)詳情,可獲取鏈節(jié)點(diǎn)的 IP 地址和端口號(hào)。
編寫應(yīng)用
使用 IntelliJ IDEA 創(chuàng)建一個(gè)基于 Maven 構(gòu)建的空項(xiàng)目(Demo)。創(chuàng)建完成后,項(xiàng)目目錄結(jié)構(gòu)應(yīng)如下:
在上圖中的
java
目錄創(chuàng)建自定義包名,例如:com.example.demo,并將DemoSample.java
(點(diǎn)擊下載 DemoSample.java 文件)中的內(nèi)容完整拷貝至創(chuàng)建的包中,并將 SDK 必須使用的client.crt
、client.key
、trustCa
及user.key
文件放入到resources
目錄中,如下圖所示:說明Demo 項(xiàng)目中需要使用合約源代碼編譯后的字節(jié)碼。有關(guān)合約源代碼,參見 Solidity 合約開發(fā);Solidity 編譯工具參見 Solidity 合約編譯工具。
在
pom.xml
中添加依賴。將 SDK 與要演示使用的slf4j-log4j12
引入到pom.xml
中,并在resources
中添加log4j
的配置文件,如下圖所示。重要在本步驟中,SDK 依賴的版本號(hào)請(qǐng)使用最新版本。
帶有 slf4j-log4j12 的完整 pom 依賴可參考:
<dependencies> <dependency> <groupId>com.alipay.mychainx</groupId> <artifactId>mychainx-sdk</artifactId> <!--請(qǐng)使用最新 SDK 版本 --> <version>0.10.2.6</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.8.0-alpha0</version> </dependency> </dependencies> <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.6.1</version> </extension> </extensions> </build>
log4j.properties
文件內(nèi)容如下:log4j.rootLogger=INFO, R # 日志輸出位置為控制臺(tái) log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n # 日志輸出位置為文件 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=./sdk.log log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n # mychain-sdk日志開關(guān)配置 log4j.logger.MychainClient=OFF
如果您使用的是logback的日志框架,則日志開關(guān)的配置方法如下:
<logger name="MychainClient" level="OFF"/>
編譯應(yīng)用
在項(xiàng)目根路徑運(yùn)行 mvn clean compile
,執(zhí)行項(xiàng)目編譯。
執(zhí)行應(yīng)用
在 DemoSample.java
中,運(yùn)行該項(xiàng)目。生成的日志文件位于 項(xiàng)目根路徑 ./sdk.log
,若從日志中搜索到“Hand shake success”,則代表與區(qū)塊鏈平臺(tái)連接成功。
預(yù)期輸出如下:
create testAccount1 success.
create testAccount2 success.
deploy contract success.
issue success.
transfer success.
check account balance success.
錯(cuò)誤信息
當(dāng)收到交易的結(jié)果以后,若交易執(zhí)行不正確,可以跟進(jìn)錯(cuò)誤碼去定位錯(cuò)誤原因。
ErrorCode
:MychainBaseResult
中errorCode
字段用來表示交易發(fā)送或者執(zhí)行錯(cuò)誤的原因。
當(dāng)發(fā)送的請(qǐng)求是交易相關(guān)的內(nèi)容時(shí),可根據(jù)交易的返回值字段中獲得關(guān)于交易執(zhí)行錯(cuò)誤更詳細(xì)的錯(cuò)誤碼。以部署合約為例:
MychainBaseResult<ReplyTransactionReceipt> result = sdk.getContractService()
.deployContract(
DeployContractRequest.build(adminAccount.getIdentity(),
Utils.getIdentityByName(testContractId,env), contractCode, VMTypeEnum.EVM,
contractParameters, BigInteger.ZERO, params));
assertTrue(result.isSuccess());
assertEquals(0, result.getData().getTransactionReceipt().getResult());
若
result.getData().getTransactionReceipt().getResult()
為 0,代表交易執(zhí)行成功,反之代表交易執(zhí)行失敗,可以通過result
的值從MychainErrorCodeEnum中
查找錯(cuò)誤原因。result.isSuccess()
可以作為交易是否發(fā)送成功的標(biāo)志。若交易發(fā)送失敗,可通過result.getErrorCode()
獲取錯(cuò)誤碼。
示例執(zhí)行流程
初始化環(huán)境。
//step 1: init logger. initLogger(); //step 2:init mychain env. env = initMychainEnv();
創(chuàng)建賬戶交易。
//step 4: init account that will be created. initAccount(); //step 5: init private key list which will be used during transaction. initPrivateKeyList(); //step 6: execute create two accounts. createAccount();
部署智能合約。
//step 7 : deploy a contract using testAccount1. deployContract();
申購(gòu)積分。
//step 8:issue 100 credits to testAccount2. issue();
進(jìn)行賬戶間轉(zhuǎn)賬。
//step 9 : transfer 50 credits from testAccount2 to testAccount1 transfer();
查詢賬戶余額。
//step 10 : query testAccount2 whose balance should be 50. BigInteger balance = query(test2PrivateKeyArrayList,testAccount2); //step 11 : compare to expect balance. expect(balance,BigInteger.valueOf(50));
關(guān)閉 SDK 連接。
//step 12 : sdk shut down sdk.shutDown();