CBOR-LD 1.0

연결 데이터를 위한 CBOR 기반 직렬화

W3C 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-cbor-ld-10-20260928/
최신 공개 버전:
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는 간결한 이진 데이터 직렬화 및 메시징 형식이다. 이 명세는 연결 데이터를 직렬화하기 위한 CBOR 기반 형식인 CBOR-LD 1.0을 정의한다. 이 인코딩은 현재 수억 개의 시스템에 배포되어 있는 기존 JSON-LD 생태계를 활용하여, 연결 데이터를 위한 효율적인 인코딩 방식을 원하는 경우에 간결한 직렬화 형식을 제공하도록 설계되었다. 의미론적 압축 방식을 활용하면 일반적인 압축 방식보다 60% 이상 향상된 압축률을 달성할 수 있다. 이 형식은 주로 저장 공간과 대역폭이 제한된 프로그래밍 환경에서 연결 데이터를 사용하고, 상호 운용 가능한 의미론적 와이어 수준 프로토콜을 구축하며, CBOR 기반 스토리지 엔진에 연결 데이터를 효율적으로 저장하기 위한 방법으로 사용하도록 의도되었다.

이 문서의 상태

이 절에서는 발행 당시 이 문서의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있다.

이 문서는 실험적이다.

이 문서에 설명된 기능을 시연할 수 있는 참조 구현이 있다.

이 문서는 JSON-LD 작업 그룹이 권고 트랙을 사용하여 작업 초안으로 발행했다.

작업 초안으로 발행되었다고 해서 W3C와 그 회원이 이를 승인했다는 의미는 아니다.

이 문서는 초안이며 언제든지 다른 문서에 의해 업데이트, 대체되거나 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 작성했다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허를 공개하기 위한 지침도 포함되어 있다. 자신이 알고 있는 특허에 필수 청구항이 포함되어 있다고 믿는 사람은 W3C 특허 정책 제6절에 따라 해당 정보를 공개해야 한다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받는다.

1. 소개

이 절은 비규범적이다.

CBOR는 간결한 이진 데이터 직렬화 및 메시징 형식이다. 이 명세는 연결 데이터를 직렬화하기 위한 CBOR 기반 형식인 CBOR-LD 1.0을 정의한다. 이 인코딩은 현재 수억 개의 시스템에 배포되어 있는 기존 JSON-LD 생태계를 활용하여, 연결 데이터를 위한 효율적인 인코딩 방식을 원하는 경우에 간결한 직렬화 형식을 제공하도록 설계되었다. 의미론적 압축 방식을 활용하면 일반적인 압축 방식보다 60% 이상 향상된 압축률을 달성할 수 있다. 이 형식은 주로 저장 공간과 대역폭이 제한된 프로그래밍 환경에서 연결 데이터를 사용하고, 상호 운용 가능한 의미론적 와이어 수준 프로토콜을 구축하며, CBOR 기반 스토리지 엔진에 연결 데이터를 효율적으로 저장하기 위한 방법으로 사용하도록 의도되었다.

1.1 이 문서를 읽는 방법

이 절은 비규범적이다.

이 문서는 CBOR에서 연결 데이터를 직렬화하기 위한 상세 명세이다. 이 문서는 주로 다음 독자를 대상으로 한다:

1.1.1 적합성

비규범적으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고 사항은 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.

이 문서에서 핵심 단어 할 수 있다(MAY), 해야 한다(MUST), 그리고 선택 사항(OPTIONAL)은 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 BCP 14 [RFC2119] [RFC8174] 에 설명된 대로 해석해야 한다.

1.2 기여하기

이 절은 비규범적이다.

이 명세의 개발에 참여할 수 있는 방법은 여러 가지가 있다:

1.3 설계 목표와 근거

이 절은 비규범적이다.

CBOR-LD는 다음 설계 목표를 충족한다:

단순성
기존 JSON-LD 구현이 있는 경우 구현을 간단하게 할 수 있어야 한다.
효율적인 저장
인코딩 프로세스는 매우 간결한 연결 데이터 이진 형식을 생성해야 한다.
일반화된 알고리즘
인코딩 알고리즘은 일반화되어야 한다.
의미론적 압축
인코딩 형식은 연결 데이터 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를 압축할 수 있는지 확인한다(JSON-LD 문서에서 URI를 통해 컨텍스트를 참조하는 @context 값을 찾는다. 내장 컨텍스트 값은 압축할 수 없다).
  2. JSON-LD 컨텍스트를 처리하여 CBOR-LD 용어-코덱 맵, 즉 압축할 수 있는 모든 용어의 목록을 작성한다. 목록을 정렬한다(유니코드 코드 포인트 순서로). 0부터 시작하여 증가시키면서 각 용어에 바이트 값을 연결한다.
  3. JSON-LD 문서를 CBOR-LD로 인코딩한다. 이는 모든 키를 용어-코덱 맵의 용어에 연결된 바이트 값으로 대체하는 것으로 구성된다.
  4. 원래 JSON-LD가 필요한 경우, CBOR-LD에서 JSON-LD로의 디코딩은 모든 CBOR 바이트 값을 용어-코덱 맵의 연결된 키로 대체하는 것으로 구성된다.

4. 처리 모델

이 절은 비규범적이다.

2. 기본 개념에서 설명한 것처럼, 주어진 사용 사례에 사용되는 특정 압축 및 변환 전략 집합을 처리 모델이라고 한다. 모든 CBOR-LD 페이로드는 정확히 하나의 처리 모델과 연결되며, 이 처리 모델은 페이로드의 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
선택 사항(OPTIONAL). JSON-LD 용어에 의미론적 압축을 적용할지 나타내는 불리언이다. 이 값이 없으면 값은 true이다. true이면 용어 식별자는 3. 의미론적 압축에 설명된 대로 자동 생성된다.
codecs
선택 사항(OPTIONAL). 유형에서 코덱 식별자로의 맵이다. 여기서 유형은 IRI로 표현된 JSON-LD 유형이거나 예약된 값 url이며, 이는 노드 참조 및 용어가 @id의 @type으로 정의된 값과 일치한다. 변환 중에는 값의 유형에 바인딩된 코덱이 있는 경우 해당 코덱을 사용하여 그 값을 압축하고 압축 해제한다. codecs가 없고 기본 처리 모델을 사용하지 않는 경우 일반적인 유형화된 값 코덱은 적용되지 않는다.

4.2.1 코덱 식별자

이 명세는 아래 표의 코덱 식별자를 정의한다. 다른 명세에서 정의한 처리 모델은 해당 명세가 대응하는 코덱을 정의한다는 조건으로 추가 코덱 식별자를 사용할 수 있다(MAY).

코덱 식별자 코덱 기본 처리 모델에서 바인딩되는 유형
url URL 코덱 url
xsd-date XSD 날짜 코덱 http://www.w3.org/2001/XMLSchema#date
xsd-date-time XSD 날짜/시간 코덱 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 멤버를 완전히 생략하고도 동일한 동작을 얻을 수 있다(MAY).

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 코덱은 확장 지점으로도 의도되었다. 처리 모델은 여기에 지정되지 않았지만 대신 해당 처리 모델을 정의하는 명세 또는 다른 문서에서 정의된 코덱을 사용할 수 있다(MAY).

이 명세는 사용자 지정 코덱의 동작 방식이나 지정 방식을 제한하지 않는다. 그러한 코덱을 사용하는 처리 모델을 정의하는 문서는 상호 운용 가능한 구현에 충분할 정도로 각 코덱을 정확하게 지정할 책임이 있으며, 테스트와 정확성에 대한 책임도 진다. 이 명세에서 정의된 코덱은 IRI로 식별되어야 한다(MUST).

다음 예는 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-LD임을 식별할 수 있어야 한다. CBOR는 기본적으로 "태그" 기능을 통해 이를 지원한다 — 전역 레지스트리를 통해 나머지 페이로드를 설명하는 이진 데이터의 헤더 값이다.

CBOR 태그 0xCB1D(태그 값 51997)는 CBOR-LD에 사용하기 위해 IANA CBOR 태그 레지스트리에 등록되어 있다. 이 태그 값 바로 뒤에 오는 데이터는 압축된 페이로드를 생성하는 데 사용된 레지스트리 엔트리를 식별한다.

