본문 바로가기

블록체인 만들기6

[블록체인 만들기 #6] P2P 네트워크 블록체인에 참여하는 노드들은 스스로 클라이언트이자 서버가 됩니다. 모든 노드들이 동일한 체인을 보유해야 하기 때문에 broadcasting을 하게 되는데, P2P 네트워크를 WS와 HTTP 프로토콜을 이용해 구현할 수 있습니다. HTTP 프로토콜은 블록데이터를 반환하는 용도 / WS는 P2P 네트워크를 담당합니다. HTTP/WS 환경 구성 터미널에서 필요한 모듈을 먼저 설치합니다. $ npm install express ws $ npm install -D @types/express @types/ws P2P 서버 구성 블록체인에서는 노드가 클라이언트가 되면서 동시에 서버가 됩니다. 즉, 서버 쪽 코드와 클라이언트 코드를 동시에 작성해줘야 합니다. ./src/server/p2p.ts 파일을 작성하고 아래 코.. 2022. 10. 12.
[블록체인 만들기 #5] PoW 합의 알고리즘 비트코인 블록체인에서는 PoW 합의 알고리즘을 통해 새로운 블록을 생성한 채굴노드에게 비트코인으로 보상을 지급하게 됩니다. PoW는 분산 합의 알고리즘의 한 종류로, 쉽게 말해 지정된 Nonce 값 보다 작은 값을 찾아내는 작업에 성공한 노드를 선정하는 일입니다. 블록체인에서 합의 알고리즘이 필요한 이유는 네트워크에 참여한 모든 노드들이 동일한 상태를 가질 수 있도록 올바른 블록만 연결해야 하기 때문입니다. 악의적인 노드가 올바르지 않은 블록을 추가하려고 할 때 이를 필터링 해줄 수 있어야 합니다. 또한 합의 알고리즘을 통해 동시에 2개의 블록이 생성되지 않도록 사전 예방하는 작업이기도 합니다. 비트코인에 사용되는 작업증명 합의 알고리즘은 Difficulty를 조정함으로써 10분에 1블록이 생성되도록 유.. 2022. 10. 11.
[블록체인 만들기 #4] Chain 만들기 이전 포스팅에서는 Block과 BlockHeader를 통해 블록체인을 구성하는 개별 블록을 생성했습니다. 이번 포스팅에서는 블록들을 연결하는 Chain을 생성합니다. 생성된 블록들을 배열에 담아 연결만 하면 됩니다. 앞서 생성한 블록들은 이미 Hash 값으로 체인을 구성하고 있으므로, 블록의 hash값이 변경되면 자연스레 chain이 끊어지게 됩니다. 이미 연결되어 있는 블록들을 담는 Chain 클래스를 구성하는 가장 큰 이유는 난이도 계산을 위해서입니다. 블록이 생성될 수록 nonce 값을 찾을 확률은 줄어들게 되고 difficulty는 올라가야 정상적인 크립토 이코노미를 구성할 수 있기 때문입니다. 체인 클래스 src/core/blockchain/chain.ts 파일을 생성합니다. import { B.. 2022. 10. 10.
[블록체인 만들기 #3] Unit Test (Jest) 이전 포스팅에서는 블록과 블록헤더를 생성하고, GENESIS 블록까지 만드는 방법을 알아보았습니다. 이제 생성된 블록들이 정상적으로 연결되는지 확인해볼 필요가 있습니다. Typescript Unit Test는 Jest로 진행해보겠습니다. Node.js 환경에서 Unit Test 프레임워크로는 Mocha, Jest가 있지만 Typescript에서 사용하기 위해서는 추가적인 환경설정이 필요합니다. 이런 불편한 추가설정을 하면서 까지 Typescript를 이용하는 이유는 그만큼 TS가 제공하는 정적 타입의 프로그램이 파워풀하기 때문입니다. Jest, Unit Test 환경구성 Jest를 사용하기 위해서 필요한 모듈을 설치해줍니다. $ npm i -D ts-jest @types/jest babel-core @b.. 2022. 10. 9.
[블록체인 만들기 #2] Genesis Block 생성 (Typescript) Typescript로 블록체인 만들기에서 기본적인 환경구성과 Block을 생성하는 방법에 대해 알아보았습니다. 하지만 Block , BlockHeader 클래스에서 이전 블록을 인자로 전달받고 있는 상황이었기 때문에 GENESIS 블록을 생성하지 못하는 문제가 남아있었습니다. 이번 포스팅에서는 GENESIS 블록을 생성합니다. 제네시스 블록 만들기 블록체인에서 제네시스 블록은 체인상 가장 앞에 있는 블록을 의미합니다. Genesis 블록은 하드코딩으로 생성합니다. 💡 하드코딩이란? 코드를 통해 생성되는 변수가 아니라, 직접 타이핑을 쳐서 생성하는 데이터를 의미합니다. src/core/config.ts 파일에서 제네시스 블록을 생성합니다. hash, previousHash, merkleRoot 는 32By.. 2022. 10. 9.
[블록체인 만들기 #1] Block 구성 (Typescript) 블록체인은 정보를 담은 여러개의 블록을 해시를 이용해 연결한 분산원장입니다. 네트워크에 참여한 노드들은 동일한 정보를 담은 블록들을 가지게 되고, 여러개의 블록들은 체인으로 연결되어 블록체인을 구성합니다. 이번 포스팅에서는 Typescript를 이용해 블록체인을 구성합니다. Typescript 환경설정 환경구성 Typescript는 동적타입을 지원하는 javascript을 개량한 언어입니다. 정적 타입을 지원하며 컴파일 시 변수의 타입을 결정하게 됩니다. Typescript로 블록체인을 구성하기 위해 환경설정을 해줍니다. $ npm i -D typescript ts-node @types/node typescript : typescript 언어를 사용합니다. -g 옵션으로 글로벌 설치를 할 수도 있지만 로.. 2022. 10. 9.