ERC-5568 지갑에 필요한 조치를 알리는 신호 표준 (Well-Known Format for Required Actions)

Review · 계정·지갑 · 2022-08-31 작성

스마트 컨트랙트가 정해진 함수와 리버트(실행 취소) 사유를 통해 사용자가 먼저 해야 할 조치를 기계가 읽을 수 있는 형식으로 지갑에 알리는 표준입니다.

왜 필요한가

스마트 컨트랙트를 쓰기 전에 사용자가 먼저 해야 하는 일이 있는 경우가 많습니다. 예를 들어 거래소 컨트랙트에서 토큰을 교환하려면 먼저 그 컨트랙트가 내 토큰을 쓸 수 있도록 승인(approve)해야 합니다. 지금까지 이런 안내는 각 서비스의 웹 프런트엔드에 하드코딩됐습니다. 그래서 프런트엔드가 모든 사전 조치를 미리 알고 처리해야 해 코드가 복잡해지고 컨트랙트가 스스로 지갑에 무엇이 필요한지 알릴 방법이 없었습니다. 이 표준은 컨트랙트가 정해진 함수와 리버트 사유로 필요한 조치를 직접 신호하게 합니다. 토큰 승인 요청, HTTP 요청 전송, 일정 기간이 지난 뒤 키 교체 요청 같은 다양한 조치를 최대 64kB의 임의 데이터와 함께 전달할 수 있고 뒤에 나올 다른 ERC가 새 지시 형식을 얹어 확장할 수 있게 설계됐습니다.

구현해야 하는 것

심층 설명

walletSignal24 함수로 필요한 조치를 조회

컨트랙트는 view 함수 walletSignal24(bytes32 selector, bytes function_data)를 구현해 (uint24 instruction_id, bytes instruction_data)를 돌려줍니다. 조치가 필요하면 0이 아닌 instruction_id와 instruction_data를 반환하고 필요 없으면 instruction_id를 0으로 설정합니다(이때 instruction_data는 아무 값이나 가능합니다). instruction_id는 그 지시를 정의한 ERC의 번호여야 하며, 예외적인 상황이 아니면 다른 번호를 쓸 수 없습니다. 하나의 ERC는 instruction_id를 정확히 0개 또는 1개만 정의해야 하고 해당 instruction_data의 구조는 그 instruction_id를 정의한 ERC가 정합니다. 지시 데이터는 최대 64kB의 임의 파라미터를 담을 수 있습니다.

조치 미이행을 알리는 커스텀 리버트

필요한 조치가 수행되지 않았음을 알리려면, 이 표준을 따르는 컨트랙트는 반드시 error WalletSignal24(uint24 instruction_id, bytes instruction_data)로 리버트해야 합니다. 여기서도 instruction_id는 그 지시를 정의한 ERC의 번호여야 하고 하나의 ERC는 instruction_id를 정확히 0개 또는 1개만 정의해야 하며 instruction_data의 구조는 그 instruction_id를 정의한 ERC가 정의합니다. 함수 반환과 커스텀 에러라는 두 경로 모두 같은 (instruction_id, instruction_data) 형식을 씁니다.

지갑이 따라야 하는 처리 절차

지갑은 거래를 멤풀에 제출하기 전에 walletSignal24를 로컬에서 반드시 시뮬레이션해야 합니다. 이때 이 함수를 view가 아닌 함수처럼, 즉 상태를 바꿀 수 있는 함수처럼 취급해야 합니다(view가 아닌 함수에 대한 CALL도 허용). 시뮬레이션 결과 instruction_id가 0이 아니면 조치가 필요한 것입니다. instruction_id와 instruction_data는 이 시뮬레이션 결과에서 가져와야 하고 지시는 해당 ERC의 규정대로 평가하는 것이 권장됩니다. 지갑이 지원하지 않는 지시면 그 사실을 알리는 오류를 사용자에게 반드시 표시해야 하고 그 뒤 거래를 다시 평가해야 합니다. 단, 지시가 재평가를 금지한다고 명시하면 재평가하지 않습니다. 지시가 유효하지 않거나 instruction_id와 instruction_data를 해석할 수 없으면 오류를 표시해야 하고 이 경우 거래를 재평가해서는 안 됩니다.

배포 가스 비용과 단순함에 맞춘 설계

이 표준은 배포 가스 비용과 단순함에 명시적으로 최적화됐습니다. 인터페이스 지원 여부를 알리는 ERC-165는 쓰지 않는데, 인터페이스가 충분히 단순해서 함수를 직접 호출해 보는 것만으로 감지할 수 있기 때문입니다. 개발자가 쓰기 편하도록 돕는 라이브러리가 나중에 만들어질 것으로 기대한다고 원문은 밝힙니다.

ERC-3668과의 관계

오프체인 데이터를 읽어 오는 ERC-3668은 이 표준과 함께 쓸 수 있지만 이 표준과는 다른 메커니즘을 사용합니다. 사람이 읽는 문자열 리버트 메시지와의 호환성 문제는 보안 고려 사항의 리버트 사유 충돌 절에서 다룹니다.

아직 검토(Review) 단계인 제안

이 ERC는 상태가 Review로, 아직 확정되지 않았고 내용이 바뀔 수 있는 제안입니다. 구현 전에 최신 원문을 확인하는 것이 좋습니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs