CBOR-LD 1.0

Linked Data のための CBOR ベースのシリアル化

W3C 作業草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2026/WD-cbor-ld-10-20260826/
最新の公開バージョン:
https://www.w3.org/TR/cbor-ld-10/
最新の編集者草案:
https://w3c.github.io/cbor-ld/
履歴:
https://www.w3.org/standards/history/cbor-ld-10/
コミット履歴
編集者:
Manu Sporny (Digital Bazaar)
Dave Longley (Digital Bazaar)
Wesley Smith (Digital Bazaar)
著者:
Manu Sporny (Digital Bazaar)
Dave Longley (Digital Bazaar)
フィードバック:
GitHub w3c/cbor-ld (プルリクエスト, 新しいイシュー, 未解決のイシュー)

概要

CBOR は、コンパクトなバイナリデータのシリアル化およびメッセージング形式です。この 仕様では、Linked Data をシリアル化するための CBOR ベースの形式である CBOR-LD 1.0 を定義します。 このエンコーディングは、現在数億ものシステムに導入されている既存の JSON-LD エコシステムを 活用するように設計されており、Linked Data の効率的なエンコーディング方式を求める利用者に コンパクトなシリアル化形式を提供します。セマンティック圧縮方式を利用することにより、汎用的な 圧縮方式よりも 60% を超えて優れた圧縮率を実現できます。この形式は 主として、ストレージおよび帯域幅に制約のあるプログラミング環境で Linked Data を使用する手段を 提供し、相互運用可能なセマンティックなワイヤレベルの プロトコルを構築し、CBOR ベースのストレージエンジンに Linked Data を効率的に格納することを目的としています。

この文書のステータス

この節では、この 文書の公開時点におけるステータスについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新改訂版は、 W3C 標準および草案 索引で確認できます。

この文書は実験的なものです。

この文書で説明されている機能を 実証できるリファレンス実装があります。

この文書は、JSON-LD ワーキンググループによって、 勧告 トラックを使用した 作業草案として公開されました。

作業草案としての公開は、 W3C およびそのメンバーによる 承認を意味するものではありません。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される 可能性があります。この文書を進行中の作業以外のものとして 引用することは適切ではありません。

この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、グループの成果物に関連して行われた 特許開示の公開リスト を管理しています。そのページには、 特許を開示するための手順も含まれています。必須クレームが含まれていると考える 特許について実際に 知識を有する個人は、 必須クレーム に関する情報を、 W3C 特許ポリシーの第6節に従って開示しなければなりません。

この文書には、 2025年8月18日付 W3C プロセス文書が適用されます。

1. はじめに

このセクションは非規範的です。

CBOR は、コンパクトなバイナリデータのシリアル化およびメッセージング形式です。この 仕様では、Linked Data をシリアル化するための CBOR ベースの形式である CBOR-LD 1.0 を定義します。 このエンコーディングは、現在数億ものシステムに導入されている既存の JSON-LD エコシステムを 活用するように設計されており、Linked Data の効率的なエンコーディング方式を求める利用者に コンパクトなシリアル化形式を提供します。セマンティック圧縮方式を利用することにより、汎用的な 圧縮方式よりも 60% を超えて優れた圧縮率を実現できます。この形式は 主として、ストレージおよび帯域幅に制約のあるプログラミング環境で Linked Data を使用する手段を 提供し、相互運用可能なセマンティックなワイヤレベルの プロトコルを構築し、CBOR ベースのストレージエンジンに Linked Data を効率的に格納することを目的としています。

1.1 この文書の読み方

このセクションは非規範的です。

この文書は、CBOR における Linked Data のシリアル化に関する詳細な仕様です。 この文書は主として、次の読者を対象としています:

1.1.1 適合性

非規範的と明記されたセクションに加えて、この仕様に含まれるすべての作成ガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべての内容は規範的です。

この文書におけるキーワード してもよいしなければならない、および 任意 は、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されるものとします。ただし、ここに示すように、 すべて大文字で表記されている場合に限ります。

1.2 貢献

このセクションは非規範的です。

この仕様の開発に参加する方法はいくつか あります:

1.3 設計目標と根拠

このセクションは非規範的です。

CBOR-LD は、次の設計目標を満たします:

単純性
既存の JSON-LD 実装があれば、実装は容易に実装できるものであるべきです。
効率的なストレージ
エンコード処理は、極めてコンパクトな Linked Data のバイナリ 形式を生成するべきです。
汎用化されたアルゴリズム
エンコードアルゴリズムは汎用化されていなければなりません。
セマンティック圧縮
エンコード形式は、Linked Data の URL(用語および 値)の圧縮を最大化するべきです。ここに重点を置くことで、アルゴリズムは汎用的な圧縮アルゴリズムよりも 優れた圧縮率を実現できます。
生のバイナリ
Base エンコードされたバイナリ値、およびその他の圧縮可能なデータ型は、 汎用性を損なうことなく可能な場合には、Base エンコード形式から 生のバイナリ形式に変換されるべきです。

同様に、次の事項は目標ではありません。

この仕様に取り組む中で、次の落とし穴が 特定されています:

2. 基本概念

このセクションは非規範的です。

大まかに言えば、CBOR-LD は JSON-LD のコンパクトなバイナリシリアル化であり、 追加の圧縮のために次の仕組みを使用できます:

コーデックは、型付き値を汎用的な方法で圧縮するための基本的なプリミティブです。セマンティック圧縮 は JSON-LD の用語を圧縮するためのものです。レジストリ辞書は、ユースケース固有の方法で型付き値を 圧縮するためのものです。これらはいずれも任意であり、CBOR-LD は、これらの圧縮戦略の いずれか、すべて、またはいずれも使用せずに利用できます。これらの戦略のうち、 特定のユースケースで使用される一連のものを総称して、処理モデルと呼びます。処理モデルについては、 4. 処理 モデルで詳しく説明します。

3. セマンティック圧縮

このセクションは非規範的です。

セマンティック圧縮は、コンパクトな CBOR-LD ペイロードを作成するための強力な手段です。中核となる考え方は、 外部 JSON-LD コンテキストオブジェクトの情報内容を使用して JSON-LD の用語を圧縮することです。 これらの外部コンテキストオブジェクトは、ペイロードの作成者と利用者の双方が利用できるため、 可逆な方法でこれを実行できます。

一般的なセマンティック圧縮処理では、JSON-LD 文書を取得し、 次の処理を行います:

  1. JSON-LD を圧縮できるかどうかを判定します(URI を介してコンテキストを参照する JSON-LD 文書内の @context 値を見つけます。埋め込みコンテキスト値は圧縮できません)。
  2. JSON-LD コンテキストを処理し、CBOR-LD の用語コーデックマップ、すなわち 圧縮可能なすべての用語のリストを構築します。リストを(Unicode コードポイント順に)ソートします。 0 から開始して順に、各用語にバイト値を関連付けます。
  3. JSON-LD 文書を CBOR-LD にエンコードします。これは、各キーを、 用語コーデックマップ内の用語に関連付けられたバイト値で置換することで行います。
  4. 元の JSON-LD が必要になった場合、CBOR-LD から JSON-LD へのデコードでは、 各 CBOR バイト値を用語コーデックマップから対応するキーに置換します。

4. 処理モデル

このセクションは非規範的です。

2. 基本概念で説明したように、特定の ユースケースで使用される圧縮および 変換戦略の特定の組み合わせを、処理モデルと呼びます。 すべての CBOR-LD ペイロードには厳密に 1 つの処理モデルが関連付けられており、そのモデルは、 ペイロードの CBOR タグに識別子が含まれる CBOR-LD レジストリエントリによって選択されます( 5. CBOR-LD 用の CBOR タグを参照)。

処理モデルは、実装が JSON-LD 文書を CBOR-LD に、また CBOR-LD から JSON-LD にどのように変換するかを決定します。具体的には、処理モデルは次を指定します:

ユースケース固有の型付き値圧縮に使用されるレジストリ辞書は、 CBOR-LD レジストリエントリの別個の 部分であり、その typeTables フィールドを通じて設定されます( 5.1 CBOR-LD レジストリを参照)。これらは 処理モデルとは独立して選択され、 処理モデルの一部ではありません。

4.1 デフォルト処理モデル

processingModel を指定しない CBOR-LD レジストリエントリは、 デフォルト処理モデルを使用します。デフォルト処理モデルはこの 仕様で定義され、次のように動作します:

適用可能なコーデックまたは typeTable エントリが型に存在しない値、および 参照されるコンテキストのいずれにも含まれない用語は、そのまま保持されるため、適合する任意の JSON-LD 文書を損失なくラウンドトリップできます。

4.2 処理モデルの表現

存在する場合、CBOR-LD レジストリ エントリprocessingModel メンバーは、以下で定義されるメンバーを持つ マップです。このメンバーが存在しない場合は、デフォルト 処理モデル が適用されます。

semanticCompression
任意。JSON-LD の用語にセマンティック圧縮を適用するかどうかを示す ブール値です。存在しない場合、その値は true です。true の場合、用語識別子は 3. セマンティック 圧縮で説明されているとおりに自動生成されます。
codecs
任意。型から コーデック 識別子へのマップです。ここで型とは、 IRI として表現される JSON-LD 型、またはノード参照および用語が @type として @id で 定義されている値に一致する予約値 url のいずれかです。 変換中、値の型に関連付けられたコーデックが存在する場合、その値の圧縮および展開に 使用されます。codecs が存在せず、デフォルト処理モデルも使用されていない場合、 汎用の型付き値コーデックは適用されません。

4.2.1 コーデック識別子

この仕様では、以下の表に示すコーデック識別子を定義します。別の仕様で定義された処理モデルは、 その仕様が対応するコーデックを 定義している場合、追加のコーデック識別子を使用してもよいものとします。

コーデック識別子 コーデック デフォルト処理 モデルで関連付けられる型
url URL コーデック url
xsd-date XSD Date コーデック http://www.w3.org/2001/XMLSchema#date
xsd-date-time XSD DateTime コーデック http://www.w3.org/2001/XMLSchema#dateTime
multibase Multibase コーデック https://w3id.org/security#multibase

4.2.2 例: デフォルト処理モデル

この形式で表現すると、デフォルト処理モデルは セマンティック圧縮を有効にし、 この仕様で定義される各コーデックを、それが圧縮する型に関連付けます:

1: デフォルト処理モデル
processingModel:
  semanticCompression: true
  codecs:
    url: url
    "http://www.w3.org/2001/XMLSchema#date": xsd-date
    "http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time
    "https://w3id.org/security#multibase": multibase

レジストリエントリは、processingModel メンバーを完全に省略しても 同一の動作を得ることができます

4.2.3 例: カスタム 処理モデル

