メインコンテンツへスキップ

セキュリティとリソース

セキュリティとリソース管理は、信頼性が高く相互運用可能なBlockletを作成するために不可欠です。blocklet.yml仕様は、この目的のために2つの主要なフィールドを提供します。signaturesはメタデータの完全性と真正性を保証し、resourceは他のBlockletと構成するための共有

セキュリティとリソース管理は、信頼性が高く相互運用可能なBlockletを作成するために不可欠です。blocklet.yml仕様は、この目的のために2つの主要なフィールドを提供します。signaturesはメタデータの完全性と真正性を保証し、resourceは他のBlockletと構成するための共有アセットを定義およびバンドルします。

このセクションでは、これらのフィールドの仕様について説明し、それらを操作するために@blocklet/metaによって提供されるユーティリティ関数を紹介します。

署名

signaturesフィールドには、Blockletのメタデータに対する検証可能な信頼の連鎖を作成するデジタル署名の配列が含まれています。このメカニズムは、不正な変更を防ぎ、開発者やBlocklet Storeなどの公開者の身元を確認します。連鎖内の各署名は、後続の署名とともにコアメタデータを暗号的に署名し、変更の履歴全体が改ざん防止であることを保証します。

マルチシグネチャプロセスの流れ

公開プロセス中の典型的なマルチシグネチャワークフローでは、開発者が初期メタデータに署名し、続いてBlocklet Storeがそれを検証し、配布情報を追加して独自の署名を付加します。

Security & Resources

仕様

signaturesフィールドは署名オブジェクトの配列です。各オブジェクトは次の構造を持っています。

blocklet.yml

yaml
signatures:
  - type: 'ED25519'
    name: 'dev'
    signer: 'z8qa...'
    pk: 'z28n...'
    created: '2023-10-27T10:00:00.000Z'
    sig: 'z24e...'
    excludes: []
  - type: 'ED25519'
    name: 'store'
    signer: 'z8qR...'
    pk: 'z29c...'
    created: '2023-10-27T10:05:00.000Z'
    sig: 'z25a...'
    appended:
      - 'dist'
      - 'stats'
  • type string (required) — 署名に使用される暗号アルゴリズム(例:「ED25519」)。
  • name string (required) — 署名の役割を示す人間が読める名前(例:「dev」、「store」)。
  • signer string (required) — 署名を作成したエンティティのDID。
  • pk string (required) — 署名者のDIDに対応する公開鍵。
  • created string (required) — 署名が作成されたときのISO 8601タイムスタンプ。
  • sig string (required) — base58エンコードされた署名文字列。
  • excludes string[] — 署名する前にメタデータから除外するトップレベルのフィールド名の配列。
  • appended string[] — この署名者によってメタデータに追加されたトップレベルのフィールド名の配列。これは、次の署名者が前の署名を正しく検証するために使用されます。
  • delegatee string — 署名が委任によって行われた場合の委任先のDID。
  • delegateePk string — 委任先の公開鍵。
  • delegation string — delegateeがsignerに代わって署名することを承認する委任トークン(JWT)。

リソース管理

resourceフィールドを使用すると、Blockletはエクスポートできる共有データ型を宣言し、他のBlockletからのリソースをバンドルできます。これは、Blockletがデータと機能をシームレスに共有できる、構成可能で相互運用可能なエコシステムを実現するための基本です。

仕様

blocklet.yml

yaml
resource:
  exportApi: '/api/resources'
  types:
    - type: 'posts'
      description: 'A collection of blog posts.'
    - type: 'images'
      description: 'A gallery of images.'
  bundles:
    - did: 'z2qa...'
      type: 'user-profiles'
      public: true
  • resource object — エクスポート可能な型とバンドルされたリソースを定義するためのプロパティを含みます。
    • exportApi string — 他のBlockletがエクスポートされたリソースを取得するために呼び出すことができるAPIエンドポイントへのパス。
    • types object[] — このBlockletがエクスポートできるリソースタイプの配列。最大10タイプに制限されます。
      • type string (required) — リソースタイプの一意の識別子(例:「posts」、「products」)。
      • description string — リソースタイプの人間が読める説明。
    • bundles object[] — 他のBlockletからインポートされたリソースバンドルの配列。
      • did string (required) — 含めるリソースバンドルのDID。
      • type string (required) — ソースからバンドルする特定のリソースタイプ。
      • public boolean — trueの場合、バンドルされたリソースが公開アクセス可能であることを示します。

関連APIユーティリティ

@blocklet/metaライブラリは、Blockletのメタデータと通信のセキュリティ側面を処理するための一連の関数を提供します。詳細については、セキュリティユーティリティAPIリファレンスを参照してください。

メタデータ署名の検証

verifyMultiSig関数は、blocklet.ymlファイルの完全性を保証するための主要なツールです。signatures配列を処理し、連鎖内の各署名を検証して、メタデータが改ざんされておらず、宣言されたエンティティによって署名されたことを確認します。

verifyMultiSig Example

javascript
import verifyMultiSig from '@blocklet/meta/lib/verify-multi-sig';
import { TBlockletMeta } from '@blocklet/meta/lib/types';

async function checkMetadata(meta: TBlockletMeta) {
  const isValid = await verifyMultiSig(meta);
  if (isValid) {
    console.log('Blockletのメタデータは信頼でき、改ざんされていません。');
  } else {
    console.error('警告:Blockletメタデータの検証に失敗しました!');
  }
}

APIレスポンスの署名と検証

Blocklet間またはBlockletとクライアント間の通信を保護するために、signResponseおよびverifyResponse関数を使用できます。これらのヘルパーは、ウォレットオブジェクトを使用してJSONシリアライズ可能なデータを暗号的に署名および検証し、データの完全性と送信者の信頼性を保証します。

signResponse Example

javascript
import { signResponse, verifyResponse } from '@blocklet/meta/lib/security';
import { fromRandom } from '@ocap/wallet';

async function secureCommunicate() {
  const wallet = fromRandom(); // あなたのBlockletのウォレット
  const data = { message: 'hello world', timestamp: Date.now() };

  // 署名
  const signedData = signResponse(data, wallet);
  console.log('署名済みデータ:', signedData);

  // 検証
  const isVerified = await verifyResponse(signedData, wallet);
  console.log('検証結果:', isVerified); // true
}