블록체인 삽질

MONA·2024년 2월 29일

나혼공

목록 보기
8/92

비트코인 블록체인의 기본 원리

블록체인의 개요

  1. 비트코인
    cyberpunk 운동의 산물. 인터넷상에서 다수의 사람들에게 신뢰받는 탈중앙형 화폐
    비트코인을 기반으로 블록체인 기술 발달.
    이더리움에서 사용하는 화폐를 이더 라고 함.
    P2P 네트워크를 통해 관리되는 분산 데이터베이스의 한 형태. 블록체인 노드에 디지털 서명된 거래 정보를 보관하는 분산원장기술.

  2. 비트코인의 동작 원리

    1. 누군가 트랜젝션을 만들어 요청한다
    2. 트랜젝션을 요청 받은 노드는 트랜젝션의 유효성을 검증한다
    3. 유효한 트랜젝션이 블록체인의 P2P 네트워크에 전파된다
    4. 블록 생성자는 블록 생성의 규칙을 준수하며, 검증된 트랜젝션을 포함하는 새 블록을 생성한다
    5. 생성된 새로운 블록이 P2P 네트워크에 전파된다
    6. 기존 블록에 새로운 블록이 연결되며 트랜젝션이 처리된다.

비트코인의 탄생

  • 사토시 나카모토란 가명으로 암호화 커뮤니티에 발송된 논문. "비트코인:P2P 전자 캐시 시스템"은 2009년 1월 3일 실제로 구현되어 최초의 블록인 제네시스 블록이 생성됨. 이후 10분에 하나 꼴로 꾸준히 블록은 생성되고 있다.

비트코인의 최대 생산량-2,100만 비트코인

  • 비트코인은 블록 생성 시 새로 생성되어 블록 생성자에 보조금 형태로 지급됨.
  • 이 보조금은 21만 개 블록 생성시마다 반씩 줄어듦.
  • 작업 증명에 대한 보상금이 줄어들수록 구성원의 블록 생산 동기가 줄어듦. 이는 블록체인의 안정성과 직결되는 문제. 이익이 적어져 채굴자가 줄어들면 블록 난이도가 하락하고, 비트코인 시스템 자체의 안정성이 저하되는 상황이 닥칠 수 있음.

블록체인

블록체인의 의미

  • 비트코인에서의 블록: 10분동안 1메가바이트를 넘지 않는 범위 내에서 담을 수 있는 거래 내역의 묶음
  • 이더리움은 이론적으로는 블록 크기에 제한이 없지만, 채굴업자들이 책정한 gas 비용에 의해 실질적으론 통제되고 있음.
  • 체인: 블록들이 생성된 시간 순서에 맞춰 차례로 정렬된 후 체인저럼 늘어선 논리적 모습을 묘사하기 위한 단어. * 블록은 시간 순서대로 정렬되어 기록된다.
  • 블록체인이란 네트워크에서 생성된 모든 데이터를 중앙 서버의 통제 없이도 발생 순서대로 정렬할 수 있는 방법을 연구하는 것이기도 함(=> 블록체인 = 탈중앙화 타임 스탬프 기계)

블록체인의 기본 작동 원리

  • 하나하나의 블록은 전체 거래 원장 중 특정 페이지로 볼 수 있다. 여러 페이지가 모여서 전체 거래 원장이 된다.
  • (비트코인의 경우 블록 하나의 용량이 최대 1메가바이트이기 때문에 각 블록은 2000~3000개의 거래내역만 담을 수 있다.)

완전 노드와 단순 지급 검정 노드