ユーザーがセマンティック圧縮の使用を望まない場合、および/または デフォルト処理モデルに含まれるもの以外のコーデックで圧縮したい場合、レジストリエントリで カスタム処理モデルを指定できます。次は、セマンティック 圧縮を使用せず、xsd-date-time コーデックのみを使用する処理モデルの例です:

2: セマンティック圧縮を 無効にした処理モデル
processingModel:
  semanticCompression: false
  codecs:
    "http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time

4.2.4 ユーザー指定のコーデック

4.2.1 コーデック識別子 には、この仕様で定義されているコーデックが 列挙されています。CBOR-LD コーデックは拡張ポイントとしても意図されています。処理モデルは、 ここでは規定されておらず、その代わりに処理モデルを定義する 仕様またはその他の文書で定義されているコーデックを使用してもよいものとします。

この仕様は、 ユーザー指定のコーデックがどのように動作するか、またそれらをどのように指定するかを制約 しません。そのようなコーデックを使用する処理モデルを定義する文書は、 相互運用可能な実装に十分な精度で各コーデックを指定する 責任を負い、テストおよび正確性についても責任を負います。この 仕様で定義されるコーデックは、IRI で識別されなければなりません

次の例は、型 https://example.org/vocab#ip-address の IP アドレス 値を圧縮するコーデックを使用する処理モデルを示しています。

3: ユーザー指定の コーデックを使用する処理モデル
processingModel:
  semanticCompression: true
  codecs:
    url: url
    "http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time
    "https://example.org/vocab#ip-address": ip-address

ここで、ip-address コーデックのエンコードおよびデコード動作は、 外部でアルゴリズムとして 規定されます。

5. CBOR-LD 用の CBOR タグ

CBOR-LD ペイロードは、バイナリレベルでそれと識別できる必要があります。CBOR はネイティブに 「タグ」機能によってこれをサポートします。これは、グローバルレジストリを介して残りの ペイロードを記述する、バイナリデータ内のヘッダー値です。

CBOR タグ 0xCB1D(タグ値 51997)は、CBOR-LD で使用するために IANA CBOR タグレジストリに登録されています。このタグ値の直後に続くデータは、 圧縮されたペイロードの作成に使用されたレジストリエントリを識別します。

CBOR-LD ペイロードは、タグ 0xCB1D が付けられた項目が 2 要素の配列となるように構成されなければならず、最初の要素は メジャータイプ 0 の整数なければなりません。 この整数は CBOR-LD レジストリエントリ ID です。バイナリ構造は tag([registryEntryId, payload]) です。

次に、CBOR-LD レジストリエントリ ID の値を使用して、CBOR-LD レジストリ内の CBOR-LD レジストリエントリを検索します。

5.1 CBOR-LD レジストリ

単一の CBOR タグ値を使用しながら、利用時に異なる圧縮テーブル素材を必要とする CBOR-LD の可能なユースケースを無制限に拡張できるようにするため、 以下を定義します。

CBOR-LD レジストリは、CBOR-LD ペイロードの利用者に、 展開に必要な用語コーデックマップを再構築するために必要な情報を提供するグローバルリストです。 CBOR-LD レジストリエントリには、以下が含まれます:

文字列 "callerProvidedTable" は typeTables に現れることがあり、このユース ケースでは、グローバルに定義されていない Type Table が必要であることを示します。

5.1.1 登録

現在の CBOR-LD レジストリはオンラインで 利用できます。

登録要件は、要求するレジストリエントリ ID に応じて異なります。範囲は以下のとおりです:

  • 0–255: 予約済み
  • 256–65,535: 仕様が必要
  • 65,536+: 先着順

登録要求は、リポジトリのフォークを介して CBOR-LD レジストリに対して作成された プルリクエストの形式でなければなりません。これらの要求には、以下を含めなければなりません:

  1. 要求するレジストリエントリ ID、
  2. レジストリエントリのユースケース、
  3. tables ディレクトリに追加された .yml ファイル。ファイル名には要求する レジストリエントリ ID を使用し、 レジストリエントリの技術的内容を指定します。このファイルが 想定されるファイル形式に適合しない場合、要求は説明なしに拒否されることがあります。

256–65,535 の範囲でエントリを登録するには、認知された標準開発組織(SDO)による 成熟した仕様または標準文書を要求とともに提供しなければなりません。 仕様またはその他の文書が受け入れ可能かどうかの判断には、W3CW3C 標準からの規範的参照を許可または禁止する際に、 組織および文書を評価する方法と同様の基準を使用します。 これらの要求は、割り当て前に専門家によるレビューを受けます。JSON-LD 系列の 仕様のメンテナーおよび/または W3C スタッフが このレビューを担当します。

ID 65 536 以上の合理的で適合する登録要求は、 追加のレビューなしに、「先着順」で レジストリリポジトリのメンテナーによってマージされます。

6. アルゴリズム

このセクションでは、JSON-LD を CBOR-LD に変換するため、およびその逆の変換に必要なアルゴリズムを 規定します。このセクションのアルゴリズムの大部分はセマンティック圧縮機能に関連しており、 CBOR-LD ペイロードがセマンティック圧縮を使用しない CBOR-LD と JSON-LD 間の変換では 使用されません。

6.1 エンコードとデコード

6.1.1 JSON-LD から CBOR-LD へのエンコードアルゴリズム

このアルゴリズムは、マップ typeTable、整数 registryEntryId、および JSON-LD 文書 jsonldDocument を入力として受け取り、16 進文字列 cborldBytes を返します。

  1. registryEntryId6.6.1 CBOR タグ構造取得アルゴリズムに渡した結果を prefix に設定します。
  2. state を空のマップに設定します。
  3. registryEntryId に関連付けられたレジストリエントリがセマンティック 圧縮を必要とする場合:
    1. state.strategy を "compression" に設定します。
    2. state.typeTabletypeTable に設定します。
    3. state.registryEntryIdregistryEntryId に設定します。
    4. state6.2.1 変換初期化アルゴリズムに渡した結果を state に設定します。
    5. state および jsonldDocumentinputDocuments として 6.2.2 文書変換アルゴリズムに渡した結果を output に設定します。
    6. suffixoutput の CBOR エンコーディングに設定します。
  4. それ以外の場合、suffixjsonldDocument の CBOR エンコーディングに設定します。
  5. prefix の 16 進エンコーディングを suffix の前に付加したものを cborldBytes に設定します。
  6. cborldBytes を返します。

6.1.2 CBOR-LD から JSON-LD へのデコードアルゴリズム

このアルゴリズムは、CBOR-LD ペイロード cborldBytes を受け取り、JSON-LD 文書 jsonldDocument を返します。

  1. state を空のマップに設定します。
  2. cborldBytes6.6.2 レジストリ エントリ ID 取得アルゴリズムに渡した結果を result に設定します。
  3. state.registryEntryIdresult.registryEntryId に設定し、suffixresult.suffix に設定します。
  4. state.registryEntryId に関連付けられたレジストリエントリが セマンティック圧縮を使用する場合:
    1. state.strategy を "decompression" に設定します。
    2. registryEntryId に関連付けられた CBOR-LD Varint レジストリエントリの typeTables 配列内の各エントリ type: map について、 そのエントリを state.typeTable に追加し、 state.reverseTypeTable 内の type の値を inverseMap に設定します。ここで inverseMap は、map のマッピングを反転したものです。
    3. state6.2.1 変換初期化アルゴリズムに渡した結果を state に設定します。
    4. suffix をバイト列からマップへデコードした結果を input に設定します。
    5. state および inputinputDocuments として 6.2.2 文書変換アルゴリズムに渡した結果を jsonldDocument に設定します。
  5. それ以外の場合、suffix をバイト列からマップへデコードした結果を jsonldDocument に設定します。
  6. jsonldDocument を返します。

6.2 変換アルゴリズム

このセクションのアルゴリズムは、データ形式間で入力を抽象的に 変換するための「コンバーター」の動作を説明します。このセクションの後半で定義する 「圧縮」および「展開」戦略などの「戦略」と組み合わせて使用すると、 これらのアルゴリズムを具体的なデータ形式間の変換に使用できます。 「圧縮」戦略は JSON-LD から CBOR-LD に変換し、「展開」 戦略は CBOR-LD から JSON-LD に変換します。

6.2.1 変換初期化 アルゴリズム

このアルゴリズムはマップ state を受け取り、それを返します。

  1. state6.4.1 コンテキストローダー初期化アルゴリズムに渡した結果を state に設定します。
  2. 空のマップ termMap および previousActiveContext6.3.1 アクティブコンテキスト初期化アルゴリズムに渡した結果を state.initialActiveContext に設定します。
  3. state.typesEncodedAsBytes を空の集合に設定します。
  4. "none"、"http://www.w3.org/2001/XMLSchema#date"、 "http://www.w3.org/2001/XMLSchema#dateTime"、 および "url" を state.typesEncodedAsBytes に追加します。
  5. state を返します。

6.2.2 文書変換アルゴリズム

このアルゴリズムは、マップ state およびマップまたは マップの配列 inputDocuments を受け取り、それぞれマップまたは マップの配列 outputMaps を返します。

  1. inputDocuments が配列の場合、inputsinputDocuments に設定します。それ以外の場合、inputs[inputDocuments] に設定します。
  2. outputMaps を空の配列に設定します。
  3. inputs 内の input ごとに:
    1. output を空のマップに設定します。
    2. stateinputoutput、および state.initialActiveContextactiveContext として 6.2.3 一般変換アルゴリズムに渡した結果を result に設定します。
    3. result.outputoutputMaps に追加します。
    4. stateresult.state に設定します。
  4. inputDocuments が配列の場合、outputMaps を返します。それ以外の場合、 outputMaps の 最初の要素を返します。

6.2.3 一般変換 アルゴリズム

