ERC-5732 커밋 공통 인터페이스 (Commit Interface)

Final · 기타 · 2022-09-29 작성

선택 내용을 해시로 먼저 제출(커밋)하고 나중에 공개(리빌)하는 커밋-리빌 방식을 어떤 컨트랙트에나 붙일 수 있도록, 커밋 함수만 담은 공통 인터페이스를 정의합니다.

왜 필요한가

블록체인에서는 거래가 처리되기 전에 누구나 그 내용을 미리 볼 수 있습니다. 그래서 투표처럼 비밀이 필요한 행동은 내용이 그대로 드러나고 남의 거래를 보고 먼저 끼어드는 선행매매(front-running), 뒤따라 붙는 후행매매(back-running), 앞뒤로 끼우는 샌드위치 공격 같은 피해가 생깁니다. 이를 막는 오래된 방법이 커밋-리빌입니다. 먼저 내용의 해시만 제출해 약속을 걸어 두고 나중에 원문을 공개해 검증받는 방식입니다. 그런데 투표 표준, 토큰 표준 등 각 표준마다 커밋 방식을 따로 설계하면 호환이 안 됩니다. 이 표준은 커밋 함수 하나만 공통으로 정해 두고 공개 방법은 각 응용에 맡겨서 기존 표준의 함수 서명을 바꾸지 않고도 어디에나 커밋-리빌을 더할 수 있게 합니다.

구현해야 하는 것

심층 설명

핵심과 일반, 두 개의 인터페이스

준수 컨트랙트는 IERC_COMMIT_CORE(EIP-165 식별자 0xf14fcbc8)를 반드시(MUST) 구현해야 하고 IERC_COMMIT_GENERAL(식별자 0x67b2ec2c)은 구현하는 것이 권장(SHOULD)됩니다. 일반 인터페이스를 구현한 컨트랙트는 commit(_commitment) 호출을 commitFrom(msg.sender, _commitment, 빈 배열)과 동등하게 처리해야 합니다. 핵심 인터페이스를 commit 한 개 파라미터로 단순하게 둔 것은 ENS 등 기존 선행 구현과의 하위 호환을 위해서입니다.

timePoint와 Commit 이벤트

IERC_COMMIT_GENERAL 구현 컨트랙트는 커밋이 접수되어 기록될 때 반드시 Commit 이벤트를 발생시켜야 합니다. commitFrom의 반환값과 이벤트의 _timePoint는 커밋 간 순서를 나타내는 값으로, 나중 커밋이 항상 이전 커밋보다 크거나 같은 값을 갖습니다. block.timestamp나 block.number, 또는 구현 컨트랙트가 고른 다른 시간 척도를 쓰는 것이 권장됩니다.

commitFrom과 대리 제출

commitFrom은 커밋값을 체인 밖에서 만들어 두고 다른 계정이 대신 제출할 수 있게 하는 함수입니다. _from이 거래 서명자와 다르면 _from의 서명을 검증하는 것이 권장됩니다. 외부 소유 계정(EOA)이라면 ECDSA 서명을 온체인에서 검증하고 스마트 컨트랙트 계정이라면 EIP-1271로 서명을 검증하는 것이 권장됩니다. _extraData 필드는 향후 동작 확장을 위해 예약되어 있습니다.

리빌 방법은 표준화하지 않음

이 표준은 commit만 정의하고 reveal 함수는 정의하지 않습니다. 준수 컨트랙트의 하나 이상의 메서드가 리빌 용도로 쓰일 수 있으며(MAY), 투표 표준의 vote나 토큰의 transfer 같은 기존 함수를 그대로 리빌로 쓸 수 있습니다. 다만 커밋한 사람이 나중에 리빌 거래에서 secret_salt를 공개할 수 있는 방법이 반드시 있어야 합니다. secret_salt의 크기와 위치는 통합의 유연성을 최대화하기 위해 일부러 정하지 않았습니다.

하위 호환성과 ENS 사례

이 표준은 extraData를 가진 기존 ERC들의 메서드 서명과 하위 호환됩니다. 새 EIP는 salt 필드를 추가해 이 표준 지원을 쉽게 만들 수 있지만 필수는 아닙니다. 참고 구현으로는 ENS의 ETHRegistrarController가 등록 선점(front-run)을 막으려고 쓰는 commit 함수가 제시되며 기존 코드에 Commit 이벤트 발생을 더하는 식으로 이 표준에 맞출 수 있음을 보여 줍니다. 이 참고 구현은 시연용이므로 실제 서비스에 그대로 쓰면 안 됩니다.

EIP-165 지원 권장

준수 컨트랙트는 EIP-165(인터페이스 지원 여부를 조회하는 표준)를 구현하는 것이 권장됩니다. 핵심 인터페이스의 식별자는 0xf14fcbc8, 일반 인터페이스의 식별자는 0x67b2ec2c입니다. 이 표준은 EIP-165와 EIP-1271을 선행 요구 사항(requires)으로 두고 있으며 상태는 Final로 확정된 표준입니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs