집돌이 공대남 IT

암호화폐 거래소 만들기. 심화 실습으로 완성도 높이기! 본문

IT/파이썬

암호화폐 거래소 만들기. 심화 실습으로 완성도 높이기!

집공이 2023. 8. 9. 12:00

안녕하세요, 여러분! 공대남입니다!

이전에 실습한 암호화폐 거래소를 더욱 발전시키는 작업을 해 보려고 합니다. 사용자 인증, 주문 매칭, 보안 등의 중요한 기능을 추가함으로써 거래소를 더욱 완성도 높은 상태로 만들어 보겠습니다.

이미 암호화폐와 블록체인에 대한 기본적인 지식이 있으신 분들이라면 큰 어려움 없이 따라올 수 있을 것입니다.

1. 사용자 인증

첫 번째로, 사용자 인증 기능을 추가합니다. 이를 위해 passport와 jsonwebtoken 라이브러리를 설치합니다.

$ npm install passport jsonwebtoken

사용자를 관리하기 위한 User 모델을 생성합니다. 이 모델에는 이메일과 비밀번호 필드가 포함됩니다.

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
  email: { type: String, required: true, unique: true },
  password: { type: String, required: true },
});

module.exports = mongoose.model('User', UserSchema);

이제 회원가입과 로그인 라우트를 추가합니다. 이 라우트에서는 passport를 이용해 사용자를 인증하고, jsonwebtoken을 이용해 토큰을 생성합니다.

const express = require('express');
const router = express.Router();
const User = require('../models/User');
const jwt = require('jsonwebtoken');

router.post('/signup', async (req, res) => {
  const { email, password } = req.body;

  const user = new User({ email, password });
  await user.save();

  const token = jwt.sign({ userId: user._id }, 'SECRET_KEY');
  res.send({ token });
});

router.post('/login', async (req, res) => {
  const { email, password } = req.body;

  const user = await User.findOne({ email });
  if (!user || user.password !== password) {
    return res.status(401).send('Invalid email or password');
  }

  const token = jwt.sign({ userId: user._id }, 'SECRET_KEY');
  res.send({ token });
});

module.exports = router;

 

2. 주문 매칭

다음으로, 주문 매칭 기능을 추가합니다. 이를 위해 주문을 관리하는 Order 모델을 생성합니다.

const mongoose = require('mongoose');

const OrderSchema = new mongoose.Schema({
  user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
  type: { type: String, enum: ['buy', 'sell'] },
  amount: { type: Number, required: true },
  price: { type: Number, required: true },
});

module.exports = mongoose.model('Order', OrderSchema);

주문을 생성하는 라우트를 추가합니다. 이 라우트에서는 주문을 데이터베이스에 저장하고, 매칭할 수 있는 다른 주문이 있는지 확인합니다.

const express = require('express');
const router = express.Router();
const Order = require('../models/Order');
const jwt = require('jsonwebtoken');

router.post('/order', async (req, res) => {
  const { type, amount, price } = req.body;
  const { userId } = jwt.verify(req.headers.authorization, 'SECRET_KEY');

  const order = new Order({ user: userId, type, amount, price });
  await order.save();

  const match = await Order.findOne({
    type: type === 'buy' ? 'sell' : 'buy',
    price: type === 'buy' ? { $lte: price } : { $gte: price },
  }).sort(type === 'buy' ? 'price' : '-price');

  if (match) {
    // 주문 매칭 로직
  }

  res.send(order);
});

module.exports = router;

 

3. 보안

마지막으로, 보안 기능을 추가합니다. 여기서는 HTTPS를 사용하도록 서버를 설정합니다. 이를 위해 openssl을 사용해 인증서를 생성합니다.

$ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

그런 다음, https 모듈을 사용해 서버를 생성합니다.

const fs = require('fs');
const https = require('https');
const app = require('./app');

const options = {
  key: fs.readFileSync('key.pem'),
  cert: fs.readFileSync('cert.pem'),
};

https.createServer(options, app).listen(3000);

이로써 사용자 인증, 주문 매칭, 보안 기능이 추가된 암호화폐 거래소를 만드는 실습을 완료했습니다.

이전에 비해 훨씬 복잡해진 거래소를 만드는 과정이었지만, 실제로 동작하는 거래소에는 이런 기능들이 필수적이라는 것을 이해하셨을 것입니다. 이를 통해 웹 개발과 블록체인 기술에 대한 이해를 더욱 깊게 하셨길 바랍니다.

다음 시간에는 거래소에 더욱 다양한 기능을 추가하는 방법에 대해 알아보도록 하겠습니다.

감사합니다!