탈중앙화 시스템의 철학에 의하면 전체 노드가 동등한 입장에서 같은 권리와 의무를 가지고 동일한 역할을 수행한다. 하지만 블록체인 데이터가 너무 방대하기 때문에 모든 노드가 모든 데이터를 저장하는 것은 현실적으로 무리가 있다. 해서 비트코인은 노드 설계 시 두 가지 노드의 형태를 설정했다.

  • 완전 노드: 전체 블록체인 데이터를 완전히 다운로드한 노드.
    비트코인 코어를 통해 시스템에 제출된 트랜젝션은 검증하고 새로운 블록을 생성하는 역할을 할 수도 있음.
  • 단순 지급 검증 노드: 최소한의 정보만 다운로드한 노드.
    단순히 지갑만을 설치함. 블록의 헤더 정보만 저장받음. 개별 트랜젝션에 대한 데이터가 필요한 경우 완전 노드에 자료를 요청해 개별적으로 데이터를 받아옴.

블록체인의 작동 방식

브로드캐스팅, 가십 프로토콜: 중앙화 방식과 달리 탈중앙화 시스템은 중앙 서버가 없고, 누가 트랜젝션을 처리할 지 정해져있지 않으며 매번 바뀐다. 이 때문에 블록체인에서는 모든 거래 내역서를 전체 참여자에게 알려야 하며 이러한 방식을 브로드캐스팅, 가십 프로토콜이라 한다.

브로드캐스팅

  • 노드 A와 F가 거래할 경우
    A와 F는 모든 노드에 거래 의사를 알려야 한다. 브로드캐스팅을 통해 피어-피어 간의 거래 내역을 네트워크에 전파함.
    전달된 트랜젝션들은 순서가 없음. 서로 다른 네트워크 전송 속도와 컴퓨터 사양을 가지고 있기 때문에 먼저 제출했다고 해서 먼저 도달하거나 먼저 처리되지는 않음.
    각 노드는 보통 수수료율이 더 높은 트랜젝션을 먼저 처리함.

리더 선출

  • 해시 퍼즐을 해결한 노드가 블록의 리더로 선출됨. 각 블록에서 선출된 리더는 그 블록의 중앙 서버 역할을 수행함.
    이 단 하나뿐인 리더가 전권을 갖고 해당 기록을 수행하기 때문에 하나의 기록만이 존재하고 이로인해 블록체인은 늘 하나의 기록만 갖게 된다.
  • 리더가 생성한 블록은 피어를 통해 브로드캐스팅되고, 각 노드는 이 블록들의 무결성 검증을 위해 두 가지를 체크함.
    1. 리더 노드가 해시 퍼즐의 답을 찾은게 맞는가?
    2. 블록에 기록된 트랜젝션들이 조작되지 않고 원래 그대로 기록된 것이 맞는가?
      위의 두 검증은 해시 함수, 전자서명, 비대칭 암호화 기법으로 실행됨.
  • 모든 부분에서 무결하다면 로컬에 저장되어 있는 기존의 블록체인 데이터에 블록을 추가함.
  • 검증을 통과하지 못한다면 블록은 즉시 폐기됨.
  • 모든 노드가 블록을 통과했을 때 전체 노드가 합의에 이르렀다고 볼 수 있다.

합의

: 분산 시스템에서 상태를 동기화하기 위해 사용

  • 탈중앙화되었지만 결정론적으로 운영하기 위해 각자 지켜야 하는 규칙
  • 누가 생성한 블록이 유효한지 합의하기 위한 프로토콜
  • 작업증명(Proof of Work)과 지분 증명(Proof of Stake)이 가장 일반적
  • 이더리움은 22년 9월에 PoS로 전환하는 The Merge 업그레이드 완료

