• Bitcoin 통신 방법
    • Client -(JSON RPC)> Node(bitcoin) -(Gossip Protocol)> Node(bitcoin), DNS Server
    • 각 Node들은 나와 트랜잭션이 연결된 다른 Node들에게 전파를 해야함.
      • 받는 노드는 여러개의 트랜잭션이 나한테 왔을 때 어떤 것이 신뢰성 있는 정보인지 검증 해야함. ⇒ 컨센서스, UTSo
  • Bitcoin Client와 통신
    • Client -(JSON RPC)> Node(bitcoin)
    1. Bitcoin와 원격 연결(Port 8233) 한다.
    2. 블록체인 데이터 조회 → getblock, gettransaction
    3. Wallet 관리 → ImportPrivateKey(지갑이 클라이언트에 저장된 경우), GetBalance
    4. Transaction 생성 → sendtoaddress(서명이 안된 데이터), signrawtransactionwitwallet(Client가 서명을 완료한 데이터)
  • 최초 네트워크 참여
    1. DNS Address에서 주소를 찾는다.
    2. 해당 주소로 연결 시도(version/verack)
      • 무작위값을 포함해서 DNS Address로 보내면 version/verack와 무작위 값을 포함해서 리던.
    3. 실패 시 소스 내 하드코드 된 DNS Address에 연결 시도
      • DNS Address가 모두 접속이 안될때,
    4. 첫 노드 연결 성공시 해당 노드가 가지고 있는 노드 IP 리스트 수신
      • 메인넷은 700여개, 테스트넷은 10개의 주소 리스트 보유
  • Block Sync
    1. Ping/Pong
      → Network에 Blockchain 다운 받기 위해 연결된 다른 노드들에게 Ping 전송
      - DNS Node에 Ping을 전송
    2. Header Download (getheaders / headers)
      → 80bytes의 작은 Block Header 들을 먼저 다운
      - 블록에 대한 적은 정보를 확인
    3. Block Download(getdata)
      → Genesis Block +1부터 시작하여 최근 Block까지 Transaction을 포함한 전체 데이터를 다운로드 진행
    4. Block Validation
      → Genesis Block부터 Block을 다운 받을 때마다 검증 진행(Rule에 따라)
    • 위의 1-2번 과정만해서 참여하는 노드가 있음 light weight Node
  • Block 검증
    • 신규 블록 수신
      → 블록 구조 일치 여부
      → 재계산 Block Header Hash == Block Header Hash
      위변조를 확인
      → Block timestamp < now() + 2hours
      → Block Size < 1MB
      대부분의 블록은 1MB
      ——여기까지 Block Header
      → Coinbase Transation Check
      채굴자가 본인이 얼마나 보상을 받을지, 수수료 등 확인
      → Transaction Check
      —— 모든 거래 검증 완료
      →Mempool Update
      → LevelDB Insert New Block
      → Block 전파
  • Transaction 전파
    1. Transaction을 다른 노드들에게서 전파 받는다.
    2. 이미 받은 Transaction 인지 확인한다.
    3. 없는 경우) 다른 노드에게 전파한다(inv(msg_tx))
      → 새로운 Transaction txid를 전달한다.
    4. 상대노드가 없는 경우 getdata를 요청 받는다.
      → MSG_TX와 txid를 전달 받는다.
    5. 새로운 Transaction을 전달한다.
    6. 연결된 모든 Node에게 전달될 때 까지 수행한다.
  • Transaction 검증
    • 신규 Tranaction 수신
      → Transaction 구조 일치 여부
      → In, out List 존재 여부
      입출금 내역을 확인
      → Transaction Size < 1MB
      트랜잭션이 블록의 크기보다 커질수 없음. 안에 담겨있기 때문
      → Output Value < 2100만 BTC
      총발행량
      → Mempool 존재 여부
      Mempool: 아직 처리되지 않는 Transaction확인. 처리된 Transaction 목록, 이미 내가 처리한 Transaction인지 확인.
      → Block 존재 여부
      이미 내 node에 추가되어있는 Block인지 확인.
      승인된 Transaction인지 확인.
      —-이후는 얼마나 입출금 되는지 확인.
      → Input Check(Double Spending)
      아직 승인되지 않은 transaction의 경우 이미 사용된 UTXO가 아닌지 확인
      → Input Check(Orpahn Tx)
      고아인 블록안에 있는 트랜잭션. 블록자체가 승인이 안된 경우.
      → Input Check(Coinbase)
      채굴자 보상, 생성되고 100번째 블록이후에 보상을 사용가능
      → Input Check(Not UTXO)
      → Input > Output value
      —-여기 까지 적합성 검증, 이후 정상적인 서명
      → Check Input Script
      → Add Mempool
      → Transaction 전파
  • Block 전파 ⇒ Longest BlockChain을 유지.
    • Mining에 성공한 Block은 아래 방법 없이 Block 전체 데이터를 모든 노드에게 바로 전송
    • Block Sync는 처음 네트워크에 참여할때, Block 전파는 새로운 블록을 확인. 채굴로 인해 발생한 블록, 검증이 끝나서 전파된 블록
    1. Ping
      → Network에 Blockchain 다운 받기 위해 연결된 다른 노드들에 Ping 전송
    2. 전달 받은 Block Header 전달한다.
    3. 아직 전달 받지 못한 Block인 경우 headers와 getdata를 모두 요청한다.
      → Headers에는 내가 가진 최신 Block Header List를 보낸다.
    4. 새로운 Block과 그 사이 Block을 노드에게 전달한다.
  • 합의 알고리즘의 필요성
    • Bitcoin P2P 네트워크 상에서의 흐름을 보면, 모두 나와 연결된 특정 Node에게서 전달 받은 Data를 신뢰하며 나의 Database를 업데이트 한다.
    • → 내가 전달 받은 데이터가 조작되거나 다른 노드와 다른 경우는 어떻게 할까?
      • POW, Longest Chain Rule 뿐만 아니라, 컨센서스와 UTXO가 필요. 전달 받은 노드가 다른 노드들과 다른 경우.
profile
"프로그래밍은 저의 상상을 실현 시킬 수 있는 유일한 도구입니다."

0개의 댓글