このアルゴリズムは、マップ inputoutputstate、および activeContext を入力として受け取り、マップ state および output を含むマップを返します。

  1. state.strategy が "compression" に設定されている場合:
    1. stateactiveContextinput、および output を渡して、 6.2.5.1 圧縮用コンテキスト変換アルゴリズムを実行した結果を contextConversionResult に設定します。
    2. activeContextcontextConversionResult.activeContext に、 outputcontextConversionResult.output に、statecontextConversionResult.state に設定します。
  2. それ以外の場合、stateactiveContextinput、および output を渡して 6.2.6.1 展開用コンテキスト変換アルゴリズムを実行して得られた resultresult.activeContextactiveContext に、 result.outputoutput に、result.statestate に設定します。
  3. state.strategy が "compression" に設定されている場合、 activeContext および input を渡して 6.2.5.4 圧縮用オブジェクト型取得アルゴリズムを実行した結果を objectTypes に設定します。
  4. それ以外の場合、stateactiveContext、および input を渡して 6.2.6.4 展開用オブジェクト型取得アルゴリズムを実行した結果を objectTypes に設定します。
  5. activeContext および objectTypes6.3.4 型スコープコンテキスト適用アルゴリズムに渡した結果を activeContext に設定します。
  6. state.strategy が "compression" に設定されている場合、 stateinput、および activeContext を渡して 6.2.5.3 圧縮用入力エントリ取得アルゴリズムを実行した結果を termEntries に設定します。
  7. それ以外の場合、 stateinput、output、および activeContext を渡して 6.2.6.3 展開用入力エントリ取得アルゴリズムを実行した結果を termEntries に設定します。
  8. termEntries 内の [termInfo, value] ごとに:
    1. termtermInfo.term に設定します。
    2. activeContext および term6.3.3 プロパティスコープコンテキスト適用アルゴリズムに渡した結果を valueActiveContext に設定します。
    3. pluraltermInfo.plural の値に設定し、 termTypetermInfo.def 内の @type の値に設定します。
    4. pluraltrue に設定されている場合、valuesvalue の値に設定します。それ以外の場合、valuesvalue の値を単一の要素として含む配列に設定します。
    5. outputs を空の配列に設定します。
    6. values 内の unconvertedValue ごとに:
      1. statetermTypeunconvertedValuevalue として、valueActiveContextactiveContext として 6.2.4 値変換アルゴリズムに 渡した結果を result に設定します。
      2. stateresult.state に設定し、 result.outputoutputs に追加します。
    7. pluraltrue に設定されている場合、outputValuesoutputs に設定します。それ以外の場合、outputValuesoutputs の最初の要素に設定します。
    8. state.strategy が "compression" に設定されている場合、 output 内で termInfo.termId の値が outputValues にマッピングされるように設定します。それ以外の場合、 output 内で termInfo.term の値が outputValues にマッピングされるように設定します。
  9. result を空のマップに設定します。
  10. result.statestate に、result.outputoutput に設定します。
  11. result を返します。

6.2.4 値変換アルゴリズム

このアルゴリズムは、マップ stateactiveContexttermInfo、および 値 valuetermType を受け取ります。 マップ state および output を含む result オブジェクトを返します。

  1. valuenull の場合、null を返します。
  2. state.strategy が "compression" に設定されている場合、 statetermTypetermInfo、および value6.2.5.2 圧縮用値変換アルゴリズムに渡した結果を output に設定します。
  3. それ以外の場合、statetermTypetermInfo、および value6.2.6.2 展開用値変換アルゴリズムに渡した結果を output に設定します。
  4. output が定義されている場合、state および output を含むマップ result を返します。
  5. value が配列の場合:
    1. outputs を空の配列に設定します。
    2. value の各 element について:
      1. activeContextstatetermInfotermType、および elementvalue として渡して 6.2.4 値変換アルゴリズムを 実行した結果を result とします。stateresult.state に設定し、 result.outputoutputs に追加します。
    3. result を空のマップに設定します。result.statestate に、result.outputoutputs に設定します。
    4. result を返します。
  6. output を空のマップに設定します。
  7. stateactiveContextvalueinput として、および output6.2.3 一般変換アルゴリズムに渡した結果を result に設定します。
  8. result を返します。

6.2.5 圧縮戦略 アルゴリズム

このセクションのアルゴリズムは、JSON-LD から CBOR-LD へ 変換するために、前述の「変換」アルゴリズムとともに使用する 「圧縮」戦略を定義します。

6.2.5.1 圧縮用コンテキスト変換アルゴリズム

このアルゴリズムは、マップ stateactiveContextinput、 および output を受け取り、 マップ outputstate、 および activeContext を含むマップ result を返します。

  1. stateactiveContext、および input を渡して 6.3.2 埋め込みコンテキスト適用アルゴリズムを実行した結果を applyEmbeddedResult に設定します。
  2. activeContextapplyEmbeddedResult.activeContext に、 stateapplyEmbeddedResult.state に設定します。
  3. "@context" が input にエントリを持たない場合:
    1. result を空のマップに設定します。
    2. result.statestate に、 result.activeContextactiveContext に設定します。
    3. result を返します。
  4. contextinput 内の "@context" の値に設定します。
  5. encodedContexts を空の配列に設定します。
  6. context が配列の場合、isArraytrue に、 contextscontext に設定します。 それ以外の場合、isArrayfalse に、contexts[context] に設定します。
  7. contexts 内の contextValue ごとに:
    1. state.typeTable および contextValue を渡して 6.5.1.1 コンテキストエンコーダーの作成を 実行した結果を encoderData に設定します。
    2. encoderData が空のマップの場合、contextValueencodedContexts に追加します。
    3. それ以外の場合、encoderData の値を encodedContexts に追加します。
  8. isArraytrue の場合、idstate.keywordsMap 内の "@context" の値に 1 を加えた値に設定し、 output 内の id の値を encodedContexts に設定します。
  9. それ以外の場合、idstate.keywordsMap 内の "@context" の値に 設定し、output 内の id の値を encodedContexts の最初の要素に設定します。
  10. result.outputoutput に、result.statestate に、result.activeContextactiveContext に設定します。
  11. result を返します。
6.2.5.2 圧縮用値変換アルゴリズム

このアルゴリズムは、マップ state および termInfo、ならびに値 valueToEncode および termType を受け取り、 マップ encoderData を返します。

  1. valueToEncode がオブジェクトの場合、返ります。
  2. それ以外の場合、statetermInfovalueToToEncode、および termType を渡して 6.5.2.1 値エンコーダーの作成を実行した結果を result に設定します。
  3. result を返します。
6.2.5.3 圧縮用入力エントリ取得アルゴリズム

このアルゴリズムは、マップ stateactiveContext、および input を受け取り、配列 entries を返します。

  1. entries を空の配列として初期化します。
  2. 配列 keys を、辞書式順序でソートされた input のキーに設定します。
  3. keys 内の key ごとに:
    1. key が "@context" の場合、続行します。
    2. valueinput 内の key の値に設定します。
    3. value が配列の場合、pluraltrue に設定します。 それ以外の場合、pluralfalse に設定します。
    4. keystate.termToId にエントリを持たない場合、termIdkey に設定します。
    5. それ以外で、pluraltrue の場合、termIdstate.termToId 内の key の値に 1 を加えた値に設定します。
    6. それ以外の場合、termIdstate.termToId 内の key の値に設定します。
    7. activeContext.termMapkey のエントリを持つ場合、definitionactiveContext.termMap 内の key の値に設定します。 それ以外の場合、 definition を空のマップに設定します。
    8. entryTerm を新しいマップに設定します。
    9. entryTerm 内の "term" の値を key の値に設定します。entryTerm 内の "def" の値を definition の値に設定します。termId および pluralentryTerm に追加します。
    10. entryTerm および value の 2 要素を持つ配列 entry を作成します。
    11. entryentries に追加します。
  4. entries を返します。
6.2.5.4 圧縮用オブジェクト型取得アルゴリズム

このアルゴリズムは、マップ activeContext および input を受け取り、集合 objectTypes を返します。

  1. objectTypes を空の集合に設定します。
  2. activeContext.typeTerms 内の term ごとに:
    1. terminput にエントリを持つ場合:
      1. typesinput 内の term の値に設定します。
      2. types 内の各値を objectTypes に追加します。
  3. objectTypes を返します。

6.2.6 展開 戦略アルゴリズム

このセクションのアルゴリズムは、CBOR-LD から JSON-LD へ 変換するために、前述の「変換」アルゴリズムとともに使用する 「展開」戦略を定義します。

6.2.6.1 展開用コンテキスト変換アルゴリズム

このアルゴリズムは、マップ stateactiveContextinput、 および output を受け取り、 マップ outputstate、および activeContext を含むマップ result を返します。

  1. state.reverseTypeTable を渡して 6.5.1.3 コンテキストデコーダーの作成を実行した結果を decoderData に設定します。
  2. contextTermIdstate.keywordsMap 内の "@context" の値に設定します。
  3. contextTermIdinput にエントリを持つ場合、 decoderData および input 内の contextTermId の値を value として 6.5.1.4 コンテキストのデコードに渡した結果を output 内の "@context" の値に設定します。
  4. contextTermIdPluralcontextTermId の値に 1 を加えた値に設定します。
  5. contextTermIdPluralinput にエントリを持つ場合:
    1. 前のチェック時に contextTermIdinput にエントリを 持っていた場合、 ERR_INVALID_ENCODED_CONTEXT エラーをスローします。
    2. encodedContextsinput 内の contextTermIdPlural の値に設定します。encodedContexts が 配列でない場合、ERR_INVALID_ENCODED_CONTEXT エラーをスローします。
    3. contexts を空の配列に設定します。
    4. encodedContexts 内の各 valueToDecode について、 decoderData および valueToDecodevalue として 6.5.1.4 コンテキストのデコードに渡した結果を contexts に追加します。
    5. output 内の "@context" の値を contexts に設定します。
  6. activeContextoutputinput として、および state を渡して 6.3.2 埋め込みコンテキスト適用アルゴリズムを実行した結果を embeddedContextResult に設定します。
  7. resultembeddedContextResult に設定し、result.outputoutput に設定します。result を返します。
6.2.6.2 展開用値変換アルゴリズム

このアルゴリズムは、マップ state および termInfo、ならびに値 termType および valueToDecode を受け取り、値 decodedValue を返します。

  1. value がマップの場合、返ります。
  2. valueToDecodestatetermInfo、および termType を渡して 6.5.2.3 値デコーダーの作成を実行した結果を decoderData に設定します。
  3. decoderData を渡して 6.5.2.4 値のデコードを実行した結果を decodedValue に設定します。
  4. decodedValue を返します。
6.2.6.3 展開用入力エントリ取得アルゴリズム

このアルゴリズムは、マップ stateactiveContext、および input を受け取り、配列 entries を返します。

  1. entries を空の配列に初期化します。
  2. input 内のキーと値のペア key および value ごとに:
    1. keystate.keywordsMap 内の "@context" の値、またはその値に 1 を加えた値の場合、続行します。
    2. それ以外で、key が文字列の場合、plural を false に、 termkey に設定します。
    3. それ以外の場合:
      1. key が奇数の場合、plural を true に設定します。それ以外の場合、 plural を false に設定します。
      2. pluraltrue の場合、termstate.idToTerm 内の key から 1 を引いた値に設定します。 その値にエントリがない場合、エラー ERR_UNKNOWN_CBORLD_TERM_ID をスローします。
      3. それ以外の場合、termstate.idToTerm 内の key の値に設定します。 その値にエントリがない場合、 エラー ERR_UNKNOWN_CBORLD_TERM_ID をスローします。
    4. definitionactiveContext.termMap 内の term の値に設定します。
    5. entryTerm を新しいマップに設定します。
    6. entryTerm 内の "termId" の値を key の値に設定します。entryTerm 内の "def" の値を definition の値に設定します。term および pluralentryTerm に追加します。
    7. entryTerm および value の 2 要素を持つ配列 entry を作成します。
    8. entryentries に追加します。
  3. entries の各要素内の term の値で entries をソートします。
  4. entries を返します。
6.2.6.4 展開用オブジェクト型取得アルゴリズム

このアルゴリズムは、マップ stateactiveContextinput を 入力として受け取り、 集合 objectTypes を返します。

  1. objectTypes を空の集合に設定します。
  2. activeContext.typeTerms 内の term ごとに:
    1. termstate.termToId にエントリを持たない場合、termIdterm に設定します。
    2. それ以外の場合、termIdstate.termToId 内の term の値に設定します。
    3. termIdtermId に 1 を加えた値も input に存在しない場合、続行します。
    4. それ以外で、termIdinput に存在する場合、 valueinput 内の termId の値に設定します。
    5. それ以外の場合、valueinput 内の termId に 1 を加えた値に設定します。
    6. key が文字列の場合、plural を false に、 termkey に設定します。
    7. それ以外の場合:
      1. key が奇数の場合、plural を true に設定します。それ以外の場合、 plural を false に設定します。
      2. pluraltrue の場合、termstate.idToTerm 内の id から 1 を引いた値に設定します。 その値にエントリがない場合、エラー ERR_UNKNOWN_CBORLD_TERM_ID をスローします。
      3. それ以外の場合、termstate.idToTerm 内の id の値に設定します。 その値にエントリがない場合、 エラー ERR_UNKNOWN_CBORLD_TERM_ID をスローします。
    8. definitionactiveContext.termMap 内の term の値に設定します。
    9. termInfo を新しいマップに設定します。
    10. entryTerm 内の "def" の値を definition の値に設定します。termtermId、および pluraltermInfo に追加します。
    11. value が配列でない場合、valuesvalue を単一の要素として含む配列に設定します。 それ以外の場合、valuesvalue の値に設定します。
    12. values 内の各 value について:
      1. valuetermInfostate、および "@vocab" を termType として渡して 6.5.2.3 値デコーダーの作成を実行した結果を decoderData に設定します。
      2. decoderData が存在する場合、decoderData を渡して 6.5.2.4 値のデコードを実行した結果を `objectTypes に追加します。
      3. それ以外の場合、valueobjectTypes に追加します。
  3. objectTypes を返します。

6.3 アクティブコンテキスト処理

このセクションのアルゴリズムでは、JSON-LD 文書に関連付けられた コンテキスト文書のどの構成要素が、圧縮または展開中の任意の時点で 使用されているかを判定する方法について説明します。 これらのアルゴリズムには、CBOR-LD で埋め込みコンテキスト、型スコープコンテキスト、および プロパティスコープコンテキストを適用する方法が含まれます。これは、この仕様の後半で定義されるコンテキスト 読み込みアルゴリズムとは対照的です。コンテキスト読み込みアルゴリズムでは、 CBOR-LD の中核的な圧縮手法である、用語から整数へのマッピングを 構築する方法について説明します。アクティブコンテキスト処理アルゴリズムとコンテキスト 読み込みアルゴリズムを合わせて、CBOR-LD への変換および CBOR-LD からの変換時に JSON-LD コンテキスト文書をどのように処理すべきかを規定します。

6.3.1 アクティブ コンテキスト初期化アルゴリズム

このアルゴリズムは、マップ previousActiveContext および termMap を受け取り、 マップ activeContext を返します。使用中のアクティブコンテキストを 更新し、'@type' のすべての別名を検索します。

  1. activeContext を新しいマップに設定します。
  2. activeContext.previousActiveContextpreviousActiveContext に設定します。
  3. activeContext.termMaptermMap に設定します。
  4. activeContext.typeTerms を配列 ['@type'] に設定します。
  5. termMap 内の [term, def] ごとに:
    1. def 内の "@id" の値が "@type" の場合、termactiveContext.typeTerms に追加します。
  6. activeContext を返します。

6.3.2 埋め込み コンテキスト適用アルゴリズム

このアルゴリズムは、マップ stateactiveContext、および input を 入力として受け取り、 マップ state および activeContext を含むマップ result を返します。

  1. stateactiveContext.termMapactiveTermMap として、および input 内の '@context' の値を contexts として 6.3.5 用語 マップ更新アルゴリズムに渡した結果を termMapUpdateResult に設定します。
  2. statetermMapUpdateResult.state に設定します。
  3. termMaptermMapUpdateResult.activeTermMap に設定します。
  4. termMap および activeContextpreviousActiveContext として渡して、 6.3.1 アクティブコンテキスト初期化アルゴリズムを実行した結果を newActiveContext に設定します。
  5. result を新しいマップに設定し、result.activeContextnewActiveContext に、 result.statestate に設定します。
  6. result を返します。

6.3.3 プロパティスコープコンテキスト適用アルゴリズム

このアルゴリズムは、マップ stateactiveContext、および文字列 term を入力として受け取り、 マップ state および activeContext を含むマップ result を返します。

  1. activeContext を渡して 6.3.6 用語マップ復元アルゴリズムを 実行した結果を revertedTermMap に設定します。
  2. termDefactiveContext.termMap 内の term の値に設定します。contextstermDef 内の "@context" の値に設定します。
  3. staterevertedTermMapactiveTermMap として、truepropertyScope として、および contexts6.3.5 用語 マップ更新アルゴリズムに渡した結果を termMapUpdateResult に設定します。
  4. statetermMapUpdateResult.state に設定します。
  5. termMaptermMapUpdateResult.activeTermMap に設定します。
  6. termMap および activeContextpreviousActiveContext として渡して、 6.3.1 アクティブコンテキスト初期化アルゴリズムを実行した結果を newActiveContext に設定します。
  7. result を新しいマップに設定し、result.activeContextnewActiveContext に、 result.statestate に設定します。
  8. result を返します。

6.3.4 型 スコープコンテキスト適用アルゴリズム

このアルゴリズムは、マップ stateactiveContext 、および集合 objectTypes を入力として受け取り、 マップ state および activeContext を含むマップ result を返します。

  1. objectTypesSorted を空の配列に設定します。
  2. objectTypes の要素を辞書式順序でソートし、その要素を順番に objectTypesSorted に追加します。
  3. newTermMapactiveContext.termMap に設定します。
  4. objectTypesSorted 内の type ごとに:
    1. typeDefnewTermMap 内の type の値に設定します。 contextstypeDef 内の "@context" の値に設定します。
    2. statenewTermMapactiveTermMap として、contexts、および truetypeScope として 6.3.5 用語マップ更新アルゴリズムに渡した結果を termMapUpdateResult に設定します。
    3. statetermMapUpdateResult.state に、 newTermMaptermMapUpdateResult.activeTermMap に設定します。
  5. newTermMaptermMap として、および activeContextpreviousActiveContext として渡して、 6.3.1 アクティブコンテキスト初期化アルゴリズムを実行した結果を newActiveContext に設定します。
  6. result を新しいマップに設定し、result.activeContextnewActiveContext に、 result.statestate に設定します。
  7. result を返します。

6.3.5 用語マップ更新アルゴリズム

このアルゴリズムは、マップ stateactiveTermMap、および値 contexts、ならびにブール値 typeScope および propertyScope を入力として受け取ります。後者 2 つは指定されない場合、いずれも false がデフォルトです。マップ state および activeTermMap を返します。

  1. contexts が配列でない場合、contexts の以前の値を 唯一の要素として持つ配列に contexts を設定します。
  2. allowProtectedOverridepropertyScope の値に設定します。
  3. propagateDefaulttypeScope の値の否定に設定します。
  4. contexts 内の contextIdentifier ごとに:
    1. state および contextIdentifier を渡して 6.4.2 コンテキスト読み込みアルゴリズムを 実行した結果を loadResult に設定します。
    2. entryloadResult.entry に、 contextentry.context に、stateloadResult.state に設定します。
    3. @propagatecontext に現れる場合、propagatecontext 内の @propagate の値に設定します。 それ以外の場合、propagatepropagateDefault の値に設定します。
    4. newTermMap を空のマップに設定します。entry.termMap 内の [key, value] ごとに:
      1. value の内容を新しいマップ newValue にシャローコピーし、propagatenewValue に追加します。
      2. newTermMap 内の key の値を newValue に設定します。
    5. activeTermMap 内の [term, activeDef] ごとに:
      1. defnewTermMap 内の term の値とします。
      2. def が定義されている場合:
        1. activeDef 内の protected の値が true の場合:
          1. allowProtectedOverridefalse に設定され、かつ defactiveDef と同一でない場合、 エラー ERR_PROTECTED_TERM_REDEFINITION をスローします。
          2. それ以外の場合、newTermMap 内の term の値を、 activeDef の値を含み、 propagatedef.propagate の値に設定されたマップに設定します。
      3. それ以外で、termcontext に現れる場合、newTermMap 内の term の値を、 activeDef のすべての値を含むマップに設定します。
    6. activeTermMap の値を newTermMap の値に設定します。
  5. result を空のマップに設定します。
  6. result.statestate に、 result.activeTermMapactiveTermMap に設定します。
  7. result を返します。

6.3.6 用語マップ復元アルゴリズム

このアルゴリズムはマップ activeContext を入力として受け取り、マップ newTermMap を返します。

  1. newTermMap を空のマップに設定します。
  2. nonPropagatingTerms を空の配列に設定します。
  3. activeContext 内の [term, def] ごとに:
    1. def.propagatefalse に設定されている場合、termnonPropagatingTerms に追加し、 このループの次の反復に進みます。
    2. それ以外の場合、newTermMap 内の term の値を def に設定します。
  4. nonPropagatingTerms 内の term ごとに:
    1. currentContextactiveContext.previousActiveContext に設定します。
    2. defcurrentContext.termMap 内の term の値に設定します。
    3. def が未定義ではなく、かつ def.propagatefalse に設定されている間:
      1. currentContextactiveContext.previousActiveContext に設定します。
      2. defcurrentContext.termMap 内の term の値に設定します。
    4. def が未定義でない場合、newTermMap 内の term の値を def に設定します。
  5. newTermMap を返します。

6.4 コンテキスト読み込み

このセクションのアルゴリズムでは、CBOR-LD の中核的な圧縮手法として使用される 用語と整数の間のマッピングを構築する方法を定義します。

6.4.1 コンテキストローダー初期化アルゴリズム

このアルゴリズムはマップ state を受け取り、それを返します。

  1. state.contextMap を新しいマップに設定します。
  2. state.nextTermId を 100 に設定します。
  3. state.keywordsMap を、JSON-LD キーワードとそれらに関連付けられた 整数値の次のマップに設定します:
    {
      '@context' => 0,
      '@type' => 2,
      '@id' => 4,
      '@value' => 6,
      '@direction' => 8,
      '@graph' => 10,
      '@included' => 12,
      '@index' => 14,
      '@json' => 16,
      '@language' => 18,
      '@list' => 20,
      '@nest' => 22,
      '@reverse' => 24,
      '@base' => 26,
      '@container' => 28,
      '@default' => 30,
      '@embed' => 32,
      '@explicit' => 34,
      '@none' => 36,
      '@omitDefault' => 38,
      '@prefix' => 40,
      '@preserve' => 42,
      '@protected' => 44,
      '@requireAll' => 46,
      '@set' => 48,
      '@version' => 50,
      '@vocab' => 52,
      '@propagate' => 54
    }
  4. state.keywordsMap の各エントリを state.termToId に追加します。
  5. state.strategy が "decompression" に設定されている場合、state.idToTermstate.termToId の逆マップ (すなわち、整数から JSON-LD キーワードへのマップ)に設定します。
  6. state を返します。

6.4.2 コンテキスト読み込みアルゴリズム

このアルゴリズムは、マップ state およびコンテキストマップまたは URL contextIdentifier を受け取り、 マップ state および entry を含むマップ result を返します。

  1. state.contextMapcontextIdentifier のエントリを持つ場合:
    1. result を空のマップに初期化します。
    2. result.statestate に設定します。
    3. result.entrystate.contextMap 内の contextIdentifier の値に設定します。
    4. result を返します。
  2. context が文字列の場合:
    1. 関連付けられたコンテキストオブジェクトを取得し、context をそのオブジェクト内の "@context" の値に設定します。
    2. contextUrlcontextIdentifier の値に設定します。
  3. それ以外の場合、contextcontextIdentifier に設定します。
  4. statecontext、および設定されている場合は contextUrl6.4.3 コンテキスト追加アルゴリズムに渡した結果を result に設定します。
  5. result を返します。

6.4.3 コンテキスト追加アルゴリズム

このアルゴリズムは、マップ state、コンテキストオブジェクト context、およびコンテキスト URL contextUrl を受け取り、 マップ state および entry を含むマップ result を返します。

  1. context がエントリ "@import" を持つ場合:
    1. importUrl を `context 内の "@import" の値に設定します。
    2. state.contextMapimportUrl のエントリを持たない場合:
      1. importUrl に関連付けられたコンテキストオブジェクトを取得し、 importContext をそのオブジェクト内の "@context" の値に設定します。
      2. stateimportContextcontext として、 および importUrlcontextUrl として渡して 6.4.3 コンテキスト追加アルゴリズムを実行した結果を importedContextAdditionResult に設定します。
      3. stateimportedContextAdditionResult.state に、 importEntryimportedContextAdditionResult.entry に設定します。
    3. それ以外の場合、importEntrystate.contextMap 内の importUrl の値に設定します。
    4. context を、context のすべてのエントリと importEntry.context を含むマップに設定します。
  2. termMap を空のマップに設定します。
  3. entrycontext および termMap を含むオブジェクトに設定します。
  4. sortedTerms を、context 内のキーを 辞書式順序でソートした結果に設定します。
  5. "@protected" が context にエントリを持つ場合は isProtectedtrue に、それ以外の場合は false に設定します。
  6. sortedTerms 内の term ごとに:
    1. termstate.keywordsMap にエントリを持つ場合、このループの次の 反復に進みます。
    2. definitioncontext 内の term の値に設定します。
    3. definitionnull の場合、この ループの次の反復に進みます。
    4. definition が文字列の場合:
      1. newDefinition を空のマップに設定します。
      2. newDefinition 内の "@id" の値を definition に設定します。
      3. definition の値を newDefinition に設定します。
    5. definition 内の protected の値を isProtected に設定します。
    6. termMap 内の term の値を definition に設定します。
    7. termstate.termToId にエントリを持たない場合:
      1. termIdstate.nextTermId に設定します。
      2. state.nextTermId を 2 増加させます。
      3. state.termToId 内の term の値を termId に設定します。
      4. state.idToTerm 内の termId の値を term に設定します。
  7. contextUrl が定義されている場合、state.contextMap 内の contextUrl の値を entry に設定します。
  8. それ以外の場合、state.contextMap 内の context の値を entry に設定します。
  9. result を空のマップに設定します。
  10. result.statestate に、result.entryentry に設定します。
  11. result を返します。

6.5 コーデック

このセクションのコーデックは、JSON-LD 内の個々の値を CBOR に変換する方法、およびその逆の方法を 厳密に規定します。これらは前のセクションのアルゴリズムで使用され、CBOR-LD が プリミティブ型と非プリミティブ型の両方を CBOR として効率的に エンコードできるようにします。

6.5.1 コンテキストコーデック

6.5.1.1 コンテキストエンコーダーの作成

このアルゴリズムは、マップ typeTable および値 contextValue を受け取り、 マップ encoderData を返します。

  1. encoderData を空のマップに初期化します。
  2. contextValue が文字列でない場合、返ります。
  3. それ以外の場合、contextTabletypeTable 内の "context" の値に設定します。
  4. encoderData.contextcontextValue に、 encoderData.contextTablecontextTable に設定します。
  5. encoderData を返します。
6.5.1.2 コンテキストのエンコード

このアルゴリズムは、マップ encoderData を受け取り、CBOR バイナリデータを返します。

  1. encoderData.contextencoderData.contextTable にエントリを持つ場合、 encoderData 内の encoderData.context の値を メジャータイプ 0(符号なし整数)オブジェクトとして CBOR エンコードしたものを返します。
  2. それ以外の場合、 encoderData.context の値をメジャータイプ 3 (テキスト文字列)オブジェクトとして CBOR エンコードしたものを返します。
6.5.1.3 コンテキストデコーダーの作成

このアルゴリズムは、マップ reverseTypeTable を受け取り、 マップ encoderData を返します。

  1. reverseContextTablereverseTypeTable 内の "context" の値に設定します。
  2. decoderData を空のマップに初期化します。
  3. decoderData.reverseContextTablereverseContextTable の値に設定し、 decoderData を返します。
6.5.1.4 コンテキストのデコード

このアルゴリズムは、マップ decoderData および値 value を受け取り、 値を返します。

  1. value が数値でない場合、value を返します。
  2. それ以外で、decoderData.reverseContextTablevalue のエントリを持つ場合、そのエントリの 値を返します。
  3. それ以外の場合、エラー ERR_UNDEFINED_COMPRESSED_CONTEXT をスローします。

6.5.2 値コーデック

6.5.2.1 値エンコーダーの作成

このアルゴリズムは、マップ state および termInfo、ならびに値 termType および valueToEncode を受け取り、マップ encoderData または valueToEncode を返します。

  1. isUrlfalse に設定します。
  2. termInfo.term が "@id" または "@type" の場合、isUrltrue に設定します。
  3. termInfo.def 内の "@id" の値が "@id" または "@type" の場合、 isUrl を true に設定します。
  4. termType が "@id" または "@vocab" の場合、isUrltrue に設定します。
  5. isUrltrue の場合、tableType を "url" に設定します。
  6. それ以外で、termType が定義されている場合、tableTypetermType に設定します。
  7. それ以外の場合、tableType を "none" に設定します。
  8. state.typeTabletableType のエントリを持つ場合:
    1. subTablestate.typeTable 内の tableType の値に設定します。
    2. subTablevalueToEncode のエントリを持つ場合:
      1. intValuesubTable 内の valueToEncode の値に設定します。 includeSignfalse に設定します。
      2. state.typesEncodedAsBytestableType のエントリを持つ場合、convertToBytestrue に設定します。 それ以外の場合、convertToBytesfalse に設定します。
    3. それ以外で、tableType が "none" ではなく、valueToEncode が 整数の場合:
      1. intValuevalueToEncode の値に設定します。
      2. convertToBytes および includeSigntrue に設定します。
    4. intValue が定義されている場合:
      1. encoderData を空のマップに初期化します。
      2. encoderData.intValueintValue の値に、encoderData.convertToBytesconvertToBytes の値に、また encoderData.includeSignincludeSign の値に設定します。
      3. encoderData を返します。
  9. tableTypestate.processingModeTypeEncoders にエントリを持つ場合、 encoderData を、そのエントリのコーデックに関連付けられた Create Encoder アルゴリズムを呼び出した結果に設定します。
  10. encoderData が定義されている場合、encoderData を返します。
  11. valueToEncode を返します。
6.5.2.2 値のエンコード

このアルゴリズムは、マップ encoderData を受け取り、CBOR バイナリデータを返します。

  1. encoderData.convertToBytestrue の場合:
    1. intValue をバイト列に変換した結果を bytes に設定し、 includeSign の値を使用して 整数のバイナリ表現を符号付きにするか 符号なしにするかを決定します。
    2. bytes をメジャータイプ 2(バイト文字列)オブジェクトとして CBOR エンコードしたものを返します。
  2. それ以外の場合、intValue をメジャータイプ 0(符号なし 整数)オブジェクトとして CBOR エンコードしたものを返します。
6.5.2.3 値デコーダーの作成

このアルゴリズムは、マップ state および termInfo、ならびに値 termType および valueToDecode を受け取り、マップ decoderData を返します。

  1. isUrlfalse に設定します。
  2. termInfo.term が "@id" または "@type" の場合、isUrltrue に設定します。
  3. termInfo.def 内の "@id" の値が "@id" または "@type" の場合、 isUrltrue に設定します。
  4. termType が "@id" または "@vocab" の場合、isUrltrue に設定します。
  5. isUrltrue の場合、tableType を "url" に設定します。
  6. それ以外で、termType が定義されている場合、tableTypetermType に設定します。
  7. それ以外の場合、tableType を "none" に設定します。
  8. state.reverseTypeTabletableType のエントリを持つ場合:
    1. subTablestate.reverseTypeTable 内の tableType の値に設定します。
    2. useTablefalse に設定します。
    3. valueToDecode がバイト配列であり、 state.typesEncodedAsBytestableType のエントリを持つ場合:
      1. useTabletrue に設定します。
      2. intValuevalueToDecode のバイト列を符号なし整数に変換した値に設定します。
    4. それ以外で、valueToDecode が整数であり、 state.typesEncodedAsBytestableType のエントリを持たない場合:
      1. useTabletrue に設定します。
      2. intValuevalueToDecode に設定します。
    5. useTabletrue の場合:
      1. intValuesubTable に存在しない場合、エラー ERR_UNKNOWN_COMPRESSED_VALUE をスローします。
      2. それ以外の場合、decodedsubTable 内の intValue の値に設定します。
    6. それ以外で、valueToDecode がバイト配列であり、tableType が "none" でない場合、 decodedvalueToDecode の整数変換結果に設定します。
    7. decoded が定義されている場合、decoderData を空の マップに初期化し、decoderData.decodeddecoded の値に設定して、decoderData を返します。
  9. tableTypestate.processingModeTypeDecoders にエントリを持つ場合、 DecoderData を、そのエントリのコーデックに関連付けられた Create Decoder アルゴリズムを呼び出した結果に設定します。
  10. decoderData が定義されている場合、decoderData を返します。
  11. それ以外で、valueToDecode が配列でない場合、 decoderData を空のマップに初期化し、 decoderData.decodedvalueToDecode に設定して、 decoderData を返します。
