๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์˜คํ”ˆ์กฐ์˜ ๊ฐœ๋ฐœ๊ธฐ

ZEKEยท2022๋…„ 2์›” 19์ผ
0
post-thumbnail

>>> Github์ฃผ์†Œ Github_BEB_02_openZo

>>> Notion์ฃผ์†Œ Notion_openZo

๐Ÿš€ ์˜คํ”ˆ์”จ(Opensea)?

์˜คํ”ˆ์”จ(Opensea)๋Š” NFT๊ฑฐ๋ž˜์†Œ์ž…๋‹ˆ๋‹ค.
Ethereum, klaytn, polygon ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐœํ–‰๋˜๋Š” NFT๋“ค์„ ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ๊ฐœ๋ฐœ๋ชฉํ‘œ

์˜คํ”ˆ์”จ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์šฐ์„  1์ฐจ ๋ชฉํ‘œ์™€ ์ถ”๊ฐ€์ ์ธ ๋ชฉํ‘œ๋ฅผ ๋‚˜๋ˆ ์„œ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ๊ธฐ๊ฐ„์•ˆ์— 1์ฐจ๋ชฉํ‘œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์žก๊ณ  ์ดํ›„ 2์ฐจ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑ์„ ๊ณ„ํšํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํŒ€1์ฐจ ๋ชฉํ‘œ

์ถ”๊ฐ€์ ์ธ ๋ชฉํ‘œ

๐Ÿš€ ์•„ํ‚คํ…์ณ(Architecture)

์„œ๋ฒ„์™€ DB์˜ ํ•„์š”์„ฑ์— ์˜๋ฌธ์„ ๊ฐ€์ง€๋ฉด์„œ Client ํ•˜๋‚˜๋งŒ์„ ๊ตฌ์„ฑํ•˜์—ฌ ๋ธ”๋ก์ฒด์ธ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

1์ฐจ ๊ฐœ๋ฐœ ์ดํ›„ ๋ธ”๋ก์ฒด์ธ์—์„œ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๊ฑด ์‚ฌ์šฉ์ž์˜ ์‚ฌ์šฉ์„ฑ์„ ๋ถˆ๋งŒ์กฑ์‹œํ‚ค๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
์™œ๋ƒํ•˜๋ฉด, ์•„๋ฌด๋ฆฌ external view ํ•จ์ˆ˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋ฟ์ด๋ผ๋„ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์†๋„์— ๋ชป๋ฏธ์ณค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ดํ›„ ์„œ๋ฒ„์™€ DB๋ฅผ ํฌํ•จํ•œ ๊ตฌ์กฐ๋กœ ๋ฐฉํ–ฅ์„ ํ‹€์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ๊ฐœ๋ฐœ๋ถ„๋‹ด

๊ฐœ๋ฐœ์€ ํฌ๊ฒŒ Front์™€ Backend์™€ Client-IPFS or Blockchain ์„ ๊ตฌ๋ถ„์ง€์–ด ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ €๋Š” NFT๋ฅผ Mintingํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ Transferํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งก๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜คํ”ˆ์กฐ์˜ ๋…ธ์…˜ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ  ํ•ด์ฃผ์„ธ์š”.

>>> Notion์ฃผ์†Œ Notion_openZo

๐Ÿš€ ๊ฐœ๋ฐœ๊ฒฐ๊ณผ

CreateNFT


Transfer


๐Ÿš€ ๊ฐœ๋ฐœํšŒ๊ณ 

KEEP

