ERC-7053 상호운용 디지털 미디어 색인 (Interoperable Digital Media Indexing)
Final · 이름·메타데이터 · 2023-05-22 작성
디지털 미디어 파일마다 내용에서 만든 콘텐츠 식별자(CID)를 붙이고 Commit 이벤트로 체인에 기록해 여러 컨트랙트와 EVM 호환 체인에서 미디어의 이력을 찾고 검증할 수 있게 하는 색인 표준입니다.
왜 필요한가
인터넷에서 디지털 미디어 파일이 차지하는 비중은 크지만 콘텐츠를 가리키는 보편적이고 상호운용 가능한 식별자가 없습니다. 같은 미디어라도 시스템마다 다른 방식으로 기록하기 때문에 정보가 조각나고 특정 미디어의 메타데이터와 저장 위치, 출처(provenance)를 찾기가 복잡해집니다. 디지털 미디어의 양이 계속 늘어날수록 이 문제는 점점 더 심각해집니다. 이 표준은 탈중앙 콘텐츠 식별자(CID)와 Commit 이벤트를 결합해 EVM 호환 네트워크 전반에서 디지털 미디어를 같은 방식으로 색인하는 방법을 정합니다. 사용자는 미디어가 만들어진 때부터 현재까지의 전체 이력을 볼 수 있어 투명성이 높아지고 어떤 디지털 미디어 시스템이든 공통 인터페이스로 콘텐츠 정보를 색인하고 검색할 수 있게 됩니다.
구현해야 하는 것
event Commit(address indexed recorder, string indexed assetCid, string commitData);: 새 커밋이 만들어질 때 발생하는 이벤트입니다. 커밋한 계정 주소, 자산의 콘텐츠 식별자, 커밋에 붙은 데이터를 담습니다.function commit(string memory assetCid, string memory commitData) public returns (uint256 blockNumber);: 자산에 대한 커밋을 등록합니다. Commit 이벤트를 발생시키고 해당 assetCid의 기록에 커밋 블록 번호를 남긴 뒤 그 블록 번호를 반환합니다.
심층 설명
표준이 다루는 범위
이 표준은 여러 스마트 컨트랙트와 EVM 호환 블록체인에 걸쳐 디지털 미디어 정보를 조직하고 검색하는 상호운용 색인 방법을 정의합니다. 같은 디지털 콘텐츠에 관한 모든 데이터를 하나로 연결해 저장 위치와 핵심 정보를 더 쉽게 찾게 하고 컨트랙트와 체인을 가로지르는 데이터의 추적과 검증을 돕는 것이 목적입니다. 어떤 디지털 미디어 시스템이든 쓸 수 있는 공통 인터페이스를 만들어 각 시스템이 자기 콘텐츠를 표준 방식으로 색인하고 검색하도록 합니다.
콘텐츠 식별자 요건
이 표준에서 콘텐츠 식별자는 디지털 미디어의 내용을 암호학적 해시 함수에 통과시켜 만든 콘텐츠 주소입니다. 색인 과정을 시작하기 전에 파일마다 고유한 콘텐츠 식별자를 반드시(REQUIRED) 만들어야 합니다. 이 식별자는 탈중앙 저장소에서 쓰는 콘텐츠 식별자와 같아야 하며 식별자 하나로 그 미디어의 메타데이터, 미디어 정보, 콘텐츠 파일 자체에 접근할 수 있어야 합니다. 내용이 같은 파일은 어디서 계산하든 같은 식별자가 나오므로, 이 식별자가 시스템을 넘나들며 같은 콘텐츠의 기록을 연결하는 공통 키 역할을 합니다.
commit 함수와 Commit 이벤트
commit 함수는 assetCid와 commitData 두 문자열을 받습니다. assetCid는 커밋 대상 자산의 콘텐츠 식별자이고 commitData는 그 커밋에 붙이는 데이터입니다. 호출하면 Commit 이벤트를 발생시키고 해당 assetCid에 대한 recordLogs 매핑에 커밋이 일어난 블록 번호를 기록한 뒤 그 블록 번호를 반환합니다. Commit 이벤트에는 커밋을 수행한 계정 주소인 recorder, 자산의 콘텐츠 식별자인 assetCid, 커밋 데이터인 commitData가 담기며 recorder와 assetCid는 indexed로 선언되어 있습니다.
CID를 쓰는 이유
원문은 CID 채택의 이점을 두 가지로 설명합니다. 첫째는 데이터 무결성 강화입니다. CID는 콘텐츠의 암호학적 해시이므로 고유성이 보장되고 위조를 막을 수 있으며 콘텐츠가 있으면 CID를 구해 그 콘텐츠에 연결된 정보를 검색할 수 있습니다. 둘째는 데이터 이동성입니다. CID 덕분에 디지털 미디어 콘텐츠를 다른 시스템으로 옮길 때 재인코딩이나 프로토콜 재설정이 필요 없습니다. 예를 들어 Commit 이벤트보다 먼저 만들어진 NFT라도 tokenURI가 가리키는 파일을 같은 방식으로 변환하면 일관된 식별 방식으로 색인할 수 있습니다.
참조 구현 CommitRegister
참조 구현인 CommitRegister 컨트랙트는 commitLogs라는 공개 매핑(string에서 uint 배열)을 둡니다. commit 함수는 Commit 이벤트를 발생시킨 뒤 commitLogs[assetCid]에 block.number를 추가하고 그 값을 반환합니다. getCommits 함수는 특정 assetCid로 기록된 블록 번호 목록을 돌려주므로, 이 번호들을 따라가면 해당 미디어에 어떤 커밋이 언제 있었는지 확인할 수 있습니다. 구현은 OpenZeppelin의 ECDSA와 Initializable을 가져오고 initialize 함수를 두는 형태로 작성되어 있습니다.
쓸 때 주의할 점
- 입력 검증: commit 함수가 문자열 인자를 받으므로 주입 공격을 피하기 위해 입력을 검증해야 합니다. 이런 공격은 전통적인 웹 개발보다 스마트 컨트랙트에서 드물지만 주의가 필요합니다.
- 데이터 무결성은 검증하지 않음: commit 함수는 CID가 올바르고 맞는 데이터를 가리킨다고 가정합니다. 이 표준은 CID 뒤의 콘텐츠와 커밋 데이터를 검증하지 않으며 그 책임은 사용자나 구현 애플리케이션에 있습니다.
- 이벤트 수신 누락과 순서: Commit 이벤트 수신에 의존해 변화를 추적하는 시스템은 네트워크 혼잡이나 재구성(reorganization) 시기에 이벤트가 누락되거나 순서가 어긋날 수 있다는 점에 대비해야 합니다.
- 배포 전 보안 감사 권장: 구현자는 자신의 사용 사례와 배포 환경에 맞춰 보안 측면을 검토해야 하며 실제 네트워크에 배포하기 전에 종합적인 보안 감사를 수행할 것이 강력히 권장됩니다.