본문 바로가기
경일/Block-chain

[Blockchain/블록체인] P2P서버로 네트워크 구축

by dev_kong 2022. 6. 14.
728x90
728x90

0. 목차

1. 개요

2. P2P 서버란?

3. P2P 서버 네트워크 구축

1. 개요

또한 블록체인의 핵심 개념 중 하나인 탈중앙화를 위해서는
데이터를 한군데에 모아서 관리하는 것이 아니라,
블록체인의 참여자 각자가 갖고 있는 블록들을 서로 비교하며, 서로의 블록에 대한 검증을 이뤄낸다.


그렇기 때문에, 기존에 내가 배웠던 서버와 클라이언트의 개념과 달리,
각각의 개인 컴퓨터끼리 직접 연결하고, 서로 데이터를 주고받는 방식의 네트워크가 필요하다.


그리고 이러한 방식을 P2P 서버라고 한다.

2. P2P서버란

P2P 서버에 대해 조금 더 자세히 알아볼 필요가 있을 것 같다.


P2P 아예 처음 들어보는 단어는 아니다.

 

아직까지도 흔하게 쓰이는 토렌트,
좀 더 과거로 거슬러 올라가면 당나귀, 프루나, 파일구리 등등이 전부 P2P 네트워크로 구축된 서비스이다.

 

그리고 기존의 서버와 클라이언트 개념을 위디스크,쎈디스크,파일노리 등등의 웹하드 서비스라고 생각하면 조금 더 이해가 쉬울 것 같다.

웹하드 서비스는
콘텐츠 공급자가 웹하드 데이터베이스(서버)에 자신이 갖고 있는 콘텐츠를 추가한다.
그리고 수요자가 웹하드 데이터베이스에 있는 콘텐츠를 다운로드 받는다.
(공급자와, 수요자 둘다 클라이언트의 역할이다.)

 

 

반면, 토렌트 같은 P2P 서버는 사용자 개개인의 컴퓨터가 네트워크로 연결되어,
콘텐츠를 주고 받는다.


즉, 각각의 컴퓨터가 어떤때에는 서버의 역할을 하기도 하고,
어떤때에는 클라이언트의 역할을 한다.


그리고 이 각각의 컴퓨터를 노드라고 칭한다.

 

3. P2P 서버 네트워크 구축

개념은 어느정도 잡은거 같으니, 이제 직접 구축을 해보자.

 

일단 express를 이용해 기본적인 서버를 구축 해야한다.

이 서버는 각각의 노드에 자리잡아서, 클라이언트서버와 백엔드 서버를 동시 수행한다.

 

import { BlockChain } from '@src/core';

import express, { Request, Response } from 'express';

const app = express();
const bc = new BlockChain();

app.use(express.json());

app.post('/addToPeer', (req: Request, res: Response) => {
});

app.listen(3000, () => {
  console.log('서버 시작 \n PORT : #3000');
});

이렇게 서버를 만들어 준 뒤,
하나하나 추가하면서 작성을 해보자.

 

우선은 P2P 네트워크를 구축할 기본 토대를 만들어야 한다.
그 기본토대로는 websocket을 이용할거다.

 

// server/p2p.ts

import { WebSocket } from 'ws';
import { Chain } from '@src/core/blockchain/chain';

export class P2PServer extends Chain {
  sockets: WebSocket[];

  constructor() {
    super();
    this.sockets = [];
  }

  // 서버 시작하는 실행코드
  listen() {
    const server = new WebSocket.Server({ port: 7545 });
    server.on('connection', (socket) => {
      console.log('websocket connection');
    });
  }

  // client 연결코드
  connectToPeer(newPeer: string) {
    const socket = new WebSocket(newPeer);
  }

websocket을 이용해서 P2PServer라는 클래스를 만들었다.


socket을 이용한 P2P 네트워크의 기본 토대를 만든거다.

 

이제 express 서버가 실행될 때,
P2P 네트워크에서 서버의 역할을 하게끔 포트를 열어주면 된다.

그 코드는 P2PServer 의 listen 에 있다.

 

그리고 client의 역할 또한 수행 하게끔,
addToPeer router 에 post 요청이 오면,
req.body 로 받은 ip 주소로 연결하게는 코드를 실행시키면 된다.


해당 코드는 P2PServer의 connectToPeer 에 있다.

 

import { BlockChain } from '@src/core';
import { P2PServer } from '@src/serve/p2p';

import express, { Request, Response } from 'express';

const app = express();
const bc = new BlockChain();
const ws = new P2PServer();

app.use(express.json());

app.post('/addToPeer', (req: Request, res: Response) => {
  const { peer } = req.body;
  ws.connectToPeer(peer);
});

app.listen(3000, () => {
  console.log('서버 시작 \n PORT : #3000');
  ws.listen();
});

 

이렇게 작성을 해주면 아주아주 기초적인 P2P네트워크를 구축 할 수 있다.

728x90
728x90

댓글