가장 일반적인 합의 방법 두가지

  1. 작업 증명 (PoW)

    • 임의의 값을 대입해 얻은 결과값이 목표 값 이하의 값을 도출할 때까지 해시 반복
    • 역산 불가능, 무작위로 대입하는 작업을 무수히 반복 수행
    • 채굴은 새로운 블록을 만들기 위한 작업. 많은 참가자가 참여할 수록 블록체인의 보안 강화
    • 채굴을 통해 새로 발행된 화폐의 보상은 블록체인 시스템 보안에 기여하는 노드에 대한 인센티브
    • 이더리움의 PoW 알고리즘 Ethash는 주문형 반도체(ASIC) 저항성을 갖게 만들어 채굴 인프라를 독점하고 보안을 훼손할 수 있는 PoW의 중앙화를 피하고자 고안된 이더리움 1.0의 합의 알고리즘이다
      하지만 지금은 사용하지 않음
  2. 지분 증명(PoS)

    • 금전적 보증금 예치 기반의 알고리즘.
    • 내 자금을 담보로 걸어두고 이게 유효하지 않다면 이걸 니맘대로 해라
    • 커뮤니티에 들어갈 때 보증금을 내고 이만큼 낼테니까 나도 껴줘 하는 것
    • 이렇게 보증금 내고 들어간 커뮤니티에서 가장 많이 신뢰받는 블록이 채택되는 것
    • 지분 증명 블록체인은 검증인 집합을 유지한다.
    • 이더를 보유한 사람은 이더를 컨트랙트에 예치시키는 특별한 컨트랙트를 보냄으로써 검증인이 됨
    • 검증인은 다음 블록에 대해 제안하고 투표하는 순서를 따름
      • 검증인이 보유한 블록이 대다수의 검증인에 의해 거부되면 보증금을 잃을 위험이 있다
      • 대다수가 블록을 수락하면 누적된 지분에 비례해 보상을 얻는다

비동기화 시스템에서의 탈중앙화 합의

  • 블록체인은 피어간의 통신으로 정보를 공유함.
  • 이러한 비동기적 특성 때문에 동시에 다른 복수의 리더가 선출되는 경우도 분명히 생길 수 있다.
  • 두 노드가 서로의 블록체인 데이터가 서로 다르다는 것을 발견했을 때, 서로의 블록이 규칙을 지켰는지 확인한 후 문제가 없다면 서로의 길이를 비교해 더 긴 블록체인을 선택함.
  • 길이가 같다면 각자 자신의 블록체인 데이터를 유지한 채 자신의 블록체인 데이터를 전파하고, 어느 순간 한쪽의 길이가 더 길어지면 해당 블록체인의 위의 경우와 같이 선택된다.
  • 탈중앙화 합의 규칙 : 서로다른 블록체인이 충돌했을 때 하나의 데이터로 일치시켜나가는 과정.
  • 궁극적 일관성 : 어느 순간에는 각 노드가 다른 블록체인 데이터를 가질 수 있지만 궁극적으로는 하나의 데이터로 통일해 나가는 성질.

블록의 높이와 깊이

  • 블록의 높이: 불변, 고정
    각 블록체인은 블록체인 데이터에 추가된 순서가 있고 그 순서는 바뀌지 않는다. 이 순서를 블록체인의 높이라고 한다.
    제네시스 블록의 높이는 0으로 0번 블록이라 부를 수 있다.
  • 블록의 깊이: 항상 변화, 지속적 증가
    블록의 높이는 절대적인 개념으로 바뀌지 않지만, 블록의 깊이는 변동되는 상대적인 개념.
    블록의 깊이는 블록의 안정성과 직결됨. 블록체인 데이터에 추가된 블록도 퇴출될 수 있는 경우가 있는 만큼, 블록의 깊이가 깊어질수록 해당 블록의 안정성이 커진다고 볼 수 있다.

블록의 구조

  1. 블록의 크기(4바이트)

  2. 블록 헤더(80바이트)

    • 요약된 블록의 모든 정보. 블록에 담기는 모든 트랜젝션의 요약 정보도 들어있음.
    • 블록 헤더는 여섯 개의 필드로 구성되어 있음.
      • 버전(4바이트): 블록이 만들어질 당시의 시스템 버전
      • 이전 블록 해시(32바이트): 이전 블록의 해시 값을 이용해 현 블록의 해시 값을 생성함-> 하나의 값이 바뀌면 연쇄적으로 모든 블록의 해시 값이 변경됨
      • 머클트리 루트 해시(32바이트)
      • 타임 스탬프(4바이트)
      • 타깃 난이도 비트(4바이트)
      • 논스(4바이트)
  3. 블록 내 전체 거래 내역 개수(1~9바이트 가변)
    트랜젝션을 하나라도 더 담기 위해서 고정된 길이가 아닌 가변 크기를 사용

  4. 블록 내 모든 거래 내역(가변)

트랜젝션

: 거래 내역.
송신인의 공개키 값, 수신인의 주소, 전송하려는 금액, 송신인의 전자 서명, 송신인이 지출하려는 비트코인의 출처 가 기록된다.

외부 소유 계정(EOA)에 의해 서명된 메시지.
이더리움 네트워크에 전송되고 블록체인에 기록된다.
블록체인 상태 변경을 유발하거나 컨트랙트를 실행하는 유일한 방법.
이더리움은 독자적으로 상태 변경x 컨트랙트는 독자적으로 실행되지 x

  1. 트랜젝션의 구조
  • nonce : 발신 주소(EOA)에 의해 발행된 일련번호

  • gas price : 발신자가 지급하는 가스의 가격

  • gas limit : 트랜젝션을 위해 지불 허용할 가스의 최대량

  • recipient : 목적지 이더리움 주소

  • value : 목적지에 보낼 이더의 양

  • data : 가변 길이의 바이너리 데이터 페이로드

  • 디지털 서명 v,r,s ; 트랜젝션 무결성 및 부인 방지를 위한 디지털 서명

    1. nonce : 해당 주소에서 생성한 트랜젝션의 건수
      0부터 시작해서 트랜젝션 생성시마다 순차적으로 증가. 트랜젝션의 순차 처리를 위해 사용
      트랜젝션의 순서가 꼬이지 않게 하기 위해 사용 nonce1이 먼저 노드에 도달해도 nonce0이 처리될 때까지 nonce1은 무시됨.
      트랜젝션을 복제할 수 없게 하기 위해 사용 100이더가 있는 주소, 논스값 없는 트랜젝션을 누군가 무한히 복제해서 보낸다면? 이더가 소진될때까지 트랜젝션을 복제해서 실행하는 공격이 가능해버림.

    2. gas : 이더리움 네트워크를 사용하기 위한 수수료
      이더에 대한 사용자 지정 환율을 가진 별도의 개념
      트랜젝션이 서용할 수 있는 자원의 양을 제어하는 데 사용됨. 이더리움에 트랜젝션을 보낼 때마다 이더리움 채굴자에게 지불되는 것.
      트랜젝션 수수료의 최대값 = gasPrice * gasLimit
      gasPrice : 1가스마다 지급할 가격(wei)를 설정할 수 있다.
      gasLimit : 최대 가스 단위 수를 지정. 이더 전송에 필요한 가스양은 21,000개로 고정.
      이 트랜젝션을 처리하다가 이 가스 단위 이상을 쓰게 되면 그 트랜젝션을 멈추라는 기준.
      내 트랜젝션을 실행하는 댓가는 내가 지정 가능(gasPrice, gasLimit를 적어서 같이 보냄)

    3. value & data
      value : 트랜젝션을 통해 송금할 때 사용
      data : 트랜젝션에 데이터를 담아 보낼 때
      4가지 조합 가능

    • value : 이더 지급(payment)
    • data : 호출(invocation)
    • value + data : 지급 + 호출
    • none : 트랜젝션은 보내지만 가스 낭비
      -> 이 연산들에는 가스비가 포함되어 있지 않다. 가스비는 별도

    새로운 컨트랙트는 트랜젝션 - 수신자 주소 : 0x0(영 주소), 데이터 : 컴파일된 컨트랙트의 바이트코드

    1. 디지털 서명
      트랜젝션 정보를 개인키를 사용해 서명.
      타원 곡선 디지털 서명 알고리즘을 사용해 인코딩된 트랜젝션 정보를 EOA의 개인키를 이용해 서명을 만듦.
      개인키를 통해 특정 메시지를 암호화하게 되면 이 암호화한 값을 서명값이라 하는데. 이더리움에서는 서명값을 꼭 붙여야 트랜젝션이 완성됨. 트랜젝션을 보낸 사람을 명확히하고 검증하는데 이용됨.

    서명이 담긴 트랜젝션을 함께 받은 누구나 메시지와 공개키만 사용해 서명을 검증할 수 있다.
    개인키 소지자에 의해 트랜젝션이 승인되었음을 증명, 부인방지, 서명 후 데이터가 수정되지 않았음을 보장
    개인의 실행된 행위를 부인할 수 없고 그 주체, 신뢰성을 증명함

  1. 트랜젝션의 전파와 기록
    트랜젝션을 생성하게되면, 그 생성된 트랜젝션을 바탕으로 내용을 포함한 서명문을 만들고 그 서명문을 붙여서 이더리움 네트워크에 전송이 가능해짐.
    • 보안의 이유로 개인키의 서명과 전송을 분리함
    • 서명된 트랜젝션은 이더리움 네트워크로 전송할 준비가 완료된 것
    • 서명된 트랜젝션을 받은 P2P 네트워크에 연결된 노드는 다음과 같이 동작한다
      • 수신한 트랜젝션의 서명 검증
      • 유효할 시 사본 저장, 이웃 노드에 전파
    • 그렇게 트랜젝션은 모든 노드에 전파되며 몇 초 내에 모든 노드로 전파됨.
      • 각 노드의 관점에서는 트랜젝션의 출처 식별이 불가함
      • 특정 노드는 트랜젝션을 블록에 추가해 새로운 블록을 만드는 작업을 수행함.

