CBOR-LD 1.0

연결 데이터를 위한 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는 간결한 이진 데이터 직렬화 및 메시징 형식이다. 이 명세는 연결 데이터를 직렬화하기 위한 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)의 성숙한 명세 또는 표준 문서를 요청과 함께 제공해야 한다. 명세 또는 기타 문서가 허용 가능한지를 판단할 때는 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. statejsonldDocumentinputDocuments6.2.2 문서 변환 알고리즘에 전달한 결과로 output을 설정한다.
    6. suffixoutput의 CBOR 인코딩으로 설정한다.
  4. 그렇지 않으면 suffixjsonldDocument의 CBOR 인코딩으로 설정한다.
  5. cborldBytessuffix 앞에 추가한 prefix의 16진수 인코딩으로 설정한다.
  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. inputsuffix를 바이트에서 맵으로 디코딩한 결과로 설정한다.
    5. jsonldDocumentstateinputinputDocuments6.2.2 문서 변환 알고리즘에 전달한 결과로 설정한다.
  5. 그렇지 않으면 jsonldDocumentsuffix를 바이트에서 맵으로 디코딩한 결과로 설정한다.
  6. jsonldDocument를 반환한다.

6.2 변환 알고리즘

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

6.2.1 변환 초기화 알고리즘

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

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

6.2.3 일반 변환 알고리즘

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

  1. state.strategy가 "compression"으로 설정되어 있는 경우:
    1. contextConversionResult6.2.5.1 압축을 위한 컨텍스트 변환 알고리즘state, activeContext, input, 그리고 output을 전달한 결과로 설정한다.
    2. activeContextcontextConversionResult.activeContext로, outputcontextConversionResult.output으로, 그리고 statecontextConversionResult.state로 설정한다.
  2. 그렇지 않으면 6.2.6.1 압축 해제를 위한 컨텍스트 변환 알고리즘state, activeContext, input, 그리고 output을 전달하여 얻은 resultresult.activeContextactiveContext를, result.output으로 output을, 그리고 result.statestate를 설정한다.
  3. state.strategy가 "compression"으로 설정되어 있으면 objectTypes6.2.5.4 압축을 위한 객체 유형 가져오기 알고리즘activeContextinput을 전달한 결과로 설정한다.
  4. 그렇지 않으면 objectTypes6.2.6.4 압축 해제를 위한 객체 유형 가져오기 알고리즘state, activeContext, 그리고 input을 전달한 결과로 설정한다.
  5. activeContextactiveContextobjectTypes6.3.4 유형 범위 컨텍스트 적용 알고리즘에 전달한 결과로 설정한다.
  6. state.strategy가 "compression"으로 설정되어 있으면 termEntries6.2.5.3 압축을 위한 입력 엔트리 가져오기 알고리즘state, input, 그리고 activeContext를 전달한 결과로 설정한다.
  7. 그렇지 않으면 termEntries6.2.6.3 압축 해제를 위한 입력 엔트리 가져오기 알고리즘state, input, output, 그리고 activeContext를 전달한 결과로 설정한다.
  8. termEntries의 각 [termInfo, value]에 대해:
    1. termtermInfo.term으로 설정한다.
    2. valueActiveContextactiveContextterm6.3.3 속성 범위 컨텍스트 적용 알고리즘에 전달한 결과로 설정한다.
    3. pluraltermInfo.plural의 값으로 설정하고 termTypetermInfo.def에 있는 @type의 값으로 설정한다.
    4. pluraltrue로 설정되어 있으면 valuesvalue의 값으로 설정한다. 그렇지 않으면 valuesvalue의 값을 단일 요소로 포함하는 배열로 설정한다.
    5. outputs를 빈 배열로 설정한다.
    6. values의 각 unconvertedValue에 대해:
      1. result6.2.4 값 변환 알고리즘state, termType, unconvertedValuevalue로, 그리고 valueActiveContextactiveContext로 전달한 결과로 설정한다.
      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 값 변환 알고리즘

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

  1. valuenull이면 null을 반환한다.
  2. state.strategy가 "compression"으로 설정되어 있으면 outputstate, termType, termInfo, 그리고 value6.2.5.2 압축을 위한 값 변환 알고리즘에 전달한 결과로 설정한다.
  3. 그렇지 않으면 outputstate, termType, termInfo, 그리고 value6.2.6.2 압축 해제를 위한 값 변환 알고리즘에 전달한 결과로 설정한다.
  4. output이 정의되어 있으면 stateoutput을 포함하는 맵인 result를 반환한다.
  5. value가 배열인 경우:
    1. outputs를 빈 배열로 설정한다.
    2. value의 각 element에 대해:
      1. result6.2.4 값 변환 알고리즘activeContext, state, termInfo, termType, 그리고 elementvalue로 전달한 결과로 설정한다. stateresult.state로 설정하고 result.outputoutputs에 추가한다.
    3. result를 빈 맵으로 설정한다. result.statestate로 설정하고 result.outputoutputs로 설정한다.
    4. result를 반환한다.
  6. output을 빈 맵으로 설정한다.
  7. result6.2.3 일반 변환 알고리즘state, activeContext, valueinput으로, 그리고 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. applyEmbeddedResult6.3.2 내장 컨텍스트 적용 알고리즘state, activeContext, 그리고 input을 전달한 결과로 설정한다.
  2. activeContextapplyEmbeddedResult.activeContext로 설정하고 stateapplyEmbeddedResult.state로 설정한다.
  3. input에 "@context" 엔트리가 없는 경우:
    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. encoderData6.5.1.1 컨텍스트 인코더 생성state.typeTablecontextValue를 전달한 결과로 설정한다.
    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 압축을 위한 값 변환 알고리즘

