Bringing Your Own Databaseを用いた個別Node専用のDatabaseの設定
はじめに
この記事はCorda5.2から実装されたBringing Your Own Database(BYOD)を用いて、Node保有者が個別のDBにStateやTransactionを保存するための方法について説明するものです。Corda5はデフォルトではCorda clusterが管理するRDBにvNodeごとにスキーマおよびテーブルを設けてデータを記録しますが、BYODを用いることで、別のRDBにvNode保有者に関するデータを作成して記録することで、独立性を高められます。
想定読者
- Corda cluster構築に携わるインフラエンジニア
- vNode管理者もしくはオペレーター
前提
- 任意のCorda clusterが起動していること。
- vNodeが使用するCPIがCorda clusterにアップロード済であり、CPIのIDを把握していること。本記事では”
374D330E34BD
”がCPIのIDに相当します。 - BYOD用のRDBインスタンスが用意されていること。
- 任意の操作端末から上記RDBにアクセス可能なこと。本記事ではプライベートサブネットにRDBを配置しているため、Kubernetes cluster上に起動したUbuntu Podの”
my-ubuntu
”を操作端末として使用しています。 my-ubuntu
に以下の環境変数を定義してください。
export REST_API_HOST=172.16.1.37 # Kubernetes上に採番されたREST APIのIPアドレス
export REST_API_PORT=8888 # Kubernetes上に採番されたREST APIのport番号
export P2P_GATEWAY_HOST=172.16.1.37 # Kubernetes上に採番されたP2P GATEWAYのIPアドレス
export P2P_GATEWAY_PORT=8080 # Kubernetes上に採番されたP2P GATEWAYのport番号
export REST_API_URL="https://$REST_API_HOST:$REST_API_PORT/api/v5_2"
export REST_API_USER=admin # REST APIのユーザー
export REST_API_PASSWORD=admin # REST APIのパスワード
- 上記RDBにおいて以下の操作権限をもつロールが使用可能なこと。本記事では”
corda
”が相当します。 - CREATE ROLE
- CREATE SCHEMA
- ALTER ROLE
- 上記RDBがCorda clusterからのアクセスを許可していること。
設定手順
BYODで使用するRDBへの設定は、vNodeの作成前に完了させる必要があります。
ロール、スキーマ作成
CordaのvNodeは様々なテーブルを保有していますが、主に「crypto」、「valut」、「uniqueness」という3つのカテゴリに分かれます。それぞれはスキーマおよびロールが異なります。
my-ubuntu
から以下のsqlファイルを作成します。
root@my-ubuntu:~# cat create_role_schemas.sql
-- ロール作成
create role demi_crypto_ddl with login password 'dmcryptoddl';
create role demi_crypto_dml with login password 'dmcryptodml';
create role demi_uniq_ddl with login password 'dmuniqddl';
create role demi_uniq_dml with login password 'dmuniqdml';
create role demi_vault_ddl with login password 'dmvaultddl';
create role demi_vault_dml with login password 'dmvaultdml';
-- スキーマ作成
CREATE SCHEMA demi_crypto;
-- 「ロール作成」で生成したroleにsearch_pathとして設定。
ALTER USER demi_crypto_ddl SET search_path TO demi_crypto;
ALTER USER demi_crypto_dml SET search_path TO demi_crypto;
GRANT CREATE,USAGE ON SCHEMA demi_crypto TO demi_crypto_ddl;
GRANT INSERT ON ALL TABLES IN SCHEMA demi_crypto TO demi_crypto_ddl;
CREATE SCHEMA demi_uniq;
-- 「ロール作成」で生成したroleにsearch_pathとして設定。
ALTER USER demi_uniq_ddl SET search_path TO demi_uniq;
ALTER USER demi_uniq_dml SET search_path TO demi_uniq;
GRANT CREATE,USAGE ON SCHEMA demi_uniq TO demi_uniq_ddl;
GRANT INSERT ON ALL TABLES IN SCHEMA demi_uniq TO demi_uniq_ddl;
CREATE SCHEMA demi_vault;
-- 「ロール作成」で生成したroleにsearch_pathとして設定。
ALTER USER demi_vault_ddl SET search_path TO demi_vault;
ALTER USER demi_vault_dml SET search_path TO demi_vault;
GRANT CREATE,USAGE ON SCHEMA demi_vault TO demi_vault_ddl;
GRANT INSERT ON ALL TABLES IN SCHEMA demi_vault TO demi_vault_ddl;
- ロール
corda
でSQLファイルを実行します。
root@my-ubuntu:~# psql -U corda -f create_role_schemas.sql
Password for user corda:
CREATE ROLE
CREATE ROLE
.
.
.
GRANT
GRANT
# エラーがでなければOK
テーブル作成
BYODに必要なテーブルを作成するためのSQLスクリプトは、Corda clusterにREST API経由で問い合わせることで取得できます。このテーブル作成が完了したら、いよいよvNodeの登録作業に移ります。
- cryptoスキーマのSQL取得
curl -k -u $REST_API_USER:$REST_API_PASSWORD -X GET $REST_API_URL/virtualnode/create/db/crypto > create_crypto_tables.sql
# 数十行のSQLが表示されます。
root@my-ubuntu:/# cat create_crypto_tables.sql
-- *********************************************************************
-- Update Database Script
-- *********************************************************************
-- Change Log: /tmp/offline-db/changelog-db932483-2e8b-458e-b287-9b4a475c8360.xml
-- Ran at: 10/1/24, 9:09 AM
-- Against: null@offline:postgresql?changeLogFile=/tmp/offline-db/changelog-db932483-2e8b-458e-b287-9b4a475c8360.xml&outputLiquibaseSql=all
-- Liquibase version: 4.19.0
-- *********************************************************************
CREATE TABLE IF NOT EXISTS databasechangelog (ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED TIMESTAMP WITHOUT TIME ZONE NOT NULL, ORDEREXECUTED INTEGER NOT NULL, EXECTYPE VARCHAR(10) NOT NULL, MD5SUM VARCHAR(35), DESCRIPTION VARCHAR(255), COMMENTS VARCHAR(255), TAG VARCHAR(255), LIQUIBASE VARCHAR(20), CONTEXTS VARCHAR(255), LABELS VARCHAR(255), DEPLOYMENT_ID VARCHAR(10));
-- Changeset net/corda/db/schema/vnode-crypto/migration/vnode-crypto-creation-v1.0.xml::vnode-crypto-creation-v1.0::R3.Corda
CREATE TABLE crypto_wrapping_key (id UUID NOT NULL, alias VARCHAR(64) NOT NULL, generation INTEGER NOT NULL, created TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW() NOT NULL, encoding_version INTEGER NOT NULL, algorithm_name VARCHAR(64) NOT NULL, key_material BYTEA NOT NULL, rotation_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, is_parent_key_managed BOOLEAN NOT NULL, parent_key_reference VARCHAR(256) NOT NULL);
.
.
.
INSERT INTO databasechangelog (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('vnode-crypto-creation-v1.0', 'R3.Corda', 'net/corda/db/schema/vnode-crypto/migration/vnode-crypto-creation-v1.0.xml', NOW(), 1, '8:16dd3ddc61c20e053484412f3dc7d325', 'createTable tableName=crypto_wrapping_key; addPrimaryKey constraintName=crypto_wrapping_key_pk, tableName=crypto_wrapping_key; addUniqueConstraint constraintName=alias_and_generation_are_unique, tableName=crypto_wrapping_key; createTable tableName...', '', 'EXECUTED', NULL, NULL, '4.19.0', '7773758905');
- CRYPTO DDLロール(
demi_crypto_ddl
)で1のSQLを実行。
root@my-ubuntu:/# psql -U demi_crypto_ddl -f create_crypto_tables.sql
Password for user demi_crypto_ddl:
CREATE TABLE
CREATE TABLE
.
.
.
ALTER TABLE
INSERT 0 1
# エラーがでなければOK
- uniquenessスキーマのSQL取得
curl -k -u $REST_API_USER:$REST_API_PASSWORD -X GET $REST_API_URL/virtualnode/create/db/uniqueness > create_uniqueness_tables.sql
# 数十行のSQLが表示されます。
root@my-ubuntu:/# cat create_uniqueness_tables.sql
-- *********************************************************************
-- Update Database Script
-- *********************************************************************
-- Change Log: /tmp/offline-db/changelog-bcbee5a9-4b64-468b-8fa6-4318c16d02ba.xml
-- Ran at: 10/1/24, 9:30 AM
-- Against: null@offline:postgresql?changeLogFile=/tmp/offline-db/changelog-bcbee5a9-4b64-468b-8fa6-4318c16d02ba.xml&outputLiquibaseSql=all
-- Liquibase version: 4.19.0
-- *********************************************************************
CREATE TABLE IF NOT EXISTS databasechangelog (ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED TIMESTAMP WITHOUT TIME ZONE NOT NULL, ORDEREXECUTED INTEGER NOT NULL, EXECTYPE VARCHAR(10) NOT NULL, MD5SUM VARCHAR(35), DESCRIPTION VARCHAR(255), COMMENTS VARCHAR(255), TAG VARCHAR(255), LIQUIBASE VARCHAR(20), CONTEXTS VARCHAR(255), LABELS VARCHAR(255), DEPLOYMENT_ID VARCHAR(10));
-- Changeset net/corda/db/schema/vnode-uniqueness/migration/vnode-uniqueness-creation-v1.0.xml::uniqueness-creation-v1.0-1::R3.Corda
CREATE TABLE uniqueness_state_details (issue_tx_id_algo VARCHAR(8) NOT NULL, issue_tx_id BYTEA NOT NULL, issue_tx_output_idx INTEGER NOT NULL, consuming_tx_id_algo VARCHAR(8), consuming_tx_id BYTEA);
ALTER TABLE uniqueness_state_details ADD CONSTRAINT uniqueness_state_details_pkey PRIMARY KEY (issue_tx_id_algo, issue_tx_id, issue_tx_output_idx);
INSERT INTO databasechangelog (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('uniqueness-creation-v1.0-1', 'R3.Corda', 'net/corda/db/schema/vnode-uniqueness/migration/vnode-uniqueness-creation-v1.0.xml', NOW(), 1, '8:0c16f737f9abd043c1e81adb739be55c', 'createTable tableName=uniqueness_state_details; addPrimaryKey constraintName=uniqueness_state_details_pkey, tableName=uniqueness_state_details', '', 'EXECUTED', NULL, NULL, '4.19.0', '7775015935');
-- Changeset net/corda/db/schema/vnode-uniqueness/migration/vnode-uniqueness-creation-v1.0.xml::uniqueness-creation-v1.0-3::R3.Corda
CREATE TABLE uniqueness_tx_details (tx_id_algo VARCHAR(8) NOT NULL, tx_id BYTEA NOT NULL, originator_x500_name VARCHAR(1024) NOT NULL, expiry_datetime TIMESTAMP WITHOUT TIME ZONE NOT NULL, commit_timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL, result CHAR NOT NULL);
ALTER TABLE uniqueness_tx_details ADD CONSTRAINT uniqueness_tx_details_pkey PRIMARY KEY (tx_id_algo, tx_id);
INSERT INTO databasechangelog (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('uniqueness-creation-v1.0-3', 'R3.Corda', 'net/corda/db/schema/vnode-uniqueness/migration/vnode-uniqueness-creation-v1.0.xml', NOW(), 3, '8:74df1cf3f28a77ef7b153d524bf03725', 'createTable tableName=uniqueness_tx_details; addPrimaryKey constraintName=uniqueness_tx_details_pkey, tableName=uniqueness_tx_details', '', 'EXECUTED', NULL, NULL, '4.19.0', '7775015935');
-- Changeset net/corda/db/schema/vnode-uniqueness/migration/vnode-uniqueness-creation-v1.0.xml::uniqueness-creation-v1.0-5::R3.Corda
CREATE TABLE uniqueness_rejected_txs (tx_id_algo VARCHAR(8) NOT NULL, tx_id BYTEA NOT NULL, error_details BYTEA NOT NULL);
ALTER TABLE uniqueness_rejected_txs ADD CONSTRAINT uniqueness_rejected_txs_pkey PRIMARY KEY (tx_id_algo, tx_id);
INSERT INTO databasechangelog (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('uniqueness-creation-v1.0-5', 'R3.Corda', 'net/corda/db/schema/vnode-uniqueness/migration/vnode-uniqueness-creation-v1.0.xml', NOW(), 5, '8:25cf59b403bbf4cade7361655fba20c1', 'createTable tableName=uniqueness_rejected_txs; addPrimaryKey constraintName=uniqueness_rejected_txs_pkey, tableName=uniqueness_rejected_txs', '', 'EXECUTED', NULL, NULL, '4.19.0', '7775015935');
- UNIQUENESS DDLユーザ(
demi_uniq_ddl
)で3のSQLを実行。
root@my-ubuntu:/# psql -U demi_uniq_ddl -f create_uniqueness_tables.sql
Password for user demi_uniq_ddl:
CREATE TABLE
CREATE TABLE
.
.
.
ALTER TABLE
INSERT 0 1
# エラーがでなければOK
- vaultスキーマのSQL取得。呼び出し時にvNodeが使用予定のCPIのIDを渡します。
# 環境変数にCPIのファイルチェックサムを設定
export CPI_FILE_CHECKSUM=374D330E34BD
curl -k -u $REST_API_USER:$REST_API_PASSWORD -X GET $REST_API_URL/virtualnode/create/db/vault/${CPI_FILE_CHECKSUM} > create_vault_tables.sql
# 数百行のSQLが表示されます。CorDappsが独自テーブルを持っている場合は増加することがあります。
root@my-ubuntu:/# cat create_vault_tables.sql
-- *********************************************************************
-- Update Database Script
-- *********************************************************************
-- Change Log: /tmp/offline-db/changelog-bc53549b-e48f-4727-af16-495e814959d7.xml
-- Ran at: 10/1/24, 9:37 AM
-- Against: null@offline:postgresql?changeLogFile=/tmp/offline-db/changelog-bc53549b-e48f-4727-af16-495e814959d7.xml&outputLiquibaseSql=all
-- Liquibase version: 4.19.0
-- *********************************************************************
CREATE TABLE IF NOT EXISTS databasechangelog (ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED TIMESTAMP WITHOUT TIME ZONE NOT NULL, ORDEREXECUTED INTEGER NOT NULL, EXECTYPE VARCHAR(10) NOT NULL, MD5SUM VARCHAR(35), DESCRIPTION VARCHAR(255), COMMENTS VARCHAR(255), TAG VARCHAR(255), LIQUIBASE VARCHAR(20), CONTEXTS VARCHAR(255), LABELS VARCHAR(255), DEPLOYMENT_ID VARCHAR(10));
-- Changeset net/corda/db/schema/vnode-vault/migration/vnode-vault-creation-v1.0.xml::vnode-vault-creation-v1.0::R3.Corda
CREATE TABLE vnode_vault (holding_identity_id VARCHAR(12) NOT NULL);
.
.
.
- VAULT DDLロール(
demi_vault_ddl
)で5のSQLファイルを実行します。
root@my-ubuntu:/# psql -U demi_vault_ddl -f create_vault_tables.sql
Password for user demi_vault_ddl:
CREATE TABLE
CREATE TABLE
ALTER TABLE
.
.
.
# 一部「psql:create_vault_tables.sql:242: NOTICE: relation "databasechangelog" already exists, skipping」が出ることがありますが、無視して結構です。
.
.
.
INSERT 0 1
# エラーがでなければOK
DMLロールに権限付与
これまで作成したテーブルの操作権限をDMLを実行用のロールに付与します。以下のようなSQLファイルを用意してください。
root@my-ubuntu:/# cat grant_permission_to_dml.sql
GRANT USAGE ON SCHEMA demi_vault TO demi_vault_dml;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA demi_vault TO demi_vault_dml;
GRANT USAGE ON SCHEMA demi_crypto TO demi_crypto_dml;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA demi_crypto TO demi_crypto_dml;
GRANT USAGE ON SCHEMA demi_uniq TO demi_uniq_dml;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA demi_uniq TO demi_uniq_dml;
- ロール
corda
でSQLファイルを実行します。
root@my-ubuntu:/# psql -U corda -f grant_permission_to_dml.sql
Password for user corda:
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
# エラーがでなければOK
vNode登録処理
ここまでの手順で個別DBの設定はできました。これよりvNode登録を進めます。
- vNode作成
# パラメータに必要な環境変数設定
root@my-ubuntu:/# export X500_NAME="CN=Bob,OU=Test_Dept,O=R3,L=London,C=GB"
root@my-ubuntu:/# export PGHOST=ps-separated-rds-cs3722-auroradb-2.cpqjvenbq3ub.ap-southeast-1.rds.amazonaws.com
root@my-ubuntu:/# export CPI_FILE_CHECKSUM=374D330E34BD
root@my-ubuntu:/# export PGDATABASE=cordacluster
root@my-ubuntu:/# export CRYPTO_DDL_USER=demi_crypto_ddl
root@my-ubuntu:/# export CRYPTO_DDL_PASSWORD=dmcryptoddl
root@my-ubuntu:/# export CRYPTO_DML_USER=demi_crypto_dml
root@my-ubuntu:/# export CRYPTO_DML_PASSWORD=dmcryptodml
root@my-ubuntu:/# export UNIQ_DDL_USER=demi_uniq_ddl
root@my-ubuntu:/# export UNIQ_DDL_PASSWORD=dmuniqddl
root@my-ubuntu:/# export UNIQ_DML_USER=demi_uniq_dml
root@my-ubuntu:/# export UNIQ_DML_PASSWORD=dmuniqdml
root@my-ubuntu:/# export VAULT_DDL_USER=demi_vault_ddl
root@my-ubuntu:/# export VAULT_DDL_PASSWORD=dmvaultddl
root@my-ubuntu:/# export VAULT_DML_USER=demi_vault_dml
root@my-ubuntu:/# export VAULT_DML_PASSWORD=dmvaultdml
# vNode作成
root@my-ubuntu:/# curl -k -u $REST_API_USER:$REST_API_PASSWORD -d "{ \"request\": {\"cpiFileChecksum\": \"$CPI_FILE_CHECKSUM\", \
\"x500Name\": \"$X500_NAME\", \
\"cryptoDdlConnection\":\"{\\\"database\\\":{\\\"jdbc\\\":{\\\"url\\\":\\\"jdbc:postgresql://$PGHOST:5432/$PGDATABASE\\\"},\\\"user\\\":\\\"$CRYPTO_DDL_USER\\\",\\\"pass\\\":\\\"$CRYPTO_DDL_PASSWORD\\\"}}\",\
\"cryptoDmlConnection\":\"{\\\"database\\\":{\\\"jdbc\\\":{\\\"url\\\":\\\"jdbc:postgresql://$PGHOST:5432/$PGDATABASE\\\"},\\\"user\\\":\\\"$CRYPTO_DML_USER\\\",\\\"pass\\\":\\\"$CRYPTO_DML_PASSWORD\\\"}}\",\
\"uniquenessDdlConnection\":\"{\\\"database\\\":{\\\"jdbc\\\":{\\\"url\\\":\\\"jdbc:postgresql://$PGHOST:5432/$PGDATABASE\\\"},\\\"user\\\":\\\"$UNIQ_DDL_USER\\\",\\\"pass\\\":\\\"$UNIQ_DDL_PASSWORD\\\"}}\",\
\"uniquenessDmlConnection\":\"{\\\"database\\\":{\\\"jdbc\\\":{\\\"url\\\":\\\"jdbc:postgresql://$PGHOST:5432/$PGDATABASE\\\"},\\\"user\\\":\\\"$UNIQ_DML_USER\\\",\\\"pass\\\":\\\"$UNIQ_DML_PASSWORD\\\"}}\",\
\"vaultDdlConnection\":\"{\\\"database\\\":{\\\"jdbc\\\":{\\\"url\\\":\\\"jdbc:postgresql://$PGHOST:5432/$PGDATABASE\\\"},\\\"user\\\":\\\"$VAULT_DDL_USER\\\",\\\"pass\\\":\\\"$VAULT_DDL_PASSWORD\\\"}}\",\
\"vaultDmlConnection\":\"{\\\"database\\\":{\\\"jdbc\\\":{\\\"url\\\":\\\"jdbc:postgresql://$PGHOST:5432/$PGDATABASE\\\"},\\\"user\\\":\\\"$VAULT_DML_USER\\\",\\\"pass\\\":\\\"$VAULT_DML_PASSWORD\\\"}}\"}}" \
$REST_API_URL/virtualnode
{"requestId":"D33773738477"}
# 表示されたrequestIdがvNodeのIDになり、後続のAPIの引数になるので環境変数として設定
export NEW_HOLDING_ID="D33773738477"
- 鍵作成 (通常手順と変更なし)
# Session鍵
curl -k -u $REST_API_USER:$REST_API_PASSWORD -X POST $REST_API_URL/hsm/soft/$NEW_HOLDING_ID/SESSION_INIT
RESPONSE_CREATE_SESSION_KEY=$(curl -k -u $REST_API_USER:$REST_API_PASSWORD -X POST $REST_API_URL/key/$NEW_HOLDING_ID/alias/$NEW_HOLDING_ID-session/category/SESSION_INIT/scheme/CORDA.ECDSA.SECP256R1)
NEW_SESSION_KEY_ID=$(echo "$RESPONSE_CREATE_SESSION_KEY" | grep -oP '(?<="id":")[^"]+')
echo $NEW_SESSION_KEY_ID
# 英数字が混ざった12バイトの文字列が表示されること
# Ledger鍵
curl -k -u $REST_API_USER:$REST_API_PASSWORD -X POST $REST_API_URL/hsm/soft/$NEW_HOLDING_ID/LEDGER
RESPONSE_CREATE_LEDGER_KEY=$(curl -k -u $REST_API_USER:$REST_API_PASSWORD -X POST $REST_API_URL/key/$NEW_HOLDING_ID/alias/$NEW_HOLDING_ID-ledger/category/LEDGER/scheme/CORDA.ECDSA.SECP256R1)
NEW_LEDGER_KEY_ID=$(echo "$RESPONSE_CREATE_LEDGER_KEY" | grep -oP '(?<="id":")[^"]+')
echo $NEW_LEDGER_KEY_ID
# 英数字が混ざった12バイトの文字列が表示されること
- コネクションプロパティ設定 (通常手順と変更なし)
# REST APIを実行して返り値がなければOK
curl -k -u $REST_API_USER:$REST_API_PASSWORD -X PUT -d '{"p2pTlsCertificateChainAlias": "p2p-tls-cert", "useClusterLevelTlsCertificateAndKey": true, "sessionKeysAndCertificates": [{"sessionKeyId": "'$NEW_SESSION_KEY_ID'", "preferred": true}]}' $REST_API_URL/network/setup/$NEW_HOLDING_ID
- vNode登録処理 (通常手順と変更なし)
# REGISTRATION CONTEXT作成
export REGISTRATION_CONTEXT='{
"corda.session.keys.0.id": "'$NEW_SESSION_KEY_ID'",
"corda.session.keys.0.signature.spec": "SHA256withECDSA",
"corda.ledger.keys.0.id": "'$NEW_LEDGER_KEY_ID'",
"corda.ledger.keys.0.signature.spec": "SHA256withECDSA",
"corda.endpoints.0.connectionURL": "https://'$P2P_GATEWAY_HOST':'$P2P_GATEWAY_PORT'",
"corda.endpoints.0.protocolVersion": "1"
}'
REGISTRATION_REQUEST='{"memberRegistrationRequest":{"context": '$REGISTRATION_CONTEXT'}}'
# 登録要求および登録状況確認
RESPONSE_REGISTRATION_REQUEST=$(curl -k -u $REST_API_USER:$REST_API_PASSWORD -d "$REGISTRATION_REQUEST" $REST_API_URL/membership/$NEW_HOLDING_ID)
REGISTRATION_ID=$(echo "$RESPONSE_REGISTRATION_REQUEST" | grep -oP '(?<="registrationId":")[^"]+')
curl -k -u $REST_API_USER:$REST_API_PASSWORD -X GET $REST_API_URL/membership/$NEW_HOLDING_ID/$REGISTRATION_ID | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 569 100 569 0 0 10173 0 --:--:-- --:--:-- --:--:-- 10345
{
"registrationId": "fa31bf9c-1742-4e05-a38e-6de918a02bea",
"registrationSent": "2024-10-03T06:52:53.318Z",
"registrationUpdated": "2024-10-03T06:53:01.316Z",
"registrationStatus": "APPROVED", # ステータスがAPPROVEDになっていればOK。
"memberInfoSubmitted": {
"data": {
"registrationProtocolVersion": "1",
"corda.session.keys.0.id": "120D9B972C52",
"corda.session.keys.0.signature.spec": "SHA256withECDSA",
"corda.ledger.keys.0.id": "0CBE319857BE",
"corda.ledger.keys.0.signature.spec": "SHA256withECDSA",
"corda.endpoints.0.connectionURL": "https://172.16.1.37:8080",
"corda.endpoints.0.protocolVersion": "1"
}
},
"reason": null,
"serial": 0
}
動作確認
- BYODが正しく機能していることを確認します。flowを実行してTransactionがBYOD上のテーブルに記録されていることを確認できました。
-- 接続host名がBYODで設定した「ps-separated-rds-cs3722-auroradb-2.cpqjvenbq3ub.ap-southeast-1.rds.amazonaws.com」になっていることを確認
cordacluster=> \conninfo
You are connected to database "cordacluster" as user "corda" on host "ps-separated-rds-cs3722-auroradb-2.cpqjvenbq3ub.ap-southeast-1.rds.amazonaws.com" (address "172.16.113.198") at port "5432".
SSL connection (protocol: TLSv1.2, cipher: AES128-SHA256, bits: 128, compression: off)
-- demi_vaultスキーマのutxo_transactionにTransactionが記録されていること。(BYODでvNodeのデータが正しく記録できている)
cordacluster=> select * from demi_vault.utxo_transaction;
-[ RECORD 1 ]--------+-----------------------------------------------------------------------------------
id | SHA-256D:B0129FE31B3320FE8C797B62CDA6FF1601EECA6EBDF660875005A214526ACBA9
privacy_salt | \x35333234376139632d343232362d346566352d396265372d3332363963613439656333622d332d30
account_id | account-zero
created | 2024-10-03 07:00:24.62678
status | V
updated | 2024-10-03 07:00:28.744832
metadata_hash | SHA-256:A3FF80917AE9F46EF8A75787452AD439DBB4A6DE31D1092A2306094AF588F2E8
is_filtered | f
repair_attempt_count | 0
おわりに
BYODを使うことで各NodeのLedgerをセキュアに管理することができます。頻繁に設定をすることはありませんが手順や引数が複雑なため、運用の際にはスクリプト化や自動化をご検討ください。
<ご質問・ご要望の例>
- Corda Portalの記事について質問したい
- ブロックチェーンを活用した新規事業を相談したい
- 企業でのブロックチェーン活用方法を教えて欲しい 等々
SBI R3 Japan エンジニアリング部所属
ソリューションアーキテクト/PoC支援
This is the way. みんなでキャズムを超えていきましょう!