일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 파이썬
- keras
- Ethereum
- javascript
- 마스터링 이더리움
- 솔리디티
- 마스터링 비트코인
- 알고리즘
- 이더리움
- 백서
- pythonic
- 블록체인개발
- 암호화폐
- 레디스
- DAPP
- solidity
- 공개키
- 개발
- 스마트컨트랙트
- smart contract
- js
- 문자열
- node js
- 주소
- 블록체인
- 비트코인
- python
- Redis
- 마스터링비트코인
- 개인키
- Today
- Total
개발이야기
[Mastering Bitcoin] 마스터링 비트코인 내 맘대로 정리 - Ch09 본문
Ch9. The Blockchain
Introduction(블록체인이란?)
블록체인 데이터 구조는 트랜잭션 블록의 정렬된 역 링크 목록이다. 블록은 "뒤로" 링크되어 체인의 이전 블록을 각각 참조한다.
[그림1] - 블록체인은 블록으로 이루어진 링크드 리스트
블록체인은 첫 번째 블록을 스택의 기초로 사용하여 수직 스택으로 시각화되는 경우가 많다. 서로 쌓인 블록을 시각화하면 "높이"와 같은 용어를 사용하여 첫 번째 블록과의 거리를 참조하고 "top" 또는 "tip"을 사용하여 가장 최근에 추가 된 블록을 나타낸다.
[그림2] - 수직 스택으로 시각화된 블록체인
블록에는 부모가 하나 밖에 없지만 일시적으로 여러 자식이 있을 수 있다. 각 자식은 부모와 동일한 블록을 참조하고 "이전 블록 해시"필드에 동일한 (상위) 해시를 포함한다. 여러 자식들은 블록체인 "포크(fork)"중에 발생하는데, 이는 서로 다른 마이너가 서로 다른 블록을 거의 동시에 발견 할 때 발생하는 일시적인 상황이다. 결국 하나의 자식 블록만 블록체인의 일부가 되고 "fork"가 해결된다.
* fork
- 하드 포크(Hard Fork)는 블록체인이 서로 호환되지 않는 두 개의 체인으로 분리 될 때 발생한다.
- 소프트 포크(Soft Fork)는 오래된(이전의) 소프트웨어에 의해 블록을 유효한 것으로 인식되게 하는 규칙의 변경이다. 즉, 하위 호환이 가능하다.
"이전 블록 해시"필드는 블록 헤더 내부에 있으므로 현재의 블록의 해시, 부모의 신분이 변경되면 자녀의 신분이 변경된다. 부모가 어떤 방식으로든 수정되면 부모의 해시가 변경된다. 부모의 변경된 해시는 자식의 "이전 블록 해시"포인터의 변경을 필요로 한다. 이것은 차례로 자식의 자식, 그 자식의 자식, 그 자식의 자식.. 해시를 변경하게 한다. 이 캐스케이드(종속) 효과는 이후의 모든 블록을 다시 계산하지 않고는 변경될 수 없도록 한다. 이러한 재계산에는 엄청난 계산(에너지 소비)이 필요하기 때문에 블록의 긴 체인은 블록체인의 깊은 역사가 변할 수 없게 만들며, 이는 비트코인 보안의 주요 특징이다.
Structure of a Block
블록은 블록체인에 포함될 트랜잭션을 집계하는 컨테이너 데이터 구조이다. 블록은 대량으로 구성된 트랜잭션의 긴 목록이 뒤따르는 메타 데이터를 포함하는 헤더로 구성된다. 블록 헤더는 80바이트이지만 평균 트랜잭션은 최소 400바이트이고 평균 블록에는 1900개가 넘는 트랜잭션이 포함된다. 따라서 모든 트랜잭션이 포함된 전체 블록은 블록 헤더보다 10,000배 더 크다.
[그림3] - 블록의 구조
Block Header
각 블록은 블록헤더의 "이전 블록 해시" 필드를 통해 상위 블록으로 알려진 이전 블록을 참조한다. 즉, 각 블록은 자체 헤더 내에 상위의 해시를 포함한다. 각 블록을 상위 블록에 연결하는 해시 시퀀스는 생성된 첫 번째 블록 (모든 블록)까지 이어지는 체인을 생성한다.
블록 헤더는 다음의 6가지 정보로 구성된다.
[그림4] - 블록헤더의 구조
1. version : 소프트웨어/프로토콜 버전
2. previous block hash : 블록체인에서 바로 앞에 위치하는 블록의 블록 해쉬
3. merkle hash : 개별 거래 정보의 거래 해쉬를 2진 트리 형태로 구성할 때, 트리 루트에 위치하는 해쉬값
4. time : 블록이 생성된 시간
5. bits : 난이도 조절용 수치
6. nonce : 최초 0에서 시작하여 조건을 만족하는 해쉬값을 찾아낼 때까지의 1씩 증가하는 계산 회수
Block Identifiers: Block Header Hash and Block Height
블록의 기본 식별자는 블록헤더에서 SHA256 암호화 해시 알고리즘을 두 번 해시하여 생성된 해시로 식별된다. 결과로 나오는 32바이트 해시는 블록해시라고 하지만 블록헤더만 계산하기 때문에 블록헤더해시가 더 정확하다.
블록을 식별하는 두 번째 방법은 블록높이라고 하는 블록체인의 위치다. 생성된 첫 번째 블록은 블록높이가 0이다.
블록해시와 달리 블록높이는 고유한 식별자가 아니다. 단일 블록은 항상 특정 불변 블록높이를 갖지만 그 역은 성립하지 않는다. 즉, 블록높이가 항상 단일 블록을 식별하지는 않는다. 두 개 이상의 블록이 블록 높이가 같아서 블록체인에서 동일한 위치를 놓고 경쟁할 수 있다.(fork에 의해서)
* Block Hash
블록의 식별자 역할을 하는 블록 해쉬는 6가지의 블록 헤더 정보를 입력값으로 하고, 여기에 SHA256 해쉬 함수를 2회 적용해서 계산되는 값으로, 32바이트의 숫자값이다. 이름은 블록 해쉬이지만 그 값은 블록 전체를 해쉬한 값이 아니라, 블록 헤더를 해쉬한 값이다.
[그림5] - 블록해쉬를 구하는 과정
개별 거래 정보는 결국 머클 트리의 해쉬값인 merkle hash 값으로 집약된다. 블록 헤더의 6가지 정보 중에서 version, previous block hash, merkle hash, time, bits 이렇게 5가지는 블록 해쉬를 만드는 시점에서 이미 확정되어 변하지 않는 값이다. 하지만 마지막 nonce는 확정되어 있지 않고 새로 구해야 하는 값이다. 이 nonce 값을 구해서 최종적으로 블록 해쉬 값을 구하고, 이 블록 해쉬값을 식별자로 가지는 유효한 블록을 만들어내는 것이 바로 작업 증명(Proof of Work), 흔히 말하는 채굴이다.
Linking Blocks in the Blockchain
비트코인 전체 노드는 제네시스 블록에서 시작하여 블록체인의 로컬 사본을 유지한다. 블록체인의 로컬 복사본은 새로운 블록이 발견되면 지속적으로 업데이트하여 체인을 확장하는데 사용된다. 노드가 네트워크에서 들어오는 블록을 수신하면 이 블록을 확인한 다음 기존 블록체인에 연결한다. 연결하기 위해 노드는 수신 블록 헤더를 검사하여 "이전 블록 해시"를 찾는다.
예를 들어 노드가 블록체인의 로컬 복사본에 277,314 개의 블록을 가지고 있다고 가정해보자. 노드가 알고 있는 마지막 블록은 다음과 같은 블록헤더해시를 가진 블록 277,314 이다.
그러면 비트코인 노드는 네트워크에서 새 블록을 수신하고 다음과 같이 구문 분석한다.
이 새로운 블록을 보면, 노드는 이전 블록 해시 필드를 찾는다. 그것은 노드에 알려진 해시이고, 높이 277,314의 체인에 있는 마지막 블록의 해시이다. 따라서 새 블록은 체인의 마지막 블록의 자식블록이며 기존 블록체인을 확장하게 되는 것이다. 노드는 이 새 블록을 체인 끝에 추가하여 277,315라는 새로운 높이로 블록체인을 길게 만든다.
Merkle Trees
비트코인 블록체인의 각 블록에는 머클트리를 사용해서 블록의 모든 트랜잭션에 대한 요약을 포함한다. 바이너리 해시 트리라고도 하는 머클트리는 대규모 데이터 세트의 무결성을 효율적으로 요약하고 확인하는데 사용되는 데이터 구조이다.
Merkle tree는 root(루트) 또는 merkle root(머클 루트)라고 하는 하나의 해시가 있을 때까지 반복적으로 노드 쌍을 해싱하여 생성된다. 비트코인의 머클트리에서 사용되는 암호화 해시 알고리즘은 SHA256이 두 번 적용되었으며 이중 SHA256이라고 한다.
용어 "Tree"는 컴퓨터 데이터에서 분기 데이터 구조를 설명하는데 사용되지만 일반적으로 이 트리는 아래 그림처럼 거꾸로 표시된다.
[그림6] - 머클트리에서 노드 계산하기
머클트리는 이진 트리이므로 짝수개의 리프 노드가 필요하다. 홀수 트랜잭션을 요약하면 마지막 트랜잭션 해시가 복제되어 균형 트리 라고도하는 리프 노드가 짝수개 생성된다. 이는 하나의 데이터 요소 복제 에서 볼 수 있듯이 트랜잭션 C가 복제 되는 짝수개의 데이터 요소를 생성한다.
[그림7] - 하나의 데이터 요소를 복제하면 짝수개의 데이터 요소가 생성된다.
비트코인에서는 단일 블록에 수백 개에서 수천 개가 넘는 트랜잭션을 처리하는 것이 일반적이며 정확히 동일한 방법으로 요약되어 단일 머클루트로 32바이트의 데이터만 생성한다. 많은 데이터 요소를 요약한 머클트리에서는 16개의 트랜잭션으로 구성된 트리가 표시된다. 루트가 다이어그램의 리프 노드보다 커 보이지만 정확한 크기는 32바이트이다. 블록에 하나의 트랜잭션이나 십만개의 트랜잭션이 있는지 여부에 상관없이 머클루트는 항상 32바이트로 요약된다.
[그림8] - 데이터 요소의 포함을 증명하는데 사용되는 머클 경로
데이터 요소의 포함을 증명하기 위해 사용되는 MERKLE 경로에서, 트랜잭션 K는 네 개의 32바이트 해시인 머클 경로를 생성함으로써 블록에 포함된다는 것을 증명할 수 있다. 즉, 여기서 머클경로는 네 개의 해시로 구성된다. (HKL, HIJKL, HIJKLMNOP, HABCDEFGHIJKLMNOP)
Bitcoin’s Test Blockchains
Testnet—Bitcoin’s Testing Playground
Testnet은 테스트 목적으로 사용되는 테스트 블록체인, 네트워크 및 통화의 이름이다. testnet은 지갑, 테스트 비트코인(testnet 동전), 마이닝 및 메인 넷의 다른 모든 기능을 갖춘 완벽한 기능의 라이브 P2P 네트워크다. 실제로 두 가지 차이점만 있다. testnet 동전은 가치가 없으며 채광 난이도가 낮아서 누구든지 testnet 동전을 비교적 쉽게 채굴 할 수 있다 (쓸모없는 채로 유지할 수 있음).
비트코인의 메인 넷에서 프로덕션 용도로 사용하려는 소프트웨어 개발은 먼저 테스트 코인으로 테스트 네트워크에서 테스트해야한다. 이렇게 하면 버그로 인한 금전적 손실과 의도하지 않은 동작으로부터 네트워크를 보호할 수 있다.
그러나 개발자들의 탄원에도 불구하고 일부 사람들은 고급 광산 장비(GPU 및 ASIC)를 사용하여 testnet에서 채굴을 시도한다. 이것은 어려움(난이도)을 증가 시키며, CPU로 채굴하는 것을 불가능하게 하고, 결과적으로 사람들이 가치 있는 동전을 얻는 것을 어렵게 만든다.
현재 testnet은 testnet3이라고 불리며, testnet3은 20GB를 초과하는 큰 블록체인이다. 메인 넷만큼은 아니지만 너무 가벼운 네트워크도 아니다. testnet 노드를 실행하는 좋은 방법 중 하나는 가상 머신(VirtualBox, Docker, Cloud Server 등)을 사용하는 것이다.
Segnet—The Segregated Witness Testnet
2016 년에 Segregated Witness (segwit라고도 함)의 개발 및 테스트를 돕기 위해 특수 목적 테스트 네트워크가 시작되었다. 이 테스트 블록체인은 segnet이라고 하며 비트코인 Core의 특별한 버전을 실행하여 조인할 수 있다.
그런데 segwit이 testnet3에 추가되었으므로 더 이상 segwit 기능을 테스트하는 데 segnet을 사용할 필요가 없다.
Regtest—The Local Blockchain
"Regression Testing"의 약자 인 Regtest는 테스트 목적으로 로컬 블록체인을 만들 수 있게 해주는 비트코인 Core 기능이다. 공공 및 공유 테스트 블록체인인 testnet3과 달리 regtest 블록체인은 로컬 테스트를 위해 폐쇄 시스템으로 실행되도록 설계되었다. regtest 블록체인을 처음부터 시작하여 로컬 생성 블록을 만든다. 비트코인 Core 소프트웨어를 테스트하기 위해서만 다른 노드를 네트워크에 추가하거나 단일 노드로 실행할 수 있다.
참고사이트]
•https://steemit.com/kr/@hanmomhanda/blockchain