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 명세서를 확인하시면 됩니다.
- NFT 테이블에 추후 민팅하고싶은 NFT의 정보들을 저장한다.
- 1번에서 저장한 정보들을 DB에서 조회하고, 보유한 ERC 20 토큰을 일정량 지불 후, 조회한 정보를 기반으로 NFT를 민팅한다.
- 민팅을 위한 ERC 20 토큰 지불비용은 로직 컨트랙트의 함수를 DelegateCall로 호출해 변경할 수 있다.
- 현재, 로직컨트랙트의 토큰 지불비용 변경은 난수 생성을 통해 이뤄지고 있지만, 추후 로직을 변경하고 싶다면 새롭게 컨트랙트를 배포한 후, 본 컨트랙트인 프록시 컨트랙트에 연결만하면 컨트랙트의 업그레이드가 이뤄질 수 있다.
업그레이더블 컨트랙트 구조
아래 다이어그램은 프록시 패턴의 구조를 시각적으로 나타낸 것이다.
- User: 프록시 컨트랙트를 호출하는 사용자.
- Owner: 프록시 컨트랙트를 업그레이드할 수 있는 권한을 가진 관리자.
- Proxy: 로직 컨트랙트를 대리하여 함수를 실행.
또한 연결된 로직 컨트랙트를 변경할 수 있는 함수를 가짐 (즉, 로직 변경 업그레이드 가능) - Logic: 실제 로직을 포함한 컨트랙트. (민팅 비용을 변경할 수 있는 함수를 가짐)
데이터베이스 구조
API 명세서
하드햇 컨트랙트 테스트