관리 메뉴

개발이야기

[마스터링 이더리움] Mastering Ethereum - Key, Addresses 본문

블록체인 /마스터링 이더리움

[마스터링 이더리움] Mastering Ethereum - Key, Addresses

안성주지몬 2018. 10. 19. 00:00

Keys, Addresses



데이터의 진위성을 증명하기 위해 전자서명을 이용하는데, 이는 이더리움 플랫폼에 있어서 중요합니다. 이더리움 플랫폼 및 노드간의 통신은 암호화되지 않으며 누구나 읽을 수 있어야  합니다. 이는 모두가 업데이트의 정확성을 확인하고, 합의할 수 있도록 하기 위함입니다.

이 장에서는 이더리움에서 사용되는 공개키 암호화를 설명합니다.


Introduction

이더리움에는 외부 소유 계정(EOA)와 계약 계정(CA)가 있습니다. 이번에는 외부 소유 계정에서 개인키를 사용하여 이더의 소유권을 설정하는 방법을 알아볼 것입니다. 개인키는 탈중앙화된 신뢰와 컨트롤, 그리고 소유권 증명을 가능하게 합니다.

EOA에 대한 이더 소유권은 개인키와 이더리움 주소, 디지털 서명을 통해 증명됩니다. 개인키는 본인만이 소유하여야 하고, 트랜잭션이나 블록체인에 저장되어서는 안됩니다. 주소와 디지털 서명만이 저장됩니다. 개인키를 통해 생성되는 디지털 서명을 통해 접근 권한 및 자금 통제가 이루어집니다. 이더리움 트랜잭션에는 유효한 디지털 서명이 블록체인에 포함되어야 합니다. 개인키의 복사본을 가지고 있다면 해당 계정에 대한 이더를 제어할 수 있습니다. 사용자가 개인키를 안전하게 보유한다면 이더리움 트랜잭션의 디지털 서명은 개인키의 소유권을 증명하여 자금의 실제 소유자를 증명할 수 있다.

이더리움의 공개키 기반 암호화 시스템에서는 개인키와 공개키로 구성된 쌍이 존재한다. 공개키는 계좌번호로 이해할 수 있고, 개인키는 PIN과 같이 이해할 수 있다. 개인키는 계정을 컨트롤하고, 공개키는 다른 사람들에게 계정을 구분할 수 있도록 해줍니다. 개인키는 대부분 암호화된 형태로 저장되고, 지갑으로 관리할 수 있다.

이더리움 트랜잭션에서 수신자는 주소로 표시됩니다. EOA를 위한 이더리움 주소는 공개키에서 생성됩니다. 하지만 모든 이더리움 주소가 공개키-개인키 쌍이 아니다.


공개키 암호화와 암호화

공개키 암호화는 고유 키를 사용하여 정보를 보호합니다. 이 계산은 역수로 갈 수 없는 타원곡선 함수를 기반으로 만들었습니다. 이를 사용하여 디지털 서명을 생성할 수 있습니다.

이더리움에서는 공개키 암호화를 사용하여 공개키와 개인키 쌍을 만듭니다. 이는 이더리움 계정에 대한 주소와 이더에 관한 접근, 그리고 스마트 컨트랙을 실행할 때 필요한 인증을 제공합니다. 개인키는 디지털 서명을 만들때 필요한 정보에 대한 제어 권한이다. 디지털 서명은 계정에서 이더를 사용하기 위해 트랜잭션에 서명할 때 필요하다. 또한 이더에 대한 소유권 및 컨트랙트 사용자를 인증하는데 사용한다.