CBOR-LD 페이로드는 태그 0xCB1D가 지정된 항목이 2개 요소로 이루어진 배열이 되도록 구성되어야 하며(MUST), 첫 번째 요소는 주 유형 0 정수여야 한다(MUST). 이 정수는 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)의 성숙한 명세 또는 표준 문서를 요청과 함께 제공해야 한다. 명세 또는 기타 문서가 허용 가능한지를 판단할 때는 W3C가 W3C 표준에서 규범 참조를 허용하거나 금지하기 위해 조직과 문서를 평가하는 방식과 유사한 기준을 사용한다. 이러한 요청은 할당 전에 전문가 검토를 거친다. 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. registryEntryId를 6.6.1 CBOR 태그 구조 가져오기 알고리즘에 전달한 결과로 prefix를 설정한다.
  2. state를 빈 맵으로 설정한다.
  3. registryEntryId와 연결된 레지스트리 엔트리가 의미론적 압축을 요구하는 경우:
    1. state.strategy를 "compression"으로 설정한다.
    2. state.typeTable을 typeTable로 설정한다.
    3. state.registryEntryId를 registryEntryId로 설정한다.
    4. state를 6.2.1 변환 초기화 알고리즘에 state를 전달한 결과로 설정한다.
    5. state와 jsonldDocument를 inputDocuments로 6.2.2 문서 변환 알고리즘에 전달한 결과로 output을 설정한다.
    6. suffix를 output의 CBOR 인코딩으로 설정한다.
  4. 그렇지 않으면 suffix를 jsonldDocument의 CBOR 인코딩으로 설정한다.
  5. cborldBytes를 suffix 앞에 추가한 prefix의 16진수 인코딩으로 설정한다.
  6. cborldBytes를 반환한다.

6.1.2 CBOR-LD에서 JSON-LD로의 디코딩 알고리즘

