ERC-7578 실물 자산 상환 NFT 표준 (Physical Asset Redemption)
Final · NFT·멀티토큰 · 2023-08-01 작성
실물 자산을 담보로 하는 NFT에 발행자, 법적 소유자, 보관 장소, 계약 조건 같은 핵심 정보를 표준 형식으로 담아 보유자가 진위를 확인하고 실물 상환을 준비할 수 있게 하는 ERC-721 확장입니다.
왜 필요한가
지금까지 NFT(블록체인 위의 고유 토큰)는 주로 디지털 자산의 소유권을 표현하는 데 쓰였습니다. 그런데 실물 자산을 토큰으로 만드는 흐름이 커지면, 토큰만 보고는 그 실물이 진짜인지, 법적 소유자가 누구인지, 어디에 어떤 상태로 보관되는지, 상환을 요구할 때 어떤 계약과 법이 적용되는지 알 방법이 없습니다. 발행자가 실물의 법적 소유자라는 보장도 없어서 보유자는 상대방 위험과 법적 위험을 따로 조사해야 합니다. 이런 표준화된 정보의 부재와 관련 당사자의 불투명성은 실물 자산 NFT를 쓰려는 사람에게 불필요한 장벽이 됩니다. 원문은 이것이 대량 채택을 가로막을 수 있다고 지적합니다. 이 표준은 토큰마다 정해진 정보를 담게 해서 진위 확인과 실물 상환을 쉽게 만들고 발행자가 정확한 정보를 기재할 책임을 지게 합니다.
구현해야 하는 것
event PropertiesSet(uint256 indexed tokenId, Properties properties);: 토큰의 속성이 설정될 때 토큰 ID와 속성 전체를 담아 발생하는 이벤트입니다.event PropertiesRemoved(uint256 indexed tokenId);: 토큰의 속성이 제거될 때 발생하는 이벤트입니다.function getPropertiesOf(uint256 tokenId) external view returns (Properties memory properties);: 토큰의 모든 속성을 조회합니다. 토큰이 없어도 되돌리지(revert) 않습니다.
심층 설명
Properties 구조체의 여섯 필드
각 토큰에는 Properties 구조체로 표현되는 여섯 가지 정보가 담깁니다. tokenIssuer는 토큰을 민팅하는 네트워크 또는 주체, assetHolder는 실물 자산의 법적 소유자, storageLocation은 실물이 보관된 장소, terms는 계약서나 약관으로 연결되는 IPFS 링크, jurisdiction은 terms에 정해진 준거법과 관할권, declaredValue는 민팅 시점에 신고된 자산 가치입니다. declaredValue는 통화(currency, string)와 값(value, uint256)으로 이루어진 Amount 구조체입니다. 모든 필드는 문자열이어서 이름뿐 아니라 서비스 제공자가 발급한 고유 식별 번호나 네트워크 ID로도 당사자를 식별할 수 있습니다.
각 필드가 노리는 효과
tokenIssuer 공개는 보유자가 발행자를 실사하고 신뢰도를 평가할 기준점을 주며 발행자에게 책임을 지워 민팅 관행의 표준화를 이끕니다. assetHolder는 발행자가 실물의 법적 소유자라고 가정할 수 없기 때문에 별도로 공개하며 보유자가 법적 상대방 위험을 따질 수 있게 합니다. storageLocation은 보관 상태가 가치에 미치는 위험을 평가하게 하고 상환 집행의 두 번째 연락처가 됩니다. terms와 jurisdiction은 법적 위험과 집행 가능성 평가를 돕습니다. declaredValue는 보험 같은 부가 서비스의 기준과 분류에 쓰입니다. 원문은 이 값이 반드시 시장 가치를 뜻하지는 않는다고 명시합니다.
민팅과 소각의 생명주기 규칙
토큰이 민팅될 때 속성은 사전에 초기화되어 있어야 합니다(SHOULD). 속성이 설정되면 PropertiesSet 이벤트가, 제거되면 PropertiesRemoved 이벤트가 발생합니다. 유효한 속성을 가진 토큰이 소각될 때는 속성을 반드시 제거해야 합니다(MUST). 원문 Rationale은 민팅 전에 속성을 초기화하지 않으면 토큰이 표현하는 자산의 출처(provenance)를 입증할 수 없게 될 위험이 있다고 설명합니다.
getPropertiesOf의 동작
getPropertiesOf(uint256 tokenId)는 토큰의 고유한 속성을 반드시 반환해야 합니다(MUST). 토큰이 존재하지 않아도 되돌리지 않는다고 주석에 명시되어 있습니다. 토큰이 소각되었거나 속성이 설정되지 않았다면 빈 Properties 구조체를 반환해야 합니다(SHOULD). 호출하는 쪽은 빈 구조체가 돌아올 수 있다는 점을 전제로 처리해야 합니다.
terms는 IPFS 링크로
terms 파라미터는 IPFS에 저장된 문서로 연결되는 HTTP 링크여야 합니다(SHOULD). IPFS는 내용이 바뀌면 주소도 바뀌는 분산 저장 방식이므로, 문서가 변조되지 않았음을 보유자가 검증할 수 있습니다. 계약서나 약관 같은 실제 법적 문서를 링크로 담을수록 보유자가 상환 집행의 법적 위험을 더 잘 평가할 수 있다는 것이 원문의 취지입니다.
컨트랙트 수준 검증을 두지 않은 이유
속성 값에 대한 컨트랙트 수준의 유효성 검증은 없습니다. 기재된 데이터의 정확성은 토큰 발행자의 책임이라는 것이 원문의 입장이며 이것이 발행자와 토큰 자체에 대한 신뢰를 쌓는다고 설명합니다. 즉 체인이 데이터의 참 거짓을 보증하는 것이 아니라, 발행자를 식별 가능하게 만들어 책임을 지우는 구조입니다.
참조 구현의 핵심 장치
OpenZeppelin ERC-721 v5 기반 참조 구현은 _update 함수를 오버라이드해 생명주기를 강제합니다. 수신자가 영주소이면(소각) _removePropertiesOf로 속성을 지우고 보내는 쪽이 영주소이면(민팅) _properties[tokenId].tokenIssuer가 비어 있을 때 PropertiesUninitialized 오류로 되돌립니다. 속성을 쓰는 _setPropertiesOf는 internal 함수입니다. 신뢰할 수 있는 EOA나 승인된 컨트랙트, 역할 기반 접근 제어(RBAC)로 접근을 제한한 함수 안에서만 호출하라고 경고합니다. 이 표준은 ERC-721과 호환되고 ERC-165, ERC-721이 필요하며 상태는 Final로 확정되었습니다.
쓸 때 주의할 점
- 속성 설정 권한 제한: 진위를 보장하려면 속성 설정은 신뢰할 수 있는 외부 소유 계정(EOA)이나 컨트랙트만 호출할 수 있는 방법으로 제한해야 합니다. 이 신뢰 주체는 속성이 실물 자산의 실제 특성을 정확히 반영하는지 검증해야 합니다.
- 설정 후 무단 변경 방지: 속성이 설정된 뒤 허가 없이 수정되는 일을 막도록 적절한 접근 제어 장치를 구현해야 합니다.