디지털 서명으로 모든 메시지에 서명할 수 있다.( 메시지 : 트랜잭션 세부 정보) 이더리움 트랜잭션은 특정 이더리움 주소를 사용해 특정 계정에서 접근하는 것입니다. 이더를 송금하거나 스마트 컨트랙트를 사용하기 위해 트랜잭션을 생성할 때 이더리움 주소에 개인키로 생성된 디지털 서명을 함께 보내야 한다. 타원 곡선 함수로 디지털 서명이 트랜잭션 세부 정보와 이더리움 주소가 일치하는 지 확인할 수 있으므로 누구나 트랜잭션의 유효성을 검증할 수 있습니다. 이러한 검증에는 개인키가 필요하지 않지만, 해당 공개키에 해당하는 개인키의 소유주가 트랜잭션을 만들었다는 것에 대한 것은 검증할 수 있습니다.


개인키

개인키는 랜덤하게 선택된 숫자입니다. 개인키의 소유권과 컨트롤은 해당 이더리움 주소에 해당되는 자금의 제어와 해당 주소가 갖는 컨트랙트에 대한 접근을 관리합니다. 개인키는 자금의 소유권을 증명하여 이더를 사용하는데 필요한 서명을 만듭니다. 따라서 개인키를 공개하는 것은 컨트랙트와 이더에 대한 접근 권한을 공개하는 것이므로 비밀로 유지되어야 하고, 백업하여 개인키 손실에 대해 보호해야 합니다. 잃어버리면 복구할 수 없으며, 이더에 대한 소유권도 잃어버리게 된다.


난수에서 개인키 생성

개인키를 만드는 것은 1에서 2256사이의 숫자를 선택하는 것입니다. 해당 번호를 선택할 때에는 예측이 불가능하여야 하고, 결정적이지 않아야 합니다. 이더리움 소프트웨어는 난수 생성기를 사용하여 256개의 임의의 비트를 생성합니다. 정확한 숫자는 처음 38자리를 2256로 공유하여 타원 곡선 순서로 정의됩니다. 개인키를 만들 때 우리는 랜덤한 256비트를 선택하여 유효한 범위 안에 있는지 확인합니다.  프로그래밍 측면에서 Keccak-256이나 SHA256같은 해쉬 알고리즘을 통해서 256비트를 선택합니다. 결과가 유효한 범위 내에 있으면 개인키가 생성되고, 아니면 다시 시도합니다.

개인키 생성은 오프라인 작업입니다. 이더리움 네트워크에서 다른 사람과 소통할 필요가 없습니다.

256비트는 16진수인 64비트로 표현이 가능합니다.

ex) f8f8a2f43c8376ccb0871305060d7b27b0554d2cc72bccf41b2705608452f315



공개키

공개키는 타원 곡선에 있는 점으로 타원 곡선 방정식을 만족하는 x,y좌표의 집합입니다.

공개키는 결합된 두개의 숫자인데 이는 개인키로부터 단방향으로만 계산이 가능합니다.

K = k * G에서 k는 개인키, G는 생성점이고 K는 공개키입니다. *는 타원 곡선 곱하기 연산자로 일반적인 곱셈과 다릅니다. 타원 곡선은 단방향 함수이므로 k * G로 K를 구할 수는 있지만 K에서 G를 나누어 k를 구할 수는 없습니다.








타원 곡선 암호화 설명

타원 곡선 암호화는 타원 곡선의 점에 더하기와 곱셈으로 표현 되는 이산 대수 문제를 기반으로 한 비대칭 또는 공개키 암호화의 한 유형입니다.


타원 곡선의 시각화는 이더리움에서 사용된 것과 유사한 타원 곡선의 한 예입니다.

Tip : 이더리움은 비트코인에서 사용하는 것과 같은 secp256k1이라 불리는 타원 곡선을 사용합니다.


그림 : 타원 곡선의 시각화


이더리움은 NIST가 설정한 secp256k1 표준에 정의된 특정 타원 곡선과 수학 상수 집합을 사용합니다. secp256k1 곡선은 타원 곡선을 만드는 다음과 같은 함수로 정의됩니다.


\[\begin{equation} {y^2 = (x^3 + 7)}~\text{over}~(\mathbb{F}_p) \end{equation}\]

or \[\begin{equation} {y^2 \mod p = (x^3 + 7) \mod p} \end{equation}\]


