ERC-1191 체크섬 주소에 체인 ID 추가 (Add chain id to mixed-case checksum address encoding)

Last Call · 계정·지갑 · 2018-03-18 작성

주소의 대소문자 체크섬 계산에 네트워크를 구분하는 체인 ID를 넣어 다른 네트워크에서 만든 주소로 잘못 송금하려는 시도를 지갑 같은 소프트웨어가 미리 알아챌 수 있게 합니다.

왜 필요한가

이더리움 주소는 공개키를 해시한 값이어서 주소 자체에 어떤 네트워크용인지 알려 주는 정보(메타데이터)가 전혀 들어 있지 않습니다. 기존 표준인 EIP-55는 주소의 영문자를 대문자와 소문자로 섞어 쓰는 체크섬(checksum)으로 오타가 난 잘못된 주소를 걸러 주지만 다른 이더리움 계열 네트워크에서 만든 주소는 형식상 완전히 유효하기 때문에 걸러내지 못합니다. 예를 들어 이더리움 테스트넷에서 받은 주소를 메인넷 지갑에 붙여 넣고 송금해도 소프트웨어가 아무 경고를 하지 못하고 그 결과 자금을 잃을 수 있습니다. 이 표준은 EIP-55 체크섬 계산에 EIP-155에서 정의한 체인 ID를 선택적으로 넣어 네트워크마다 대소문자 패턴이 달라지게 만들고 그 덕분에 소프트웨어가 서로 다른 네트워크의 주소를 구분할 수 있게 합니다.

심층 설명

EIP-55를 확장하는 선택적 변형

EIP-55는 사용자가 잘못된 주소로 송금해 자금을 잃는 일을 막으려고 만든 대소문자 체크섬 표준입니다. 이 제안은 거기에 EIP-155가 정의한 체인 ID를 선택적으로(optionally) 해시 계산에 추가합니다. 목적은 유효하지만 다른 네트워크의 클라이언트에서 얻은 주소로 송금하는 손실을 막는 것입니다. 원문은 이 제안이 구현되면 이더리움 메인넷 지갑에서 이더리움 테스트넷 주소로 보내려 할 때 지갑이 사용자에게 경고할 수 있다는 예를 듭니다.

체크섬 계산 규칙

기본 알고리즘은 EIP-55와 같습니다. 다만 등록된 체인 ID가 주어지면 그 값을 해시 함수의 입력에 추가합니다. 전달된 체인 ID가 이 체크섬 변형을 채택하기로 한 네트워크의 것이면, 해시를 계산하기 전에 주소 앞에 체인 ID와 0x 구분자를 붙입니다. 그다음 주소를 16진수로 표기하되, i번째 글자가 영문자(abcdef 중 하나)이면 계산한 해시의 4*i번째 비트가 1일 때 대문자로, 아니면 소문자로 적습니다. 원문 Rationale은 기존 라이브러리의 최소한의 코드 변경으로 서로 다른 이더리움 계열 네트워크의 주소가 섞이는 손실을 막을 수 있다는 점을 장점으로 듭니다.

참조 구현(파이썬)

원문의 eth_checksum_encode(addr, chainid=1) 함수는 채택 네트워크 목록을 adopted_eip1191 = [30, 31]로 두고 체인 ID가 이 목록에 있으면 str(chainid) + addr.lower()를, 아니면 기존 EIP-55처럼 addr[2:].lower()를 keccak_256 해시의 입력으로 씁니다. 그 뒤 해시의 각 니블 값이 8 이상이면 해당 글자를 대문자로 바꿉니다. 즉 이더리움 메인넷(체인 ID 1)처럼 채택하지 않은 네트워크에서는 결과가 기존 EIP-55와 같습니다.

채택 네트워크와 테스트 케이스

원문 Usage 표 기준으로 이 체크섬 변형을 지원하는 네트워크는 RSK 메인넷(체인 ID 30)과 RSK 테스트넷(체인 ID 31)입니다. 테스트 케이스는 같은 주소라도 이더리움 메인넷(1), RSK 메인넷(30), RSK 테스트넷(31)에서 대소문자 패턴이 서로 다르게 나오는 것을 보여 주며 각 목록의 주소가 해당 체인 ID로 다시 인코딩했을 때 그대로 나오는지 검증합니다.

구현한 프로젝트 목록

원문 Implementation 표에는 이 표준을 구현한 프로젝트로 MyCrypto, MyEtherWallet, Ledger, Trezor, Web3.js, EthereumJS-util, ENS address-encoder가 올라 있습니다. 구현 언어는 JavaScript, TypeScript, Python, C 등 다양합니다.

문서 상태

원문의 상태는 Last Call이며 마감일은 2019-11-18로 적혀 있습니다. 최종 확정(Final) 전 단계의 문서이므로 내용이 바뀌었을 수 있다는 점을 염두에 두어야 합니다.

ERC 원문 · ← ERCs