1๏ธโƒฃ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ํ•ญ์ƒ ๋Š๋ผ๋Š” ๋ถ€๋ถ„์€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋„ ์—ฌ์ง€ ์—†์ด ์–ด๋”˜๊ฐ€์— ์žˆ์„ ํ•ด๊ฒฐ๋ฐฉ์•ˆ๋“ค์„ ์ฐพ์•„ ๋งŽ์ด ์‹œ๋„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์‹œ๋„์†์—์„œ ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋˜๋Š” ๊ฒƒ๋“ค๊ณผ ๋งŽ์€ ์‹คํŒจ ๋์— ๊ฒฐ๊ตญ ๊ตฌํ˜„์— ์„ฑ๊ณต ํ•ด๋ƒˆ์„ ๋•Œ ๊ทธ ์งœ๋ฆฟํ•จ์ด ๊ณ„์† ์ฝ”๋”ฉ์„ ํ•˜๊ฒŒ ๋˜๋Š” ์›๋™๋ ฅ์ด ๋˜์ง€ ์•Š๋‚˜ ์‹ถ์Šต๋‹ˆ๋‹ค.
๋‹ต์„ ์ฐพ๋Š” ์—ฌ์ •์„ ์ฆ๊ธฐ๊ณ  ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋๊นŒ์ง€ ๋ถ€๋”ชํžˆ๋ฉฐ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์˜์ง€๊ฐ€ ์•ž์œผ๋กœ ์ œ๊ฐ€ ๊ณ„์† ๊ณ ์ˆ˜ํ•ด ๋‚˜๊ฐ€์•ผํ•  ๊ทผ๋ณธ ๋งˆ์Œ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ํŒ€์›๋“ค๊ณผ ํ˜‘์—…์‹œ ์ง€์†์ ์œผ๋กœ ์„œ๋กœ ์ƒํ™ฉ๋“ค์„ ๊ณต์œ ํ•˜๋ฉฐ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŒ€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์™„์„ฑ๋„ ์žˆ๊ฒŒ ๋งˆ๋ฌด๋ฆฌ ๋  ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ค‘ ํ•˜๋‚˜๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

PROBLEM

1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ํ˜‘์—…์— ์ œ์ผ ์ค‘์š”ํ•œ GitHub์—์„œ merge๋•Œ๋ฌธ์— ๋ช‡ ๋ฒˆ ์• ๋จน์€ ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์ธํ•ด ๊นจ๋‹ฌ์€ ํ•ด๊ฒฐ๋ฐฉ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • GitHub์„ ํŒ€ํ”„๋กœ์ ํŠธ ์‚ฌ์šฉ์‹œ์— Gitworkflow๋Š” ํ•„์ˆ˜! ์‚ฌ์ „์— ๋ฏธ๋ฆฌ ๋ธŒ๋žœ์น˜์˜ ๊ทœ์น™์„ ์ •ํ•˜๊ณ  main branch๊ฐ€ ์•„๋‹Œ dev๋ธŒ๋žœ์น˜๋กœ๋งŒ merge ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ
  • ์ž‘์—… ํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ์„œ๋กœ ์–ธ์ง€ํ•˜์—ฌ conflict๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€
  • mergeํ•˜๋Š” ์‹œ๊ฐ„ ์ •ํ•ด๋†“๊ณ , merge์‹œ ๋ฏธ๋ฆฌ ํ•ด๋‹น ์‚ฌํ•ญ ๊ณต์œ 
  • ์‰ฝ๊ฒŒ ๋‚ด์šฉ์„ ํ”ผ๋“œ๋ฐฑ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋””์Šค์ฝ”๋“œ์™€ GitHub ์—ฐ๋™ํ•˜๊ธฐ

2๏ธโƒฃ ์ด๋ก ์œผ๋กœ๋งŒ ์Šต๋“ํ•œ ์ง€์‹์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ์˜ ์–ด๋ ค์›€์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ํŠธ๋žœ์žญ์…˜์„ ์ผ์œผํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ๋ช…์ด ํ•„์š”ํ•˜๊ณ , ๊ฐ€์Šค๋น„๋“ฑ์˜ ๊ธˆ์•ก์„ ์ง€๋ถˆํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๋ฅผ ๋ฉ”ํƒ€๋งˆ์Šคํฌ์™€ ์—ฐ๋™ํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ž‘์„ฑํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • const tx = {
       from: userAddress,
       to: contractAddr,
       nonce: nonce,
       gas: 300000,
       data: contract.methods.mintNFT(userAddress, tokenUri).encodeABI(),
     };

