2019년 10월 31일 목요일

블록체인 이야기 - 해시함수, 작업증명, 해시캐시, 비트코인

해시함수

정방향 계산은 쉬우나 역방향 계산은 매우 어려움

특징

  • SHA1 → 160 bits
  • SHA2 → 256 bits
  • 입력 값이 조금만 달라져도 완전히 다른 값이 나온다.
  • 가능성은 낮지만, 입력값이 다른데 같은 결과가 나오는 경우도 있음 : 해시충돌
    • 입력값의 범위는 무한하지만 출력값은 항상 160비트가 나온다면 당연한 결과
  • 데이터 진품 보증에 활용
  • 다운로드 시그니쳐 - KEYS, ASC, MD5, SHA256


작업증명(Proof-of-work)

  • 해시 함수에서 결과로 부터 입력을 알아내는 것은 현실적으로 불가능
  • 하지만, 대입법으로 찾을 수 있음 (가능한 입력 값을 모두 대입해 출력을 산출)
  • 하지만, 찾아야 하는 값의 범위를 넓혀준다면?
  • 총 160비트의 수에서 10진수 127(01111111) 이하의 수를 찾는다고 가정해보자.
  • 0~127 -> 128배로 쉬워짐
  • X->Y = 100 (1 / 2^160 )
  • X->Y = 99 or 100 ( 2 / 2 ^ 160) -> 2배 쉬워짐
  • X->Y = 0000….0000 1111111 -> 2^153

간단한 예

  • 전체 비트수가 8일 때, 앞 다섯 자리가 0인 예
  • 앞의 다섯 자리가 0으로 고정되고 나머지 자리가 모두 1인 경우 나올 수 있는 가장 큰 값은 1이다.
  • 00000111 = 7
  • 앞의 다섯 자리가 0 이면 항상 00000111 보다 같거나 작다.
  • 즉, Hash(X) ≤ 00000111인 X는 항상 앞의 다섯 자리가 0이다.

작업증명의 아이디어 - 해시캐시(Hashcash)

  • 10년 전 스팸메일 거르기
  • 스팸메일 보내는 비용은 매우 싸고 대량 발송 가능, 누구든 걸려들면 이득
  • 하지만 이메일을 보낼 때 한 사람당 1초 정도 걸린다면?
  • 보내는 사람이 메일을 보내기 위해 노력을 했다는 증거 - 작업의 증명 -을 함께 보냄
  • 메일 헤더 X-Hashcash
  • 버전:비트수:날짜:수신자주소:랜덤값:카운터값
  • 발송자 카운터 값을 바꿔 가며 해시함수로 계산해서 앞의 20자리가 0으로 시작할 때 까지…
  • 수신자는 간단히 앞의 20자리가 0으로 시작하는지만 확인
  • 97년도에는 이작업을 하는데 컴퓨팅 파워가 1초 정도 걸렸다고 함
  • 메일을 보내기 위한 노력!


비트코인과 블록체인

화폐란 무엇인가?

  • 신뢰
  • 시간이 지날 수록 발행하면 할 수록 가치가 떨어지는 것
  • 은행 = 국가가 보증하는 기관
    • 고객의 믿음이 생명
    • 거래원장(ledger)의 정확성
  • 누구나 믿을 수 있는 하나의 거래원장이 있으면 은행 대체 가능
    • 금, 부동산, 이력, 근무기록, 게임머니, 작업기록 등등
  • 국가를 믿지 못하면 화폐가치가 폭락
    • 국가가 마구 찍어서 발행한 화폐는 빵 보다 못함
    • 아프리카 짐바브웨 2000년대 후반 물가가 일년에 백만 배 이상 오르는 하이퍼 인플레이션
    • 빵하나에 수십억
  • 로마가 멸망한 이유? - 금화, 은화 -> 불순물 섞으면서 유통량 늘림
  • 일본 에도시대 종말 - 위에서 한 발 더 나아가서 금 은 비율 조정


비트코인

  • 최초의 실물 거래 사례 : 1만 BTC for 피자 두판 (2010년)
  • 현재 가치 : 약 8000달러(18년 2월)
    • 여러 사람에게 보급 되어 신뢰를 얻으면 무형의 재산도 실물의 가치를 가지게 된다
    • 결국 국가가 보증하기 때문에 신뢰하는 화폐와 비슷한 개념
  • 신뢰를 얻게 된 핵심 -> 블록체인 기술
    • 해시의 원리로 진품 확인 및 작업 보증


해시캐시 구조



블록체인 블록 구조



SHA256

  • 1990년 말 해시캐시는 SHA-160 사용
    • 앞자리 20비트가 0이면 정상적인 카운터값
  • 이제는 어려운게 아님
  • SHA-256
    • 앞자리가 40비트! (40비트는 만고불변은 아님)


블록헤더만 해시

  • 블록 내용 전체를 포함해서 Nonce를 찾아내면 계산량이 많아지니 실 사용에 적합하지 않음.
  • 블록 헤더에 블록의 내용을 해시한 값을 이용


실제 블록체인 구조