The mod p (modulo prime number p)는 이 곡선이 p = 2^256 – 2^32 – 2^9 – 2^8 – 2^7 – 2^6 – 2^4 – 1인 \(\( \mathbb{F}_p \)\)라고 표기된 prime order p의 유한한 필드 위에 있음을 나타냅니다.


이 곡선은 실수 대신에 소수 차수의 유한 필드에서 정의되기 때문에 두개의 차원으로 흩어진 점들의 패턴처럼 보이기 때문에 시각화 하기 어렵습니다. 하지만 수학은 실수에 대한 타원 곡선의 수학과 동일합니다. 예를 들어 [ Elliptc curve cryptography : p = 17인 타원 곡선 F(p) 시각화는 격자에 점 패턴이 나타나 있는 소수 차수 17의 훨씬 더 작은 유한 필드 위에

있는 동일한 타원 곡선을 보여준다. ] -> 뭔소리인지 1도 모르겠음


Elliptc curve cryptography : p = 17인 타원 곡선 F(p) 시각화


예를 들어, 다음은 secp256k1 곡선상의 점인 좌표(x,y)가 있는 점 Q입니다.


 


파이썬을 사용하여 이 점이 타원 곡선에 있는지 확인하는 방법은 어떻게 너가 파이썬을 사용하는지 확인시켜줄 것이다. 변수 x와 y는 위와 같이 점 Q의 좌표입니다. [ 변수 p는 타원 곡선의 소수(모든 모듈 연산에 사용되는 소수)입니다. ] 파이썬의 마지막 줄은 타원 곡선 방정식입니다.(파이썬의 % 연산자는 모듈러 연산자입니다) x와 y가 타원 곡선의 한 점의 좌표인 경우 x와 y는 방정식을 만족하고 결과는 0입니다(0L은 값이 0인 긴 정수입니다). 명령창에 python을 입력하고 >>> 다음에 각 행을 복사하여 확인할 수 있습니다.


Example 1. 파이썬을 사용하여 타원 곡선에 점이 있는지 확인



 

타원 곡선 산술 연산

많은 타원 곡선 수학은 학교에서 배우는 정수 산술과 매우 흡사한데 특히 숫자 사이를 점프하는 대신에 곡선 상에 다른점으로 점프하는 더하기 연산자를 정의 할 수 있습니다. 또한 덧셈 연산자가 있으면 점과 정수의 곱셈을 정의할 수 있습니다.


타원 곡선 추가는 타원 곡선상의 점 P1과 P2가 주어졌을 때 P3 = P1 + P2가 타원 곡선 상에 존재한다는 것이다.


기하학적으로 이 세번째 점 P3는 P1과 P2사이의 선을 그려 계산됩니다. [ 이 선은 정확하게 하나의 추가적인 공간 안에서 타원 곡선과 교차합니다. ] 이 점을 P3’ = (x,y)로 나타냅니다. 그리고나서 P3 = (x, -y)를 얻기 위해 x축과 대칭 시킵니다.


만약 P1과 P2가 같은 점이라면 [ P1과 P2사이의 선은 P1점에 곡선에 대한 접선으로 확장되어야 합니다. ] 이 접선은 정확히 하나의 새로운 점에서 곡선을 교차합니다. 미적분 기법을 사용하여 접선의 기울기를 결정할 수 있습니다. [ 이 기법은 비록 우리가 두 개의 정수 좌표가 있는 곡선상에 점으로 관심을 제한할지라도 효과가 있습니다. ]


타원 곡선 수학에서는 대략 숫자 0의 역할에 해당하는 ‘무한대 점’이라는 점이 있습니다. [ 컴퓨터에서 때때로 x=y=0으로 표시되는 경우가 있습니다.( 타원 곡선 방정식을 만족하지는 않지만 쉽게 확인할 수 있습니다.) ] ‘무한대 점’의 필요성을 설명하기 위한 몇가지 특별한 예가 있습니다.


몇가지 경우에서( 예를 들어 P1과 P2가 동일한 x값을 갖지만, y값이 다른 경우) 선은 정확히 수직이 되며 이 경우에서 P3가 무한대 점이 됩니다.


