Logo
    Logo

    Search

    R3-Solana連携

    Blockchainトレンド

    Corda活用事例

    Corda技術

    おすすめ記事

    記事を探す

    その他

    お客様サポート

    SBI R3 Japan HP

    お問い合わせ

    Bringing Your Own Databaseを用いたNode別Databaseの設定

    公開日
    Oct 8, 2024
    カテゴリ
    Corda技術を知る
    タグ
    🛠️Node運用⭐Corda5
    筆者
    立山
    image
    icon
    この記事で学べること

    Bringing Your Own Databaseを用いた個別Node専用のDatabaseの設定

    icon
    目次
    • はじめに
    • 想定読者
    • 前提
    • 設定手順
    • ロール、スキーマ作成
    • テーブル作成
    • DMLロールに権限付与
    • vNode登録処理
    • 動作確認
    • おわりに

    はじめに

    この記事は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 に以下の環境変数を定義してください。
    • 上記RDBにおいて以下の操作権限をもつロールが使用可能なこと。本記事では”corda”が相当します。
      • CREATE ROLE
      • CREATE SCHEMA
      • ALTER ROLE
    • 上記RDBがCorda clusterからのアクセスを許可していること。

    設定手順

    BYODで使用するRDBへの設定は、vNodeの作成前に完了させる必要があります。

    ロール、スキーマ作成

    CordaのvNodeは様々なテーブルを保有していますが、主に「crypto」、「valut」、「uniqueness」という3つのカテゴリに分かれます。それぞれはスキーマおよびロールが異なります。

    • my-ubuntuから以下のsqlファイルを作成します。
    • ロール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の登録作業に移ります。

    1. cryptoスキーマのSQL取得
    1. 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
    1. uniquenessスキーマのSQL取得
    1. 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
    1. vaultスキーマのSQL取得。呼び出し時にvNodeが使用予定のCPIのIDを渡します。
    1. 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ファイルを用意してください。

    • ロール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登録を進めます。

    1. vNode作成
    1. 鍵作成 (通常手順と変更なし)
    1. コネクションプロパティ設定 (通常手順と変更なし)
    # 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
    1. vNode登録処理 (通常手順と変更なし)

    動作確認

    • BYODが正しく機能していることを確認します。flowを実行してTransactionがBYOD上のテーブルに記録されていることを確認できました。

    おわりに

    BYODを使うことで各NodeのLedgerをセキュアに管理することができます。頻繁に設定をすることはありませんが手順や引数が複雑なため、運用の際にはスクリプト化や自動化をご検討ください。

    📬
    最後までお読みいただきありがとうございます。当社へのご質問・ご要望がございましたら、📪SBI R3 Japan お問い合わせフォーム📪よりお気軽にお問い合わせください!

    <ご質問・ご要望の例>

    • Corda Portalの記事について質問したい
    • ブロックチェーンを活用した新規事業を相談したい
    • 企業でのブロックチェーン活用方法を教えて欲しい 等々
    📢
    また、厳選されたCordaに関する最新情報をお伝えるするメールマガジンやX、当社主催のイベントコミュニティを運営しております。ぜひご登録ください。
    • Cordaメールマガジンに登録
    • X(旧Twitter)をフォロー
    • 弊社イベントコミュニティ(Connpass)に参加
    ✍️
    Written by 立山 和人 (Kazuto Tateyama)
    image

    SBI R3 Japan エンジニアリング部所属

    ソリューションアーキテクト/PoC支援

    This is the way. みんなでキャズムを超えていきましょう!

    →筆者の記事一覧

    Logo

    © copyright SBI R3 Japan 2025

    GitHubYouTubeXFacebookLinkedIn
    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のパスワード
    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;
    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');
    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');
    
    # 環境変数に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);
    .
    .
    .
    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;
    # パラメータに必要な環境変数設定
    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バイトの文字列が表示されること
    # 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
    }
    
    -- 接続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