beeimp
BeeImp
beeimp
전체 방문자
오늘
어제
  • 분류 전체보기 (110)
    • Program_Language (17)
      • Python (13)
      • Go (0)
      • JavaScript (4)
      • TypeScript (0)
      • Rust (0)
      • Solidity (0)
    • OS (8)
      • UNIX&LINUX (7)
      • Windows (0)
      • MacOS (1)
    • Front-End (19)
      • Svelte (19)
      • React (0)
    • Blockchain (6)
      • Bitcoin (0)
      • Ethereum (1)
      • Klaytn (0)
      • Project (5)
    • Data Structure&Algorithm (11)
      • Greedy (7)
      • Dynamic Programming (1)
      • Sort (0)
      • DFS & BFS (2)
      • Recursive (1)
    • Security (0)
      • SDP (0)
      • Authentication (0)
    • Network (3)
      • OpenWrt (0)
      • SDN&NFV (1)
    • Git (5)
    • IT_News (0)
    • 베타 학습단 (12)
      • SQL (12)
    • Project (1)
    • Issues (1)
    • Reviews (3)
    • I Learned (23)
      • TIL (23)
      • WIL (0)
    • Other (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • jenkins
  • Nest.js
  • mysql
  • 탐욕법
  • PYTHON
  • Git
  • typescript
  • 기초
  • github
  • Docker
  • Ethereum
  • sql
  • 블록체인
  • react
  • blockchain
  • solidity
  • ubuntu
  • javascript
  • svelte
  • greedy

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
beeimp

BeeImp

왜 지갑 주소에는 대소문자가 들어갈까?
Blockchain/Ethereum

왜 지갑 주소에는 대소문자가 들어갈까?

2022. 8. 29. 20:52

왜 지갑 주소에는 대소문자가 들어갈까?

상황

  • 이더리움 초창기에는 소문자만 사용하여 주소를 생성했었는데, 잘못된 주소를 입력하여 송금하는 사고가 종종 발생했다.

문제

  • 이러한 경우 회수가 현실적으로 불가능하여 주소 입력 오류 확인이 필요했다.

해결

  • 2016년에 도입된 EIP-55를 통해 주소 오류를 99.9853% 감지
  • EIP-55는 주소의 대소문자 형태로 인코딩해 주는 방식으로 checksum한다.
  • checksum은 prefix인 0x를 뗀 소문자를 사용해서 표현한 주소의 해시값이 역할을 수행한다.

방법

'''EIP-55 Code'''
import eth_utils

def checksum_encode(addr): # Takes a 20-byte binary address as input
    hex_addr = addr.hex()
    checksummed_buffer = ""

    # Treat the hex address as ascii/utf-8 for keccak256 hashing
    hashed_address = eth_utils.keccak(text=hex_addr).hex()

    # Iterate over each character in the hex address
    for nibble_index, character in enumerate(hex_addr):

        if character in "0123456789":
            # We can't upper-case the decimal digits
            checksummed_buffer += character
        elif character in "abcdef":
            # Check if the corresponding hex digit (nibble) in the hash is 8 or higher
            hashed_address_nibble = int(hashed_address[nibble_index], 16)
            if hashed_address_nibble > 7:
                checksummed_buffer += character.upper()
            else:
                checksummed_buffer += character
        else:
            raise eth_utils.ValidationError(
                f"Unrecognized hex character {character!r} at position {nibble_index}"
            )

    return "0x" + checksummed_buffer

def test(addr_str):
    addr_bytes = eth_utils.to_bytes(hexstr=addr_str)
    checksum_encoded = checksum_encode(addr_bytes)
    assert checksum_encoded == addr_str, f"{checksum_encoded} != expected {addr_str}"

test("0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed")
test("0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359")
test("0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB")
test("0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb")
  1. 소문자만을 사용하는 이더리움 주소의 해시값을 구한다.
  2. 이더리움 주소와 해시값을 왼쪽부터 하나씩 확인하면서 다음과 같을 경우 대문자로 수정한다.
    • 이더리움 주소가 0xa 이상
    • 해시값이 0x8 이상인 경우
  3. 입력 오류가 있을 경우 위와같은 checksum 인코딩에서 미스매치가 발생하여 오류를 쉽게 검출할 수 있다.

결론

  • EIP-55를 통해 지갑 주소의 무결성을 보호하기 위해 대소문자를 사용한다.

    티스토리툴바