이 알고리즘은 CBOR-LD 페이로드 cborldBytes를 입력으로 받아 JSON-LD 문서 jsonldDocument를 반환한다.

  1. state를 빈 맵으로 설정합니다.
  2. cborldBytes를 6.6.2 레지스트리 항목 ID 가져오기 알고리즘에 전달한 결과로 result를 설정합니다.
  3. state.registryEntryId를 result.registryEntryId로 설정하고 suffix를 result.suffix로 설정합니다.
  4. state.registryEntryId와 연결된 레지스트리 항목이 의미론적 압축을 사용하는 경우:
    1. state.strategy를 "decompression"으로 설정합니다.
    2. registryEntryId와 연결된 CBOR-LD 레지스트리 항목의 typeTables 배열에 있는 각 항목 type: map에 대해 해당 항목을 state.typeTable에 추가하고 type의 값을 state.reverseTypeTable에서 inverseMap으로 설정합니다. 여기서 inverseMap은 매핑이 반전된 map입니다.
    3. state를 6.2.1 변환 초기화 알고리즘에 전달한 결과로 state를 설정합니다.
    4. input을 suffix를 디코딩한 결과로 설정합니다. 결과가 맵 또는 배열이 아니면 오류를 발생시킵니다. ERR_INVALID_PAYLOAD_STRUCTURE`.
    5. state와 input을 inputDocuments로 6.2.2 문서 변환 알고리즘에 전달한 결과로 jsonldDocument를 설정합니다.
  5. 그렇지 않으면 suffix를 바이트에서 맵으로 디코딩한 결과로 jsonldDocument를 설정합니다.
  6. jsonldDocument를 반환합니다.

6.2 변환 알고리즘

이 절의 알고리즘은 데이터 형식 간에 입력을 추상적으로 변환하기 위한 "변환기"의 동작을 설명한다. 이 절의 뒷부분에서 정의되는 "compression" 및 "decompression" 전략과 같은 "전략"과 함께 사용하면, 이러한 알고리즘을 구체적인 데이터 형식 간 변환에 적용할 수 있다. "compression" 전략은 JSON-LD에서 CBOR-LD로 변환하고, "decompression" 전략은 CBOR-LD에서 JSON-LD로 변환한다.

6.2.1 변환 초기화 알고리즘

이 알고리즘은 맵 state를 입력으로 받아 반환한다.

  1. state를 6.4.1 컨텍스트 로더 초기화 알고리즘에 state를 전달한 결과로 설정한다.
  2. state.initialActiveContext를 빈 맵 termMap과 previousActiveContext를 6.3.1 활성 컨텍스트 초기화 알고리즘에 전달한 결과로 설정한다.
  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가 배열이면 inputs를 inputDocuments로 설정한다. 그렇지 않으면 inputs를 [inputDocuments]로 설정한다.
  2. outputMaps를 빈 배열로 설정한다.
  3. inputs의 각 input에 대해:
    1. output을 빈 맵으로 설정한다.
    2. result를 state, input, output, 그리고 state.initialActiveContext를 activeContext로 6.2.3 일반 변환 알고리즘에 전달한 결과로 설정한다.
    3. result.output을 outputMaps에 추가한다.
    4. state를 result.state로 설정한다.
  4. inputDocuments가 배열이면 outputMaps를 반환한다. 그렇지 않으면 outputMaps의 첫 번째 요소를 반환한다.

6.2.3 일반 변환 알고리즘

이 알고리즘은 맵 input, output, state, 그리고 activeContext를 입력으로 받고, 맵 state와 output을 포함하는 맵을 반환한다.

  1. state.strategy가 "compression"으로 설정되어 있는 경우:
    1. contextConversionResult를 6.2.5.1 압축을 위한 컨텍스트 변환 알고리즘에 state, activeContext, input, 그리고 output을 전달한 결과로 설정한다.
    2. activeContext를 contextConversionResult.activeContext로, output을 contextConversionResult.output으로, 그리고 state를 contextConversionResult.state로 설정한다.
  2. 그렇지 않으면 6.2.6.1 압축 해제를 위한 컨텍스트 변환 알고리즘에 state, activeContext, input, 그리고 output을 전달하여 얻은 result의 result.activeContext로 activeContext를, result.output으로 output을, 그리고 result.state로 state를 설정한다.
  3. state.strategy가 "compression"으로 설정되어 있으면 objectTypes를 6.2.5.4 압축을 위한 객체 유형 가져오기 알고리즘에 activeContext와 input을 전달한 결과로 설정한다.
  4. 그렇지 않으면 objectTypes를 6.2.6.4 압축 해제를 위한 객체 유형 가져오기 알고리즘에 state, activeContext, 그리고 input을 전달한 결과로 설정한다.
  5. activeContext를 activeContext와 objectTypes를 6.3.4 유형 범위 컨텍스트 적용 알고리즘에 전달한 결과로 설정한다.
  6. state.strategy가 "compression"으로 설정되어 있으면 termEntries를 6.2.5.3 압축을 위한 입력 엔트리 가져오기 알고리즘에 state, input, 그리고 activeContext를 전달한 결과로 설정한다.
  7. 그렇지 않으면 termEntries를 6.2.6.3 압축 해제를 위한 입력 엔트리 가져오기 알고리즘에 state, input, output, 그리고 activeContext를 전달한 결과로 설정한다.
  8. termEntries의 각 [termInfo, value]에 대해:
    1. term을 termInfo.term으로 설정한다.
    2. valueActiveContext를 activeContext와 term을 6.3.3 속성 범위 컨텍스트 적용 알고리즘에 전달한 결과로 설정한다.
    3. plural을 termInfo.plural의 값으로 설정하고 termType을 termInfo.def에 있는 @type의 값으로 설정한다.
    4. plural이 true로 설정되어 있으면 values를 value의 값으로 설정한다. 그렇지 않으면 values를 value의 값을 단일 요소로 포함하는 배열로 설정한다.
    5. outputs를 빈 배열로 설정한다.
    6. values의 각 unconvertedValue에 대해:
      1. result를 6.2.4 값 변환 알고리즘에 state, termType, unconvertedValue를 value로, 그리고 valueActiveContext를 activeContext로 전달한 결과로 설정한다.
      2. state를 result.state로 설정하고 result.output을 outputs에 추가한다.
    7. plural이 true로 설정되어 있으면 outputValues를 outputs로 설정한다. 그렇지 않으면 outputValues를 outputs의 첫 번째 요소로 설정한다.
    8. state.strategy가 "compression"으로 설정되어 있으면 output에서 termInfo.termId의 값이 outputValues에 매핑되도록 설정한다. 그렇지 않으면 output에서 termInfo.term의 값이 outputValues에 매핑되도록 설정한다.
  9. result를 빈 맵으로 설정한다.
  10. result.state를 state로 설정하고 result.output을 output으로 설정한다.
  11. result를 반환한다.

6.2.4 값 변환 알고리즘

이 알고리즘은 맵 state, activeContext, termInfo, 그리고 값 value와 termType을 입력으로 받는다. 맵 state와 output을 포함하는 result 객체를 반환한다.

  1. value가 null이면 null을 반환한다.
  2. state.strategy가 "compression"으로 설정되어 있으면 output을 state, termType, termInfo, 그리고 value를 6.2.5.2 압축을 위한 값 변환 알고리즘에 전달한 결과로 설정한다.
  3. 그렇지 않으면 output을 state, termType, termInfo, 그리고 value를 6.2.6.2 압축 해제를 위한 값 변환 알고리즘에 전달한 결과로 설정한다.
  4. output이 정의되어 있으면 state와 output을 포함하는 맵인 result를 반환한다.
  5. value가 배열인 경우:
    1. outputs를 빈 배열로 설정한다.
    2. value의 각 element에 대해:
      1. result를 6.2.4 값 변환 알고리즘에 activeContext, state, termInfo, termType, 그리고 element를 value로 전달한 결과로 설정한다. state를 result.state로 설정하고 result.output을 outputs에 추가한다.
    3. result를 빈 맵으로 설정한다. result.state를 state로 설정하고 result.output을 outputs로 설정한다.
    4. result를 반환한다.
  6. output을 빈 맵으로 설정한다.
  7. result를 6.2.3 일반 변환 알고리즘에 state, activeContext, value를 input으로, 그리고 output을 전달한 결과로 설정한다.
  8. result를 반환한다.

6.2.5 압축 전략 알고리즘

이 절의 알고리즘은 JSON-LD를 CBOR-LD로 변환하기 위해 앞에서 정의한 "conversion" 알고리즘과 함께 사용할 "compression" 전략을 정의한다.

6.2.5.1 압축을 위한 컨텍스트 변환 알고리즘

이 알고리즘은 맵 state, activeContext, input, 그리고 output을 입력으로 받고, 맵 output, state, 그리고 activeContext를 포함하는 맵 result를 반환한다.

  1. applyEmbeddedResult를 6.3.2 내장 컨텍스트 적용 알고리즘에 state, activeContext, 그리고 input을 전달한 결과로 설정한다.
  2. activeContext를 applyEmbeddedResult.activeContext로 설정하고 state를 applyEmbeddedResult.state로 설정한다.
  3. input에 "@context" 엔트리가 없는 경우:
    1. result를 빈 맵으로 설정한다.
    2. result.state를 state로 설정하고 result.activeContext를 activeContext로 설정한다.
    3. result를 반환한다.
  4. context를 input의 "@context" 값으로 설정한다.
  5. encodedContexts를 빈 배열로 설정한다.
  6. context가 배열이면 isArray를 true로 설정하고 contexts를 context로 설정한다. 그렇지 않으면 isArray를 false로 설정하고 contexts를 [context]로 설정한다.
  7. contexts의 각 contextValue에 대해:
    1. encoderData를 6.5.1.1 컨텍스트 인코더 생성에 state.typeTable과 contextValue를 전달한 결과로 설정한다.
    2. encoderData가 빈 맵이면 contextValue를 encodedContexts에 추가한다.
    3. 그렇지 않으면 encoderData의 값을 encodedContexts에 추가한다.
  8. isArray가 true이면 id를 state.keywordsMap의 "@context" 값에 1을 더한 값으로 설정하고 output에서 id의 값을 encodedContexts로 설정한다.
  9. 그렇지 않으면 id를 state.keywordsMap의 "@context" 값으로 설정하고 output에서 id의 값을 encodedContexts의 첫 번째 요소로 설정한다.
  10. result.output을 output으로, result.state를 state로, 그리고 result.activeContext를 activeContext로 설정한다.
  11. result를 반환한다.
6.2.5.2 압축을 위한 값 변환 알고리즘

이 알고리즘은 맵 state와 termInfo, 그리고 값 valueToEncode와 termType을 입력으로 받고, 맵 encoderData를 반환한다.

  1. valueToEncode가 객체이면 반환한다.
  2. 그렇지 않으면 result를 6.5.2.1 값 인코더 생성에 state, termInfo, valueToToEncode, 그리고 termType을 전달한 결과로 설정한다.
  3. result를 반환한다.
6.2.5.3 압축을 위한 입력 엔트리 가져오기 알고리즘

이 알고리즘은 맵 state, activeContext, 그리고 input을 입력으로 받고 배열 entries를 반환한다.

  1. entries를 빈 배열로 초기화한다.
  2. 배열 keys를 input의 키를 사전식으로 정렬한 것으로 설정한다.
  3. keys의 각 key에 대해:
    1. key가 "@context"이면 계속한다.
    2. value를 input에서 key의 값으로 설정한다.
    3. value가 배열이면 plural을 true로 설정한다. 그렇지 않으면 plural을 false로 설정한다.
    4. key에 state.termToId의 엔트리가 없으면 termId를 key로 설정한다.
    5. 그렇지 않고 plural이 true이면 termId를 state.termToId에서 key의 값에 1을 더한 값으로 설정한다.
    6. 그렇지 않으면 termId를 state.termToId에서 key의 값으로 설정한다.
    7. activeContext.termMap에 key의 엔트리가 있으면 definition을 activeContext.termMap에서 key의 값으로 설정한다. 그렇지 않으면 definition을 빈 맵으로 설정한다.
    8. entryTerm을 새 맵으로 설정한다.
    9. entryTerm에서 "term"의 값을 key의 값으로 설정한다. entryTerm에서 "def"의 값을 definition의 값으로 설정한다. termId와 plural을 entryTerm에 추가한다.
    10. entryTerm과 value라는 두 요소를 갖는 배열 entry를 생성한다.
    11. entry를 entries에 추가한다.
  4. entries를 반환한다.
6.2.5.4 압축을 위한 객체 유형 가져오기 알고리즘

이 알고리즘은 맵 activeContext와 input을 입력으로 받고 집합 objectTypes를 반환한다.

  1. objectTypes를 빈 집합으로 설정한다.
  2. activeContext.typeTerms의 각 term에 대해:
    1. input에 term의 엔트리가 있는 경우:
      1. types를 input에서 term의 값으로 설정한다.
      2. types의 각 값을 objectTypes에 추가한다.
  3. objectTypes를 반환한다.

6.2.6 압축 해제 전략 알고리즘

이 절의 알고리즘은 CBOR-LD를 JSON-LD로 변환하기 위해 앞에서 정의한 "conversion" 알고리즘과 함께 사용할 "decompression" 전략을 정의한다.

6.2.6.1 압축 해제를 위한 컨텍스트 변환 알고리즘

이 알고리즘은 맵 state, activeContext, input, 그리고 output을 입력으로 받고, 맵 output, state, 그리고 activeContext를 포함하는 맵 result를 반환한다.

  1. decoderData를 6.5.1.3 컨텍스트 디코더 생성에 state.reverseTypeTable을 전달한 결과로 설정한다.
  2. contextTermId를 state.keywordsMap에서 "@context"의 값으로 설정한다.
  3. input에 contextTermId의 엔트리가 있으면 output에서 "@context"의 값을 6.5.1.4 컨텍스트 디코딩에 decoderData와 input에서 contextTermId의 값을 value로 전달한 결과로 설정한다.
  4. contextTermIdPlural을 contextTermId의 값에 1을 더한 값으로 설정한다.
  5. input에 contextTermIdPlural의 엔트리가 있는 경우:
    1. 이전 검사에서 input에 contextTermId의 엔트리도 있었다면 ERR_INVALID_ENCODED_CONTEXT 오류를 발생시킨다.
    2. encodedContexts를 input에서 contextTermIdPlural의 값으로 설정한다. encodedContexts가 배열이 아니면 ERR_INVALID_ENCODED_CONTEXT 오류를 발생시킨다.
    3. contexts를 빈 배열로 설정한다.
    4. encodedContexts의 각 valueToDecode에 대해, decoderData와 valueToDecode를 value로 6.5.1.4 컨텍스트 디코딩에 전달한 결과를 contexts에 추가한다.
    5. output에서 "@context"의 값을 contexts로 설정한다.
  6. embeddedContextResult를 6.3.2 내장 컨텍스트 적용 알고리즘에 activeContext, output을 input으로, 그리고 state를 전달한 결과로 설정한다.
  7. result를 embeddedContextResult로 설정하고 result.output을 output으로 설정한다. result를 반환한다.
6.2.6.2 압축 해제를 위한 값 변환 알고리즘

이 알고리즘은 맵 state와 termInfo, 그리고 값 termType과 valueToDecode를 입력으로 받고, 값 decodedValue를 반환한다.

  1. value가 맵이면 반환한다.
  2. decoderData를 6.5.2.3 값 디코더 생성에 valueToDecode, state, termInfo, 그리고 termType을 전달한 결과로 설정한다.
  3. decodedValue를 6.5.2.4 값 디코딩에 decoderData를 전달한 결과로 설정한다.
  4. decodedValue를 반환한다.
6.2.6.3 압축 해제를 위한 입력 엔트리 가져오기 알고리즘

이 알고리즘은 맵 state, activeContext, 그리고 input을 입력으로 받고 배열 entries를 반환한다.

  1. entries를 빈 배열로 초기화한다.
  2. input의 각 키-값 쌍 key와 value에 대해:
    1. key가 state.keywordsMap에서 "@context"의 값이거나 그 값에 1을 더한 값이면 계속한다.
    2. 그렇지 않고 key가 문자열이면 plural을 false로 설정하고 term을 key로 설정한다.
    3. 그렇지 않으면:
      1. key가 홀수이면 plural을 true로 설정한다. 그렇지 않으면 plural을 false로 설정한다.
      2. plural이 true이면 term을 state.idToTerm에서 key에서 1을 뺀 값에 해당하는 값으로 설정한다. 해당 값에 엔트리가 없으면 ERR_UNKNOWN_CBORLD_TERM_ID 오류를 발생시킨다.
      3. 그렇지 않으면 term을 state.idToTerm에서 key의 값으로 설정한다. 해당 값에 엔트리가 없으면 ERR_UNKNOWN_CBORLD_TERM_ID 오류를 발생시킨다.
    4. definition을 activeContext.termMap에서 term의 값으로 설정한다.
    5. entryTerm을 새 맵으로 설정한다.
    6. entryTerm에서 "termId"의 값을 key의 값으로 설정한다. entryTerm에서 "def"의 값을 definition의 값으로 설정한다. term과 plural을 entryTerm에 추가한다.
    7. entryTerm과 value라는 두 요소를 갖는 배열 entry를 생성한다.
    8. entry를 entries에 추가한다.
  3. entries의 각 요소에서 term의 값을 기준으로 entries를 정렬한다.
  4. entries를 반환한다.
6.2.6.4 압축 해제를 위한 객체 유형 가져오기 알고리즘

이 알고리즘은 맵 state, activeContext, input을 입력으로 받고 집합 objectTypes를 반환한다.

  1. objectTypes를 빈 집합으로 설정한다.
  2. activeContext.typeTerms의 각 term에 대해:
    1. term에 state.termToId의 엔트리가 없으면 termId를 term으로 설정한다.
    2. 그렇지 않으면 termId를 state.termToId에서 term의 값으로 설정한다.
    3. termId와 termId에 1을 더한 값 모두 input에 없으면 계속한다.
    4. 그렇지 않고 termId가 input에 있으면 value를 input에서 termId의 값으로 설정한다.
    5. 그렇지 않으면 value를 input에서 termId에 1을 더한 값에 해당하는 값으로 설정한다.
    6. key가 문자열이면 plural을 false로 설정하고 term을 key로 설정한다.
    7. 그렇지 않으면:
      1. key가 홀수이면 plural을 true로 설정한다. 그렇지 않으면 plural을 false로 설정한다.
      2. plural이 true이면 term을 state.idToTerm에서 id에서 1을 뺀 값에 해당하는 값으로 설정한다. 해당 값에 엔트리가 없으면 ERR_UNKNOWN_CBORLD_TERM_ID 오류를 발생시킨다.
      3. 그렇지 않으면 term을 state.idToTerm에서 id의 값으로 설정한다. 해당 값에 엔트리가 없으면 ERR_UNKNOWN_CBORLD_TERM_ID 오류를 발생시킨다.
    8. definition을 activeContext.termMap에서 term의 값으로 설정한다.
    9. termInfo를 새 맵으로 설정한다.
    10. entryTerm에서 "def"의 값을 definition의 값으로 설정한다. term, termId, 그리고 plural을 termInfo에 추가한다.
    11. value가 배열이 아니면 values를 value를 단일 요소로 포함하는 배열로 설정한다. 그렇지 않으면 values를 value의 값으로 설정한다.
    12. values의 각 value에 대해:
      1. decoderData를 6.5.2.3 값 디코더 생성에 value, termInfo, state, 그리고 "@vocab"을 termType으로 전달한 결과로 설정한다.
      2. decoderData가 존재하면 6.5.2.4 값 디코딩에 decoderData를 전달한 결과를 `objectTypes에 추가한다.
      3. 그렇지 않으면 value를 objectTypes에 추가한다.
  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.previousActiveContext를 previousActiveContext로 설정한다.
  3. activeContext.termMap을 termMap으로 설정한다.
  4. activeContext.typeTerms를 배열 ['@type']로 설정한다.
  5. termMap의 각 [term, def]에 대해:
    1. def에서 "@id"의 값이 "@type"이면 term을 activeContext.typeTerms에 추가한다.
  6. activeContext를 반환한다.