만약 P1이 ‘무한대 점’이라면 P1 + P2 = P2입니다. 유사하게 P2가 ‘무한대 점’이면 P1 + P2 = P1입니다. 이는 무한대점이 산술 연산에서 0으로 계산 되는 것을 확인할 수 있습니다.


+는 (A + B) + C = A + (B + C)의 예처럼 계산식이 부분의 순서와 상관없이 동일한 결과가 나옵니다. 즉 괄호 없이 A + B + C를 쓸 수 있습니다.


addition을 정의 했기 때문에 addition을 확장하는 표준 방식으로 곱셈을 정의할 수 있습니다.

타원 곡선상의 점 P에 대해서 만약 k가 정수고 k * P = P + P + P + …​ + P (k times)라면 이 경우에서 k는 종종 지수라고 불립니다.  

공개 키 생성

무작위로 생성 된 숫자 k의 형태로 개인키와 곡선에 있는 생성자 점 G를 곱하여 곡선상의 또 다른 점인 공개키를 생성할 수 있습니다. [ 생성자 점은 secp256k1 표준의 일부로 지정되며 secp256k1의 모든 구현에 대해 동일하며 해당 곡선에서 파생 된 모든 키는 동일한 점 G를 사용합니다. ]




\[\begin{equation} {K = k * G} \end{equation}\]

여기서 k는 개인 키, G는 생성자 점, K는 곡선의 한 점인 공개 키입니다. 생성자 점(G)은 항상 모든 이더리움 사용자에게 동일하기 때문에 G와 곱해진 개인 키 (k)는 항상 동일한 결과의 공개 키 K를 생성할 것이다. k와 K 사이의 관계가 고정되어있지만 오직 k에서 K로의 한 방향으로만 계산될 수 있습니다. 따라서 공개 키(K)에서 파생된 이더리움 주소는 모든 사람과 공유할 수 있지만 사용자의 개인 키(k)는 공개하지 않습니다.


타원 곡선 산술 연산에서 설명한 것 처럼 k * G의 곱셈은 반복되는 덧셈과 동일한 결과이기 때문에 G + G + G + …​ + G가 k번 반복됩니다. 요약하자면 개인 키(k)로 부터 공개 키(K)를 생성하기 위해 생성자 점(G)를 k번 더해줍니다.


Tip  

개인 키는 공개키로 변환될 수 있지만, 한 방향으로만 계산될 수 있기때문에 공개키는 다시 개인키로 변환될 수 없습니다.


이제 위에서 설명한 계산을 가지고 개인키로 공개키를 찾아보자


공개 키 계산에 대한 개인 키 예제



암호화 라이브러리는 타원 곡선 곱셈을 사용하여 K를 계산하는데 도움을 줍니다. 그 결과 공캐 키(K)는 point K = (x,y)로 정의됩니다.


예제 개인 키로부터 계산 된 공개 키

 

이더리움에서는 공개 키가 130개의 16진수(65바이트)로 직렬화돼있습니다.

이는 SEC에서 제안한 표준 직렬화 형식에서 채택되었으며 Standards for Efficient Cryptography (SEC1)에 문서화되어 있습니다. 이 표준은 타원 곡선 상의 점을 식별하기 위해 사용되는 4가지의 접두어를 정의합니다.

이더리움은 압축되지 않은 공개 키만을 사용하기 때문에, 유일한 접두어는 0x04입니다. 직렬화는 공개 키의 x 및 y좌표를 연결합니다.


따라서 개인키로 부터 계산된 공개키 예제에서 살펴 봤던 예들은 다음과 같이 직렬화됩니다.


 

타원 곡선 라이브러리

cryptocurrency 관련 프로젝트에서 사용되는 secp256k1 타원 곡선의 몇 가지 구현이 있습니다.


OpenSSL

