Java SDK 快速開始
本文通過示例闡述如何 運(yùn)行應(yīng)用,展示 示例執(zhí)行流程,并指導(dǎo)如何 指定密碼學(xué)套件。
運(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)生成下載。
準(zhǔn)備 TEE 硬件隱私合約鏈文件。
如果使用 TEE 硬件隱私合約鏈,還需要使用一個(gè)
tee_rsa_public_key.pem
文件,此文件可從已存在的 TEE 硬件隱私合約鏈申請(qǐng),如果使用的是標(biāo)準(zhǔn)的合約鏈,則不需要使用此文件。文件名稱
文件說明
文件來源
tee_rsa_public_key.pem
TEE 硬件隱私合約鏈,節(jié)點(diǎn)對(duì)外公開的 RSA 公鑰文件
通過 BaaS 平臺(tái)下載。
看合約鏈節(jié)點(diǎn)信息。
要與合約鏈交互,您需要獲取鏈節(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 與項(xiàng)目使用的依賴引入到pom.xml
,并在resources
中添加log4j
的配置文件。重要在本步驟中,SDK 依賴的版本號(hào)請(qǐng)使用最新版本。
完整 pom 依賴可參考:
<dependencies> <dependency> <groupId>com.alipay.mychainx</groupId> <artifactId>mychainx-sdk</artifactId> <!--請(qǐng)使用最新 SDK 版本 --> <version>0.10.2.12</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.60</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.29.Final</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>2.0.17.Final</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>20.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.5</version> </dependency> </dependencies> <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.6.1</version> </extension> </extensions> </build>
在某些情況下,可能會(huì)出現(xiàn)如下異常:
異常原因有可能是 Netty 加載失敗,可以嘗試修改 netty 依賴,如下所示:
<dependency> <groupId>com.alipay.mychainx</groupId> <artifactId>mychainx-sdk</artifactId> <!--請(qǐng)使用最新 SDK 版本 --> <version>0.10.2.12</version> <exclusions> <exclusion> <groupId>io.netty</groupId> <artifactId>netty-tcnative-openssl-static</artifactId> </exclusion> </exclusions> </dependency>
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.
示例執(zhí)行流程
初始化環(huán)境。
//step 1: init logger. initLogger(); //step 2:init mychain env. env = initMychainEnv(); //step 3: start sdk. MychainClient sdk = new MychainClient(); sdk.init(env);
創(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();
申購積分。
//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();
指定密碼學(xué)套件
合約鏈的鏈環(huán)境可能使用以下兩種密碼學(xué)套件中的一種:
classic:使用國際商用密碼算法,包括 SHA256 摘要、ECC 公鑰算法、AES 對(duì)稱加密等,標(biāo)準(zhǔn)合約鏈默認(rèn)為此套件配置;
china-sm:使用中國國家商用密碼算法,包括 SM3 摘要、SM2 公鑰算法、SM4 對(duì)稱加密等,國密算法合約鏈默認(rèn)為此套件配置。
如果不清楚 SDK 連接的目標(biāo)合約鏈?zhǔn)褂玫氖悄囊环N密碼套件,可咨詢?cè)撴湹墓芾韱T。構(gòu)建 ClientEnv
時(shí),必須明確指定 SignerBase。示例如下:
Pkcs8KeyOperator pkcs8KeyOperator = new Pkcs8KeyOperator();
Keypair keyPair = pkcs8KeyOperator.load(privateKeyPath, keyPassword);
SignerBase signerBase = MyCrypto.getInstance().createSigner(keyPair);
SDK 與合約平臺(tái)之間的 SSL 通信不受密碼學(xué)套件影響,由頒發(fā)證書的 PKI 機(jī)構(gòu)決定。