코드코코

[블록체인] 블록체인만들기 (3) HTTP 서버 (httpServer.js) 본문

블록체인

[블록체인] 블록체인만들기 (3) HTTP 서버 (httpServer.js)

코드코코 2021. 12. 31. 17:21

사전작업

httpServer.js 파일 생성

touch httpServer.js

모듈설치

express, bodyparser

npm i express body-parser

모듈불러오기

chainedBlock.js, checkValidBlock.js

const express = require("express")
const bodyParser = require("body-parser")
const { getBlocks, getVersion, nextBlock } = require('./chainedBlock')
const { addBlock } = require('./checkVaildBlock')

chainedBlock.js 에서 추가 exports 해주기

getBlocks와 getVersion을 httpServer.js 에서 사용할 예정이므로 미리 exports 시킴

module.exports = { nextBlock, getLastBlock, createHash, Blocks, getBlocks, getVersion }

 

express 서버 만들기

env 사용하여 포트열기

환경변수 설정 및 조회

export 변수명="값"

env | grep 조회할 변수명

HTTP서버 연결 및 확인

원하는 형태로 데이터를 파싱하기위해 bodyParser 추가

const app = express()
const http_port = process.env.HTTP_PORT || 3001

function initHttpServer() {

  app.use(bodyParser.json())

  app.listen(http_port, () => {
    console.log("Listening Http Port : " + http_port)
  })
  
}

initHttpServer();

 

URI

구성

/blocks : 전체 블럭을 가져옴

/mineBlock : 블럭체인에 블럭을 추가

/version : 버전정보를 가져옴

/stop : 서버를 종료

 

function initHttpServer() {
  app.use(bodyParser.json())


  app.get("/blocks", (req, res) => {
    res.send(getBlocks())
  })

  app.post("/mineBlock", (req, res) => {
    const data = req.body.data || []
    console.log(data)
    
    const block = nextBlock(data)
    addBlock(block)
    
    res.send(block)
  })

  app.get("/version", (req, res) => {
    res.send(getVersion())
  })

  app.post("/stop", (req, res) => {
    res.send({ "msg": "Stop Server!" })
    process.exit()
  })

  app.listen(http_port, () => {
    console.log("Listening Http Port : " + http_port)
  })
}

initHttpServer();

브라우저 접속

/blocks , /version

GET 메소드는 브라우저에 잘 출력이 되지만,

/mineBlock , /stop

POST 메소드는 브라우저에 출력이 되지 않는다.

curl 명령어를 통해 터미널에서 확인하는 방법을 사용하고자 한다.

 

curl 명령어로 POST 메소드 이용하기

/mineBlock

curl -H "Content-Type: application/json" --data "{\"data\" : [\"Anything1\",\"Anything2\"]}" http://localhost:3001/mineBlock

위와 같은 내용의 이미지

curl -H "Content-Type: application/json" --data "{\"data\":[\"Anything3\",\"Anything4\"]}"
 http://localhost:3001/mineBlock | python3 -m json.tool

 

파이선이 설치되어 있다면 다음과 같은 형태로 확인해 볼 수 있다.

 

서버연결한 터미널에 로그가 쌓임

마찬가지로 /blocks 에서 추가된 블럭들이 확인 됨

/stop

curl -X POST http://localhost:3001/stop

목차

httpServer.js
1	사전작업
1.1	httpServer.js 파일 생성
-	touch httpServer.js
1.2	모듈설치
1.2.1	Express, Bodyparser
1.3	모듈불러오기
1.3.1	chainedBlock, checkValidBlock
2	express server 만들기
2.1	env 사용하여 포트열기
2.1.1	환경변수 설정 및 조회
-	export 변수명="값"
-	env | grep 조회할 변수명
2.2	http서버연결 및 확인
-	원하는 형태로 데이터를 파싱하기위해 bodyParser 를 추가
2.3	chainedBlock.js 에서 추가 exports 해주기
-	getBlocks와 getVersion을 httpServer.js 에서 사용할 예정이므로 미리 exports 시킴
3	URl
3.1	구성
-	/blocks  : 전체 블록을 가져옴
-	/mineBlock : 블록체인에 블록을 추가
-	/version : 버전 정보를 가져옴
-	/stop : 서버를 종료
3.2	브라우저 접속
3.2.1	/blocks , /version
-	GET 메소드는 브라우저에 잘 출력이 되지만,
3.2.2	/mineBlock , /stop
-	POST 메소드는 브라우저에 출력이 되지 않는다.
3.3	Curl 명령어로 POST 메소드 이용하기
3.3.1	/blocks
3.3.2	/stop

 

전체코드

const express = require("express")
const bodyParser = require("body-parser")
const { getBlocks, getVersion, nextBlock } = require('./chainedBlock')
const { addBlock } = require('./checkValidBlock')
const app = express()
const http_port = process.env.HTTP_PORT || 3001

function initHttpServer() {
  app.use(bodyParser.json())


  app.get("/blocks", (req, res) => {
    res.send(getBlocks())
  })

  app.post("/mineBlock", (req, res) => {
    const data = req.body.data || []
    console.log(data)

    const block = nextBlock(data)
    addBlock(block)

    res.send(block)
  })

  app.get("/version", (req, res) => {
    res.send(getVersion())
  })

  app.post("/stop", (req, res) => {
    res.send({ "msg": "Stop Server!" })
    process.exit()
  })

  app.listen(http_port, () => {
    console.log("Listening Http Port : " + http_port)
  })
}

initHttpServer();