이 알고리즘은 맵 statetermInfo, 그리고 값 valueToEncodetermType을 입력으로 받고, 맵 encoderData를 반환한다.

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

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

  1. entries를 빈 배열로 초기화한다.
  2. 배열 keysinput의 키를 사전식으로 정렬한 것으로 설정한다.
  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의 값으로 설정한다. termIdpluralentryTerm에 추가한다.
    10. entryTermvalue라는 두 요소를 갖는 배열 entry를 생성한다.
    11. entryentries에 추가한다.
  4. entries를 반환한다.
6.2.5.4 압축을 위한 객체 유형 가져오기 알고리즘

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

  1. objectTypes를 빈 집합으로 설정한다.
  2. activeContext.typeTerms의 각 term에 대해:
    1. inputterm의 엔트리가 있는 경우:
      1. typesinput에서 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. decoderData6.5.1.3 컨텍스트 디코더 생성state.reverseTypeTable을 전달한 결과로 설정한다.
  2. contextTermIdstate.keywordsMap에서 "@context"의 값으로 설정한다.
  3. inputcontextTermId의 엔트리가 있으면 output에서 "@context"의 값을 6.5.1.4 컨텍스트 디코딩decoderDatainput에서 contextTermId의 값을 value로 전달한 결과로 설정한다.
  4. contextTermIdPluralcontextTermId의 값에 1을 더한 값으로 설정한다.
  5. inputcontextTermIdPlural의 엔트리가 있는 경우:
    1. 이전 검사에서 inputcontextTermId의 엔트리도 있었다면 ERR_INVALID_ENCODED_CONTEXT 오류를 발생시킨다.
    2. encodedContextsinput에서 contextTermIdPlural의 값으로 설정한다. encodedContexts가 배열이 아니면 ERR_INVALID_ENCODED_CONTEXT 오류를 발생시킨다.
    3. contexts를 빈 배열로 설정한다.
    4. encodedContexts의 각 valueToDecode에 대해, decoderDatavalueToDecodevalue6.5.1.4 컨텍스트 디코딩에 전달한 결과를 contexts에 추가한다.
    5. output에서 "@context"의 값을 contexts로 설정한다.
  6. embeddedContextResult6.3.2 내장 컨텍스트 적용 알고리즘activeContext, outputinput으로, 그리고 state를 전달한 결과로 설정한다.
  7. resultembeddedContextResult로 설정하고 result.outputoutput으로 설정한다. result를 반환한다.