6.3.2 내장 컨텍스트 적용 알고리즘

이 알고리즘은 맵 state, activeContext, 그리고 input을 입력으로 받고, 맵 state와 activeContext를 포함하는 맵 result를 반환한다.

  1. termMapUpdateResult를 state, activeContext.termMap을 activeTermMap으로, 그리고 input에서 '@context'의 값을 contexts로 6.3.5 용어 맵 업데이트 알고리즘에 전달한 결과로 설정한다.
  2. state를 termMapUpdateResult.state로 설정한다.
  3. termMap을 termMapUpdateResult.activeTermMap으로 설정한다.
  4. newActiveContext를 6.3.1 활성 컨텍스트 초기화 알고리즘에 termMap과 activeContext를 previousActiveContext로 전달한 결과로 설정한다.
  5. result를 새 맵으로 설정하고 result.activeContext를 newActiveContext로, 그리고 result.state를 state로 설정한다.
  6. result를 반환한다.

6.3.3 속성 범위 컨텍스트 적용 알고리즘

이 알고리즘은 맵 state, activeContext, 그리고 문자열 term을 입력으로 받고 맵 state와 activeContext를 포함하는 맵 result를 반환한다.

  1. revertedTermMap을 6.3.6 용어 맵 되돌리기 알고리즘에 activeContext를 전달한 결과로 설정한다.
  2. termDef를 activeContext.termMap에서 term의 값으로 설정한다. contexts를 termDef에서 "@context"의 값으로 설정한다.
  3. termMapUpdateResult를 state, revertedTermMap을 activeTermMap으로, true를 propertyScope로, 그리고 contexts를 6.3.5 용어 맵 업데이트 알고리즘에 전달한 결과로 설정한다.
  4. state를 termMapUpdateResult.state로 설정한다.
  5. termMap을 termMapUpdateResult.activeTermMap으로 설정한다.
  6. newActiveContext를 6.3.1 활성 컨텍스트 초기화 알고리즘에 termMap과 activeContext를 previousActiveContext로 전달한 결과로 설정한다.
  7. result를 새 맵으로 설정하고 result.activeContext를 newActiveContext로, 그리고 result.state를 state로 설정한다.
  8. result를 반환한다.

6.3.4 유형 범위 컨텍스트 적용 알고리즘

이 알고리즘은 맵 state, activeContext ,그리고 집합 objectTypes를 입력으로 받고, 맵 state와 activeContext를 포함하는 맵 result를 반환한다.

  1. objectTypesSorted를 빈 배열로 설정한다.
  2. objectTypes의 요소를 사전식으로 정렬하고 순서대로 objectTypesSorted에 추가한다.
  3. newTermMap을 activeContext.termMap으로 설정한다.
  4. objectTypesSorted의 각 type에 대해:
    1. typeDef를 newTermMap에서 type의 값으로 설정한다. contexts를 typeDef에서 "@context"의 값으로 설정한다.
    2. termMapUpdateResult를 state, newTermMap을 activeTermMap으로, contexts를, 그리고 true를 typeScope로 6.3.5 용어 맵 업데이트 알고리즘에 전달한 결과로 설정한다.
    3. state를 termMapUpdateResult.state로, 그리고 newTermMap을 termMapUpdateResult.activeTermMap으로 설정한다.
  5. newActiveContext를 6.3.1 활성 컨텍스트 초기화 알고리즘에 newTermMap을 termMap으로, 그리고 activeContext를 previousActiveContext로 전달한 결과로 설정한다.
  6. result를 새 맵으로 설정하고 result.activeContext를 newActiveContext로, 그리고 result.state를 state로 설정한다.
  7. result를 반환한다.

6.3.5 용어 맵 업데이트 알고리즘