UTXO

: 여러 거래 중 누군가에게 비트코인을 수령한 후 아직 사용하지 않은 상태로 블록에 남아 있는 항목들(Unspent Transaction Output)
사용을 위해서는 해당하는 암호키(수신인의 공개 암호화키를 이용한)를 제시하도록 해 UTXO의 조작을 방지함.
사용시엔 트랜젝션의 수입 부분에 UTXO의 아이디를 기재하고 본인의 암호화키와 함께 서명을 하여 사용가능

코인베이스 트랜젝션

: 블록의 보상금을 지급하는 트랜젝션. 코인베이스 트랜젝션을 제외한 모든 거래는 일반 트랜젝션이다.

블록체인의 암호학

  1. 공개키 암호화
    공개키 암호화 === 비대칭 암호화
    계산하기는 쉽지만 역은 알아내기 어려운 특수한 함수를 바탕으로 생성된 고유한 키를 사용해 그 정보를 보호하는 방법
    비트코인 및 이더리움에서는 이산로그문제를 이용하는 타원 곡선 암호화를 활용함.
    평문을 개인키로 암호화하면 암호문이 됨. 이는 공개키로 풀어볼 수 있음.
    평문을 공개키로 암호화하면 개인키로 풀어볼 수 있음 --> 이를 비대칭 암호화라고 한다

  2. 개인키와 공개키

    1. 개인키

      1~2의256제곱 사이 무작위 선택 숫자.
      오프라인 프로세스로 생성됨. 대부분의 프로그래밍 언어에 있는 random함수같은 암호학적으로 안전하지 않은 난수 생성기는 사용 금지.
      임의로 생성한 16진수 개인키는 mastering ethereum의 예제 검색.. 그냥 숫자

    2. 공개키
      타원 곡선에 있는 점(타원 곡선 방정식을 만족하는 x와 y좌표의 집합)
      그래프상의 한 점을 여러차례 연산을 해서 그 연산횟수가 개인키만큼 반복되었을 때 도착하는 점, 그 점이 공개키가 됨.
      추론하기가 매우매우매우매우매우 어렵기에 안전하다

  3. 해시 함수

    공개키를 주소로 변환하기 위해 사용됨.
    임의 크기의 데이터를 고정된 크기 데이터로 매핑하는 함수
    해시 함수의 입력을 메시지 또는 입력 데이터, 결과를 해시라고 함.
    결과값을 알고 있을 때 입력데이터를 다시 작성하는 것이 불가능한 단방향함수.
    이더리움은 keccak-256 사용(일반 함수와 다름. 라이브러리 서칭시 이더리움 keccak 사용해야 함)

    빈값을 넣었을때 시작이 위와 같아야 함

    주소 생성

    공개키를 keccak-256에 넣으면 엄청 긴 비트 출력값이 나옴. 뒤의 20바이트만 가져오고 0x를 붙이면 이더리움 주소가 됨. 보통은 그대로 쓰지 않고 일부를 대문자로 바꿔서 사용. 이 주소에 대한 validation을 체크하기 위해서.

    정방향 연산은 가능하지만 역방향 연산은 불가능.

