이 글을 이해하기 위해 컴퓨터 공학 지식이 일부 필요할 수 있습니다.
Block
Blockchain 은 Block 과 Chain 의 합성어
Blockchain P2P Network 에서 Miner 들은 네트워크 상에 있는 Transaction 을 수집하여 Block 으로 기록하며, 만들어진 Block 은 하나의 Chain (Linked List) 로 연결 됩니다.
Block 은 P2P Network 의 참여자인 Node 들 간의 데이터 동기화 단위이기도 합니다.
예) 이 Node 는 101 번 Block 까지의 데이터를 가지고 있다. 연결된 다른 Node 는 105 번 Block 까지 가지고 있다.
Linked List With Blocks
Blockchain 의 가장 중요한 특성은 데이터의 임의 조작이 사실 상 불가능 하다는 것입니다.
이 특성은 Linked List 를 기반으로 합니다.
- 각각의 Block 은 앞 Block 의 Hash 를 가지고 있습니다.
- 만약 Height 2 Block 에서 변조가 발생하면, Height 2 Block 의 Hash 가 변경됩니다.
- Height 2 Block Hash 가 변경되면, Height 3 Block 이 가지고 있는 Height 2 Block 의 Hash 역시 변경되어야 합니다.
- Height 3 Block 의 내용이 변경되었으므로, Height 3 Block 의 Hash 가 변경됩니다. 이 변경은 다시 Height 4 Block 에 영향을 끼칩니다.
앞선 Block 이 변경되면 이후의 모든 Block 을 변경해야만 합니다.
따라서, Blockchain 의 앞 쪽에 위치한 Block 일수록 변조가 어려워집니다.
Unique Chain
Blockchain 은 단 하나의 Chain 만이 Network 안에서 인정 됩니다.
Block 의 동기화 상황에 따라, 잠시 분기가 발생할 수는 있으나, 최종적으로는 다시 하나의 Chain 을 선택해야만 합니다.
일반적으로는 Longest Chain Rule (가장 Height 가 큰 Chain) 을 사용합니다.
Confirmation
특정 Block 뒤에 몇 개의 Block 이 연결 되었는지를 Confirmation 이라고 부릅니다.
- Miner 가 앞선 Block 을 Confirm 했기 때문에, 앞선 Block 의 Hash 를 가자는 다음 Block 을 만들었습니다.
위 특징으로 인해, Confirmation 을 충분히 확보한 Block 이라면, 이 Block 은 바뀌지 않을 것이라 생각할 수 있습니다.
이러한 접근은 모호한 정의를 가지며, Confirmation 은 Trade off 의 성격을 갖습니다.
- Confirmation 이 커지면, 더 안전한 Block (바뀌지 않을) 에 접근할 수 있습니다.
- Confirmation 이 작아지면, Block 이 일찍 Confirm 되어, Transaction 역시 빠르게 Confirm 되지만, Block 이 바뀔 가능성이 높아집니다.
명확한 정답은 정해져 있지 않지만, 각 Blockchain 에서 Guide 되는 추천 Confirmation 숫자가 있습니다.
0-Confirmation
User Experience 를 위해서, Block Confirm 을 기다리지 않고, Block 에 기록되기 전의 Transaction 을 바로 Confirm 하는 경우가 있습니다.
이를 0 Confirmation 이라고 부르며, 서비스 단에서 제약을 두거나, UTXO 를 이용하는 것으로 구현할 수 있습니다.
예)
- 입금 Transaction 이 Confirm 이 되기 전까지 출금 할 수 없도록 제한합니다.
- Bitcoin Transaction 을 만들 때, 유저의 Transaction 을 Input 으로 하여 만듭니다. Input 이 유효하지 않다면 (다른 곳에서 쓰여졌다면) 이 Transaction 은 무효가 됩니다.
Bitcoin Raw Block
Little Endian 인 것에 주의합시다
Bitcoin Height 0 Raw Block Header
0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c
Name | Byte | Description | Example |
---|---|---|---|
Version | 4 | 버전 정보 | 01000000 |
Previous Block Hash | 32 | 이전 블록 해시 | 000000 ... |
Merkle Root | 32 | Merkle Root | 3ba3edfd ... |
Time | 4 | Block 의 생성 시간 | 29ab5f49 |
Bits | 4 | 난이도 목표 | ffff001d |
Nonce | 4 | 난수 | 1dac2b7c |
Bitcoin Height 0 Raw Block
0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000
Header 이후 1 Byte (01) 는 Block 에 포함된 Transaction 의 개수 입니다.