6.5.2.4 値のデコード

このアルゴリズムは、マップ decoderData を受け取り、値を返します。

  1. decoderData.decoded を返します。

6.5.3 URL コーデック

URL コーデックは、値のプレフィックスに基づいて URL 値を圧縮します。 ここでプレフィックスとは、URL プレフィックス テーブル内で最長一致するエントリです。URL は配列としてエンコードされ、最初の整数が URL のプレフィックスを識別します。コーデックはまず、その値が既知の JSON-LD 用語識別子と一致するかどうかを確認し、一致する場合は単純な整数としてエンコードします。それ以外の場合は、 値のプレフィックスに基づいて、以下のプレフィックス固有のサブコーデックのいずれかに 処理を委譲します。

6.5.3.1 URL プレフィックステーブル

URL プレフィックステーブルは、URL プレフィックスをそれらに 関連付けられた圧縮整数識別子にマッピングします。URL コーデックを使用する実装は、以下のテーブルを使用しなければなりませんURL プレフィックス逆引きテーブルは、この テーブルを反転したものです(すなわち、整数から URL プレフィックス文字列へのマップ)。

URL プレフィックス 整数識別子
http:// 1
https:// 2
urn:uuid: 3
data: 4
did:v1:nym: 1024
did:key: 1025
6.5.3.2 URL エンコーダーの作成

このアルゴリズムは、マップ state、マップ termInfo、 および文字列 valueToEncode を受け取り、エンコーダーオブジェクト または undefined を返します。

  1. valueToEncode が文字列でない場合、 ERR_UNSUPPORTED_JSON_TYPE エラーをスローします。
  2. state.termToId 内で valueToEncode を検索した結果を termId に設定します。
  3. termId が整数の場合、6.5.3.3 URL の エンコードを介して呼び出されたときに、termId を メジャータイプ 0(符号なし整数)の CBOR 項目としてエンコードするエンコーダーを返します。
  4. valueToEncode を URL として解析しようとします。 解析に失敗した場合(すなわち、その値が有効な URL でない場合)、 undefined を返します。
  5. valueToEncodeprefix で始まり、 prefix に続く valueToEncode の残りの部分に ":"(U+003A COLON)文字が含まれないような、URL プレフィックス テーブル内のエントリを prefix に設定します。そのような エントリが存在しない場合は、undefined を返します(これは、この URL を 圧縮できないことを意味します)。
  6. prefix が "https://" または "http://" の場合、 valueToEncode を渡して 6.5.3.6.1 HTTP URL エンコーダーの作成を実行した結果を返します。
  7. prefix が "urn:uuid:" の場合、 valueToEncode を渡して 6.5.3.7.1 UUID URN エンコーダーの作成を実行した結果を返します。
  8. prefix が "data:" の場合、 valueToEncode を渡して 6.5.3.8.1 Data URL エンコーダーの作成を実行した結果を返します。
  9. prefix が "did:v1:nym:" または "did:key:" の場合、 valueToEncode を渡して 6.5.3.9.1 Base58 DID URL エンコーダーの作成を実行した結果を返します。
  10. undefined を返します(これは、この URL を圧縮 できないことを意味します)。
6.5.3.3 URL のエンコード

このアルゴリズムは、 6.5.3.2 URL エンコーダーの作成によって生成されたエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。

  1. エンコーダーが用語 ID の一致( 6.5.3.2 URL エンコーダーの作成のステップ 3)用に作成された場合、 termId をメジャータイプ 0(符号なし整数)オブジェクトとして CBOR エンコードしたものを返します。
  2. それ以外の場合、適切なプレフィックス固有のサブエンコーダーの encode メソッドを呼び出し、結果の CBOR バイナリデータを返します。
6.5.3.4 URL デコーダーの作成

このアルゴリズムは、マップ state、マップ termInfo、 および値 valueToDecode を受け取り、デコーダーオブジェクトまたは undefined を返します。

  1. valueToDecode が文字列の場合、undefined を返します (これは、その値がすでに非圧縮の URL 文字列であり、そのまま渡すことを意味します)。
  2. valueToDecode が配列の場合:
    1. prefixIdvalueToDecode の最初の要素に設定します。
    2. prefix を、URL プレフィックス 逆引きテーブル内の prefixId に対応する値に設定します。
    3. prefix が "http://" または "https://" の場合、valueToDecode を渡して 6.5.3.6.3 HTTP URL デコーダーの作成を実行した結果を decoder に設定します。
    4. それ以外で、prefix が "urn:uuid:" の場合、 valueToDecode を渡して 6.5.3.7.3 UUID URN デコーダーの作成を実行した結果を decoder に設定します。
    5. それ以外で、prefix が "data:" の場合、 valueToDecode を渡して 6.5.3.8.3 Data URL デコーダーの作成を実行した結果を decoder に設定します。
    6. それ以外で、prefix が "did:v1:nym:" または "did:key:" の場合、valueToDecode を渡して 6.5.3.9.4 Base58 DID URL デコーダーの作成を実行した結果を decoder に設定します。
    7. prefix が上記のいずれにも一致しなかった場合( prefixIdURL プレフィックス逆引きテーブル内の エントリがない場合を含む)、または decoderundefined の場合(これは、サブデコーダーが valueToDecode の形状を拒否したことを意味します)、 ERR_UNKNOWN_COMPRESSED_VALUE エラーをスローします。
    8. decoder を返します。
  3. valueToDecode が整数の場合、 state.idToTerm 内で valueToDecode を検索した 結果を term に設定し、 6.5.3.5 URL のデコード の呼び出しによって term を返すデコーダーを返します。
  4. undefined を返します。
6.5.3.5 URL のデコード

このアルゴリズムは、 6.5.3.4 URL デコーダーの作成によって生成されたデコーダーオブジェクトを受け取り、文字列値を返します。

  1. デコーダーが整数の用語 ID 値( 6.5.3.4 URL デコーダーの作成のステップ 3)用に作成された場合、関連付けられた term 文字列を返します。
  2. それ以外の場合、適切なプレフィックス固有のサブデコーダーの decode メソッドを呼び出し、結果の文字列を返します。
6.5.3.6 HTTP URL コーデック

HTTP URL コーデックは、プレフィックスが http:// または https:// である値を処理します。エンコードされた HTTP URL は、 2 要素の CBOR 配列 [prefixId, remainder] として表現されます。ここで prefixIdURL プレフィックステーブルの整数であり、remainder は URL からプレフィックスを取り除いた部分をテキスト文字列として表したものです。

6.5.3.6.1 HTTP URL エンコーダーの作成

このアルゴリズムは文字列 value を受け取り、 エンコーダーオブジェクトまたは undefined を返します。

  1. value"https://" で始まる場合、 prefix"https://" に設定します。
  2. それ以外で、value"http://" で始まる場合、 prefix"http://" に設定します。
  3. それ以外の場合、undefined を返します。
  4. value および prefix を含むエンコーダーオブジェクトを返します。
6.5.3.6.2 HTTP URL のエンコード

このアルゴリズムは、 6.5.3.6.1 HTTP URL エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。

  1. URL プレフィックステーブル内の encoderData.prefix の値を prefixId に設定します。
  2. encoderData.prefix の後から始まる encoderData.value の部分文字列を rest に設定します。
  3. 2 要素の配列 [prefixId, rest] を CBOR エンコードしたものを返します。これは、 メジャータイプ 0(符号なし整数)項目の後にメジャータイプ 3 (テキスト文字列)項目を含むメジャータイプ 4(配列)です。
6.5.3.6.3 HTTP URL デコーダーの作成

このアルゴリズムは CBOR 配列 valueToDecode を受け取り、 デコーダーオブジェクトまたは undefined を返します。

  1. valueToDecode がちょうど 2 要素を持ち、2 番目の 要素がテキスト文字列の場合:
    1. URL プレフィックス 逆引きテーブル内の valueToDecode[0] の値を prefix に設定します。
    2. prefix を含むデコーダーオブジェクトを返します。
  2. それ以外の場合、undefined を返します。
6.5.3.6.4 HTTP URL のデコード

このアルゴリズムは、 6.5.3.6.3 HTTP URL デコーダーの作成からのデコーダーオブジェクトおよび CBOR 配列 valueToDecode を受け取り、文字列を返します。

  1. decoderData.prefixvalueToDecode[1] を連結したものを返します。
6.5.3.7 UUID URN コーデック

UUID URN コーデックは、プレフィックスが urn:uuid: である値を処理します。エンコードされた UUID URN は 2 要素の CBOR 配列 [3, uuidValue] であり、uuidValue は、 UUID をバイナリ形式で表現する 16 バイトのメジャータイプ 2(バイト文字列) (UUID 文字列がすべて小文字の場合)、または UUID 値をそのまま含む メジャータイプ 3(テキスト文字列)(大文字と小文字の区別をバイナリ形式を介して ラウンドトリップできない場合)のいずれかです。

6.5.3.7.1 UUID URN エンコーダーの作成

このアルゴリズムは文字列 value を受け取り、エンコーダー オブジェクトまたは undefined を返します。

  1. value"urn:uuid:" で始まらない場合、 undefined を返します。
  2. value を含むエンコーダーオブジェクトを返します。
6.5.3.7.2 UUID URN のエンコード

このアルゴリズムはエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。

  1. prefixId3URL プレフィックステーブル内の "urn:uuid:" のエントリ)に設定します。
  2. "urn:uuid:" の後から始まる encoderData.value の部分文字列を rest に設定します。
  3. rest に大文字が含まれない場合(すなわち、小文字化した形式と 等しい場合):
    1. [RFC4122] に従って rest を解析して得られる UUID の 16 バイトのバイナリ表現を uuidBytes に設定します。 rest を有効な UUID として解析できない場合、 エラーがスローされ、エンコードは失敗します。
    2. 2 要素の配列 [3, uuidBytes] を CBOR エンコードしたものを返します。これは、 メジャータイプ 0(符号なし整数)項目の後に長さ 16 のメジャータイプ 2 (バイト文字列)項目を含むメジャータイプ 4(配列)です。
  4. それ以外の場合、2 要素の配列 [3, rest] を CBOR エンコードしたものを返します。これは、 メジャータイプ 0(符号なし整数)項目の後にメジャータイプ 3 (テキスト文字列)項目を含むメジャータイプ 4(配列)です。
6.5.3.7.3 UUID URN デコーダーの作成

