本ガイドでは、BaaS プラットフォーム上で Java アプリケーションを構築・実行する手順について説明します。証明書の準備からスマートコントラクトのデプロイ、アカウント残高のクエリまで、一連の操作を解説します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
BaaS プラットフォームへのアクセス権限があり、対象のコントラクトチェーンが構成済みであること
IntelliJ IDEA および Apache Maven がインストール済みであること
チェーンノードの IP アドレスおよびポート番号が分かっていること(これらの情報は、BaaS プラットフォームのブロックブラウザで対象コントラクトチェーンのノード詳細より確認できます)
アプリケーションの実行
アプリケーションの実行には、以下の 4 つのステップが必要です。
環境の準備
アプリケーションの作成
アプリケーションのコンパイル
アプリケーションの実行
環境の準備
SSL 接続ファイルおよびアカウント認証情報の収集
BaaS プラットフォームとの SSL 接続を確立するため、以下の 4 つのファイルを準備してください。
| ファイル | 説明 | 入手方法 |
|---|---|---|
client.crt | クライアント証明書 | BaaS プラットフォームの キージェネレーター を使用して証明書署名要求ファイル (client.csr) を生成し、client.csr を BaaS プラットフォームに提出して証明書を申請し、承認後に .crt ファイルをダウンロードします。 |
client.key | クライアント秘密鍵 | BaaS プラットフォームの キージェネレーター を使用して生成します。 |
trustCa | CA 証明書用 trustStore | BaaS プラットフォームからダウンロードします。このファイルのパスワードは mychain です。 |
user.key | アカウント秘密鍵(トランザクション送信時に必要) | BaaS プラットフォームの キージェネレーター を使用して、手動または自動でこのファイルを生成します。 |
TEE ハードウェアプライバシー対応コントラクトチェーンファイルの収集(該当する場合)
ご使用のコントラクトチェーンが Trusted Execution Environment(TEE)ハードウェアプライバシー構成を採用している場合は、以下のファイルも準備してください。標準コントラクトチェーンの場合は、このステップはスキップしてください。
| ファイル | 説明 | 入手方法 |
|---|---|---|
tee_rsa_public_key.pem | ノードの公開 RSA 公開鍵ファイル | BaaS プラットフォームからダウンロードします。 |
アプリケーションの作成
プロジェクト構造の設定
IntelliJ IDEA で Maven プロジェクトを作成します。
プロジェクト内、
javaディレクトリ配下にカスタムパッケージ(例:com.example.demo)を作成します。その後、DemoSample.java をダウンロードし、その内容全体をパッケージ内にコピーします。上記の 4 つの認証情報ファイルを
resourcesディレクトリに配置します。your-project/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com/example/demo/ │ │ └── DemoSample.java # アプリケーションのエントリポイント │ └── resources/ │ ├── client.crt # クライアント証明書 │ ├── client.key # クライアント秘密鍵 │ ├── trustCa # CA trustStore(パスワード:mychain) │ └── user.key # トランザクション用アカウント秘密鍵 └── pom.xml
デモプロジェクトでは、スマートコントラクトのコンパイル済みバイトコードが必要です。Solidity コントラクトの記述方法については、「Solidity コントラクト開発」をご参照ください。Solidity コンパイラについては、「Solidity コントラクトコンパイラ」をご参照ください。
Maven 依存関係の追加
pom.xml に以下の内容を追加します。SDK の依存関係は、常に最新バージョンを使用してください。
<dependencies>
<dependency>
<groupId>com.alipay.mychainx</groupId>
<artifactId>mychainx-sdk</artifactId>
<!-- 最新バージョンの SDK を使用してください。 -->
<version>0.10.2.12</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>Netty の読み込みエラーが発生した場合、netty-tcnative-openssl-static アーティファクトを除外します。
<dependencies>
<dependency>
<groupId>com.alipay.mychainx</groupId>
<artifactId>mychainx-sdk</artifactId>
<!-- 最新バージョンの SDK を使用してください。 -->
<version>0.10.2.12</version>
<exclusions>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative-openssl-static</artifactId>
</exclusion>
</exclusions>
</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 ファイルを resources ディレクトリに追加します。
log4j.rootLogger=INFO, R
# ログ出力先はコンソールです。
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 のログ出力制御設定
log4j.logger.MychainClient=OFFlog4j ではなく logback を使用する場合は、以下の設定を logback 構成に追加します。
<logger name="MychainClient" level="OFF"/>アプリケーションのコンパイル
プロジェクトのルートディレクトリで、以下のコマンドを実行します。
mvn clean compileアプリケーションの実行
DemoSample.java を実行します。プロジェクトのルートディレクトリに sdk.log という名前のログファイルが作成されます。
接続が正常に確立されたことを確認するには、sdk.log 内に Hand shake success というメッセージが含まれていることを確認してください。
正常終了時の期待される出力は以下のとおりです。
testAccount1 の作成に成功しました。
testAccount2 の作成に成功しました。実行プロセスの例
DemoSample.java 内のすべてのステップは、線形フローに従います。以下各セクションでは、各ステップの処理内容と期待される出力を説明します。
ステップ 1:環境の初期化
ロガーの設定、Mychain 環境の初期化、SDK クライアントの起動を行います。
// ステップ 1:ロガーを初期化します。
initLogger();
// ステップ 2:Mychain 環境を初期化します。
env = initMychainEnv();
// ステップ 3:SDK を起動します。
MychainClient sdk = new MychainClient();
sdk.init(env);ステップ 2:アカウントの作成
2 つのテストアカウントおよびトランザクション承認に使用する秘密鍵リストを初期化し、アカウント作成トランザクションを送信します。
// ステップ 4:作成するアカウントを初期化します。
initAccount();
// ステップ 5:トランザクション実行時に使用する秘密鍵リストを初期化します。
initPrivateKeyList();
// ステップ 6:2 つのアカウントを作成します。
createAccount();期待される出力:
create testAccount1 success.
create testAccount2 success.ステップ 3:スマートコントラクトのデプロイ
testAccount1 を使用してコントラクトをデプロイします。
// ステップ 7:testAccount1 を使用してコントラクトをデプロイします。
deployContract();期待される出力:
deploy contract success.ステップ 4:クレジットの発行
testAccount2 に 100 クレジットを発行します。
// ステップ 8:testAccount2 に 100 クレジットを発行します。
issue();期待される出力:
issue success.ステップ 5:クレジットの転送
testAccount2 から testAccount1 へ 50 クレジットを転送します。
// ステップ 9:testAccount2 から testAccount1 へ 50 クレジットを転送します。
transfer();期待される出力:
transfer success.ステップ 6:アカウント残高のクエリ
testAccount2 の残高をクエリし、その値が 50 であることを確認します。
// ステップ 10:残高が 50 となる testAccount2 をクエリします。
BigInteger balance = query(test2PrivateKeyArrayList, testAccount2);
// ステップ 11:期待される残高と比較します。
expect(balance, BigInteger.valueOf(50));期待される出力:
check account balance success.ステップ 7:SDK のシャットダウン
SDK 接続をクリーンに解放します。
// ステップ 12:SDK をシャットダウンします。
sdk.shutDown();暗号化キットの指定
コントラクトチェーン環境では、以下の 2 種類の暗号化キットが利用可能です。
| キット | アルゴリズム | 適用対象 |
|---|---|---|
classic | SHA-256 ダイジェスト、ECC 公開鍵アルゴリズム、AES 対称暗号化 | 標準コントラクトチェーン |
china-sm | SM3 ダイジェスト、SM2 公開鍵アルゴリズム、SM4 対称暗号化 | 中国国家暗号規格を採用するコントラクトチェーン |
対象のコントラクトチェーンで使用されるキットを確認するには、チェーン管理者にお問い合わせください。
ClientEnv を構築する際に、SignerBase を明示的に指定します。
Pkcs8KeyOperator pkcs8KeyOperator = new Pkcs8KeyOperator();
Keypair keyPair = pkcs8KeyOperator.load(privateKeyPath, keyPassword);
SignerBase signerBase = MyCrypto.getInstance().createSigner(keyPair);暗号化キットは、SDK とコントラクトプラットフォーム間の通信には影響しません。通信は、証明書を発行する PKI 権限によって管理されます。