OpenSSL 라이브러리는 secp256k1의 전체 구현을 포함하여 종합적인 암호화 기본 세트를 제공합니다. 예를 들어 공개 키를 파생하려면 EC_POINT_mul () 함수를 사용할 수 있습니다. https://www.openssl.org/ 에서 찾으십시오.


libsecp256k1

비트코인 코어 libsecp256k1은 secp256k1 타원 곡선 및 기타 암호화 기본 요소의 C-언어 구현입니다. 타원 곡선 암호화의 libsecp256k1은 비트코인 코어 소프트웨어에서 OpenSSL을 대체하기 위해 만들어 졌으며 성능과 보안면에서 모두 뛰어나다. https://github.com/bitcoin-core/secp256k1 에서 찾으십시오




Cryptographic hash functions

암호학적 해시 함수는 이더리움 내내 사용된다. 사실, 해시함수는 거의 대부분 암호학 시스템에서 많이 사용되며, “부호화 알고리즘보다 더 많이, one-way 해시 함수는 현대 암호학의 일말이다”라고 말한 암호학자 Bruce Schneier에 의한 사실이다.


이 장에서 해시 함수에 대해 토론하고, 기초적인 특성을 보고, 그 특성들이 현대 암호학의 많은 분야에서 어떻게 유용한지 볼 것이다. 우리는 여기서 해시 함수에 대해 설명하는 데, 그 이유는 이더리움 공공 키들이 주소로 이동하는 것의 부분이기 때문이다. 그들은 또한 데이터의 검증을 목표로하는 디지털 지문을 생성하는 데 사용된다.


단순히 용어에서, “해시 함수는 임의의 사이즈 데이터를 고정 사이즈로 매핑하는 데 사용되는 어떤 함수이다”. 해시 함수에서 input은  원상, 메시지, 또는 단순히 input 데이터라고 불린다.

output은 해시라고 불린다. 해시 함수의 특별한 부분카테고리는 이더리움과 같은 안전한 플랫폼에 유용한 특성을 가진 암호학적 해시 함수이다.


암호학적 해시 함수는 임의의 사이즈의 데이터를 고정된 사이즈 비트스트링으로 매핑하는 one-way 함수이다. “one-way”는 output 해시를 알면 input 데이터 재생성이 불가하는 것을 의미한다. input를 결정하는 단 한 가지 방법은 output를 매칭하는 후보자를 각각 확인하는 브루트-포스 탐색을 하는 것이다; 탐색공간이 가상적으로 무한하다고 고려하면, 작업의 실제 불가능성을 이해하기는 쉽다. 너가 매칭 해시를 생성하는 몇 개의 input 데이터를 찾았다고 해도, 그것이 원래 input 데이터는 아닐 것이다: 해시 함수는 “다대일” 함수이다. 같은 output으로 해시하는 input 데이터의 두 집합을 찾는 것을 “해시 충돌”을 찾았다고 부른다. 대략적으로, 더 나은 해시 함수일수록, 해시 충돌은 드물 것이다. 이더리움에서 해시 충돌은 불가능하다.


암호학적 해시 함수들은 5가지 메인 특성을 가지고 있다:

- 결정론: 주어진 input 메시지는 늘 같은 해시 output를 생성한다.

- 검증가능성: 메시지의 해시를 계산하는 것은 효율적이다(선형적 복잡성)

- 비상관: 메시지에 작은 변화는 해시 output를 크게 바꿔서 원래 메시지의 해시와 상관이 없을 것이다.

- 불가역성: 메시지 해시로부터 메시지를 계산하는 것은 실행 불가이며, 모든 가능성있는 메시지를 통해 브루트-포스 탐색을 하는 것과 동등하다

- 충돌 보호: 서로 다른 두 입력에서 같은 해시 output값이 나오는 것을 방지한다.


해시 충돌에 대한 저항성은 이더리움에서 디지털 서명 위조를 피하는 데 중요하다.

이러한 특성들의 결합은 암호학적 해시 함수가 아래와 같은 보안 어플리케이션의 넓은 범위에 유용하게 만들어준다:

- 데이터 지문

- 메시지 무결성(에러 보호)

- Proof-of-Work

- 증명(비밀번호 해싱 그리고 키 스트레칭)

- 유사-랜덤 숫자 생성기

- 메시지 약속

- 유일한 신원



Ethereum’s cryptographic hash function - Keccak-256

이더리움은 많은 곳에서 Keccak-256 암호 해시 함수를 사용한다. Keccak-256은 National Institute of Science and Technology(NIST)에 의해 2007년도에 열린 SHA-3 암호학적 해시 함수 대회에서 후보자로 설계되었다. Keccak은 우승 알고리즘이 되어 Federal Information Processing Standard(FIPS) 202로써 2015년에 표준화되었다.


그러나, 이더리움이 개발되는 기간동안, NIST 표준화는 아직 확정되지 않았다. NIST는 표준 진행, 이른 바 효율성을 증가시키는 것을 완성한 이후에 Keccak의 몇 개의 매개변수들을 바로 잡았다. 내부고발자인 Edward Snowden은 Dual_EC_DRBG 랜덤 생성기 표준에 백도어 바이러스를 위치시켜 의도적으로 약화시키려는 국가 보안 기관에 의해 부적절하게 영향받았다는 문서를 공개하면서 발생했다. 이러한 논쟁의 결과는 SHA-3의 표준화에 큰 지연과 제안된 변화에 대한 반발이였다. 동시에, 이더리움 재단은 개발자가 제안해서 NIST에 의해 수정된 SHA-3 표준보다는 원래의 Keccak 알고리즘을 구현하기로 결정하였다.


이더리움에서 사용되는 해시함수(Keccak-256)과 확정된 표준(FIPS-202 SHA-3)사이에 차이점에 의해 만들어진 혼란 때문에, 모든 코드, 연산 부호, 라이브러리에 있는 sha3 사례를 keccak256으로 이름을 바꾸는 노력이 있었다.


Which hash function am I using?

당신이 사용하고 있는 소프트웨어 라이브러리가 FIPS-202 SHA-3이나 Keccak-256이거나 둘 다 “SHA-3”이라고 불렸다면 어떻게 말할 것인가?


말하기 쉬운 방법은 주어진 input에 대한 기대 output값인 테스트 벡터를 사용하는 것이다. 해시 함수에 주로 사용되는 테스트는 빈 input이다. 만약 당신이 빈 스트링을 input으로 사용해 해시 함수를 사용한다면 다음과 같은 결과를 볼 것이다.

Keccak256("") =
c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

SHA3("") =
a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

-> 당신이 사용하고 있는 SHA-3 라이브러리가 Keccak-256인지 FIPS-202 SHA-3인지 테스트


어떤 함수가 호출되었는 지에 상관없이, 당신은 위에 단순한 테스트를 실행하면서 이것이 원래 Keccak-256인지 최종 NIST 표준 FIPS-202 SHA-3인지 확인할 수 있다. Keccak-256이 종종 코드에서 SHA-3으로 불려도 이더리움은 Keccak-256를 사용하는 것을 기억해라.


다음으로, 이제 공공 키로부터 이더리움 주소를 생성하는 이더리움 상에서 Keccak-256의 첫 어플리케이션을 설명해보겠다.



  • Ethereum address

- 공개키를 Keccak-256을 사용하여 해시 계산

- 계산된 주소의 마지막 20바이트만 유지

- 16진수로 인코딩된 접두어0x가 주소 앞에 표시


  • Ethereum address format

-Ethereum 주소는 16 진수이며 공개 키의 Keccak-256 해시의 마지막 20 바이트에서 파생 된 식별자이다.

- bitcoin과 달리 체크섬이 없다


  • ICAP

- IBAN의 국제 공용 계좌번호의 형식

- 이더리움과 직접적인 국제계좌 연계를 염두에 두고 추가 도입한 형식

- IBAN이란?

-> 은행 계좌 번호를 식별하기 위한 국제 표준, 주로 은행 송금에 사용