このアルゴリズムは CBOR 配列 valueToDecode を受け取り、 デコーダーオブジェクトまたは undefined を返します。

  1. valueToDecode がちょうど 2 要素を持ち、2 番目の 要素がバイト文字列またはテキスト文字列のいずれかである場合、デコーダーオブジェクトを返します。
  2. それ以外の場合、undefined を返します。
6.5.3.7.4 UUID URN のデコード

このアルゴリズムはデコーダーオブジェクトおよび CBOR 配列 valueToDecode を受け取り、文字列を返します。

  1. valueToDecode[1] がテキスト文字列の場合、uuidvalueToDecode[1] に設定します。
  2. それ以外の場合、[RFC4122] に従った 16 バイトのバイナリ値 valueToDecode[1] の UUID 文字列表現 (小文字でハイフン区切りの形式)を uuid に設定します。
  3. "urn:uuid:"uuid を連結したものを返します。
6.5.3.8 Data URL コーデック

Data URL コーデックは、プレフィックスが data: である値([RFC2397] で定義されている data URL)を処理します。 Base64 エンコードされた data URL (data:<mediatype>;base64,<data> に一致するもの)は、 3 要素の CBOR 配列 [4, mediatype, dataBytes] としてエンコードされます。Base64 でない data URL は、 2 要素の CBOR 配列 [4, rest] としてエンコードされます。ここで rest"data:" の後に続く URL の部分です。

6.5.3.8.1 Data URL エンコーダーの作成

このアルゴリズムは文字列 value を受け取り、エンコーダー オブジェクトまたは undefined を返します。

  1. value"data:" で始まらない場合、 undefined を返します。
  2. value を正規表現 ^data:(?<mediatype>.*);base64,(?<data>.*)$ に一致させようとします。ここで各 .* は貪欲です(すなわち、文字列 ";base64," が複数回出現する場合、 mediatype グループは最後の出現箇所まで拡張されます)。
  3. 一致した場合:
    1. datadata キャプチャ グループの値に設定します。
    2. ラウンドトリップの整合性を検証します。data を Base64 からデコードし、 Base64 に再エンコードします。結果が data と等しい場合、 value を持ち、base64true に設定されたエンコーダーオブジェクトを返します。
  4. value を持ち、base64false に設定されたエンコーダーオブジェクトを返します。
6.5.3.8.2 Data URL のエンコード

このアルゴリズムは、 6.5.3.8.1 Data URL エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。

  1. prefixId4URL プレフィックステーブル内の "data:" のエントリ)に設定します。
  2. encoderData.base64true の場合:
    1. encoderData.value を解析して、mediatype"data:"";base64," の間の部分文字列) および dataBytes(Base64 データ部分をバイナリデコードしたもの)を 抽出します。
    2. 3 要素の配列 [prefixId, mediatype, dataBytes] を CBOR エンコードしたものを返します。これは、 メジャータイプ 0 の整数、メジャータイプ 3 のテキスト文字列、および メジャータイプ 2 のバイト文字列を含むメジャータイプ 4(配列)です。
  3. それ以外の場合:
    1. "data:" の後から始まる encoderData.value の部分文字列を rest に設定します。
    2. 2 要素の配列 [prefixId, rest] を CBOR エンコードしたものを返します。これは、 メジャータイプ 0 の整数とメジャータイプ 3 のテキスト文字列を含む メジャータイプ 4(配列)です。
6.5.3.8.3 Data URL デコーダーの作成

このアルゴリズムは CBOR 配列 valueToDecode を受け取り、 デコーダーオブジェクトまたは undefined を返します。

  1. valueToDecode がちょうど 3 要素を持ち、2 番目の 要素がテキスト文字列で、3 番目の要素がバイト文字列の場合、 デコーダーオブジェクト(Base64 モード)を返します。
  2. それ以外で、valueToDecode がちょうど 2 要素を持ち、 2 番目の要素がテキスト文字列の場合、デコーダーオブジェクト (非 Base64 モード)を返します。
  3. それ以外の場合、undefined を返します。
6.5.3.8.4 Data URL のデコード

このアルゴリズムはデコーダーオブジェクトおよび CBOR 配列 valueToDecode を受け取り、文字列を返します。

  1. valueToDecode が 3 要素を持つ場合(Base64 モード):
    1. mediatypevalueToDecode[1] に設定します。
    2. バイト文字列 valueToDecode[2] を Base64 エンコードしたものを encodedData に設定します。
    3. "data:"mediatype";base64,"、および encodedData を連結したものを返します。
  2. それ以外の場合(非 Base64 モード)、"data:"valueToDecode[1] を連結したものを返します。
6.5.3.9 Base58 DID URL コーデック

Base58 DID URL コーデックは、プレフィックスが did:v1:nym: または did:key: であり、 オーソリティ(および任意のフラグメント)コンポーネントが通常 multibase base58btc エンコードされた文字列(文字 'z' で始まるもの)である DID URL を処理します。圧縮された DID URL は、2 要素または 3 要素の CBOR 配列 [prefixId, authority] または [prefixId, authority, fragment] としてエンコードされます。コンポーネントが 'z' で始まり、有効な base58btc である場合、生のバイト 文字列として格納されます。それ以外の場合はテキスト文字列として格納されます。

注記
6.5.3.9.1 Base58 DID URL エンコーダーの作成

このアルゴリズムは文字列 value を受け取り、 エンコーダーオブジェクトまたは undefined を返します。

  1. プレフィックスが "did:" で始まるURL プレフィックステーブル内の 各 [prefix, prefixId] ペアについて:
    1. valueprefix で始まる場合、 valueprefix、および prefixId を含むエンコーダーオブジェクトを返します。
  2. undefined を返します。
6.5.3.9.2 Base58 DID URL のエンコード

このアルゴリズムは、 6.5.3.9.1 Base58 DID URL エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリ データを返します。

  1. encoderData.prefix の後から始まる encoderData.value の部分文字列を suffix に設定します。
  2. suffix'#' の最初の出現箇所で分割して authority と、存在する場合は fragment を生成します。
  3. authorityMultibase Base58 から CBOR トークンへ アルゴリズムを適用した結果を authorityEncoded に設定します。
  4. entries[encoderData.prefixId, authorityEncoded] に初期化します。
  5. fragment が定義されている場合:
    1. fragmentMultibase Base58 から CBOR トークンへアルゴリズムを適用した結果を fragmentEncoded に設定します。
    2. fragmentEncodedentries に追加します。
  6. entries をメジャータイプ 4 (配列)として CBOR エンコードしたものを返します。
6.5.3.9.3 Multibase Base58 から CBOR トークンへ

Multibase Base58 から CBOR トークンへアルゴリズムは文字列 str を受け取り、メジャータイプ 2(バイト文字列)の CBOR トークン(値が base58btc multibase 文字列の場合)またはメジャータイプ 3 (テキスト文字列)の CBOR トークンのいずれかを返します。

  1. str'z' で始まる場合:
    1. str の base58btc 内容 (すなわち str[1:])をデコードした結果を decoded に設定します。
    2. デコードに成功した場合、decoded の メジャータイプ 2(バイト文字列)の CBOR トークンを返します。
  2. str のメジャータイプ 3(テキスト文字列)の CBOR トークンを返します。
6.5.3.9.4 Base58 DID URL デコーダーの作成

このアルゴリズムは CBOR 配列 valueToDecode を受け取り、 デコーダーオブジェクトまたは undefined を返します。

  1. valueToDecode がちょうど 2 または 3 要素を持つ場合:
    1. URL プレフィックス 逆引きテーブル内の valueToDecode[0] の値を prefix に設定します。
    2. prefix を含むデコーダーオブジェクトを返します。
  2. それ以外の場合、undefined を返します。
6.5.3.9.5 Base58 DID URL のデコード

このアルゴリズムは、 6.5.3.9.4 Base58 DID URL デコーダーの作成からのデコーダーオブジェクトおよび CBOR 配列 valueToDecode を受け取り、文字列を返します。

  1. urldecoderData.prefix に設定します。
  2. valueToDecode[1] がバイト文字列の場合、 'z' に続けて valueToDecode[1] を base58btc エンコードしたものを url に追加します。
  3. それ以外の場合、valueToDecode[1]url に追加します。
  4. valueToDecode が 2 要素より多く持つ場合:
    1. valueToDecode[2] がバイト文字列の場合、 "#z" に続けて valueToDecode[2] を base58btc エンコードしたものを url に追加します。
    2. それ以外の場合、"#" に続けて valueToDecode[2]url に追加します。
  5. url を返します。

6.5.4 XSD Date コーデック

XSD Date コーデックは、型が http://www.w3.org/2001/XMLSchema#date である値を圧縮します。日付値は、 Unix エポック (1970-01-01T00:00:00Z)からの秒数を表す整数として表現され、非負の値には CBOR メジャータイプ 0(符号なし 整数)として、エポックより前の日付にはメジャータイプ 1(負の整数)として エンコードされます。このコーデックは、この表現を介して正確にラウンドトリップできる日付文字列のみを 圧縮します。それ以外の場合、元の 文字列がそのまま保持されます。

注記
6.5.4.1 XSD Date エンコーダーの作成

このアルゴリズムは文字列 value を受け取り、エンコーダー オブジェクトまたは undefined を返します。

  1. value に文字 'T'(時刻要素を示す)が含まれる場合、 undefined を返します(この値は代わりに XSD DateTime コーデックによって圧縮されます)。
  2. value を ISO 8601 日付文字列として解析し、 Unix エポックからのミリ秒数として表した結果を parsed に設定します。
  3. parsed が有効な数値でない場合、 undefined を返します。
  4. value および parsed を含むエンコーダーオブジェクトを返します。
6.5.4.2 XSD Date のエンコード

このアルゴリズムは、 6.5.4.1 XSD Date エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。

  1. secondsSinceEpochfloor(encoderData.parsed / 1000) に設定します。
  2. reconstituted を、Unix エポックから secondsSinceEpoch × 1000 ミリ秒後の時点を表す ISO 8601 文字列に設定します。
  3. expectedDatereconstituted 内で最初に出現する 'T' より前の部分文字列に設定します。
  4. encoderData.valueexpectedDate と等しくない場合、圧縮は非可逆になります。encoderData.value を メジャータイプ 3(テキスト 文字列)オブジェクトとして CBOR エンコードしたものを返します。
  5. secondsSinceEpoch0 以上の場合、 secondsSinceEpoch をメジャータイプ 0(符号なし整数) オブジェクトとして CBOR エンコードしたものを返します。
  6. それ以外の場合、secondsSinceEpoch を メジャータイプ 1(負の整数)オブジェクトとして CBOR エンコードしたものを返します。
6.5.4.3 XSD Date デコーダーの作成

このアルゴリズムは値 valueToDecode を受け取り、 デコーダーオブジェクトまたは undefined を返します。

  1. valueToDecode が整数(正、負、または 0)の場合、デコーダーオブジェクトを返します。
  2. それ以外の場合、undefined を返します。
