JavaScript[TS]

[TS][공부 마라톤] TS + NestJS + TypeORM + MariaDB + 업그레이더블 컨트랙트

viviviviviid 2024. 6. 23. 15:18

 

직전에 작성한 업그레이더블 컨트랙트와
이번에 새로 학습한 TS, NestJS, TypeORM로 구축한 서버와 연결하는
10일 챌린지 프로젝트를 진행했습니다. 72번째 포스팅 글에서 이어집니다.

 

GITHUB

https://github.com/viviviviviid/ts-nest-upgradable-challenge/blob/main/README.md

 

챌린지 프로젝트 개요

  • 학습 내용 : TypeScript, Nest.js, TypeORM
  • 학습 기간 : 1개월
  • 챌린지 목표 : 학습한 내용을 직전에 구축한 업그레이더블 컨트랙트에 연결하여 실전에 적용하는 것을 목표로 한다.
  • 챌린지 기간 : 7일 [컨트랙트 구축 및 하드햇 테스트 : 3일] [서버 구축 및 연결 4일]
  • 챌린지 후기 : 자주 사용하는 GO언어처럼 강타입으로 바뀌니 확실히 타입에러가 현저히 줄어들어 너무 편리하고 마음이 편안하다.

 

기술 스택

  • Language : Javascript(TypeScript), Solidity
  • Backend : Nest.js, Node.js, TypeORM, ethers
  • Database : MariaDB
  • Blockchain : Solidity, Hardhat, Upgradable Contract(프록시 패턴), ERC-20, 721

 

프로젝트 세부 내용

아래 기능들은 전부 CRUD를 기반으로 API를 구축해 놓은 상태이고, 글 하단의 API 명세서를 확인하시면 됩니다.

  1. NFT 테이블에 추후 민팅하고싶은 NFT의 정보들을 저장한다.
  2. 1번에서 저장한 정보들을 DB에서 조회하고, 보유한 ERC 20 토큰을 일정량 지불 후, 조회한 정보를 기반으로 NFT를 민팅한다.
  3. 민팅을 위한 ERC 20 토큰 지불비용은 로직 컨트랙트의 함수를 DelegateCall로 호출해 변경할 수 있다.
  4. 현재, 로직컨트랙트의 토큰 지불비용 변경은 난수 생성을 통해 이뤄지고 있지만, 추후 로직을 변경하고 싶다면 새롭게 컨트랙트를 배포한 후, 본 컨트랙트인 프록시 컨트랙트에 연결만하면 컨트랙트의 업그레이드가 이뤄질 수 있다.

 

업그레이더블 컨트랙트 구조

아래 다이어그램은 프록시 패턴의 구조를 시각적으로 나타낸 것이다.

  • User: 프록시 컨트랙트를 호출하는 사용자.
  • Owner: 프록시 컨트랙트를 업그레이드할 수 있는 권한을 가진 관리자.
  • Proxy: 로직 컨트랙트를 대리하여 함수를 실행.
                또한 연결된 로직 컨트랙트를 변경할 수 있는 함수를 가짐 (즉, 로직 변경 업그레이드 가능)
  • Logic: 실제 로직을 포함한 컨트랙트. (민팅 비용을 변경할 수 있는 함수를 가짐)

 

데이터베이스 구조

 

API 명세서

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

하드햇 컨트랙트 테스트