-> 국가코드, 체크섬 및 은행 계좌 식별자를 포함하는 최대 34개의 영숫자(대소문자 구분X)로 구성된 문자열로 구성

- 이더리움을 나타내는 비표준 국가 코드 ‘XE’를 도입하여 동일하게 사용


Direct

코드가 30자이고 하나의 필드로 구성. 하나 이상의 0으로 시작하는 주소에서만 작동

Basic

Direct인코딩과 동일하지만 코드가 31자이다. IBAN필드 유효성 검사와 호환되지 않음

indirect

읽을 수 있는 9자의 이름 (예 : KITTYCATS)을 포함하는 16 개의 영숫자를 사용

(예 : XE ## ETHXREGKITTYCATS )(=20 자 길이),여기서 "##"는 두 개의 계산 된 체크섬 문자로 바뀌어야한다


** helpeth 사용하여 ICAP주소 만들기


$ helpeth keyDetails -p 0xf8f8a2f43c8376ccb0871305060d7b27b0554d2cc72bccf41b2705608452f315

주소 : 0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9
주소 (체크섬) : 0x001d3F1ef827552Ae1114027BD3ECF1f086bA0F9
ICAP : XE60 하미 CDXS V5QX VJA7 TJW4 7Q9C HWKJ D

-예제 Ethereum 주소는 0 바이트로 시작되기 때문에 IBAN 형식으로 유효한 "Direct"ICAP 인코딩 방법을 사용하여 인코딩 할 수 있습니다

-주소가 0으로 시작하지 않으면 "기본"인코딩으로 인코딩됩니다. 길이는 35 자이고 IBAN은 유효하지 않습니다.


  • 체크섬 (EIP-55)으로 16 진수 인코딩

-EIP-55는 16 진수 주소의 대소문자를 수정하여 Ethereum 주소에 대해 이전 버전과 호환되는 체크섬을 제공

- 이더리움 주소는 대소문자를 구별하지 않으며, 모든지갑은 대소문자 구분없이 주소를 해석해야한다

- 이더리움 주소의 알파벳 문자의 대소문자를 수정함으로써  체크섬 전달 가능


예)

- 이더리움  주소

0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9

- EIP-55 사용한 주소

0x001d3F1ef827552Ae1114027BD3ECF1f086bA0F9


- 인코딩되는 과정

  1. 0x 접두어없이 소문자 주소를 해시

Keccak256 ( "001d3f1ef827552ae1114027bd3ecf1f086ba0f9")
23a69c1653e4ebbb619b0b2cb8a9bad49892a8b9695d9a19d8f673ca991deae1

  1. 해시의 해당 16 진수가 0x8 이상인 경우 각 알파벳 문자를 대문자 변환

주소 : 001d3f1ef827552ae1114027bd3ecf1f086ba0f9
해시 : 23a69c1653e4ebbb619b0b2cb8a9bad49892a8b9 ..

-> 주소의 4번째 위치에 알파벳 d. 해시의 4번째 문자는 8보다 작으므로 소문자로 남겨둠. 6번째 위치에 알파벳 f. 해시의 6번째 문자는 c이므로 8보다 크다. 따라서 대문자로 변환.


결과 : 0x001d3F1ef827552Ae1114027BD3ECF1f086bA0F9


EIP-55로 인코딩 된 주소의 오류 감지

이더리움 주소

0x001d3F1ef827552Ae1114027BD3ECF1f086bA0F9

잘못 읽은 주소

0x001d3F1ef827552Ae1114027BD3ECF1f086bA0E9


대소문자가 혼용된것을 확인하고 주소의 유효성 검사. 소문자로 변환하고 체크섬 해시 계산

Keccak256 ( "001d3f1ef827552ae1114027bd3ecf1f086ba0e9")
5429b5d9460122fb4b11af9cb88b7bb76d8928862e0a57d46dd18dd8e08a6927

⇒ 주소가 한문자씩 변경 되더라도 주소의 해시가 급격히 바뀜





Comments