[Blockchain] JS로 Blockchain 구현하기 (1)

Jaewonee·2022년 4월 28일

목표

  • 파일디렉토리 구조 설정
  • web 및 p2p server 구축

파일디렉토리 구조 설정

다음과 같은 4개의 파일을 만들자. 해당 파일의 역할은 다음과 같다.

main.js

  • p2p 서버 초기화, 사용
  • http 서버 초기화, 사용
  • 블록체인 함수 사용

httpServer.js

  • web에 명령어를 입력해서 내 노드를 제어하는 서버

p2pServer.js

  • 다른 노드와 통신을 위한 서버
  • peer to peer / node 대 node / 개인과 개인 의 원장공유
  • 서로 필요한 정보들을 서로서로 공유하는 탈중앙화 시스템 구축

block.js

  • 블록체인 관련 함수
  • 블록 구조 설계


httpServer.js

기존에 server를 구축할때 const express = require('express') 와 같은 코드를 사용했다. 이는 CommonJs 모듈을 사용하는 방식으로서 전체 모듈을 다 불러오게 되는데, 불필요한 모듈이 로드되기도 하고 모듈 내에서 어떤 부분을 사용했는지도 확인할 수 없다. 때문에 ES6부터는 import / export 라는 방식으로 모듈을 불러오고 내보낸다. 보다 자세한 내용은 아래 문서를 참고하자.

Node.js에서 ES 모듈(import/export) 사용하기
Node.js 에서 import/export 사용하기

npm으로 필요한 모듈 설치후 server를 실행시키면 다음과 같은 에러를 볼 수 있다. import/export 사용시 나오는 error로 package.json"type": "module"을 다음과 같이 추가해 주면 정상 작동하는것을 확인 할 수 있다.

이후 작성할 main.js에서 불러야 하기때문에 initHttpServer 함수를 export 해주었다. 아래는 코드.

// import의 경우 딱 필요한 애만 불러옴
import express from 'express';
import bodyParser from 'body-parser';

// common js에서 통쨰로 다 불러옴 그래서 위 import가 더 빠름
//const express = require('express')

// 초기화 함수
const initHttpServer = (myHttpPort) => {
    const app = express();
    app.use(bodyParser.json()); 

    app.get('/', (req, res) => {
        res.send('Hello BlockChain!')
    })

    //매개변수 2개 / 함수포트 , 화살표함수
    app.listen(myHttpPort, () => {
        console.log('listening httpServer Port : ', myHttpPort);
    })
}

// main에서 import를 하려면 export를 먼저하자
export { initHttpServer };



p2pServer.js

websocket server는 다른 노드와 통신을 위해 사용된다. 현재 작동하지는 않지만 server연결된 것을 확인해보도록 하자. 추가로 import 사용시 { }가 들어간 것과 들어가지 않는것의 차이가 궁금했는데, 받아오는 모듈에서 보내주는 export 방식의 차이라고 한다. 자세한 내용은 아래 링크를 참고하자.

import시 { } 의 역할은 무엇인가?

import { WebSocketServer } from 'ws' 

// 아래 매개변수 ws가 계속 늘어나기 때문에 저장해줄 자료구조를 만들어보자
// 지금 sockets가 가르키는건 빈 배열이 담긴 주소값. 따라서 안에 data에 push로 추가되고 바뀌는건 크게 상관이 없다 
const sockets = [];

const initP2PServer = (p2pPort) => {
    const server = new WebSocketServer({port:p2pPort});

    // websocke 내에서 일어나는 event는 정의되어 있다. 그 이벤트가 발생했을때 우리는 어떤 함수를 실행(호출)할 것인지 정해주면 된다. 
    server.on('connection', (ws) => {
        initConnection(ws) // 만들어야할 함수
    })
    console.log('listening P2PServer Port : ', p2pPort);
}

const initConnection = (ws) => {
    sockets.push(ws)
}

export { initP2PServer }



main.js

위 각각의 파일에서 export해준 함수를 호출했다. 환경변수 설정도 해주도록하자. 실행확인.

import { initHttpServer } from "./httpServer.js";
import { initP2PServer } from "./p2pServer.js";

            // 설정되어있으면 환경변수 아니면 3001 / 6001을 쓴다
            // int형으로 변환해서 써주자 (env파일에선 다 string형태로 들어간다? 정확하진않지만 암튼 뭘로 들어가든 int로 바꾸자)
const httpPort = parseInt(process.env.HTTP_PORT) || 3001;
const p2pPort = parseInt(process.env.P2P_PORT) || 6001;

initHttpServer(httpPort);
initP2PServer(p2pPort);
profile
🙋‍♂️블록체인 개발자 되기 / 📑 공부기록 공간

0개의 댓글