6.5.4.4 XSD Date のデコード

このアルゴリズムはデコーダーオブジェクトおよび整数値 value を受け取り、文字列を返します。

  1. dateString を、Unix エポックから value * 1000 ミリ秒後の時点を表す ISO 8601 文字列に設定します。
  2. dateString 内で最初に 出現する 'T' より前の部分文字列を返します。

6.5.5 XSD DateTime コーデック

XSD DateTime コーデックは、型が http://www.w3.org/2001/XMLSchema#dateTime である値を圧縮します。秒精度の 日時値は、Unix エポックからの秒数を表す単一の整数 (メジャータイプ 0 または 1)としてエンコードされます。秒未満の精度を持つ日時値は、 2 要素の CBOR 配列 [seconds, milliseconds] としてエンコードされ、いずれもメジャータイプ 0 の整数となります。XSD Date コーデックと同様に、圧縮が可逆である場合にのみ値が圧縮されます (元の文字列がエンコーディングを介して正確にラウンドトリップする場合)。

6.5.5.1 XSD DateTime エンコーダーの作成

このアルゴリズムは文字列 value を受け取り、エンコーダー オブジェクトまたは undefined を返します。

  1. value に文字 'T' が含まれない場合、 undefined を返します(この値は代わりに XSD Date コーデックによって圧縮されます)。
  2. value を ISO 8601 日時文字列として解析し、Unix エポックからのミリ秒数として表した結果を parsed に設定します。
  3. parsed が有効な数値でない場合、 undefined を返します。
  4. value および parsed を含むエンコーダーオブジェクトを返します。
6.5.5.2 XSD DateTime のエンコード

このアルゴリズムは、 6.5.5.1 XSD DateTime エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリ データを返します。

  1. secondsSinceEpochfloor(encoderData.parsed / 1000) に設定します。
  2. encoderData.value に文字 '.' が含まれない場合(ミリ秒要素なし):
    1. expectedDate を、Unix エポックから secondsSinceEpoch * 1000 ミリ秒後の時点を表す ISO 8601 文字列で、 部分文字列 ".000Z""Z" に置換したものに設定します。
    2. encoderData.valueexpectedDate と等しくない場合、圧縮は非可逆になります。 encoderData.value をメジャータイプ 3 (テキスト文字列)オブジェクトとして CBOR エンコードしたものを返します。
    3. secondsSinceEpoch0 以上の場合、 secondsSinceEpoch をメジャータイプ 0(符号なし整数) オブジェクトとして CBOR エンコードしたものを返します。
    4. それ以外の場合、secondsSinceEpoch を メジャータイプ 1(負の整数)オブジェクトとして CBOR エンコードしたものを返します。
  3. それ以外の場合(ミリ秒要素が存在する場合):
    1. millisecondIndexencoderData.value 内で最初に出現する '.' のインデックスに設定します。
    2. milliseconds を、 encoderData.valuemillisecondIndex + 1 の位置から始まる数字の整数値に設定します。
    3. expectedDate を、Unix エポックから secondsSinceEpoch * 1000 + milliseconds ミリ秒後の時点を表す ISO 8601 文字列に設定します。
    4. encoderData.valueexpectedDate と等しくない場合、圧縮は非可逆になります。 encoderData.value をメジャータイプ 3 (テキスト文字列)オブジェクトとして CBOR エンコードしたものを返します。
    5. 2 要素の配列 [secondsSinceEpoch, milliseconds] を CBOR エンコードしたものを返します。これは、 2 つのメジャータイプ 0(符号なし整数)項目を含むメジャータイプ 4(配列)です。
6.5.5.3 XSD DateTime デコーダーの作成

このアルゴリズムは値 valueToDecode を受け取り、 デコーダーオブジェクトまたは undefined を返します。

  1. valueToDecode が整数の場合、デコーダーオブジェクトを返します。
  2. valueToDecode がちょうど 2 要素からなる配列で、 両方の要素が数値の場合、デコーダーオブジェクトを返します。
  3. それ以外の場合、undefined を返します。
6.5.5.4 XSD DateTime のデコード

このアルゴリズムはデコーダーオブジェクトおよび値 value (整数または整数からなる 2 要素の配列のいずれか)を受け取り、 文字列を返します。

  1. value が整数の場合:
    1. instantMsvalue * 1000 に設定します。
    2. dateString を、Unix エポックから instantMs ミリ秒後の時点を表す ISO 8601 文字列に設定します。
    3. dateString の部分文字列 ".000Z""Z" に置換したものを返します。
  2. それ以外の場合(value が 2 要素の配列の場合):
    1. instantMsvalue[0] * 1000 + value[1] に設定します。
    2. instantMs を返します。

6.5.6 Multibase コーデック

Multibase コーデックは、型が https://w3id.org/security#multibase である値を圧縮します。multibase エンコードされた 文字列は、最初のバイトが Multibase プレフィックスバイトであり、残りのバイトが デコードされた バイナリペイロードである、生のバイト文字列に変換されます。これにより、 Base エンコード文字のオーバーヘッドなしでバイナリペイロードをコンパクトに格納できます。

次の multibase エンコーディングがサポートされています:

Multibase プレフィックス文字 Multibase プレフィックスバイト エンコーディング
z 0x7a Base58btc
u 0x75 Base64url(パディングなし)
M 0x4d Base64pad
6.5.6.1 Multibase エンコーダーの作成

このアルゴリズムは値 value を受け取り、エンコーダー オブジェクトまたは undefined を返します。

  1. value が文字列でない場合、undefined を返します。
  2. value の最初の文字が 'z''u'、または 'M' の場合、 value を含むエンコーダーオブジェクトを返します。
  3. それ以外の場合、undefined を返します(サポートされていない multibase エンコーディング)。
6.5.6.2 Multibase のエンコード

このアルゴリズムは、 6.5.6.1 Multibase エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。

  1. prefixCharencoderData.value の最初の文字に設定します。
  2. prefixByte を、prefixChar に対応するMultibase プレフィックスバイト に設定します。
  3. content を、 encoderData.value の最初の文字の後から始まる部分文字列に設定します。
  4. prefixChar'z' の場合、 content を base58btc デコードしたものを suffixBytes に設定します。
  5. それ以外で、prefixChar'u' の場合、 content を base64url デコードしたものを suffixBytes に設定します。
  6. それ以外の場合(prefixChar'M' の場合)、 content を base64pad デコードしたものを suffixBytes に設定します。
  7. bytes を長さ 1 + length(suffixBytes) のバイト配列に設定し、最初のバイトを prefixByte に、残りのバイトを suffixBytes に設定します。
  8. bytes をメジャータイプ 2(バイト 文字列)オブジェクトとして CBOR エンコードしたものを返します。
6.5.6.3 Multibase デコーダーの作成

このアルゴリズムは値 valueToDecode を受け取り、 デコーダーオブジェクトまたは undefined を返します。

  1. valueToDecode がバイト文字列でない場合、 undefined を返します。
  2. valueToDecode の最初のバイトが 0x7a0x75、または 0x4d の場合、デコーダーオブジェクトを返します。
  3. それ以外の場合、undefined を返します(サポートされていない multibase プレフィックスバイト)。
6.5.6.4 Multibase のデコード

このアルゴリズムはデコーダーオブジェクトおよびバイト文字列 value を受け取り、文字列を返します。

  1. prefixBytevalue の最初のバイトに設定します。
  2. suffixvalue の残りのバイト (すなわち、最初のバイト以降のすべてのバイト)に設定します。
  3. prefixByte0x7a'z')の場合:
    1. "z"suffix の base58btc エンコーディングを 連結したものを返します。
  4. prefixByte0x75'u')の場合:
    1. "u"suffix の base64url エンコーディング (パディングなし)を連結したものを返します。
  5. prefixByte0x4d'M')の場合:
    1. "M"suffix の base64pad エンコーディングを 連結したものを返します。
  6. それ以外の場合、value を返します。

6.6 CBOR タグ処理

6.6.1 CBOR タグ 構造取得アルゴリズム

このアルゴリズムは整数 registryEntryId を入力として受け取り、バイト文字列 prefix を返します。
  1. registryEntryBytesregistryEntryID の CBOR エンコーディングに設定します。
  2. prefix を、バイト文字列 0xD9CB1D82 の末尾に registryEntryBytes を追加した結果に設定します。
  3. prefix を返します。

6.6.2 レジストリエントリ ID 取得アルゴリズム

このアルゴリズムは、エンコードされた CBOR-LD ペイロード cborldBytes を入力として受け取り、 デコード対象となる主要データ suffix と、suffix の展開に使用 すべき registryEntryId の値を返します。

  1. cborldbytes の CBOR タグが 0xCB1D(タグ値 51997)でない場合、 ERR_NON_CBOR_LD_TAG エラーをスローします。
  2. タグ付き項目が、最初の要素が CBOR 整数である 2 要素の配列でない場合、 ERR_INVALID_PAYLOAD_STRUCTURE エラーをスローします。
  3. registryEntryId の値を、タグ付き 配列のインデックス 0 にある整数の値に設定します。
  4. suffix の値を配列の 2 番目の要素の値に設定します。
  5. result を空のマップに設定します。
  6. result.suffixsuffix の値に設定し、 result.registryEntryIdregistryEntryId の値に設定します。
  7. result を返します。

7. セキュリティに関する考慮事項

このセクションは非規範的です。

8. プライバシーに関する考慮事項

このセクションは非規範的です。

9. IANA に関する考慮事項

このセクションは非規範的です。

9.1 CBOR タグ

この仕様では、利用者が CBOR-LD ペイロードを識別できるようにするため、CBOR タグを登録します。 以下は暫定的なものであり、まだ IANA によって承認されていません。

タグ: 51997

レジストリ: https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml

データ項目: 配列

セマンティクス: タグ値 51997 は、ペイロードが CBOR-LD であることを示します。

セマンティクスの説明: https://w3c.github.io/cbor-ld/#cbor-tags-for-cbor-ld

連絡先: Wesley Smith (wsmith@digitalbazaar.com)

A. 参考文献

A.1 規範的参考文献

[RFC2119]
RFC において要求レベルを示すために使用する キーワード. S. Bradner. IETF. 1997年3月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC2397]
「data」URL スキーム. L. Masinter. IETF. 1998年8月. 標準化への提案. URL: https://www.rfc-editor.org/info/rfc2397/
[RFC4122]
汎用一意識別子 (UUID) URN 名前空間. P. Leach; M. Mealling; R. Salz. IETF. 2005年7月. 標準化への提案. URL: https://www.rfc-editor.org/info/rfc4122/
[RFC8174]
RFC 2119 のキーワードにおける大文字と小文字の曖昧性. B. Leiba. IETF. 2017年5月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc8174/