스마트 컨트랙트

  1. 스마트 컨트랙트란
    : 디지털 형식으로 명시된 서약들의 집합.

    블록체인에서의 스마트 컨트랙트
    : 불변의 컴퓨터 프로그램(마스터링 이더리움)
    불변-한 번 이더리움 네트워크에 배포하면 원작자나 그 누구도 코드를 변경할 수 없다.
    결정적-이 코드는 누가 실행하던간에 항상 결과가 같다.
    EVM 위에서 동작(하나의 소프트웨어적 장치이다.)
    탈중앙화된 world computer. 동일한 상태를 유지. 전체 여러대의 컴퓨터로 이루어진 한 대의 월드 컴퓨터다

    스마트 컨트랙트 작성 언어 : Solidity, LLL, Viper, Assembly

    이더리움의 스마트 컨트랙트 배포 과정
    소스코드 개발-컴파일(바이트코드, ABI. 트랜젝션 내 data에 들어가는 내용)-트랜젝션생성-서명 후 이더리움 네트워크에 배포

    스마트 컨트랙트 프로그램이 이더리움에 제출이 되어 배포되면, 이 프로그램을 지칭하는 고유 주소를 하나 받을 수 있다-> 컨트랙트 주소. 위치를 찾기 위한 하나의 식별값(Contract Address). 이후 CA와 ABI로 함수 호출 가능.

    • 바이트코드 : 내가 작성한 스마트 컨트랙트 코드의 컴파일 이후의 코드
    • ABI : Application Binary Interface 컨트랙트 내 정의되어 있는 함수의 리스트
    • CA : contract address ID로 쓰게 될 주소

솔리디티 기본 문법

솔리디티 컨트랙트 기본 구조

파일 초반

  1. 소스코드 라이선스(GPL-3.0)
  2. Version Pragma : 소스코드가 이용하는 컴파일러 버전 명시

솔리디티 컨트랙트의 범위

contract 컨트랙트명 {
    uint number; // 상태변수
    function store(uint num) public { // 함수
        number = num;
    }

}

상태변수(state Variable)
: 블록체인(contract storage)에 값이 저장되는 변수. 상태변수의 접근 제어자(visibility) 지정 가능(external, public, private)
기본형, 구조체, 배열 등 다양한 자료형 존재

함수
: 컨트랙트 단위 기능. 매개변수, 제어자, 반환값 지정 가능.
함수 내부에서 상태변수의 값을 변경하고 읽을 수 있음


자료형

  • 논리형 : bool

  • 정수형 : uint(unsigned integer), int(signed integer)
    8 ~ 256 bit 표현 가능. unit은 unit356과 같음

  • 주소형 : address. 이더리움의 주소를 표현

  • 바이트형 : bytes# or byte[]. 데이터를 바이트로 표현할 수 있음

  • 접근 제어자, 자주 쓰는 자료형

  • 사용자 선언형, 함수, 제어문, 화폐 단위

profile
고민고민고민

0개의 댓글