6.2.6.2 압축 해제를 위한 값 변환 알고리즘

이 알고리즘은 맵 statetermInfo, 그리고 값 termTypevalueToDecode를 입력으로 받고, 값 decodedValue를 반환한다.

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

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

  1. entries를 빈 배열로 초기화한다.
  2. input의 각 키-값 쌍 keyvalue에 대해:
    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의 값으로 설정한다. termpluralentryTerm에 추가한다.
    7. entryTermvalue라는 두 요소를 갖는 배열 entry를 생성한다.
    8. entryentries에 추가한다.
  3. entries의 각 요소에서 term의 값을 기준으로 entries를 정렬한다.
  4. entries를 반환한다.
6.2.6.4 압축 해제를 위한 객체 유형 가져오기 알고리즘

이 알고리즘은 맵 state, activeContext, input을 입력으로 받고 집합 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의 값으로 설정한다. term, termId, 그리고 pluraltermInfo에 추가한다.
    11. value가 배열이 아니면 valuesvalue를 단일 요소로 포함하는 배열로 설정한다. 그렇지 않으면 valuesvalue의 값으로 설정한다.
    12. values의 각 value에 대해:
      1. decoderData6.5.2.3 값 디코더 생성value, termInfo, state, 그리고 "@vocab"을 termType으로 전달한 결과로 설정한다.
      2. decoderData가 존재하면 6.5.2.4 값 디코딩decoderData를 전달한 결과를 `objectTypes에 추가한다.
      3. 그렇지 않으면 valueobjectTypes에 추가한다.
  3. objectTypes를 반환한다.

6.3 활성 컨텍스트 처리

이 절의 알고리즘은 JSON-LD 문서와 연결된 컨텍스트 문서의 어떤 구성 요소가 압축 또는 압축 해제 과정의 특정 시점에 사용되고 있는지를 결정하는 방법을 설명한다. 이러한 알고리즘에는 CBOR-LD에서 내장 컨텍스트, 유형 범위 컨텍스트 및 속성 범위 컨텍스트를 적용하는 방법이 포함된다. 이는 이 명세의 뒤에서 정의되는 컨텍스트 로딩 알고리즘과 대조되며, 해당 알고리즘은 핵심 CBOR-LD 압축 기법인 용어에서 정수로의 매핑을 구성하는 방법을 설명한다. 활성 컨텍스트 처리와 컨텍스트 로딩 알고리즘은 함께 CBOR-LD로 변환하거나 CBOR-LD에서 변환할 때 JSON-LD 컨텍스트 문서를 처리하는 방법을 지정한다.

6.3.1 활성 컨텍스트 초기화 알고리즘

이 알고리즘은 맵 previousActiveContexttermMap을 입력으로 받고 맵 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 내장 컨텍스트 적용 알고리즘

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

  1. termMapUpdateResultstate, activeContext.termMapactiveTermMap으로, 그리고 input에서 '@context'의 값을 contexts6.3.5 용어 맵 업데이트 알고리즘에 전달한 결과로 설정한다.
  2. statetermMapUpdateResult.state로 설정한다.
  3. termMaptermMapUpdateResult.activeTermMap으로 설정한다.
  4. newActiveContext6.3.1 활성 컨텍스트 초기화 알고리즘termMapactiveContextpreviousActiveContext로 전달한 결과로 설정한다.
  5. result를 새 맵으로 설정하고 result.activeContextnewActiveContext로, 그리고 result.statestate로 설정한다.
  6. result를 반환한다.

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

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

  1. revertedTermMap6.3.6 용어 맵 되돌리기 알고리즘activeContext를 전달한 결과로 설정한다.
  2. termDefactiveContext.termMap에서 term의 값으로 설정한다. contextstermDef에서 "@context"의 값으로 설정한다.
  3. termMapUpdateResultstate, revertedTermMapactiveTermMap으로, truepropertyScope로, 그리고 contexts6.3.5 용어 맵 업데이트 알고리즘에 전달한 결과로 설정한다.
  4. statetermMapUpdateResult.state로 설정한다.
  5. termMaptermMapUpdateResult.activeTermMap으로 설정한다.
  6. newActiveContext6.3.1 활성 컨텍스트 초기화 알고리즘termMapactiveContextpreviousActiveContext로 전달한 결과로 설정한다.
  7. result를 새 맵으로 설정하고 result.activeContextnewActiveContext로, 그리고 result.statestate로 설정한다.
  8. result를 반환한다.

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

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

  1. objectTypesSorted를 빈 배열로 설정한다.
  2. objectTypes의 요소를 사전식으로 정렬하고 순서대로 objectTypesSorted에 추가한다.
  3. newTermMapactiveContext.termMap으로 설정한다.
  4. objectTypesSorted의 각 type에 대해:
    1. typeDefnewTermMap에서 type의 값으로 설정한다. contextstypeDef에서 "@context"의 값으로 설정한다.
    2. termMapUpdateResultstate, newTermMapactiveTermMap으로, contexts를, 그리고 truetypeScope6.3.5 용어 맵 업데이트 알고리즘에 전달한 결과로 설정한다.
    3. statetermMapUpdateResult.state로, 그리고 newTermMaptermMapUpdateResult.activeTermMap으로 설정한다.
  5. newActiveContext6.3.1 활성 컨텍스트 초기화 알고리즘newTermMaptermMap으로, 그리고 activeContextpreviousActiveContext로 전달한 결과로 설정한다.
  6. result를 새 맵으로 설정하고 result.activeContextnewActiveContext로, 그리고 result.statestate로 설정한다.
  7. result를 반환한다.

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

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

  1. contexts가 배열이 아니면, 이전 contexts 값을 유일한 요소로 갖는 배열로 contexts를 설정한다.
  2. allowProtectedOverridepropertyScope의 값으로 설정한다.
  3. propagateDefaulttypeScope 값의 부정으로 설정한다.
  4. contexts의 각 contextIdentifier에 대해:
    1. loadResult6.4.2 컨텍스트 로드 알고리즘statecontextIdentifier를 전달한 결과로 설정한다.
    2. entryloadResult.entry로, contextentry.context로, 그리고 stateloadResult.state로 설정한다.
    3. context@propagate가 있으면 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의 값들과 def.propagate의 값으로 설정된 propagate를 포함하는 맵으로 설정한다.
      3. 그렇지 않고 contextterm이 있으면, 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를 입력으로 받고, 맵 stateentry를 포함하는 맵 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. result6.4.3 컨텍스트 추가 알고리즘state, context, 그리고 설정된 경우 contextUrl을 전달한 결과로 설정한다.
  5. result를 반환한다.

6.4.3 컨텍스트 추가 알고리즘

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

  1. context에 "@import" 엔트리가 있는 경우:
    1. importUrl을 `context에서 "@import"의 값으로 설정한다.
    2. state.contextMapimportUrl의 엔트리가 없는 경우:
      1. importUrl과 연결된 컨텍스트 객체를 가져오고 importContext를 해당 객체의 "@context" 값으로 설정한다.
      2. importedContextAdditionResult6.4.3 컨텍스트 추가 알고리즘state, importContextcontext로, 그리고 importUrlcontextUrl로 전달한 결과로 설정한다.
      3. stateimportedContextAdditionResult.state로, 그리고 importEntryimportedContextAdditionResult.entry로 설정한다.
    3. 그렇지 않으면 importEntrystate.contextMap에서 importUrl의 값으로 설정한다.
    4. contextcontext의 모든 엔트리와 importEntry.context를 포함하는 맵으로 설정한다.
  2. termMap을 빈 맵으로 설정한다.
  3. entrycontexttermMap을 포함하는 객체로 설정한다.
  4. sortedTermscontext의 키를 사전식 순서로 정렬한 결과로 설정한다.
  5. context에 "@protected" 엔트리가 있으면 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 값 인코더 생성