3๏ธโƒฃ contract๋ฅผ truffle๋กœ ์žฌ๋ฐฐํฌ์‹œ ์ด๋ฏธ ๋ฐฐํฌ๋œ contract๋ฅผ ์•„๋ฌด๋ฆฌ ์ˆ˜์ •ํ•ด๋„ ์žฌ๋ฐฐํฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ €์˜ ํ•œ์—†๋Š” ๋ฌด์ง€์—์„œ ๋น„๋กฏ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • Truffle init์„ ํ†ตํ•œ ํด๋” ์ดˆ๊ธฐํ™”์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด migrationsํด๋”๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํด๋” ์•ˆ์—๋Š” 1_initial_migration.js ํŒŒ์ผ๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ truffle์—์„œ๋Š” ์ด ํด๋”์˜ ์•ž์— ๋ถ™์—ฌ์ง„ ์ˆซ์ž๋ฅผ ์ฐพ์•„ ์ด๋ฏธ ๋ฐฐํฌ๋œ contract๋Š” ์ˆ˜์ •๋˜์—ˆ๋”๋ผ๋„ ์žฌ๋ฐฐํฌ ํ•˜์ง€ ์•Š๊ณ , ์•„์ง ๋ฐฐํฌ๋˜์ง€ ์•Š์€ ์ˆซ์ž์˜_initial_migration.js ํŒŒ์ผ๋ถ€ํ„ฐ ๋ฐฐํฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ, contract๋ฅผ ์ˆ˜์ • ํ›„ ์žฌ๋ฐฐํฌ ํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ ์ˆซ์ž_initial_migration.js๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐฐํฌํ•  contract๋ฅผ ๋ช…์‹œํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. About migration

4๏ธโƒฃ Contract๋‚ด ํ•จ์ˆ˜์˜ return ๊ฐ’์„ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

web3ํ†ตํ•ด contract ๊ฐ์ฒด ์ƒ์„ฑํ›„, ์ปจํŠธ๋ž™ํŠธ๋‚ด์— ํ•จ์ˆ˜๊ฐ’์„ ๋ฆฌํ„ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ฅผ ๊ฒ€์ƒ‰ ํ›„ call()์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํŠธ๋ž™ํŠธ ๋‚ด์— ํ•จ์ˆ˜ ์‹คํ–‰์‹œ return๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

const tokenId = contract.methods.getTokenId().call();

5๏ธโƒฃ web3.js ์‚ฌ์šฉ์‹œ webpack๋ฌธ์ œ

create-react-app ๋ฒ„์ „์ด 5 ์ด์ƒ์ธ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ ์•„๋ž˜ ๋‚˜์™€ ์žˆ๋Š” ๋งํฌ๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์„ค์น˜ ํ›„ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. web3์™€ creat-react-app webpack๋ฒ„์ „ ๋ฌธ์ œ

6๏ธโƒฃ ํŒ€์›๋“ค๊ณผ ๊ตฌ์กฐ ์„ค๊ณ„์‹œ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฌ๋”๋ผ๋„ ์ถฉ๋ถ„ํ•œ ๋ฆฌ์„œ์น˜ ํ›„์— ์„ค๊ณ„ํ•  ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

TRY

1๏ธโƒฃ ํ˜„์žฌ ์†๋„ ๊ฐœ์„ ์œผ๋กœ ์ธํ•œ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฐ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์ž‘์—…์ด ์ง„ํ–‰์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„๊นŒ์ง€ ์™„๋ฃŒํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธก์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, ์†๋„ ์ง€์—ฐ์œผ๋กœ ๋ถˆ๋งŒ์กฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋™์ž‘ํ•˜๋„๋ก๋งŒ ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ์ฝ๊ธฐ ์ข‹๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋Š” ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ์ž‘์—…์„ ์˜ˆ์ •์ค‘์ž…๋‹ˆ๋‹ค.

profile
MAKE SOMETHING

0๊ฐœ์˜ ๋Œ“๊ธ€