Yours Technical Logic
Last updated
Last updated
Yours는 구글, 카카오 소셜 로그인 기능을 제공하며 2가지 모두 OAuth2.0 방식으로 동작합니다.
사용자는 구글, 카카오 로그인 창에 계정 정보를 입력하여 인증 과정을 수행한다.
발급된 인가 코드로 Yours Client는 Access Token 수령 후 해당 Token을 Yours Web Server로 전달한다.
Yours Web Server는 Access Token으로 User Resource를 수령하고 회원가입 처리 후 자체 Json Web Token을 발급하여 Client에게 전달한다.
Yours 프로덕트 내 모든 타이포를 JSON으로 분리한다.
한국어로 작성된 타이포가 모인 JSON 작성한다.
영어로 작성된 타이포가 모인 JSON 작성한다.
i18n(국제화) 라이브러리를 이용하여 JSON을 파싱 후 올바른 위치에 각 타이포 삽입한다.
useTranslation 훅을 이용하여 언어 변경 및 언어별 스타일링 설정한다.
이더리움 기반 지갑 지원( Ethereum, Klaytn, Polygon, Aurora)
앱토스 기반 지갑 지원
랜덤 니모닉 코드를 생성한다.
해당 니모닉 코드를 사용자 암호(passCode)를 가지고 암호화한다.
유저의 고유 passCode를 알아야만 복호화가 가능하도록 한다.
사용자 패스코드로 암호화한 니모닉코드 값을 데이터베이스에 저장한다.
이더리움으로 지원
데이터베이스에 웰컴 NFT에 대한 정보와 미리 발행한 NFT 주소를 저장해두고 있다.
NFT 받으러 가기 버튼을 클릭한다.
데이터베이스에 저장해둔 웰컴 NFT 정보를 가져온 후 스마트 컨트랙트 통신(발행자, 소유자 Yours)한다.
스마트 컨트랙트에서 해당 유저에게 NFT를 민팅해주면서 default benefit을 설정한다.
그 후, mintId를 유저에게 부여함으로써 유얼스에서는 민팅한다고 정의
이더리움 기반 체인 지원( Ethereum, Klaytn, Polygon, Aurora)
ERC-721 표준으로 지원
앱토스 체인 지원
Yours가 정의하는 앱토스에서의 NFT 형태
이더리움 기반 체인
데이터베이스에서 NFT 정보를 가져온다.
서버 단에서 NFT 정보를 ipfs에 올린 후, 반환된 ipfs url을 인자 값으로 넣어 스마트 컨트랙트 통신(발행자, 소유자 Yours)한다.
YoursBenefitNFT contract를 참조하는 proxy 컨트랙트를 배포하고 initialize 함수를 실행한다.
앱토스
데이터베이스에서 NFT 정보를 가져온다.
nft이름, nft메타데이터를 ipfs에 업로드한 값(nft 이름, 설명, 이미지 링크), 혜택 링크를 인자로 받아 deployAptosNFT 함수를 실행한다.
토큰을 100개(임의로 개발자가 지정한 것, 수정 가능) 발행하고, 100개 중 1개의 토큰을 mutate_property한다.
그 후, owner 속성을 version1로 수정한다.
이더리움 기반 체인 지원( Ethereum, Klaytn, Polygon, Aurora)
ERC-721 표준으로 지원
앱토스 체인 지원
Yours가 정의하는 앱토스에서의 NFT 형태
이더리움 기반 체인
데이터베이스에서 NFT 정보를 가져온다.
서버 단에서 NFT 정보를 ipfs에 올린 후, 반환된 ipfs url을 인자 값으로 넣어 스마트 컨트랙트 통신(발행자, 소유자 Yours)한다.
스마트 컨트랙트에서 해당 유저에게 NFT를 민팅해주면서 default benefit을 설정한다.
그 후, mintId를 유저에게 부여함으로써 유얼스에서는 민팅한다고 정의한다.
앱토스
데이터베이스에서 NFT 정보를 가져온다.
property_version이 0인 토큰들 중 하나에 mutate_property함수를 이용하여 owner를 고치고 index_list에 해당 유저가 몇번의 혜택을 갖는지 저장한다.
property_version이 1인 토큰의 maxPropertyVersion을 +1해줍니다.
사진 업로드해서 인증 요청을 한다.
NFT 생성자는 관리자 페이지에 들어가서 인증 요청에 대해 수락, 거절할 수 있다.
이메일 인증 코드를 랜덤으로 생성한다.
이메일을 key값으로 인증 코드를 value값으로 Redis에 저장한다.
NodeMailer 라이브러리를 사용하여 이메일을 발송한다.
발송한 이메일에서 인증 버튼을 클릭했을 때, Yours 페이지로 리다이렉션 시킨다.
리다이렉션 시키는 페이지 url에는 암호화된 인증코드를 붙어있다.
url에서 파싱한 인증코드를 받아와 검증한다.
Yours에서 온오프라인 데이터를 통한 신원 인증을 해줄 수 있게 하는 기능입니다.
이더리움 기반 체인 지원( Ethereum, Klaytn, Polygon, Aurora)
ERC-721 표준으로 지원
앱토스 체인 지원
Yours가 정의하는 앱토스에서의 NFT 형태
이더리움 기반 체인
데이터베이스에서 혜택 수정 된 NFT 정보를 가져온다.
서버 단에서 NFT 혜택 정보를 ipfs에 올린 후, 반환된 ipfs url을 인자 값으로 넣어 스마트 컨트랙트 통신(발행자, 소유자 Yours)한다.
스마트 컨트랙트에서 setBenefitsURI 함수를 실행하여 benefituri를 변경한다.
앱토스
데이터베이스에서 혜택 수정 된 NFT 정보를 가져온다.
서버 단에서 NFT 혜택 정보를 ipfs에 올린 후, 반환된 ipfs url을 인자 값으로 넣어 스마트 컨트랙트 통신(발행자, 소유자 Yours)한다.
mutateProperties 함수를 실행하여 value 값에 ipfs url을 추가해준다.
이더리움 기반 체인
데이터베이스에서 유저에게 부여한 mintId를 가져온다.
요청받은 유저의 외부 evm 지갑 주소와 mintId를 인자 값으로 넣으며 스마트 컨트랙트와 통신한다.
스마트 컨트랙트에서 transferFrom 함수를 실행시킨다.
앱토스
데이터베이스에서 유저에게 부여된 NFT Name과 id를 가져온다.
요청받은 유저의 외부 Aptos 지갑 주소와 NFT Name+id 값 그리고 mintId 값을 통해 SDK caller를 구성한다.
Aptos SDK의 offenToken 을 실행하고 target Wallet Address로 전송한다.
이더리움 기반 체인 지원( Ethereum)
ERC-1155 표준으로 지원
Klaytn, Polygon, Aurora 은 RPC 변경하여 배포만 하면 되는 상태
앱토스 체인 지원
이더리움 기반 체인
요청한 nftId들의 배열로 데이터베이스에서 두 개 이상의 nftAddress들과 mintId들의 정보를 가져온다.
nftAddress 배열과, mintId 배열을 인자 값으로 넣으며 스마트 컨트랙트와 통신한다.
스마트 컨트랙트에서 혜택 NFT들을 lock시키고, nftInfo 인터페이스에 nftAddress와 mintId 값을 넣으며, 하나의 통합 NFT를 생성한다.
데이터베이스에 생성한 통합 NFT 정보와 유저 ID를 매핑시켜 저장한다.
앱토스
요청한 nftId들의 배열로 데이터베이스에서 유저 이름과 nftName들의 정보를 가져온다.
owner, uri, nftNameList, propertyVersionList를 인자 값으로 넣으며 스마트 컨트랙트와 통신한다.
하나의 통합 NFT를 생성한다.
이더리움 기반 체인
요청한 nftId들의 배열로 데이터베이스에서 nftAddress들과 mintId들의 정보를 가져온다.
nftAddress 배열과, mintId 배열을 인자 값으로 넣으며 스마트 컨트랙트와 통신한다.
스마트 컨트랙트에서 추가된 혜택 NFT들을 lock시키고, nftInfo 인터페이스에 nftAddress와 mintId 값을 넣으며, 통합 NFT를 수정한다.
데이터베이스에 통합 NFT에 추가적으로 들어간 혜택NFT ID를 유저 ID를 매핑시켜 수정한다.
앱토스
개발 진행중
이더리움 기반 체인
요청한 contractId와 유얼스 중앙지갑 주소를 인자 값으로 넣으며 스마트 컨트랙트와 통신한다.
스마트 컨트랙트에서 추가된 혜택 NFT들을 lock 해제시키고, 통합 NFT를 소각한다.
앱토스
개발 진행중
2023.10.06 기준 NFT 마켓플레이스는 Yours 지갑 연동만 지원합니다.
소셜 로그인을 통해 사용자 정보를 조회합니다.
사용자 정보를 조회하여 Yours가 사용자에게 부여된 지갑 정보를 통해 Yours 지갑과 NFT 마켓플레이스를 연동합니다.
Yours 회원이 아니라면 회원 가입을 진행합니다.
2023.10.06 기준 토큰타입은 ERC-721만 지원합니다.
Yours와 연동되어있는 NFT 마켓플레이스에 NFT를 판매하려고 할 때, 판매하려는 NFT 주소를 확인합니다.
NFT 마켓플레이스에 리스팅 되어있지 않은 NFT라면, 마켓플레이스 스마트 컨트랙트와 통신하여 NFT를 판매할 수 있게 소유권 변경이 가능하도록 설정을 해줍니다.
NFT id와 NFT 주소, 토큰타입, 가격 정보를 가지고 마켓플레이스 스마트 컨트랙트와 통하여 NFT 판매 정보를 등록합니다.
23.10.06 기준 토큰타입은 ERC-721만 지원합니다.
Yours와 연동되어있는 NFT 마켓플레이스에 NFT를 구매하려고 할 때, 구매하려는 NFT 주소를 확인합니다.
NFT Id와 NFT 주소, 토큰타입, 소유자 정보를 가지고 마켓플레이스 스마트 컨트랙트와 통신하여 NFT 구매 정보를 등록합니다.
사용자는 YRP 포인트를 충전하기 앞서, 충전에 사용할 스테이블 코인을 선택할 수 있습니다.
Yours 내부 로직으로 최대 충전 가능 금액에 대한 계산이 이루어지고, 사용자는 한도 내에서 원하는 충전 수량을 입력할 수 있습니다. 2023. 10. 06 기준 스테이블 코인과 YRP 포인트의 환율은 1 이며, 최소 10YRP 부터 최대 10,000,000YRP 까지 충전할 수 있습니다.
이후 트랜잭션 비용을 계산하는데 사용자는 트랜잭션 비용을 포함한 총 거래 금액 이상의 코인을 소유하고 있어야 거래를 진행할 수 있습니다.
Yours Pool로 스테이블 코인을 전송하는 트랜잭션을 실행합니다.
거래에서 생성된 트랜잭션 , 네트워크 수수료 등의 정보는 모두 사용자에게 제공합니다.
지갑 연결 정보는 react-redux
와 local-storage
를 통해 관리합니다. 한 번 지갑을 연결한 사용자는 직접 해제하거나, Metamask
인증 실패하는 경우가 아니면 자동으로 해제되지 않습니다.
연결 후, address
와 signer
객체는 전역 상태를 통해 관리합니다.
redux
와 local-storage
를 통해 사용자가 현재 연결한 지갑의 체인을 구분합니다.
연결 후, wallet
객체를 통해 사용자 지갑에 대한 정보를 관리합니다.
외부 지갑에 소유하고 있는 NFT 정보를 얻어오기 위하여 Moralis SDK
를 이용합니다.
외부 지갑에 소유하고 있는 전처리한 데이터한 NFT 정보를 Yours에게 전달합니다.
Yours에서는 외부 NFT를 2가지 기준으로 구분합니다.
Yours protocol 에서 발행되고 외부로 Transfer 된 NFT
Yours protocol 에서 발행되지 않은 NFT
3-a의 경우, NFT를 Yours 로 Transfer 한 유저에게 다시 모든 권한을 부여합니다.
3-b의 경우, 원본 NFT를 Yours 가 관리하고 유저에게 wrapping NFT를 발급하여 동등한 가치의 NFT에 대해 모든 권한을 부여합니다.
컨트랙트에게 원본 NFT를 deposit 합니다.
deposit 된 결과를 확인되었으면 wrapping 을 통해 전달받은 NFT와 동등한 가치를 지닌 NFT(wrapNFT)를 mint하여 사용자에게 발급합니다. 이후 사용자는 Yours protocol 에서 생성되지 않은 NFT로도 Yours가 제공하는 benefit 을 모두 경험할 수 있습니다.
다시 외부 지갑으로 해당 NFT를 이동시킬 경우, wrapNFT를 burn 시키고 컨트랙트에서 관리하고 있던 원본 NFT를 사용자 지갑 주소로 transfer 합니다.
준비 중
EVM 기반 체인의 경우, 구조를 사용함으로써 비용 절약 및 수정 가능하도록 설계 되어 있다.
앱토스에는 mintId가 없기 때문에 property_version을 유저에게 부여함으로써 유얼스에서는 민팅한다고 정의한다. 이와 관련된 개념은 에서 확인할 수 있습니다.
를 이용합니다.