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

Signature Claim

Signature Claimは、ユーザーにDIDに関連付けられた秘密鍵を使用して任意のデータに署名するよう要求するための多目的なツールです。この暗号署名は、ユーザーがデータを見て承認したことの否定できない証明として機能し、デジタルアイデンティティの制御を効果的に示します。一般的な使用例には、メッセージへの署名、トランザクションの承認、委任の確認などがあります。

ウォレットがトランザクションに入力を提供する必要がある、より複雑な支払いシナリオでは、Prepare Transaction Claimの使用を検討してください。

仕組み

アプリケーションは、署名が必要な内容を詳述するsignatureクレームを構築します。これには、データ自体(生の文字列または事前に計算されたダイジェストとして)、データの種類(ウォレットが正しく表示するのに役立ちます)、およびハッシュ化メソッドが含まれます。DID Walletはこのリクエストを受け取り、確認のためにユーザーに情報を提示し、承認されるとデータに署名し、検証のために署名をアプリケーションに返します。

パラメータ

signatureクレームオブジェクトは、以下のパラメータを受け付けます。

ParameterTypeDescription
typeUrlstring**必須。**データタイプを指定します。これにより、ウォレットはコンテンツを正しく解釈して表示できます。一般的な値には、mime:text/plain、mime:text/html、fg:t:transaction(Forgeでエンコードされたトランザクションの場合)、またはTransferV2Txのような特定のトランザクションタイプが含まれます。
originstring署名される生のデータで、Base58文字列としてエンコードされます。これは、ウォレットに完全なデータを表示させ、ハッシュ化させたい場合に使用します。originまたはdigestのいずれかを提供する必要があります。
digeststring事前に計算されたデータのハッシュ。元のデータが大きすぎて送信できない場合や、ウォレットに元のコンテンツを表示させる必要がない場合に使用します。
methodstring署名する前にウォレットがoriginデータに適用するハッシュ化アルゴリズム。デフォルトはsha3です。'none'に設定されている場合、ウォレットは最初にハッシュ化せずにoriginデータに直接署名します。
displaystringウォレットでリッチな表示を提供するためのJSON文字列。フォーマットされたメッセージやリンクの表示など。例:JSON.stringify({ type: 'url', content: 'https://www.arcblock.io' })。
descriptionstringユーザーに署名を求めている内容を説明する、ユーザーフレンドリーなメッセージ。デフォルトは「このトランザクションまたはメッセージに署名して続行してください。」です。
requirementobjectユーザーが署名を提供するために満たす必要があるトークンまたは資産の要件を指定するオプションのオブジェクト。
noncestringリプレイ攻撃を防ぐために使用されるオプションのランダムな文字列。

使用例

さまざまな種類の署名を要求する方法の例をいくつか示します。

1. プレーンテキストメッセージへの署名

これは最も単純な使用例で、ユーザーに単純なテキスト文字列への署名を依頼します。

Requesting a Text Signature

javascript
const claims = {
  signature: {
    typeUrl: 'mime:text/plain',
    description: '本人確認のためにこのメッセージに署名してください。',
    data: '利用規約に同意します。',
  },
};

// ハンドラ内
const { authInfo } = await authenticator.sign({
  claims,
  // ... other params
});

この例では、data文字列はBufferに変換され、Base58でエンコードされて、originフィールドとしてウォレットに送信されます。

2. トランザクションへの署名(生データから)

オンチェーン操作の場合、ユーザーにトランザクションへの署名を依頼できます。生のトランザクションオブジェクトを提供すれば、DID Connectがエンコーディングを処理します。これには、WalletAuthenticatorインスタンスでchainInfoを設定する必要があります。

Requesting a Transaction Signature

javascript
const claims = {
  signature: {
    // これは@ocap/clientで認識される特定のトランザクションタイプです
    type: 'TransferV2Tx',
    description: '100 TBAの転送を確認するために署名してください。',
    display: JSON.stringify({ type: 'html', content: '<div>受信者に<b>100 TBA</b>を転送</div>' }),
    // 生のトランザクションデータオブジェクト
    data: {
      itx: {
        to: 'z123...',
        tokens: [
          {
            address: 'z35nB2SA6xxBuoaiuUXUw6Gah2SNU3UzqdgEt',
            value: '100',
          },
        ],
      },
    },
    // オプション:ウォレットのトークン要件を指定
    requirement: {
      tokens: [
        {
          address: 'z35nB2SA6xxBuoaiuUXUw6Gah2SNU3UzqdgEt',
          value: '100',
        },
      ],
    },
  },
};

内部では、WalletAuthenticatorは@ocap/clientを使用してdataオブジェクトをトランザクションバッファにエンコードします。ウォレットに送信されるtypeUrlは自動的にfg:t:transactionに設定され、originはBase58でエンコードされたバッファになります。

3. トランザクションへの署名(事前エンコード済み)

サーバーでトランザクションバッファをすでにエンコードしている場合は、直接送信できます。この場合、typeUrlをfg:t:transactionに設定する必要があります。

Signing a Pre-Encoded Transaction

javascript
const { Client } = require('@ocap/client');
const { toBase58 } = require('@ocap/util');

// clientが@ocap/clientのインスタンスであると仮定
const { buffer: txBuffer } = await client.encodeTransferV2Tx({
  // ... tx params
});

const claims = {
  signature: {
    typeUrl: 'fg:t:transaction',
    description: 'この事前にエンコードされたトランザクションを確認してください。',
    // `data`はbase58でエンコードされたバッファです
    data: toBase58(txBuffer),
  },
};

このアプローチではより多くの制御が可能になりますが、トランザクションのエンコーディングを自分で処理する必要があります。

Signature Claimを活用することで、ユーザーとの安全で検証可能なインタラクションを構築できます。次のセクションでは、支払いシナリオ向けの特殊なトランザクションクレームについて説明します。

次へ:Prepare Transaction Claim

ウォレットに部分的に構築されたトランザクションを完成させ、署名を要求する方法を学びます。