이 알고리즘은 맵 statetermInfo, 그리고 값 termTypevalueToEncode를 입력으로 받고 맵 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. convertToBytesincludeSigntrue로 설정한다.
    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. bytesintValue를 바이트로 변환한 결과로 설정하고, includeSign의 값을 사용하여 정수의 이진 표현에 부호를 포함할지 여부를 결정한다.
    2. bytes를 주 유형 2(바이트 문자열) 객체로 CBOR 인코딩하여 반환한다.
  2. 그렇지 않으면 intValue를 주 유형 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환한다.
6.5.2.3 값 디코더 생성

이 알고리즘은 맵 statetermInfo, 그리고 값 termTypevalueToDecode를 입력으로 받고 맵 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 코덱을 사용하는 구현은 아래 테이블을 사용해야 한다(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. termIdstate.termToId에서 valueToEncode를 조회한 결과로 설정한다.
  3. termId가 정수이면, 6.5.3.3 URL 인코딩을 통해 호출될 때 termId를 주 유형 0(부호 없는 정수) CBOR 항목으로 인코딩하는 인코더를 반환한다.
  4. valueToEncode를 URL로 파싱하려고 시도한다. 파싱에 실패하면(즉, 값이 유효한 URL이 아니면) undefined를 반환한다.
  5. prefixURL 접두사 테이블의 엔트리 중 valueToEncodeprefix로 시작하고 prefix 뒤에 오는 valueToEncode의 나머지 부분에 ":"(U+003A COLON) 문자가 포함되지 않는 엔트리로 설정한다. 그러한 엔트리가 없으면 undefined를 반환한다(즉, 이 URL에는 압축을 적용할 수 없다).
  6. prefix가 "https://" 또는 "http://"이면, valueToEncode6.5.3.6.1 HTTP URL 인코더 생성에 전달한 결과를 반환한다.
  7. prefix가 "urn:uuid:"이면, valueToEncode6.5.3.7.1 UUID URN 인코더 생성에 전달한 결과를 반환한다.
  8. prefix가 "data:"이면, valueToEncode6.5.3.8.1 Data URL 인코더 생성에 전달한 결과를 반환한다.
  9. prefix가 "did:v1:nym:" 또는 "did:key:"이면, valueToEncode6.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. prefixURL 접두사 역방향 테이블에서 prefixId에 해당하는 값으로 설정한다.
    3. prefix가 "http://" 또는 "https://"이면, decodervalueToDecode6.5.3.6.3 HTTP URL 디코더 생성에 전달한 결과로 설정한다.
    4. 그렇지 않고 prefix가 "urn:uuid:"이면, decodervalueToDecode6.5.3.7.3 UUID URN 디코더 생성에 전달한 결과로 설정한다.
    5. 그렇지 않고 prefix가 "data:"이면, decodervalueToDecode6.5.3.8.3 Data URL 디코더 생성에 전달한 결과로 설정한다.
    6. 그렇지 않고 prefix가 "did:v1:nym:" 또는 "did:key:"이면, decodervalueToDecode6.5.3.9.4 Base58 DID URL 디코더 생성에 전달한 결과로 설정한다.
    7. prefix가 위 항목 중 어느 것과도 일치하지 않거나( prefixIdURL 접두사 역방향 테이블에 엔트리가 없는 경우 포함), 또는 decoderundefined이면(즉, 하위 디코더가 valueToDecode의 형식을 거부한 경우), ERR_UNKNOWN_COMPRESSED_VALUE 오류를 발생시킨다.
    8. decoder를 반환한다.
  3. valueToDecode가 정수이면 termstate.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]로 표현되며, 여기서 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. valueprefix를 포함하는 인코더 객체를 반환한다.