이 알고리즘은 맵 state, activeTermMap, 그리고 값 contexts와 불리언 typeScope 및 propertyScope를 입력으로 받으며, 후자의 두 값은 제공되지 않으면 모두 false가 기본값이다. 맵 state와 activeTermMap을 반환한다.

  1. contexts가 배열이 아니면, 이전 contexts 값을 유일한 요소로 갖는 배열로 contexts를 설정한다.
  2. allowProtectedOverride를 propertyScope의 값으로 설정한다.
  3. propagateDefault를 typeScope 값의 부정으로 설정한다.
  4. contexts의 각 contextIdentifier에 대해:
    1. loadResult를 6.4.2 컨텍스트 로드 알고리즘에 state와 contextIdentifier를 전달한 결과로 설정한다.
    2. entry를 loadResult.entry로, context를 entry.context로, 그리고 state를 loadResult.state로 설정한다.
    3. context에 @propagate가 있으면 propagate를 context에서 @propagate의 값으로 설정한다. 그렇지 않으면 propagate를 propagateDefault의 값으로 설정한다.
    4. newTermMap을 빈 맵으로 설정한다. entry.termMap의 각 [key, value]에 대해:
      1. value의 내용을 새 맵 newValue에 얕게 복사하고 propagate를 newValue에 추가한다.
      2. newTermMap에서 key의 값을 newValue로 설정한다.
    5. activeTermMap의 각 [term, activeDef]에 대해:
      1. def를 newTermMap에서 term의 값으로 설정한다.
      2. def가 정의되어 있는 경우:
        1. activeDef에서 protected의 값이 true인 경우:
          1. allowProtectedOverride가 false로 설정되어 있고 def가 activeDef와 동일하지 않으면 ERR_PROTECTED_TERM_REDEFINITION 오류를 발생시킨다.
          2. 그렇지 않으면 newTermMap에서 term의 값을 activeDef의 값들과 def.propagate의 값으로 설정된 propagate를 포함하는 맵으로 설정한다.
      3. 그렇지 않고 context에 term이 있으면, newTermMap에서 term의 값을 activeDef의 모든 값을 포함하는 맵으로 설정한다.
    6. activeTermMap의 값을 newTermMap의 값으로 설정한다.
  5. result를 빈 맵으로 설정한다.
  6. result.state를 state로, 그리고 result.activeTermMap을 activeTermMap으로 설정한다.
  7. result를 반환한다.

6.3.6 용어 맵 되돌리기 알고리즘

이 알고리즘은 맵 activeContext를 입력으로 받고 맵 newTermMap을 반환한다.

  1. newTermMap을 빈 맵으로 설정한다.
  2. nonPropagatingTerms를 빈 배열로 설정한다.
  3. activeContext의 각 [term, def]에 대해:
    1. def.propagate가 false로 설정되어 있으면 term을 nonPropagatingTerms에 추가하고 이 루프의 다음 반복으로 진행한다.
    2. 그렇지 않으면 newTermMap에서 term의 값을 def로 설정한다.
  4. nonPropagatingTerms의 각 term에 대해:
    1. currentContext를 activeContext.previousActiveContext로 설정한다.
    2. def를 currentContext.termMap에서 term의 값으로 설정한다.
    3. def가 정의되지 않은 상태가 아니고 def.propagate가 false로 설정되어 있는 동안:
      1. currentContext를 activeContext.previousActiveContext로 설정한다.
      2. def를 currentContext.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.idToTerm을 state.termToId의 역방향 맵(즉, 정수에서 JSON-LD 키워드로의 맵)으로 설정한다.
  6. state를 반환한다.

6.4.2 컨텍스트 로드 알고리즘

이 알고리즘은 맵 state와 컨텍스트 맵 또는 URL contextIdentifier를 입력으로 받고, 맵 state와 entry를 포함하는 맵 result를 반환한다.

  1. state.contextMap에 contextIdentifier의 엔트리가 있는 경우:
    1. result를 빈 맵으로 초기화한다.
    2. result.state를 state로 설정한다.
    3. result.entry를 state.contextMap에서 contextIdentifier의 값으로 설정한다.
    4. result를 반환한다.
  2. context가 문자열인 경우:
    1. 연결된 컨텍스트 객체를 가져오고 context를 해당 객체의 "@context" 값으로 설정한다.
    2. contextUrl을 contextIdentifier의 값으로 설정한다.
  3. 그렇지 않으면 context를 contextIdentifier로 설정한다.
  4. result를 6.4.3 컨텍스트 추가 알고리즘에 state, context, 그리고 설정된 경우 contextUrl을 전달한 결과로 설정한다.
  5. result를 반환한다.

6.4.3 컨텍스트 추가 알고리즘

