생성되는 지갑 주소의 경우, 유효성 검사를 할 수 있나요?
고액의 암호화폐를 주고 받다보면 항상 소액을 먼저 보내고 입금이 잘 되었는지 확인해야하는 번거로움이 따르는 것 같습니다. 은행권의 경우 주소와 받는이의 이름 및 계좌의 유효성 검사까지 가능한 것으로 알고 있는데, 암호화폐는 여로모로 위험성 및 부담이 따르는것 같네요.
전송속도가 비교적 빠른 코인의 경우는 문제가 되지 않지만, 느린 코인에 대해서는 확인절차에 필요한 시간소요도 굉장히 많이 걸리게 되리라 생각이 드네요. 지갑 주소의 레터 1개라도 다름에 따라 완전히 다른 주소가 될 수 있을텐데 생성되는 지갑 주소가 올바른 것인지. 유효성 검사를 할 수 있는지 궁금합니다.
과거 비탈릭 부테린은 EIP-55에서 '대문자로 16진수 인코딩된 체크섬'이라는 방법을 제안한 바가 있습니다. 이 방법은 이더리움 주소의 알파벳 대소문자를 수정함으로써 주소 입력이 정확히 되었는지 검증할 수 있는 체크섬을 추가할 수 있는 방법이라고 할 수 있습니다. 이러한 EIP-55에 대해 Mastering Ethereum이라는 책의 내용을 참고로 하여 답변해 드리도록 하겠습니다.
예를 들어 0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9라는 주소가 있다고 할 때 EIP-55 체크섬을 적용하면 주소가 0x001d3F1ef827552Ae1114027BD3ECF1f086bA0F9로 바뀌게 됩니다.
구체적으로는 소문자 16진수 주소에서 0x 접두어를 빼고 Keccak-256 해시 알고리즘으로 암호화한 후 도출된 해시 값과 이더리움 주소를 비교하여 각각에 해당하는 값이 0x8 이상인 경우에 소문자를 대문자로 바꾸게 됩니다. 이러한 과정을 거쳐 대문자와 소문자가 혼합된 체크섬이 적용된 주소가 만들어지게 됩니다.
그렇다면 이것을 가지고 유효성을 어떻게 체크하는지 알아보도록 하겠습니다. 예를 들어 EIP-55가 적용된 이더리움 지갑이 있다고 할 때 다음 '0x001d3F1ef827552Ae1114027BD3ECF1f086bA0 F 9' 주소를 '0x001d3F1ef827552Ae1114027BD3ECF1f086bA0 E 9'로 잘못 입력한 상황을 가정하도록 하겠습니다.
이때 입력되는 주소가 '0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9'와 같이 대문자가 혼용된 지갑 주소가 아니라면 별도의 유효성 검사 없이 거래가 이루어지지만 위에서는 대문자가 혼용된 주소를 입력했으므로 유효성 검사가 진행됩니다.
이러한 유효성을 파악하는 것은 쉽습니다. 앞서 입력한 대소문자 혼합 주소의 경우 EIP-55가 적용된 것이므로 입력된 주소를 소문자로 변환한 다음에 앞서 살펴본 바와 같이 체크섬 해시를 계산하기만 하면 되기 때문입니다.
비록 입력된 주소에서 문자가 하나만 바뀌었다고 하지만 이것을 체크섬 해시로 계산하게 되면 입력된 주소를 기준으로 대문자로 바뀌어야 할 것이 소문자로 남아있거나, 소문자여야 할 것이 대문자로 바뀌었다는 것을 확인할 수 있으므로 주소가 유효한지 판단할 수 있게 되는 것입니다.
답변이 도움이 되길 바랍니다.