6.5.3.6.2 HTTP URL 인코딩

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

  1. prefixIdURL 접두사 테이블에서 encoderData.prefix의 값으로 설정한다.
  2. restencoderData.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. prefixURL 접두사 역방향 테이블에서 valueToDecode[0]의 값으로 설정한다.
    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. prefixId3으로 설정한다( URL 접두사 테이블에서 "urn:uuid:"의 엔트리).
  2. restencoderData.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]이 텍스트 문자열이면 uuidvalueToDecode[1]로 설정한다.
  2. 그렇지 않으면 uuid를 [RFC4122]에 따른 16바이트 이진 값 valueToDecode[1]의 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와 같으면 valuebase64true로 설정된 인코더 객체를 반환한다.
  4. valuebase64false로 설정된 인코더 객체를 반환한다.
6.5.3.8.2 Data URL 인코딩

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

  1. prefixId4로 설정한다( URL 접두사 테이블에서 "data:"의 엔트리).
  2. encoderData.base64true인 경우:
    1. encoderData.value를 파싱하여 mediatype ("data:"";base64," 사이의 부분 문자열) 및 dataBytes(base64 데이터 부분을 이진 디코딩한 결과)를 추출한다.
    2. 3개 요소 배열 [prefixId, mediatype, dataBytes]를 CBOR 인코딩하여 반환한다. 주 유형 4(배열)에 주 유형 0 정수, 주 유형 3 텍스트 문자열, 그리고 주 유형 2 바이트 문자열이 포함된다.
  3. 그렇지 않으면:
    1. restencoderData.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. mediatypevalueToDecode[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. valueprefix로 시작하면 value, prefix, 그리고 prefixId를 포함하는 인코더 객체를 반환한다.
  2. undefined를 반환한다.
6.5.3.9.2 Base58 DID URL 인코딩

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

  1. suffixencoderData.value에서 encoderData.prefix 뒤부터 시작하는 부분 문자열로 설정한다.
  2. suffix'#'가 처음 나타나는 지점에서 분할하여 authority와, 존재하는 경우 fragment를 생성한다.
  3. authorityEncodedauthorityMultibase Base58에서 CBOR 토큰으로 알고리즘을 적용한 결과로 설정한다.
  4. entries[encoderData.prefixId, authorityEncoded]로 초기화한다.
  5. fragment가 정의되어 있는 경우:
    1. fragmentEncodedfragmentMultibase Base58에서 CBOR 토큰으로 알고리즘을 적용한 결과로 설정한다.
    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. decodedstr의 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. prefixURL 접두사 역방향 테이블에서 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. 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 날짜 코덱

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. parsedvalue를 Unix 에포크 이후의 밀리초 수로 표현되는 ISO 8601 날짜 문자열로 파싱한 결과로 설정한다.
  3. parsed가 유효한 숫자가 아니면 undefined를 반환한다.
  4. valueparsed를 포함하는 인코더 객체를 반환한다.
6.5.4.2 XSD 날짜 인코딩

이 알고리즘은 6.5.4.1 XSD 날짜 인코더 생성의 인코더 객체를 입력으로 받고 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 날짜 디코더 생성

이 알고리즘은 값 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. parsedvalue를 Unix 에포크 이후의 밀리초 수로 표현되는 ISO 8601 날짜 및 시간 문자열로 파싱한 결과로 설정한다.
  3. parsed가 유효한 숫자가 아니면 undefined를 반환한다.
  4. valueparsed를 포함하는 인코더 객체를 반환한다.
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. millisecondsencoderData.value의 위치 millisecondIndex + 1부터 시작하는 숫자들의 정수 값으로 설정한다.
    3. expectedDate를 Unix 에포크 이후 secondsSinceEpoch * 1000 + milliseconds밀리초인 시점의 ISO 8601 문자열로 설정한다.
    4. encoderData.valueexpectedDate와 같지 않으면 압축으로 인해 정보가 손실된다. 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. 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. prefixByteprefixChar에 해당하는 Multibase 접두사 바이트로 설정한다.
  3. contentencoderData.value에서 첫 번째 문자 뒤부터 시작하는 부분 문자열로 설정한다.
  4. prefixChar'z'이면 suffixBytescontent의 base58btc 디코딩으로 설정한다.
  5. 그렇지 않고 prefixChar'u'이면 suffixBytescontent의 base64url 디코딩으로 설정한다.
  6. 그렇지 않으면(prefixChar'M'인 경우) suffixBytescontent의 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. 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를 입력으로 받고, 디코딩할 주요 데이터인 suffixsuffix를 압축 해제하는 데 사용해야 하는 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.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/