証明・情報開示
メタデータ・資格証明・ゼロ知識証明を組み合わせる。
← 実装パターン一覧点検報告書と点検結果を結び付け、提示先が照合できるようにする
設備の点検報告書を保存し、合格を示す値と報告書のハッシュをMultiTrustCredentialへ記録する構成です。報告書を受け取った相手は、同じファイルからハッシュを計算して記録と照合できます。
報告書の内容が記録後に変わっていないかを確認し、発行主体、対象、期限とともに提示できます。点検内容の正しさは、点検者と原データの管理で担保します。
システム構成と役割
点検・原データ管理
設備、点検者、点検日時、報告書の版を管理します。
Inspection system / DB文書の保存・共有
原本を保存し、共有先に応じたアクセス制御を行います。
Storage / Access control証明値の記録
指標ID、公開値、文書ハッシュ、有効期限を記録します。
MultiTrustCredentialHelper提示・照合
原本のハッシュ、信頼する発行者、期限、対象を照合します。
Verifier UI / Application policy
データモデル例
業務DBに保存する情報と、チェーンやAPIで管理する情報を対応づけます。フィールド名とサンプル値は、この構成で使うアプリケーション側の設計例です。
| 項目・値の例 | 管理する場所 | 役割・対応関係 |
|---|---|---|
assetId / subjectWalletROBOT-A-001 / 0x… | 業務DB | 証明先のウォレットと設備の対応。ウォレットを設備と紐づける責任は業務側で持ちます。 |
documentId / versionINSPECT-001 / v1 | 業務DB・ストレージ | 報告書を版ごとに保存。再生成せず、実際に保存・共有するバイト列をハッシュします。 |
metricId / valueINSPECTION_PASS_V1 / 1 | チェーン | この例の1は点検合格を表す公開値。指標の意味は発行側の仕様として定義します。 |
anchorRootBigInt(documentHash) | チェーン | この例は文書のkeccak256を格納します。ZK用のMerkle rootとは別の設計です。 |
expiresAtUNIX seconds | チェーン+業務DB | 証明の有効期限。再点検や訂正時の扱いも業務側で定義します。 |
chainId / credentialAddress / transactionHashchain / 0x… / 0x… | 業務DB | どの記録に対応する報告書かを、チェーンとコントラクト込みで特定します。 |
処理の流れ
指標と発行主体を設定する
管理者がINSPECTION_PASS_V1という指標を登録し、書込用の役割を点検結果の発行者に付与します。この例は公開値なのでcommitmentはfalse、比較を使わない構成としてmaskは0にします。
registerMetric(id, label, writerRole, false, 0) / grantRole原本を保存してハッシュを計算する
確定した報告書のバイト列を保存し、同じバイト列からkeccak256を計算します。署名入りURLの有効期限と、証明自体の有効期限は別々に管理します。
Storage upload → keccak256(reportBytes)証明先へ指標を記録する
対象のウォレットにvalue 1、文書ハッシュ、期限をmintします。同じウォレット・同じ指標へ再度mintすると指標の更新になるため、過去の報告書は版と取引ハッシュで別途保存します。
MultiTrustCredentialHelper.mint(subjectWallet, input)提示先が記録を照合する
提示先は信頼するコントラクトと発行者を確認し、報告書のハッシュ、指標、対象ウォレット、期限を照合します。MetricUpdatedの取引履歴も使い、訂正前の古い記録を現在有効なものと誤認しないようにします。
queryMetricUpdated(fromBlock, toBlock) / application validity checks訂正・再点検を管理する
新しい版を保存して指標を更新し、旧版との対応を残します。過去の公開データを消すことはできないため、取消しや置換の表示は業務DBの履歴と組み合わせます。
updateMetric / document version history
コードを利用する前の準備
- 初期化済みMultiTrustCredentialと、登録済み指標に対する書込権限を持つSignerを用意します。
- この例はINSPECTION_PASS_V1を公開値として扱います。subjectWalletと設備の対応を管理し、同じ指標を別設備の記録で上書きしない構成にします。
- reportBytesには確定した原本を渡します。metadataUriは公開可能なメタデータを指し、非公開原本の取得には別途アクセス制御を設けます。
npm install --save-exact @hazbase/kit@0.9.0 ethers@6.16.0以下はアプリケーションから呼び出すTypeScriptの関数です。接続先・権限・対象データを引数として渡します。UI、DBへの保存、処理の再開は、上記の構成に沿って業務側へ組み込めます。
報告書のハッシュと点検合格を記録する
publishInspectionへ報告書のバイト列、証明先、期限、発行者を渡します。ここでは文書との対応づけを実装し、ZKによる条件証明は次の拡張として分けています。
import { MultiTrustCredentialHelper } from '@hazbase/kit';
import { id, keccak256 } from 'ethers';
type Signer = Parameters<typeof MultiTrustCredentialHelper.deploy>[1];
const metricId = id('INSPECTION_PASS_V1');
export async function publishInspection(input: {
credentialAddress: string;
subjectWallet: string;
reportBytes: Uint8Array;
metadataUri: string;
expiresAt: bigint;
writer: Signer;
}) {
// Register this metric and grant its writer role before calling.
const credential = MultiTrustCredentialHelper.attach(input.credentialAddress, input.writer);
const documentHash = keccak256(input.reportBytes);
const receipt = await credential.mint(input.subjectWallet, {
metricId,
value: 1,
anchorRoot: BigInt(documentHash),
uri: input.metadataUri,
expiresAt: input.expiresAt,
});
// This example anchors document bytes; it does not generate a ZK proof.
return {
subject: input.subjectWallet,
metricId,
documentHash,
transactionHash: receipt.hash,
blockNumber: receipt.blockNumber,
};
}
実行結果と、アプリケーションへの反映
documentHashと取引ハッシュを報告書の版に紐づけて保存します。チェーン上ではanchorRootがleafFullという項目に対応します。提示先は同じ文書をハッシュし、対象取引の記録と一致することを確認できます。
実装で押さえておきたい点
同じ内容でもファイルが変わればハッシュは変わる
PDFの再出力や改行コードの変更でもハッシュは変わります。照合対象は再生成した文書ではなく、記録時と同じ原本のバイト列です。
ハッシュ一致と内容の正しさ
一致が示すのは文書との対応です。誰が点検したか、設備との紐づけは正しいか、期限や取消しがないかは別に確認します。
公開範囲と上書き
ウォレット、公開値、期限などはチェーン上に残ります。複数の設備・報告書を扱う場合は対象と指標の区分を設計し、最新値と過去の報告書を分けて管理します。
用途に合わせた拡張
数値を公開せずに条件だけを証明する
たとえば稼働率そのものを公開せず基準以上であることを示す場合は、@hazbase/zkの対応回路、原データのcommitment、公開入力、Verifierを組み合わせます。文書ハッシュを保存するだけではZK証明にはなりません。
証明と利用資格をつなぐ
条件を満たした利用者をWhitelistへ登録するなど、証明結果から利用資格につなぐ構成も可能です。対応するVerifier、root、対象アドレス、期限・失効の条件を同じ仕様として揃えます。