이 알고리즘은 맵 state, 컨텍스트 객체 context, 그리고 컨텍스트 URL contextUrl을 입력으로 받고, 맵 state와 entry를 포함하는 맵 result를 반환한다.

  1. context에 "@import" 엔트리가 있는 경우:
    1. importUrl을 `context에서 "@import"의 값으로 설정한다.
    2. state.contextMap에 importUrl의 엔트리가 없는 경우:
      1. importUrl과 연결된 컨텍스트 객체를 가져오고 importContext를 해당 객체의 "@context" 값으로 설정한다.
      2. importedContextAdditionResult를 6.4.3 컨텍스트 추가 알고리즘에 state, importContext를 context로, 그리고 importUrl을 contextUrl로 전달한 결과로 설정한다.
      3. state를 importedContextAdditionResult.state로, 그리고 importEntry를 importedContextAdditionResult.entry로 설정한다.
    3. 그렇지 않으면 importEntry를 state.contextMap에서 importUrl의 값으로 설정한다.
    4. context를 context의 모든 엔트리와 importEntry.context를 포함하는 맵으로 설정한다.
  2. termMap을 빈 맵으로 설정한다.
  3. entry를 context와 termMap을 포함하는 객체로 설정한다.
  4. sortedTerms를 context의 키를 사전식 순서로 정렬한 결과로 설정한다.
  5. context에 "@protected" 엔트리가 있으면 isProtected를 true로 설정하고, 그렇지 않으면 false로 설정한다.
  6. sortedTerms의 각 term에 대해:
    1. term에 state.keywordsMap의 엔트리가 있으면 이 루프의 다음 반복으로 진행한다.
    2. definition을 context에서 term의 값으로 설정한다.
    3. definition이 null이면 이 루프의 다음 반복으로 진행한다.
    4. definition이 문자열인 경우:
      1. newDefinition을 빈 맵으로 설정한다.
      2. newDefinition에서 "@id"의 값을 definition으로 설정한다.
      3. definition의 값을 newDefinition으로 설정한다.
    5. definition에서 protected의 값을 isProtected로 설정한다.
    6. termMap에서 term의 값을 definition으로 설정한다.
    7. term에 state.termToId의 엔트리가 없는 경우:
      1. termId를 state.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.state를 state로, 그리고 result.entry를 entry로 설정한다.
  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. 그렇지 않으면 contextTable을 typeTable에서 "context"의 값으로 설정한다.
  4. encoderData.context를 contextValue로 설정하고 encoderData.contextTable을 contextTable로 설정한다.
  5. encoderData를 반환한다.
6.5.1.2 컨텍스트 인코딩

이 알고리즘은 맵 encoderData를 입력으로 받고 CBOR 이진 데이터를 반환한다.

  1. encoderData.context에 encoderData.contextTable의 엔트리가 있으면, encoderData에서 encoderData.context의 값을 주 유형 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환한다.
  2. 그렇지 않으면 encoderData.context의 값을 주 유형 3 (텍스트 문자열) 객체로 CBOR 인코딩하여 반환한다.
6.5.1.3 컨텍스트 디코더 생성

이 알고리즘은 맵 reverseTypeTable을 입력으로 받고 맵 encoderData를 반환한다.

  1. reverseContextTable을 reverseTypeTable에서 "context"의 값으로 설정한다.
  2. decoderData를 빈 맵으로 초기화한다.
  3. decoderData.reverseContextTable을 reverseContextTable의 값으로 설정하고 decoderData를 반환한다.
6.5.1.4 컨텍스트 디코딩

이 알고리즘은 맵 decoderData와 값 value를 입력으로 받고 값을 반환한다.

  1. value가 숫자가 아니면 value를 반환한다.
  2. 그렇지 않고 decoderData.reverseContextTable에 value의 엔트리가 있으면 해당 엔트리의 값을 반환한다.
  3. 그렇지 않으면 ERR_UNDEFINED_COMPRESSED_CONTEXT 오류를 발생시킨다.

6.5.2 값 코덱

6.5.2.1 값 인코더 생성

이 알고리즘은 맵 state와 termInfo, 그리고 값 termType과 valueToEncode를 입력으로 받고 맵 encoderData 또는 valueToEncode를 반환한다.

  1. isUrl을 false로 설정한다.
  2. termInfo.term이 "@id" 또는 "@type"이면 isUrl을 true로 설정한다.
  3. termInfo.def에서 "@id"의 값이 "@id" 또는 "@type"이면 isUrl을 true로 설정한다.
  4. termType이 "@id" 또는 "@vocab"이면 isUrl을 true로 설정한다.
  5. isUrl이 true이면 tableType을 "url"로 설정한다.
  6. 그렇지 않고 termType이 정의되어 있으면 tableType을 termType으로 설정한다.
  7. 그렇지 않으면 tableType을 "none"으로 설정한다.
  8. state.typeTable에 tableType의 엔트리가 있는 경우:
    1. subTable을 state.typeTable에서 tableType의 값으로 설정한다.
    2. subTable에 valueToEncode의 엔트리가 있는 경우:
      1. intValue를 subTable에서 valueToEncode의 값으로 설정한다. includeSign을 false로 설정한다.
      2. state.typesEncodedAsBytes에 tableType의 엔트리가 있으면 convertToBytes를 true로 설정한다. 그렇지 않으면 convertToBytes를 false로 설정한다.
    3. 그렇지 않고 tableType이 "none"이 아니며 valueToEncode가 정수인 경우:
      1. intValue를 valueToEncode의 값으로 설정한다.
      2. convertToBytes와 includeSign을 true로 설정한다.
    4. intValue가 정의되어 있는 경우:
      1. encoderData를 빈 맵으로 초기화한다.
      2. encoderData.intValue를 intValue의 값으로, encoderData.convertToBytes를 convertToBytes의 값으로, 그리고 encoderData.includeSign을 includeSign의 값으로 설정한다.
      3. encoderData를 반환한다.
  9. tableType에 state.processingModeTypeEncoders의 엔트리가 있으면 encoderData를 해당 엔트리의 코덱과 연결된 Create Encoder 알고리즘을 호출한 결과로 설정한다.
  10. encoderData가 정의되어 있으면 encoderData를 반환한다.
  11. valueToEncode를 반환한다.
6.5.2.2 값 인코딩

이 알고리즘은 맵 encoderData를 입력으로 받고 CBOR 이진 데이터를 반환한다.

  1. encoderData.convertToBytes가 true인 경우:
    1. bytes를 intValue를 바이트로 변환한 결과로 설정하고, includeSign의 값을 사용하여 정수의 이진 표현에 부호를 포함할지 여부를 결정한다.
    2. bytes를 주 유형 2(바이트 문자열) 객체로 CBOR 인코딩하여 반환한다.
  2. 그렇지 않으면 intValue를 주 유형 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환한다.
6.5.2.3 값 디코더 생성

이 알고리즘은 맵 state와 termInfo, 그리고 값 termType과 valueToDecode를 입력으로 받고 맵 decoderData를 반환한다.

  1. isUrl을 false로 설정한다.
  2. termInfo.term이 "@id" 또는 "@type"이면 isUrl을 true로 설정한다.
  3. termInfo.def에서 "@id"의 값이 "@id" 또는 "@type"이면 isUrl을 true로 설정한다.
  4. termType이 "@id" 또는 "@vocab"이면 isUrl을 true로 설정한다.
  5. isUrl이 true이면 tableType을 "url"로 설정한다.
  6. 그렇지 않고 termType이 정의되어 있으면 tableType을 termType으로 설정한다.
  7. 그렇지 않으면 tableType을 "none"으로 설정한다.
  8. state.reverseTypeTable에 tableType의 엔트리가 있는 경우:
    1. subTable을 state.reverseTypeTable에서 tableType의 값으로 설정한다.
    2. useTable을 false로 설정한다.
    3. valueToDecode가 바이트 배열이고 state.typesEncodedAsBytes에 tableType의 엔트리가 있는 경우:
      1. useTable을 true로 설정한다.
      2. intValue를 valueToDecode 바이트를 부호 없는 정수로 변환한 값으로 설정한다.
    4. 그렇지 않고 valueToDecode가 정수이며 state.typesEncodedAsBytes에 tableType의 엔트리가 없는 경우:
      1. useTable을 true로 설정한다.
      2. intValue를 valueToDecode로 설정한다.
    5. useTable이 true인 경우:
      1. intValue가 subTable에 없으면 ERR_UNKNOWN_COMPRESSED_VALUE 오류를 발생시킨다.
      2. 그렇지 않으면 decoded를 subTable에서 intValue의 값으로 설정한다.
    6. 그렇지 않고 valueToDecode가 바이트 배열이며 tableType이 "none"이 아니면 decoded를 valueToDecode를 정수로 변환한 값으로 설정한다.
    7. decoded가 정의되어 있으면 decoderData를 빈 맵으로 초기화하고, decoderData.decoded를 decoded의 값으로 설정한 다음 decoderData를 반환한다.
  9. tableType에 state.processingModeTypeDecoders의 엔트리가 있으면 DecoderData를 해당 엔트리의 코덱과 연결된 Create Decoder 알고리즘을 호출한 결과로 설정한다.
  10. decoderData가 정의되어 있으면 decoderData를 반환한다.
  11. 그렇지 않고 valueToDecode가 배열이 아니면 decoderData를 빈 맵으로 초기화하고, decoderData.decoded를 valueToDecode로 설정한 다음 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 코덱을 사용하는 구현은 아래 테이블을 사용해야 한다(MUST). 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. termId를 state.termToId에서 valueToEncode를 조회한 결과로 설정한다.
  3. termId가 정수이면, 6.5.3.3 URL 인코딩을 통해 호출될 때 termId를 주 유형 0(부호 없는 정수) CBOR 항목으로 인코딩하는 인코더를 반환한다.
  4. valueToEncode를 URL로 파싱하려고 시도한다. 파싱에 실패하면(즉, 값이 유효한 URL이 아니면) undefined를 반환한다.
  5. prefix를 URL 접두사 테이블의 엔트리 중 valueToEncode가 prefix로 시작하고 prefix 뒤에 오는 valueToEncode의 나머지 부분에 ":"(U+003A COLON) 문자가 포함되지 않는 엔트리로 설정한다. 그러한 엔트리가 없으면 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. prefixId를 valueToDecode의 첫 번째 요소로 설정한다.
    2. prefix를 URL 접두사 역방향 테이블에서 prefixId에 해당하는 값으로 설정한다.
    3. prefix가 "http://" 또는 "https://"이면, decoder를 valueToDecode를 6.5.3.6.3 HTTP URL 디코더 생성에 전달한 결과로 설정한다.
    4. 그렇지 않고 prefix가 "urn:uuid:"이면, decoder를 valueToDecode를 6.5.3.7.3 UUID URN 디코더 생성에 전달한 결과로 설정한다.
    5. 그렇지 않고 prefix가 "data:"이면, decoder를 valueToDecode를 6.5.3.8.3 Data URL 디코더 생성에 전달한 결과로 설정한다.
    6. 그렇지 않고 prefix가 "did:v1:nym:" 또는 "did:key:"이면, decoder를 valueToDecode를 6.5.3.9.4 Base58 DID URL 디코더 생성에 전달한 결과로 설정한다.
    7. prefix가 위 항목 중 어느 것과도 일치하지 않거나( prefixId가 URL 접두사 역방향 테이블에 엔트리가 없는 경우 포함), 또는 decoder가 undefined이면(즉, 하위 디코더가 valueToDecode의 형식을 거부한 경우), ERR_UNKNOWN_COMPRESSED_VALUE 오류를 발생시킨다.
    8. decoder를 반환한다.
  3. valueToDecode가 정수이면 term을 state.idToTerm에서 valueToDecode를 조회한 결과로 설정하고, 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]로 표현되며, 여기서 prefixId는 URL 접두사 테이블의 정수이고 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. prefixId를 URL 접두사 테이블에서 encoderData.prefix의 값으로 설정한다.
  2. rest를 encoderData.value에서 encoderData.prefix 뒤부터 시작하는 부분 문자열로 설정한다.
  3. 2개 요소 배열 [prefixId, rest]를 CBOR 인코딩하여 반환한다. 주 유형 4(배열)에 주 유형 0(부호 없는 정수) 항목과 이어서 주 유형 3 (텍스트 문자열) 항목이 포함된다.
6.5.3.6.3 HTTP URL 디코더 생성

이 알고리즘은 CBOR 배열 valueToDecode를 입력으로 받고 디코더 객체 또는 undefined를 반환한다.

  1. valueToDecode가 정확히 2개의 요소를 가지며 두 번째 요소가 텍스트 문자열인 경우:
    1. prefix를 URL 접두사 역방향 테이블에서 valueToDecode[0]의 값으로 설정한다.
    2. prefix를 포함하는 디코더 객체를 반환한다.
  2. 그렇지 않으면 undefined를 반환한다.
6.5.3.6.4 HTTP URL 디코딩

이 알고리즘은 6.5.3.6.3 HTTP URL 디코더 생성의 디코더 객체와 CBOR 배열 valueToDecode를 입력으로 받고 문자열을 반환한다.

  1. decoderData.prefix와 valueToDecode[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. prefixId를 3으로 설정한다( URL 접두사 테이블에서 "urn:uuid:"의 엔트리).
  2. rest를 encoderData.value에서 "urn:uuid:" 뒤부터 시작하는 부분 문자열로 설정한다.
  3. rest에 대문자가 포함되지 않은 경우(즉, 소문자 형식과 동일한 경우):
    1. uuidBytes를 [RFC4122]에 따라 rest를 파싱하여 얻은 UUID의 16바이트 이진 표현으로 설정한다. rest를 유효한 UUID로 파싱할 수 없으면 오류가 발생하고 인코딩이 실패한다.
    2. 2개 요소 배열 [3, uuidBytes]를 CBOR 인코딩하여 반환한다. 주 유형 4(배열)에 주 유형 0(부호 없는 정수) 항목과 이어서 길이가 16인 주 유형 2 (바이트 문자열) 항목이 포함된다.
  4. 그렇지 않으면 2개 요소 배열 [3, rest]를 CBOR 인코딩하여 반환한다. 주 유형 4(배열)에 주 유형 0(부호 없는 정수) 항목과 이어서 주 유형 3 (텍스트 문자열) 항목이 포함된다.
6.5.3.7.3 UUID URN 디코더 생성

이 알고리즘은 CBOR 배열 valueToDecode를 입력으로 받고 디코더 객체 또는 undefined를 반환한다.

  1. valueToDecode가 정확히 2개의 요소를 가지며 두 번째 요소가 바이트 문자열 또는 텍스트 문자열이면 디코더 객체를 반환한다.
  2. 그렇지 않으면 undefined를 반환한다.
6.5.3.7.4 UUID URN 디코딩

이 알고리즘은 디코더 객체와 CBOR 배열 valueToDecode를 입력으로 받고 문자열을 반환한다.

  1. valueToDecode[1]이 텍스트 문자열이면 uuid를 valueToDecode[1]로 설정한다.
  2. 그렇지 않으면 uuid를 [RFC4122]에 따른 16바이트 이진 값 valueToDecode[1]의 UUID 문자열 표현 (소문자, 하이픈 구분 형식)으로 설정한다.
  3. "urn:uuid:"와 uuid를 연결한 값을 반환한다.
6.5.3.8 데이터 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. data를 data 캡처 그룹의 값으로 설정한다.
    2. 왕복 무결성을 확인한다. data를 base64에서 디코딩한 다음 base64로 다시 인코딩한다. 결과가 data와 같으면 value와 base64가 true로 설정된 인코더 객체를 반환한다.
  4. value와 base64가 false로 설정된 인코더 객체를 반환한다.
6.5.3.8.2 Data URL 인코딩

이 알고리즘은 6.5.3.8.1 Data URL 인코더 생성의 인코더 객체를 입력으로 받고 CBOR 이진 데이터를 반환한다.

  1. prefixId를 4로 설정한다( URL 접두사 테이블에서 "data:"의 엔트리).
  2. encoderData.base64가 true인 경우:
    1. encoderData.value를 파싱하여 mediatype ("data:"와 ";base64," 사이의 부분 문자열) 및 dataBytes(base64 데이터 부분을 이진 디코딩한 결과)를 추출한다.
    2. 3개 요소 배열 [prefixId, mediatype, dataBytes]를 CBOR 인코딩하여 반환한다. 주 유형 4(배열)에 주 유형 0 정수, 주 유형 3 텍스트 문자열, 그리고 주 유형 2 바이트 문자열이 포함된다.
  3. 그렇지 않으면:
    1. rest를 encoderData.value에서 "data:" 뒤부터 시작하는 부분 문자열로 설정한다.
    2. 2개 요소 배열 [prefixId, rest]를 CBOR 인코딩하여 반환한다. 주 유형 4(배열)에 주 유형 0 정수와 주 유형 3 텍스트 문자열이 포함된다.
6.5.3.8.3 Data URL 디코더 생성

이 알고리즘은 CBOR 배열 valueToDecode를 입력으로 받고 디코더 객체 또는 undefined를 반환한다.

  1. valueToDecode가 정확히 3개의 요소를 가지며, 두 번째 요소가 텍스트 문자열이고 세 번째 요소가 바이트 문자열이면 디코더 객체(base64 모드)를 반환한다.
  2. 그렇지 않고 valueToDecode가 정확히 2개의 요소를 가지며 두 번째 요소가 텍스트 문자열이면 디코더 객체 (비-base64 모드)를 반환한다.
  3. 그렇지 않으면 undefined를 반환한다.
6.5.3.8.4 Data URL 디코딩

이 알고리즘은 디코더 객체와 CBOR 배열 valueToDecode를 입력으로 받고 문자열을 반환한다.

  1. valueToDecode가 3개의 요소를 갖는 경우(base64 모드):
    1. mediatype을 valueToDecode[1]로 설정한다.
    2. encodedData를 바이트 문자열 valueToDecode[2]의 base64 인코딩으로 설정한다.
    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. value가 prefix로 시작하면 value, prefix, 그리고 prefixId를 포함하는 인코더 객체를 반환한다.
  2. undefined를 반환한다.
6.5.3.9.2 Base58 DID URL 인코딩

이 알고리즘은 6.5.3.9.1 Base58 DID URL 인코더 생성의 인코더 객체를 입력으로 받고 CBOR 이진 데이터를 반환한다.

  1. suffix를 encoderData.value에서 encoderData.prefix 뒤부터 시작하는 부분 문자열로 설정한다.
  2. suffix를 '#'가 처음 나타나는 지점에서 분할하여 authority와, 존재하는 경우 fragment를 생성한다.
  3. authorityEncoded를 authority에 Multibase Base58에서 CBOR 토큰으로 알고리즘을 적용한 결과로 설정한다.
  4. entries를 [encoderData.prefixId, authorityEncoded]로 초기화한다.
  5. fragment가 정의되어 있는 경우:
    1. fragmentEncoded를 fragment에 Multibase Base58에서 CBOR 토큰으로 알고리즘을 적용한 결과로 설정한다.
    2. fragmentEncoded를 entries에 추가한다.
  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. decoded를 str의 base58btc 내용 (즉, str[1:])을 디코딩한 결과로 설정한다.
    2. 디코딩에 성공하면 decoded에 대한 주 유형 2(바이트 문자열) CBOR 토큰을 반환한다.
  2. str에 대한 주 유형 3(텍스트 문자열) CBOR 토큰을 반환한다.
6.5.3.9.4 Base58 DID URL 디코더 생성

이 알고리즘은 CBOR 배열 valueToDecode를 입력으로 받고 디코더 객체 또는 undefined를 반환한다.

  1. valueToDecode가 정확히 2개 또는 3개의 요소를 갖는 경우:
    1. prefix를 URL 접두사 역방향 테이블에서 valueToDecode[0]의 값으로 설정한다.
    2. prefix를 포함하는 디코더 객체를 반환한다.
  2. 그렇지 않으면 undefined를 반환한다.
6.5.3.9.5 Base58 DID URL 디코딩

이 알고리즘은 6.5.3.9.4 Base58 DID URL 디코더 생성의 디코더 객체와 CBOR 배열 valueToDecode를 입력으로 받고 문자열을 반환한다.

  1. url을 decoderData.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 날짜 코덱

XSD 날짜 코덱은 유형이 http://www.w3.org/2001/XMLSchema#date인 값을 압축한다. 날짜 값은 Unix 에포크(1970-01-01T00:00:00Z) 이후의 초 수를 나타내는 정수로 표현되며, 음수가 아닌 값은 CBOR 주 유형 0(부호 없는 정수)으로, 에포크 이전 날짜는 주 유형 1(음의 정수)로 인코딩된다. 이 코덱은 이 표현을 통해 정확히 왕복 변환되는 날짜 문자열만 압축하며, 그렇지 않으면 원래 문자열을 그대로 유지한다.

참고
6.5.4.1 XSD 날짜 인코더 생성

이 알고리즘은 문자열 value를 입력으로 받고 인코더 객체 또는 undefined를 반환한다.

  1. value에 문자 'T'(시간 구성 요소를 나타냄)가 포함되어 있으면 undefined를 반환한다(이 값은 대신 XSD DateTime 코덱으로 압축된다).
  2. parsed를 value를 Unix 에포크 이후의 밀리초 수로 표현되는 ISO 8601 날짜 문자열로 파싱한 결과로 설정한다.
  3. parsed가 유효한 숫자가 아니면 undefined를 반환한다.
  4. value와 parsed를 포함하는 인코더 객체를 반환한다.
6.5.4.2 XSD 날짜 인코딩

이 알고리즘은 6.5.4.1 XSD 날짜 인코더 생성의 인코더 객체를 입력으로 받고 CBOR 이진 데이터를 반환한다.

  1. secondsSinceEpoch를 floor(encoderData.parsed / 1000)으로 설정한다.
  2. reconstituted를 Unix 에포크 이후 secondsSinceEpoch × 1000밀리초인 시점의 ISO 8601 문자열로 설정한다.
  3. expectedDate를 reconstituted에서 'T'가 처음 나타나기 전의 부분 문자열로 설정한다.
  4. encoderData.value가 expectedDate와 같지 않으면 압축으로 인해 정보가 손실된다. encoderData.value를 주 유형 3(텍스트 문자열) 객체로 CBOR 인코딩하여 반환한다.
  5. secondsSinceEpoch가 0보다 크거나 같으면 secondsSinceEpoch를 주 유형 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환한다.
  6. 그렇지 않으면 secondsSinceEpoch를 주 유형 1(음의 정수) 객체로 CBOR 인코딩하여 반환한다.
6.5.4.3 XSD 날짜 디코더 생성

이 알고리즘은 값 valueToDecode를 입력으로 받고 디코더 객체 또는 undefined를 반환한다.

  1. valueToDecode가 정수(양수, 음수 또는 0)이면 디코더 객체를 반환한다.
  2. 그렇지 않으면 undefined를 반환한다.
6.5.4.4 XSD 날짜 디코딩

이 알고리즘은 디코더 객체와 정수 값 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 날짜 코덱과 마찬가지로 압축이 무손실인 경우에만 값이 압축된다 (원래 문자열이 인코딩을 통해 정확히 왕복 변환됨).

6.5.5.1 XSD DateTime 인코더 생성

이 알고리즘은 문자열 value를 입력으로 받고 인코더 객체 또는 undefined를 반환한다.

  1. value에 문자 'T'가 포함되어 있지 않으면 undefined를 반환한다(이 값은 대신 XSD 날짜 코덱으로 압축된다).
  2. parsed를 value를 Unix 에포크 이후의 밀리초 수로 표현되는 ISO 8601 날짜 및 시간 문자열로 파싱한 결과로 설정한다.
  3. parsed가 유효한 숫자가 아니면 undefined를 반환한다.
  4. value와 parsed를 포함하는 인코더 객체를 반환한다.
6.5.5.2 XSD DateTime 인코딩

이 알고리즘은 6.5.5.1 XSD DateTime 인코더 생성의 인코더 객체를 입력으로 받고 CBOR 이진 데이터를 반환한다.

  1. secondsSinceEpoch를 floor(encoderData.parsed / 1000)으로 설정한다.
  2. encoderData.value에 문자 '.'가 포함되어 있지 않은 경우(밀리초 구성 요소 없음):
    1. expectedDate를 Unix 에포크 이후 secondsSinceEpoch * 1000밀리초인 시점의 ISO 8601 문자열에서 부분 문자열 ".000Z"를 "Z"로 대체한 값으로 설정한다.
    2. encoderData.value가 expectedDate와 같지 않으면 압축으로 인해 정보가 손실된다. encoderData.value를 주 유형 3 (텍스트 문자열) 객체로 CBOR 인코딩하여 반환한다.
    3. secondsSinceEpoch가 0보다 크거나 같으면 secondsSinceEpoch를 주 유형 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환한다.
    4. 그렇지 않으면 secondsSinceEpoch를 주 유형 1(음의 정수) 객체로 CBOR 인코딩하여 반환한다.
  3. 그렇지 않으면(밀리초 구성 요소가 있는 경우):
    1. millisecondIndex를 encoderData.value에서 첫 번째 '.'의 인덱스로 설정한다.
    2. milliseconds를 encoderData.value의 위치 millisecondIndex + 1부터 시작하는 숫자들의 정수 값으로 설정한다.
    3. expectedDate를 Unix 에포크 이후 secondsSinceEpoch * 1000 + milliseconds밀리초인 시점의 ISO 8601 문자열로 설정한다.
    4. encoderData.value가 expectedDate와 같지 않으면 압축으로 인해 정보가 손실된다. encoderData.value를 주 유형 3 (텍스트 문자열) 객체로 CBOR 인코딩하여 반환한다.
    5. 2개 요소로 이루어진 배열 [secondsSinceEpoch, milliseconds]을 CBOR 인코딩하여 반환한다. 주 유형 4(배열)에 2개의 주 유형 0(부호 없는 정수) 항목이 포함된다.
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. instantMs를 value * 1000으로 설정한다.
    2. dateString을 Unix 에포크 이후 instantMs밀리초인 시점의 ISO 8601 문자열로 설정한다.
    3. dateString에서 부분 문자열 ".000Z"를 "Z"로 대체한 값을 반환한다.
  2. 그렇지 않으면(value가 2개 요소로 이루어진 배열인 경우):
    1. instantMs를 value[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. prefixChar을 encoderData.value의 첫 번째 문자로 설정한다.
  2. prefixByte를 prefixChar에 해당하는 Multibase 접두사 바이트로 설정한다.
  3. content를 encoderData.value에서 첫 번째 문자 뒤부터 시작하는 부분 문자열로 설정한다.
  4. prefixChar이 'z'이면 suffixBytes를 content의 base58btc 디코딩으로 설정한다.
  5. 그렇지 않고 prefixChar이 'u'이면 suffixBytes를 content의 base64url 디코딩으로 설정한다.
  6. 그렇지 않으면(prefixChar이 'M'인 경우) suffixBytes를 content의 base64pad 디코딩으로 설정한다.
  7. bytes를 길이가 1 + length(suffixBytes)인 바이트 배열로 설정하고, 첫 번째 바이트는 prefixByte로, 나머지 바이트는 suffixBytes로 설정한다.
  8. bytes를 주 유형 2(바이트 문자열) 객체로 CBOR 인코딩하여 반환한다.
6.5.6.3 Multibase 디코더 생성

이 알고리즘은 값 valueToDecode를 입력으로 받고 디코더 객체 또는 undefined를 반환한다.

  1. valueToDecode가 바이트 문자열이 아니면 undefined를 반환한다.
  2. valueToDecode의 첫 번째 바이트가 0x7a, 0x75 또는 0x4d이면 디코더 객체를 반환한다.
  3. 그렇지 않으면 undefined를 반환한다(지원하지 않는 multibase 접두사 바이트).
6.5.6.4 Multibase 디코딩

이 알고리즘은 디코더 객체와 바이트 문자열 value를 입력으로 받고 문자열을 반환한다.

  1. prefixByte를 value의 첫 번째 바이트로 설정한다.
  2. suffix를 value의 나머지 바이트 (즉, 첫 번째 이후의 모든 바이트)로 설정한다.
  3. prefixByte가 0x7a('z')인 경우:
    1. "z"와 suffix의 base58btc 인코딩을 연결한 값을 반환한다.
  4. prefixByte가 0x75('u')인 경우:
    1. "u"와 suffix의 base64url 인코딩 (패딩 없음)을 연결한 값을 반환한다.
  5. prefixByte가 0x4d('M')인 경우:
    1. "M"과 suffix의 base64pad 인코딩을 연결한 값을 반환한다.
  6. 그렇지 않으면 value를 반환한다.

6.6 CBOR 태그 처리

6.6.1 CBOR 태그 구조 가져오기 알고리즘

이 알고리즘은 정수 registryEntryId를 입력으로 받고 바이트 문자열 prefix를 반환한다.
  1. registryEntryBytes를 registryEntryID의 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의 값을 배열의 두 번째 요소 값으로 설정한다.
  5. result를 빈 맵으로 설정한다.
  6. result.suffix를 suffix의 값으로 설정하고 result.registryEntryId를 registryEntryId의 값으로 설정한다.
  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

연락처: W3C JSON-LD Working Group (public-json-ld-wg@w3.org).

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/