마스터링 이더리움을 개인적으로 정리한 글입니다. 누락된 내용이 있을 수 있으며 잘못된 해석이 있을 수 있습니다.
포스트에 문제가 있다면 언제든지 댓글 부탁드립니다. :)
키와 주소
이더리움의 두가지 유형의 계정
- 외부소유계정 EOA
- 컨트랙트 계정 CA
EOA의 이더 소유권 확립은 개인키, 이더리움 주소, 디지털 서명을 통해 이루어진다.
💡 개인키는 네트워크로 전달되는 메세지에 나타나지 않으며 체인에 저장되지 않는다. 계정주소와 디지털 서명만이 이더리움 시스템에 전송된다.
개인키에서 만들어진 디지털 서명을 통해 자금의 접근 통제가 이루어진다.
⇒ 즉, 디지털 서명이 개인키의 소유권을 증명한다.
공개키 암호화 기반 시스템 → 개인키와 공개키로 구성된쌍으로 제공
- 개인키 → 제어권 제공
- 공개키 → 계정 식별
공개키 암호화와 암호화폐
공개키 암호화는 고유한 키를 사용하여 정보를 보호한다. 이 키는 특수한 속성을 가진 수학함수를 바탕으로 하며, 이 함수를 바탕으로 암호화는 디지털 비밀과 위조불가능한 디지털 서명을 만들수있다. 이것은 수학 법칙에 의해 보장받는다.
트랩도어함수
어떤 큰 숫자를 만들기 위해 알고 있는 두 소인수를 곱하는건 쉽지만 어떤 큰 숫자가 주어진 상태에서 어떠한 정보도 알려주지 않고 두 소인수 모두를 구하는것은 어려운 일이다.
→ 이렇게 단방향으로만 연산 가능한 함수를 트랩도어함수라고 한다.
이더리움에 사용되는 개인키와 서명의 기초는 타원곡선 암호화에서 비롯된다.
이산 로그 문제
이산 로그 문제(Discrete Logarithm Problem, DLP)는 $a^x=b$를 계산하는 것은 쉽지만 $x=log_{a}b$를 만족하는 $x$를 구하기는 어렵다는 것에서 나온 문제
이더리움 트랜잭션
→ 암호수학은 메세지(트랜잭션 세부사항)를 개인키와 결합 → 코드 = 디지털서명
⇒ 디지털 서명 = 암호수학(메세지, 개인키)
이더리움 트랜잭션은 디지털 서명과 함께 보내지며 특정계정에 접근하는 요청이다.
💡 타원곡선수학은 정보를 확인하여 누구나 트랜잭션이 유효한지 확인가능하게 한다.
개인키
- 이더리움 상호작용의 핵심
- 단순히 무작위로 선택한 숫자
- 공개키-개인키 쌍 생성 → 주소 생성
- 모든 인증에대한 사적제어권 제공
- 디지털 서명 생성에 사용 → 소유자임을 인증
난수로 개인키 생성
- 엔트로피(무작위성 확보) 256 비트보다 더 큰 숫자 추출 (사용자 행동에서 난수를 추출할 수 있다.📌 https://www.bitaddress.org/bitaddress.org-v3.3.0-SHA256-dec17c07685e1870960903d8f58090475b25af946fe95a734f88408cef4aa194.html)
- 256비트 해시알고리즘(SHA-256, keccak-256) 사용하여 1번에서 추출한 난수를 넣는다.
- 해시 알고리즘 결과값이 2^256 범위내에 유효하면 개인키로 사용가능하다.
💡 개인키 생성은 오프라인 프로세스이다.
공개키
이더리움 공개키는 타원곡선위의 점으로 타원곡선 방정식을 만족하는 x와 y좌표의 집합이다.
💡 개인키로부터 타원곡선곱셈을 사용하여 공개키 계산은 가능하지만 이의 역산은 불가능하다.
타원곡선 산술연산
📌타원곡선 산술연산에 대한 좋은 자료!📌
타원 곡선 공개키 암호
본 글은 한기대 박승철 교수님의 타원 곡선 암호 강의를 듣고 정리한 내용입니다.현재까지 공개키 암호는 주로 RSA나 DH를 많이 사용해왔다. 최근에 들어서는 ECC(타원곡선 암호)를 많이 사용한다.
velog.io
[번역] 비트코인 key에 쓰이는 타원 곡선 암호화에 대해 알아보자 - 2부 ( 부제 : ECC 파헤치기 ) — Steemit
[번역] 비트코인 key에 쓰이는 타원 곡선 암호화에 대해 알아보자 - 2부 ( 부제 : ECC 파헤치기 ) — S
안녕하세요. ICOREPORT에 @sanghyun 입니다. 비트코인에는 여러 방법의 암호화가 사용됩니다. 그 중에서 키 값들을 암호화 시키는 방법인 타원 곡선 암호화에 대해 글을 써보도록 하겠습니다. 본 자료
steemit.com
너무 어렵다면 2번째 링크에서 나온 설명과 같이 “당구공의 시작 위치와 마지막 위치만을 보고 몇번 튕겼을까요?”를 구하는 문제라고 생각하자!
→ 이 질문의 답을 내는 난이도 만큼의 어려운 수학연산으로 암호화 되어있다고 생각하자!
공개키생성
K를 k*G를 통하여 계산하는것은 쉽지만 k를 K/G를 통하여 계산하는것은 어렵다.
이때 G는 고정되어있다. 즉, k와 K의 관계는 항상 정해져있고 k에서 K까지 한방향으로만 계산 가능하다.
타원곡선 라이브러리
- openSSL
- libsecp256k1 → openSSL보다 뛰어난 성능
암호화 해시함수
해시함수 : 임의 크기의 데이터를 고정된 데이터로 매핑하는데 사용할 수 있는 모든 함수
- 단방향함수 → 해시값을 안 상태에서 입력 값을 아는것은 불가능 → 무차별 대입을 해야한다.
- 일부 입력 값을 안다고해서 원본 입력 데이터가 아닐수있다. → 다대일함수이기 때문이다.
- → 해시충돌이 일어날수있지만 이더리움은 불가능→ 디지털 서명위조를 피하기위해 중요
암호화 해시 함수 속성
- 결정론 : 항상동일한 결과를 생성
- 검증성 : 해시 계산은 효율적
- 비상관성 : 원본과 해시는 전혀 상관이 없다.
- 비가역성 : 해시로부터 원본을 계산하는건 불가능
- 충돌방지 : 같은 해시결과를 생성하는 2개의 서로 다른 원본을 계산하는것은 불가능
암호화 해시 기능 활용 예시
- 데이터 핑거 프린팅
- 메세지 무결성
- 작업증명
- 인증
- 의사 난수 생성기
- 메세지 커밋
- 고유식별자
이더리움의 암호화 해시 함수 Keccak-256
Keccak-256과 SHA-3는 같은 입력값에 대해 다른 출력값을 만들어낸다.
이더리움 주소
이더리움 주소 : Keccak-256 단방향 해시 함수를 사용하는 공개키 또는 컨트랙트에서 파생한 고유 식별자
- 16진수
- 공개키 Keccak-256 해시의 마지막 20바이트에서 파생한 식별자
이더리움 주소가 만들어지는 과정
- 우선 엔트로피 즉, 무작위성을 사용해서 개인키를 생성
- 생성된 개인키를 가지고 타원곡선곱셈을 활용하여 공개키를 생성
- 생성된 공개키를 가지고 Keccak-256을 사용하여 공개키의 해시를 계산
- 해시값에서 마지막 20바이트만 유지하고 접두어 0x를 붙인다. ⇒ 주소 완성!
이더리움 주소 형식
📖 체크섬 : 네트워크를 통해 전달된 값이 변경 되었는지를 검사하는 값으로 무결성을 제공한다
비트코인 주소는 체크섬을 포함한 주소를 가지고 있지만 이더리움 주소는 체크섬이 없는 원시 16진수이다.
클라이언트 주소 상호교환 프로토콜 (ICAP)
- ICAP은 국제은행 계좌번호 인코딩과 호환되는 이더리움 주소 인코딩이다.
- 이더리움 주소에 대해 다목적 체크섬가능하며 상호운용 가능한 인코딩 제공을 제공한다.
- ICAP 주소는 이름 레지스트리에 등록한 일반 이름 또는 이더리움 주소를 인코딩 가능하다.
대문자로 16진수 인코딩된 체크섬(EIP-55)
ICAP와 네임서비스의 느린배포로 인해 EIP에서 새로운 표준을 제시
EIP-55
ERC-55: Mixed-case checksum address encoding
ERC-55: Mixed-case checksum address encoding
eips.ethereum.org
16진수 주소의 대소문자를 수정하여 이더리움 주소에 대해 이전 버전과 호환되는 체크섬을 제공한다. 이더리움 주소는 대소문자를 구분하지 않으며 모든 지갑은 해석의 차이없이 대문자 또는 소문자로 표현된 이더리움 주소를 수용해야한다는 것이다.
주소의 알파벳 대소문자를 수정 → 입력의 무결성 제공하는 체크섬 전달가능!
EIP-55 혼합 대문자 체크섬 사용 전
EIP-55 혼합 대문자 체크섬 사용 후
→ 일부 알파벳 (A~F) 문자가 대문자로 변한것을 확인 가능
EIP-55 구현
1. 0x 접두어 없이 소문자 주소를 해시 처리한다.
2. 해시의 해당 16진수가 0x8 이상인 경우 각 알파벳 문자를 대문자로 만들어라. 주소와 해시를 정렬하면 표시하기가 더 쉽다.
체크섬 적용 전
체크섬 적용 후
EIP-55로 인코딩된 주소의 오류감지
1. 맨뒤에서 두번째 F → E로 잘못보냈다고 가정
2. 잘못보낸 주소를 수신자가 소문자로 전부 변경후 해시화
3. 수신자가 EIP-55에 맞게 해시화 되었는지 확인 ⇒ 규칙이 맞지 않다면 잘못된 주소라는것을 인지!
'⛓️ Web3' 카테고리의 다른 글
솔리디티 문해력 특강_5강 (1) | 2023.09.19 |
---|---|
솔리디티 문해력 특강_4강 (0) | 2023.09.17 |
마스터링 이더리움_Ch.3 이더리움 클라이언트 (0) | 2023.09.12 |
마스터링 이더리움_Ch.2 이더리움 기초 (0) | 2023.09.10 |
마스터링 이더리움_Ch.1 이더리움이란 무엇인가? (0) | 2023.09.09 |