Skip to content

Blockchain Neo Extension Wallet, Private Node, Explorer

Notifications You must be signed in to change notification settings

yu-uj/Bithumb-Dagao-NEO

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Bithumb Dagao Neo (๋น—์ธ์ด ๋‹ค๊ฐ€์˜ค๋„ค์˜ค)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-11-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 9 43 01

๐Ÿ“™ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๋น ๋ฅด๊ณ  ํŽธ๋ฆฌํ•œ Explorer, ์‰ฝ๊ณ  ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์˜ Wallet์ด ์ง€๊ธˆ ๋‹ค๊ฐ€์˜ค ๋„ค์˜ค!!

โ€˜Bithumb Dagao Neoโ€™ ๋Š” Neo Private Node๋ฅผ ํ™œ์šฉํ•œ Exlorer, Wallet ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๋น—์ธ์ด ๋‹ค๊ฐ€์˜ค๋„ค์˜ค Explorer๋Š” ํ”„๋ผ์ด๋น— ๋…ธ๋“œ์— ๋Œ€ํ•œ ํŠธ๋žœ์žญ์…˜, ๋ธ”๋ก, ๊ณ„์ •๋“ค์˜ ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฒ€์ƒ‰์ฐฝ์„ ์ด์šฉํ•œ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Wallet์€ ๋‹ˆ๋ชจ๋‹‰ ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•œ ๊ณ„์ • ๋ณต๊ตฌ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, NEP17 ํ† ํฐ์ธ ๋„ค์˜ค, ๊ฐ€์Šค์˜ ์ „์†ก๊ณผ ๋ฉ€ํ‹ฐ์‹œ๊ทธ ๊ณ„์ •์˜ ์ƒ์„ฑ ๋ฐ ์†ก๊ธˆ์„ ์ง€์›ํ•˜๊ณ  ๋””์Šค์ฝ”๋“œ ์ฑ„๋„๋กœ์˜ ์•Œ๋ฆผ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Bithumb Dagao Neo ๊ธฐ์ˆ  ์Šคํƒ

๋…ธ๋“œ ๋ฐ API: Docker, Mongo DB, Python

Wallet : MUI, NeonJs, CSS, React, Crypto, Ethers, Chrome Extension, Axios

Explorer : Axios, AntDesign, React, NeonJs, NodeJs

Getting Started

Installing

  1. clone this repository
https://github.com/codestates/BTAFinalProject-01.git
  1. change directory

Explorer

cd BTAFinalProject-01/Explorer/client

Wallet

cd BTAFinalProject-01/Wallet
  1. install dependencies
npm install

Executing program

Wallet

npm run build

ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ € > ์ƒ๋‹จ ์šฐ์ธก ํฌ๋กฌ ํ™•์žฅํ”„๋กœ๊ทธ๋žจ ๊ด€๋ฆฌ > ์ƒ๋‹จ ์ขŒ์ธก "์••์ถ•ํ•ด์ œ๋œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค" ํด๋ฆญ > Wallet์— build ํด๋” ์—…๋กœ๋“œ ํฌ๋กฌ ์ƒ๋‹จ ์šฐ์ธก ํฌ๋กฌ ํ™•์žฅํ”„๋กœ๊ทธ๋žจ์—์„œ Neo Wallet ํด๋ฆญ

Explorer

npm run start

Node ReadMe

(https://github.com/codestates/BTAFinalProject-01/tree/main/Node)

Daemon ReadMe

(https://github.com/codestates/BTAFinalProject-01/tree/main/Daemon)


์„ ์ • ์ฝ”์ธ ์†Œ๊ฐœ (NEO)

๐Ÿ“Ÿย ๊ฐœ์š”

์Šค๋งˆํŠธ ์ด์ฝ”๋…ธ๋ฏธ๋ฅผ ์œ„ํ•œ ๋ถ„์‚ฐ ๋„คํŠธ์›Œํฌ

๋ชฉํ‘œ : Neo๋Š” ๋ธ”๋ก์ฒด์ธ ๊ธฐ์ˆ ๊ณผ ๋””์ง€ํ„ธ ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‚ฐ์„ ๋””์ง€ํ„ธํ™”ํ•˜๊ณ , ๋””์ง€ํ„ธ ์ž์‚ฐ์— ๋Œ€ํ•œ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž์ฒด ๊ด€๋ฆฌํ•˜๊ณ , ๋ถ„์‚ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด "์Šค๋งˆํŠธ ๊ฒฝ์ œ"๋ฅผ ๋‹ฌ์„ฑ

๐Ÿ“Ÿย  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ ํŠน์ง•

โœ…ย  ํ•ฉ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜ : dBFT

์œ„์ž„๋œ ๋น„์ž”ํ‹ด ์žฅ์•  ํ—ˆ์šฉ(Delegated Byzantine Fault Tolerant)๋Š” ๋Œ€๋ฆฌ ํˆฌํ‘œ๋ฅผ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ ํ•ฉ์˜ ์ฐธ์—ฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋น„์ž”ํ‹ด ์žฅ์•  ํ—ˆ์šฉ ํ•ฉ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜.ย 

NEO ํ† ํฐ ๋ณด์œ ์ž๋Š” ํˆฌํ‘œ๋ฅผ ํ†ตํ•ด ์ง€์ง€ํ•˜๋Š” ํ•ฉ์˜ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ.ย ์„ ํƒ๋œ ํ•ฉ์˜ ๋…ธ๋“œ ๊ทธ๋ฃน์€ BFT ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ํ•ฉ์˜์— ๋„๋‹ฌํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ธ”๋ก์„ ์ƒ์„ฑ.ย ํˆฌํ‘œ๋Š” ์ •ํ•ด์ง„ ๊ธฐ๊ฐ„์ด ์•„๋‹Œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ง„ํ–‰.

dBFT๋Š” n๊ฐœ์˜ ํ•ฉ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํ•ฉ์˜ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด f = โŒŠ(n-1) / 3 โŒ‹์˜ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ์ œ๊ณต.ย ์ด ๋‚ด๊ฒฐํ•จ์„ฑ์—๋Š” ๋ณด์•ˆ๊ณผ ๊ฐ€์šฉ์„ฑ์ด ๋ชจ๋‘ ํฌํ•จ๋˜๋ฉฐ ์ผ๋ฐ˜ ๋ฐ ๋น„์ž”ํ‹ด ์žฅ์• ์— ๋Œ€ํ•œ ๋‚ด์„ฑ์ด ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์— ์ ํ•ฉ.ย dBFT๋Š” ์ตœ์ข… ํ™•์ธ์ด ์™„๋ฃŒ๋˜๋ฉด ๋ธ”๋ก์„ ๋ถ„๊ธฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํŠธ๋žœ์žญ์…˜์ด ์ทจ์†Œ๋˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋˜์ง€ ์•Š์Œ.

๋ธ”๋ก ์ƒ์„ฑ์—๋Š” ์•ฝ 15~20์ดˆ๊ฐ€ ์†Œ์š”๋˜๋ฉฐ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋Ÿ‰์€ ์ตœ๋Œ€ ์•ฝ 1,000TPS๊นŒ์ง€ ์ธก์ •๋˜๋ฉฐ, ์ด๋Š” ํผ๋ธ”๋ฆญ ์ฒด์ธ ์ค‘ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ.ย ์ ์ ˆํ•œ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด 10,000TPS์— ๋„๋‹ฌํ•  ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ.

dBFT๋Š” ๋””์ง€ํ„ธ ์‹ ์› ๊ธฐ์ˆ ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•ฉ์˜ ๋…ธ๋“œ๊ฐ€ ๊ฐœ์ธ ๋˜๋Š” ๊ธฐ๊ด€์˜ ์‹ค๋ช…์ด ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธ.ย ๋”ฐ๋ผ์„œ ๋ฒ•์›์˜ ๊ฒฐ์ •์— ๋”ฐ๋ผ ๋™๊ฒฐ, ์ทจ์†Œ, ์ƒ์†, ํšŒ์ˆ˜ ๋ฐ ์†Œ์œ ๊ถŒ ์ด์ „์ด ๊ฐ€๋Šฅ.ย ์ด๋ฅผ ํ†ตํ•ด Neo ๋„คํŠธ์›Œํฌ์— ๊ทœ์ • ์ค€์ˆ˜ ๊ธˆ์œต ์ž์‚ฐ์„ ์‰ฝ๊ฒŒ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Œ.

+ย ๋…ธ๋“œ๋ฅผ ์šด์˜ํ•˜๋Š”ย ๋ถํ‚คํผ(Book Keeper)์˜ 60% ์ด์ƒ์ด ๋™์˜ํ•  ๊ฒฝ์šฐ์—๋งŒ ํ•ฉ์˜๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋จผ์ € ๋„ค์˜ค ์ฝ”์ธ ์‚ฌ์šฉ์ž๋“ค์€ ํˆฌํ‘œ๋ฅผ ํ†ตํ•ด์„œ ๋Œ€ํ‘œ์ž์ธ ๋ถํ‚คํผ๋ฅผ ์„ ์ถœํ•œ๋‹ค. ์œ„์ž„ ํ”„๋ž™ํ‹ฐ์ปฌ ๋น„์ž”ํ‹ด ์žฅ์•  ํ—ˆ์šฉ(dPBFT) ๋ฐฉ์‹์„ ํ†ตํ•ด ์„ ์ถœ๋œ ๋ถํ‚คํผ๋“ค์€ย ๋ธ”๋ก์„ ๊ฒ€์ฆํ•  ๋•Œ๋งˆ๋‹คย ๋žœ๋ค์œผ๋กœ ๊ทธ ์ค‘์—์„œ ๋‹ค์‹œ ๋ธ”๋ก ์ƒ์„ฑ์ž(BP)๋“ค์ด ๊ฒฐ์ •๋˜๊ณ , ์ด ์ค‘ 3๋ถ„์˜ 2 ์ด์ƒ์˜ ๋ถํ‚คํผ๋“ค์ด ๊ฒ€์ฆ์— ๋™์˜ํ•˜์—ฌ ํ•ฉ์˜๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฉด, ์ƒˆ๋กœ์šด ๋ธ”๋ก์ด ์ƒ์„ฑ๋œ๋‹ค.

https://steemitimages.com/1280x0/https://cdn.steemitimages.com/DQmUtTsfhb11ENwwvfifL5b1QFqmmeL88RSgwAzqJQoLA6L/Screen%20Shot%202018-05-26%20at%204.52.13%20PM.png

image

โœ๏ธย ๋„ค์˜ค๋ฅผ ์„ ํƒํ•œ ์ด์œ 

๋„ค์˜ค๋Š” 2015๋…„ ์ถœ์‹œ๋œ ์ค‘๊ตญ ์ตœ์ดˆ์˜ ๋ธ”๋ก์ฒด์ธ์œผ๋กœ, ๋…์ž์ ์ธ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๊ธฐ์ˆ ์ธ ๋„ค์˜ค ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ค‘๊ตญ์— ์ด๋”๋ฆฌ์›€์ด๋ผ ๋ถˆ๋ฆด๋งŒํผ ์ด๋”๋ฆฌ์›€๊ณผ ๋น„์Šทํ•œ ๊ฐ€๋Šฅ(SC, Dapp๋“ฑ)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ–ฅํ›„ ์ค‘๊ตญ์˜ ์•”ํ˜ธํ™”ํ์— ๋Œ€ํ•œ ๊ทœ์ œ๊ฐ€ ํ’€๋ฆฌ๊ฒŒ๋˜๋ฉด ๋”์šฑ ๊ฐ๊ด‘๋ฐ›์„ ์•”ํ˜ธํ™”ํ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ด๋”๋ฆฌ์›€ ์ฒ˜๋Ÿผ ๊ฐ€์ƒ ๋จธ์‹ (VM)์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœ ํ•˜๊ธฐ ์œ„ํ•ด ๋…์ž์ ์ธ VM์„ ํ†ตํ•ด C, Java, Go, Python, JS๋“ฑ ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์šฐ๋ฆฌ ํŒ€์ด ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ธฐ์— ์–ธ์–ด ์„ ํƒ์˜ ํญ์ด ๋„“์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ Neo์—์„œ๋Š” ๊ณ„์ •์˜ ์ข…๋ฅ˜๋กœ normal ๋ฟ์•„๋‹ˆ๋ผ ๋‹ค์ค‘์„œ๋ช… ๊ณ„์ • (multisig) ๋˜ํ•œ ์ œ๊ณตํ•˜์—ฌ ์ด๋ก ์œผ๋กœ๋งŒ ์ ‘ํ–ˆ๋˜ multisig account๋ฅผ ํ†ตํ•œ ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ ๋ฐ ์„œ๋ช…, ์ „์†ก๋“ฑ์˜ enhancement ๊ธฐ๋Šฅ์„ ์ €ํฌ ํ”„๋กœ์ ํŠธ์— ๋…น์—ฌ๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜์—ฌ ์„ ํƒ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ƒ์„ธ

0.

ํŒ€๋ช… : (๋น—)์ธ ํƒ€๊ณ ์‹ถ๋‹ค.

๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ๋ช… : ๋น—์ธ์ด ๋‹ค๊ฐ€์˜ค๋„ค์˜ค (bithumb Dagao Neo)

I. ๊ฐœ์š”

๋น—์ธ์ด ๋‹ค๊ฐ€์˜ค๋„ค์˜ค(bithumb Dagao Neo) ํ”„๋กœ์ ํŠธ๋Š” ๋„ค์˜ค(NEO) ๋ธ”๋ก์ฒด์ธ์— ๋Œ€ํ•œ 1.ํ”„๋ผ์ด๋น— ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์ด ๋„คํŠธ์›Œํฌ ์ƒ์˜ 2.Block, Tx, Acccount ๊ธฐ๋ก์„ ํƒ์ƒ‰ ํ•  ์ˆ˜ ์žˆ๋Š” ์›น๊ธฐ๋ฐ˜ ์ต์Šคํ”Œ๋กœ์–ด, 3. normal, multisig ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  ํ”„๋ผ์ด๋น— ๋„คํŠธ์›Œํฌ์— ํŠธ๋žœ์žญ์…˜์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋กฌ ์ต์Šคํ…์…˜ ๊ธฐ๋ฐ˜์˜ ์ง€๊ฐ‘์„ ์ œ๊ณต ํ•ฉ๋‹ˆ๋‹ค.

II. ๊ธฐ์ˆ  ์Šคํ…

  1. ๋…ธ๋“œ, Daemon, API

    Docker, Mongo DB, Python

  2. Wallet

    MUI, NeonJs, CSS, React, Crypto, Ethers, Chrome Extension, Axios

  3. Explorer

    Axios, AntDesign, React, NeonJs, NodeJs

III. ํ•ต์‹ฌ๊ธฐ๋Šฅ

[ ์ง€๊ฐ‘ ]

  • ์ง€๊ฐ‘ ์ƒ์„ฑ
  • ๋กœ๊ทธ์ธ
  • ํ† ํฐ ์ „์†ก
  • MultiSig Account ์ƒ์„ฑ
  • MultiSig Account๋ฅผ ํ†ตํ•œ ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ, ์„œ๋ช…, ์ „์†ก ๋ฐ ๋””์Šค์ฝ”๋“œ ๋ฉ”์‹œ์ง€ ์ „์†ก

[ ์ต์Šคํ”Œ๋กœ์–ด ]

  • ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๋Š” Overview
  • ํŠธ๋žœ์žญ์…˜ ์กฐํšŒ
  • ๋ธ”๋ก ์กฐํšŒ
  • Address ์กฐํšŒ (์ž”๊ณ , NEP17 ํ† ํฐ ๊ฑฐ๋ž˜ ๋‚ด์—ญ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ)
  • ๊ฒ€์ƒ‰์ฐฝ์—์„œ Tx, Block number, Addres ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ

[ ๋…ธ๋“œ ]

  • ๋ธ”๋ก ์ƒ์„ฑ์šฉ(1Consensus) + ๋ธ”๋ก ๊ฒ€์ฆ์šฉ (2 Client) (dBFT) ๊ตฌ์„ฑ
  • RPC ํ˜ธ์ถœ, DB๋™๊ธฐํ™”
  • Rest API ์ œ๊ณต

IV.์ฐจ๋ณ„์ 

  • [Wallet] ํฌ๋กฌ ์ต์Šคํ…์…˜ ๊ฐœ๋ฐœ , ์‹ค์ œ ์ œํ’ˆ๊ณผ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ
  • [Wallet] ๋‹ˆ๋ชจ๋‹‰ ์ฝ”๋“œ๋กœ ๊ณ„์ • ๋ณต๊ตฌ
  • [Wallet] MultiSig Account ์ƒ์„ฑ, Tx์ƒ์„ฑ, ์„œ๋ช…, ์ „์†ก๊ณผ ๋””์Šค์ฝ”๋“œ ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ธฐ๋Šฅ
  • [Explorer] Tx, Block number, address๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” Search Box
  • [Explorer] Restfull API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ ๋ฐ˜์‘์„ฑ

ํ”„๋กœ์ ํŠธ ์ƒ์„ธ

01. ์ง€๊ฐ‘(Wallet)

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

  1. ๋ณด์•ˆ

์ง€๊ฐ‘ ์ƒ์„ฑ์‹œ ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์ด ๋ฐœ๊ธ‰๋˜๊ณ  ํ•ด๋‹น ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์œผ๋กœ ์ง€๊ฐ‘์„ ๋ณต๊ตฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Neo์˜ ๊ณ„์ •์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ํ‚ค๋“ค์— ๋Œ€ํ•œ ์ƒํ˜ธ๊ด€๊ณ„์™€ Hierarchy๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. โ†”ย ๋Š” ์„œ๋กœ๋ฅผ ์œ ๋„ํ•ด ๋‚ผ์ˆ˜ ์žˆ๋Š” ๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ(๋™๋“ฑํ•œ ๊ณ„๊ธ‰์„ ์˜๋ฏธ), โฌ‡๏ธ๋Š” ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ์˜ย ์œ ๋„๋Š” ๊ฐ€๋Šฅํ•˜๋‚˜ ๊ทธ ์—ญ์œผ๋กœ ์œ ๋„ํ•˜๋Š”๊ฒƒ์€ ๋ถˆ๊ฐ€ํ•œ ๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

image

(NEP2*๋Š” NEP2 standard์—์„œ ์ •์˜๋œ NEO๋งŒ์˜ ์ƒˆ๋กœ์šด Key๋กœ ๊ทธ ์ง€์œ„๋Š” ๋‹ค๋ฅธ ์•”ํ˜ธํ™”ํ์—๋„ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” WIF, PrivateKey์™€ ๋™๋“ฑํ•œ ์œ„์น˜๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.)

์ €ํฌ ์ง€๊ฐ‘์€ ์–ด์นด์šดํŠธ์˜ ๋‹ค์–‘ํ•œ ํ‚ค ๋“ค์„ ๋กœ์ปฌ์— ์ง์ ‘์ ์œผ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  encrypt๋œ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜์—ฌ ๋ณด์•ˆ์  ์ธก๋ฉด์„ ๊ฐ•ํ™” ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿช™ย ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ

**๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ • (multi-signature account)**๋Š” **์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ณต๊ฐœํ‚ค (Pubkey)**๋กœ ๊ตฌ์„ฑ๋œ ์ฃผ์†Œ๋กœ, ์ด ์ฃผ์†Œ์—์„œ ์ž์‚ฐ์„ ์ด์ „ ํ•˜๋ ค๋ฉด ํ•œ๋ช… ์ด์ƒ์˜ ๋‹น์‚ฌ์ž๊ฐ€ ์„œ๋ช… ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์€ m / n ๋‹ค์ค‘ ์„œ๋ช… ์ฃผ์†Œ์˜ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋‹ค์ค‘์„œ๋ช… ๋ฐฉ์‹์€ ํ•œ๋ช…์ด ๋น„๋ฐ€ํ‚ค ๋ณด๊ด€์— ์‹คํŒจํ•˜๊ฒŒ ๋˜์–ด๋„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์„œ๋ช…์ด ์—†์œผ๋ฉด ์ž์‚ฐ์„ ์˜ฎ๊ธธ ์ˆ˜ ์—†๊ฒŒ ํ•˜์—ฌ ์ž์‚ฐ์˜ ์•ˆ์ „ํ•œ ๋ณด๊ด€์— ์šฉ์ดํ•˜๋ฉฐ, ๊ณต๋™์˜ ์žฌ์‚ฐ์„ ๊ด€๋ฆฌ ํ•  ๋•Œ ํ•œ์‚ฌ๋žŒ์ด ํšก๋ นํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , 2๋ช…๊ฐ„์˜ ๊ฑฐ๋ž˜ ์‚ฌ์ด์— ์ค‘์žฌ์ž๋กœ ์ œ3์ž์ธ ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ํ•จ๊ป˜ ๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ •์„ ๋งŒ๋“ฌ์œผ๋กœ์„œ ๋ธ”๋ก์ฒด์ธ์„ ํ™œ์šฉํ•œ ์•ˆ์ „ ๊ฑฐ๋ž˜์—๋„ ํ™œ์šฉ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋งŽ์€ ํˆฌ์ž์ž๋“ค์˜ ๊ฑฐ๊ธˆ์ด ์šด์šฉ๋˜๋Š” ์•”ํ˜ธํ™”ํ ๊ฑฐ๋ž˜์†Œ์—์„œ์˜ ํ™œ์šฉ์€ ๋‘๋ง ํ• ๊ฒƒ๋„ ์—†๊ฒ ์ฅฌ๐Ÿคฃ)

๋„ค์˜ค์˜ ๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ •๋„ 2~16๋ช…์˜ pubkey๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋ช… ์ˆœ์„œ๋Š” ๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ •์„ ๋งŒ๋“ค๋•Œ ๊ณต๊ฐœํ‚ค์˜ ์ž…๋ ฅ ์ˆœ์„œ์™€๋Š” ๋ฌด๊ด€ํ•˜์—ฌ๋„ ๋ฉ๋‹ˆ๋‹ค.

image

(๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ •์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ด๋ก ์  ์Šคํ„ฐ๋””๋Š” ๋‹ค์Œ ๋งํฌ์—์„œ ์ฐพ์•„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ €ํฌ ๋น—์ธ์ด ๋‹ค๊ฐ€์˜ค๋„ค์˜ค ์ง€๊ฐ‘์—์„œ๋Š” ๋…ธ๋ฉ€ ๊ณ„์ • ๋ฟ์•„๋‹ˆ๋ผ ๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ • ๋˜ํ•œ ์‰ฝ๊ฒŒ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๊ณ , ์ƒ์„ฑ ์‚ฌ์‹ค์„ ๊ณต๊ฐœํ‚ค์˜ ์ฃผ์ธ๋“ค๊ณผ ๋””์Šค์ฝ”๋“œ ์ฑ„๋„ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ •์„ ํ†ตํ•œ ์†ก๊ธˆ ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ๋„ ์ผ๋ฐ˜ ๊ณ„์ •์˜ ์†ก๊ธˆ ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ๋งŒํผ ๊ฐ„ํŽธํ•˜๋ฉฐ, ์ด ๋˜ํ•œ ๋””์Šค์ฝ”๋“œ ์ฑ„๋„์„ ํ†ตํ•ด ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์€ ๋‹ค๋ฅธ ๋ฉค๋ฒ„๋“ค๋„ ๋ฉ”์‹œ์ง€์— ํฌํ•จ๋œ ์ธ์ฝ”๋”ฉ๋œ Tx์„ ์ž…๋ ฅํ•˜์—ฌ ์ž์‹ ์˜ ์„œ๋ช…์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ณ , ์„œ๋ช… ์—ฌ๋ถ€๋ฅผ ๋””์Šค์ฝ”๋“œ ์ฑ„๋„์„ ํ†ตํ•ด ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ m ๋ช…์ค‘ n๋ช…์˜ ์„œ๋ช…์ด ์™„๋ฃŒ ๋˜๋ฉด ์ง€๊ฐ‘์„ ํ†ตํ•ด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ sendํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ–ฅ๏ธย ๊ธฐ๋Šฅ๋ณ„ ์„ค๋ช… ๋ฐ ๋™์ž‘ GIF

  • ์ง€๊ฐ‘ ์ƒ์„ฑ ๋ฐ ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ ๋ฐœ๊ธ‰

    1. ์ง€๊ฐ‘ ์ƒ์„ฑ
    • ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์„ ํ†ตํ•œ HDWallet ์ƒ์„ฑ

      • ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ private key ์ƒ์„ฑ
      const ethers = require('ethers');
      const mnemonicCode = ethers.utils.entropyToMnemonic(ethers.utils.randomBytes(16));
    • Neo Account ์ƒ์„ฑ

      • ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์œผ๋กœ ์ƒ์„ฑ๋œ private key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Neo ๊ณ„์ •์„ ์ƒ์„ฑํ•œ๋‹ค. (์ฃผ์†Œ๋ฅผ ๋ฐœ๊ธ‰)
      import wallet from "@cityofzion/neon-js";
      const ethers = require('ethers');
      
      export const getPrivateKeyFromMnemonic = (mnemonicCode) => {
          const mnemonicWallet = ethers.utils.HDNode.fromMnemonic(mnemonicCode);
          const privateKey = mnemonicWallet.privateKey.substring(2);
          return privateKey;
      }
      
      const privateKey = getPrivateKeyFromMnemonic(mnemonicCode);
      const userAccount = new wallet.Account(privateKey);
    • ์ƒ์„ฑ๋œ ๊ณ„์ •์„ encryptionํ•˜์—ฌ local storage์— ์ €์žฅ

      • private key๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ password๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ encryption๋œ๋‹ค.

    [๋กœ๊ทธ์ธ ๋ฐฉ์‹ ์ˆ˜์ • ํ›„]

    CreateNeoWallet

  • ๋กœ๊ทธ์ธ

    • ์‚ฌ์šฉ์ž๊ฐ€ password๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธ
      • ์ž…๋ ฅ๋œ password๋Š” ์•”ํ˜ธํ™”๋œ private key๋ฅผ decryption ํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋œ๋‹ค.

    [๋กœ๊ทธ์ธ ๋ฐฉ์‹ ์ˆ˜์ • ํ›„]

    LoginNeoWallet

  • ์ง€๊ฐ‘ ๋ณต๊ตฌ

    • ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ private key๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ฒฐ๊ณผ๋Š” deterministicํ•˜๋‹ค. ์ฆ‰, ๋™์ผํ•œ ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์„ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋ฐ›์„ ์‹œ, ๋งค๋ฒˆ ๋™์ผํ•œ private key๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
    • ๋”ฐ๋ผ์„œ, ์•”ํ˜ธ์„ ๊นŒ๋จน์–ด ๋” ์ด์ƒ private key๋ฅผ decryptํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์ดˆ๊ธฐ ์ง€๊ฐ‘ ์ƒ์„ฑ์‹œ์— ๋ฐœ๊ธ‰๋ฐ›์€ ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ private key๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹ค์‹œ ๋ฐœ๊ธ‰ ๋ฐ›์€ private key ๋ฅผ ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ encryptionํ•œ๋‹ค.
    • ์ถ”ํ›„, ์ด ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ decrpyion ํ•  ์ˆ˜ ์žˆ๋‹ค.
    export const restoreAccount = async(encryptedAccount, mnemonicCode, newPassword) => {
        const privateKey = getPrivateKeyFromMnemonic(mnemonicCode);
        return {
            "address": encryptedAccount.address,
            "publicKey": encryptedAccount.publicKey,
            "privateKey": await CryptoJS.AES.encrypt(privateKey, newPassword),
            "scriptHash": encryptedAccount.scriptHash
        };
    }
  • ์ง€๊ฐ‘ ๋กœ๊ทธ์•„์›ƒ ๋ฐ ์ดˆ๊ธฐํ™”

    NeoLogout InitWallet

  • ๊ณ„์ • NEO, GAS ํ† ํฐ ๋ฐธ๋Ÿฐ์Šค ํ™•์ธ

    CheckBalanceNeoWallet

  • ํ† ํฐ ์ „์†ก

    NeoTransfer

    • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์ˆ˜์ • ์ „ Transfer

      Transfer

    • script๋Š” ์–ด๋–ค ์ฃผ์†Œ(toAddress)๋กœ ์–ด๋–ค ํ† ํฐ(tokenHash)์ด ์–ผ๋งˆ ๋งŒํผ(tokenAmount) ๋ณด๋‚ด์งˆ์ง€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

    • ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ๊ฑฐ์ณ userAccount์—๋Š” decrpytion๋œ private key ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.

    • script์™€ ์‚ฌ์šฉ์ž์˜ sign์ด ๋“ค์–ด๊ฐ„ transaction์„ ์™„์„ฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

    const script = sc.createScript({
    		scriptHash: tokenHash,
    		operation: "transfer",
    		args: [sc.ContractParam.hash160(userAccount.address), 
    					 sc.ContractParam.hash160(toAddress), 
    					 sc.ContractParam.integer(tokenAmount),
    					 sc.ContractParam.any()],
    	});
    
    const myTx = new tx.Transaction({
            signers: [
                {
                    account: userAccount.scriptHash,
                    scopes: tx.WitnessScope.CalledByEntry,
                },
            ],
            validUntilBlock: currentHeight + heightIncrease,
            systemFee: systemFee,
            networkFee: networkFee,
            script,
        }).sign(userAccount, networkMagic, 1024);
  • ๋ฉ€ํ‹ฐ์‹œ๊ทธ ์–ด์นด์šดํŠธ ์ƒ์„ฑ

    ๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ Pubkey๋ฅผ ์ž…๋ ฅํ•˜๊ณ , ํ•ด๋‹น ๊ณ„์ •์—์„œ ๋ฐœ์ƒํ•œ ํŠธ๋žœ์žญ์…˜์— ๋ช‡๋ช…์ด์ƒ ์„œ๋ช…์„ ํ•ด์•ผ ํŠธ๋žœ์žญ์…˜์ด ์ „์†ก๋ ์ง€ ๊ฒฐ์ •ํ•˜๋Š” sining threshold์ˆ˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช…๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋””์Šค์ฝ”๋“œ webHook ๋งํฌ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. +,- ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ž…๋ ฅ๋ž€์„ ๋Š˜๋ฆฌ๊ณ  ์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ •์„ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๊ณต๊ฐœํ‚ค ๊ฐฏ์ˆ˜๋Š” 2๋ช…์ž…๋‹ˆ๋‹ค.

    ๊ฒฐ๊ณผ ๋””์Šค์ฝ”๋“œ ๋ฉ”์‹œ์ง€

  • ๋ฉ€ํ‹ฐ์‹œ๊ทธ ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ

    ๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ •์„ ํ†ตํ•œ ํŠธ๋žœ์žญ์…˜ ์ƒ์„ ์€ MultiSig Transfer๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ์ผ๋ฐ˜ ์†ก๊ธˆ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ฐ‘ UI์—์„œ ๋ณด์ด๋Š” ๋™์ž‘์€ ์ผ๋ฐ˜ ์ „์†ก๊ณผ ๋น„์Šทํ•ด ๋ณด์ด๋‚˜, ๋’ค์—์„œ๋Š” ๋‹ค์ค‘ ์„œ๋ช… ๊ณ„์ •์œผ๋กœ ์ƒ์„ฑ๋œ ํŠธ๋žœ์žญ์…˜์— ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑํ•œ ์‚ฌ๋žŒ์˜ ์„œ๋ช…์ด ๋“ค์–ด๊ฐ€๊ณ  ์ด๊ฒƒ์„ serializeํ›„ bs58๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๊ธธ์ด๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธํ›„ ์ด ๊ฐ’์„ ์ž…๋ ฅํ•œ webHook link์— ํ•ด๋‹นํ•˜๋Š” ์ฑ„๋„๋กœ ํŠธ๋žœ์žญ์…˜ ์ •๋ณด์™€ ๋ฉ”์‹œ์ง€๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ€ํ‹ฐ์‹œ๊ทธ ํŠธ๋žœ์žญ์…˜ ์„œ๋ช…

    ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์€ ์‚ฌ๋žŒ์€ ์ƒ์„ฑ๋œ ํŠธ๋žœ์žญ์…˜์— ์ž์‹ ์˜ ์„œ๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด get multisig tx๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์„œ๋ช…์„ ์ถ”๊ฐ€ํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์ž…๋ ฅ๋ž€์— encoding๋œ Tx์„ ์ž…๋ ฅํ•˜๊ณ  ๋‘๋ฒˆ์งธ ์ž…๋ ฅ๋ž€์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋””์Šค์ฝ”๋“œ ์ฑ„๋„์˜ URL์„ ์ž…๋ ฅํ•œ๋’ค ์„œ๋ช…ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด ์ธ์ฝ”๋”ฉ๋œ ํŠธ๋žœ์žญ์…˜์„ ๋””์ฝ”๋”ฉ โ†’ deserialize๋ฅผ ๊ฑฐ์ณ ๋‹ค์‹œ ์„œ๋ช… ํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜ class๋กœ ๋ณต์›ํ•˜๊ณ  ์—ฌ๊ธฐ์— ํ•ด๋‹น ๊ณ„์ •์˜ ์„œ๋ช…์„ ๋”ํ•œํ›„ ๋‹ค์‹œ ์ธ์ฝ”๋”ฉ โ†’ serialize ๊ณผ์ •์„ ๊ฑฐ์ณ ์ด๊ฐ’์„ ๋ฉ”์‹œ์ง€๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  • ๋ฉ€ํ‹ฐ์‹œ๊ทธ ํŠธ๋žœ์žญ์…˜ ์ „์†ก

    threshold ์ด์ƒ์˜ ์ฐธ๊ฐ€์ž๊ฐ€ ์„œ๋ช…ํ•œ ํŠธ๋žœ์žญ์…˜์€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ get Multisig Tx ํŽ˜์ด์ง€์—์„œ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

02. ํƒ์ƒ‰๊ธฐ(Explorer)

๋น—์ธ์ด ๋‹ค๊ฐ€์˜ค๋„ค์˜ค ํƒ์ƒ‰๊ธฐ๋Š” ํ”„๋ผ์ด๋น— ๋…ธ๋“œ์— ๋Œ€ํ•œ Block, Tx, Address ์กฐํšŒ๋ฅผ ์ง€์›ํ•˜๋Š” ์›น ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ํƒ์ƒ‰๊ธฐ ์ž…๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋น— ๋…ธ๋“œ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์ ‘๊ทผํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ๋˜๋Š” DB๋กœ ๋ถ€ํ„ฐ Rest API๋ฅผ ํ†ตํ•ด ์ •๋ณด๋“ค์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉฐ ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿช™ย  ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ

  • Search Box : Neon Js์˜ Verify ๊ธฐ๋Šฅ๊ณผ ์ž์ฒด์ ์œผ๋กœ ๊ตฌ์ถ•ํ•œ verify๊ธฐ๋Šฅ์œผ๋กœ ์ž…๋ ฅ๊ฐ’์˜ format์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ์ž…๋ ฅ๊ฐ’์ด Tx hash, Block number, Neo Address์ธ์ง€ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ๊ฐ’์€ Alert๋กœ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • Address Detail : ์ž”๊ณ  ์กฐํšŒ ๋ฟ ์•„๋‹ˆ๋ผ, ํ•ด๋‹น Address์˜ ๋ชจ๋“  NEP17 ํ† ํฐ(๋„ค์˜ค, ๊ฐ€์Šค ํฌํ•จ)์˜ ๊ฑฐ๋ž˜ ๋‚ด์—ญ์„ ์†ก์‹ , ๋ฐœ์‹  ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋กœ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ–ฅ๏ธย ๊ธฐ๋Šฅ ์„ค๋ช… ๋ฐ ๋™์ž‘ GIF

  • ๋ธ”๋ก ์กฐํšŒ

  • ํŠธ๋žœ์žญ์…˜ ์กฐํšŒ

  • ๊ณ„์ • ์กฐํšŒ

    private network์— ์ •์ƒ์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ sendํ•œ์  ์žˆ๋Š” ๋ชจ๋“  ๊ณ„์ • ์ฃผ์†Œ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ํ•ด๋‹น ๊ณ„์ •์„ ํ†ตํ•ด ์ฃผ๊ณ  ๋ฐ›์€ neo์™€ gas์˜ ๊ฑฐ๋ž˜ ๊ธฐ๋ก์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒ€์ƒ‰

    Neon Js์˜ Verify ๊ธฐ๋Šฅ๊ณผ ์ž์ฒด์ ์œผ๋กœ ๊ตฌ์ถ•ํ•œ verify๊ธฐ๋Šฅ์œผ๋กœ ์ž…๋ ฅ๊ฐ’์˜ format์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ์ž…๋ ฅ๊ฐ’์ด Tx hash, Block number, Neo Address์ธ์ง€ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

03. ํ”„๋ผ์ด๋น— ๋…ธ๋“œ ๋ฐ ๋ฐ๋ชฌ (Node & Daemon)

Neo Private Node๋Š” Legacy๋‹ค์Œ์— ์ƒˆ๋กœ ์—…๋ฐ์ดํŠธ๋œ ์ตœ์‹  ๋ฒ„์ „์ธ NEO3์— ๋Œ€ํ•œ ๊ฒƒ์œผ๋กœ, dPBFTํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” Neo์˜ ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜๋Š” 1๊ฐœ์˜ Consenses ๋…ธ๋“œ์™€ ๋ธ”๋ก์„ ๊ฒ€์ฆ ํ•˜๋Š” 2๊ฐœ์˜ Client ๋…ธ๋“œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์™ธ๋ถ€์™€ ์›ํ• ํ•œ RPC ์†Œํ†ต์„ ํ•˜๊ธฐ์œ„ํ•œ RPC ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ NEP17, NEP11 ํ† ํฐ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ํ™œ์šฉ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ๋ชฌ ํ”„๋กœ๊ทธ๋žจ์€ JSON-RPC ๊ธฐ๋ฐ˜์˜ API๋ฅผ ํ†ตํ•ด์„œ ๋ธ”๋ก๊ณผ ํŠธ๋žœ์žญ์…˜ ์ •๋ณด๋“ค์„ DB์— ๋™๊ธฐํ™” ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž…๋‹ˆ๋‹ค. Python + MongoDB๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ Docker Runtime์œผ๋กœ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชฌ ๊ตฌํ˜„์€ Python์˜ ์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ํ™œ์šฉํ•˜์˜€๊ณ , ์ฃผ๊ธฐ์ ์œผ๋กœ Block ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” Consensus ๋…ธ๋“œ์˜ ๋ธ”๋ก์„ 15์ดˆ (1 ๋ธ”๋ก์ด ์ƒ์„ฑ๋˜๋Š” ํ‰๊ท  ์‹œ๊ฐ„)๋งˆ๋‹ค ํ™•์ธํ•˜์—ฌ ๋ธ”๋ก์ •๋ณด,ํŠธ๋žœ์žญ์…˜, ๊ณ„์ขŒ์ž”๊ณ , ์ด์ฒด ์ด๋ ฅ์„ MongoDB์— ๋™๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ๋ธ”๋กํƒ์ƒ‰๊ธฐ์—์„œ ๋ธ”๋ก์ฒด์ธ ์ •๋ณด๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์กฐํšŒ ํ• ์ˆ˜ ์žˆ๋„๋ก ๋ธ”๋ก์ •๋ณด,ํŠธ๋žœ์žญ์…˜ ์ •๋ณด ๋ฐ ์ด์ฒด๊ธฐ๋ก์— ๊ด€ํ•œ REST API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Problem & Solution (ํŒ€์›๋ณ„)

  • Multisig

    ๋ฉ€ํ‹ฐ์‹œ๊ทธ์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ด ํ•˜๊ณ , neon js๋ฅผ ํ†ตํ•ด ๋ฉ€ํ‹ฐ์‹œ๊ทธ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ๋ณด๋‚ด๋Š”๋ฐ๊นŒ์ง€๋„ ์–ด๋ ค์›€์ด ์žˆ์—ˆ์ง€๋งŒ, ์ค‘์•™ ์„œ๋ฒ„๊ฐ€ ์—†๋Š” ์ €ํฌ ์ง€๊ฐ‘์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋‹ค์ค‘ ์„œ๋ช…์„ ํ•˜๊ธฐ์œ„ํ•ด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ ์—ฐ๋ฝ์„ ํ• ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•ด ์•„์ด๋””์–ด ์ ์ธ ๊ณ ๋ฏผ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ serialize โ†’ bs58์„ ํ†ตํ•œ encoding์„ ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์„œ๋ช…, ํŠธ๋žœ์žญ์…˜ ์ „์†ก์„ ํ•˜๊ธฐ์œ„ํ•ด ์—ญ๊ณผ์ •์„ ๊ฑฐ์ณ ํŠธ๋žœ์žญ์…˜์„ neon js์˜ transaction class๋กœ ๋ณต์›ํ•˜๋Š”๋ฐ ์„ฑ๊ณต ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ธ”๋ก์ฒด์ธ์„ ํ™œ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ๋ฝ ๋ฐฉ๋ฒ•์ธ ๋””์Šค์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์ „์†กํ•˜๊ณ , ์ง€๊ฐ‘ ์‚ฌ์šฉ์ž๋“ค์ด ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๋‹ค์ค‘์„œ๋ช… ๊ณ„์ •์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก UI๋ฅผ ๊ฐ„์†Œํ™” ์‹œ์ผœ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์™„์„ฑ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • NODE

    Neo ํ˜„์žฌ Neo Legacy์™€ Neo N3 ๋กœ ์ด๋ฆ„์€ Neo ์ง€๋งŒ ํ˜ธํ™˜๋˜์ง€ ์•Š์€ ํ”„๋กœํ† ์ฝœ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์Šคํ„ฐ๋”” ์ดˆ๋ฐ˜ ๊ฒ€์ƒ‰๋˜์–ด ์ง€๋Š” ์†Œ์Šค ๋ฐ ๋ฌธ์„œ๊ฐ€ ์–ด๋–ค๊ฒƒ์ธ Legacy ์ด๋ฉฐ N3์ธ์ง€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฑฐ์ณ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰์ด ๊ฐ๊ฐ ๋ฒ„์ „ ๋ณ„๋กœ ๋‹ค๋ฅธ ์ง€๊ฐ‘์ฃผ์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์–ด ์ตœ์‹  N3 ํ”„๋กœํ† ์ฝœ์— ๋งž์ถฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ• ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • OS/Package dependency

    • Problem: Private node ๋„์ปค ํ™˜๊ฒฝ ๋ฐ ๊ฐœ๋ฐœ ํˆด์ด ํŠน์ • OS์™€ ํŠน์ • ๋ฒ„์ „์—์„œ๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. Neo๋Š” ์• ์ดˆ์— ์œˆ๋„์šฐ/C#์— ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ํˆด๋“ค ๋ฐ ํŒจํ‚ค์ง€๋“ค์ด ํŠน์ • OS์— ์˜์กด์„ฑ์ด ์žˆ์–ด ์‹œํ–‰์ฐฉ์˜ค๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.
    • Solution: Private Node๋ฅผ Ubuntu ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ œ ์—†์ด ๋Œ๋ฆฌ๋„๋ก ํ•˜์˜€๊ณ , ์œˆ๋„์šฐ์—์„œ๋งŒ ๋Œ์•„๊ฐ€๋Š” Neo-GUI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋น ๋ฅด๊ฒŒ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋„๋ก, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋“ค์„ ์šฐ์„ ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค. ์ฒซ ํ•œ ์ฃผ์— ํŽธํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ฆฌ์„œ์น˜์™€ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜์˜€์ง€๋งŒ, ์‚ฌ์ „์— ์ด๋Ÿฌํ•œ ์–ด๋ ค์šด ์ž‘์—…๋“ค์„ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜๊ณ  ๋๋‚ด๋†“์€ ๋•๋ถ„์— ์ž˜ ๋งˆ๋ฌด๋ฆฌ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Encryption, decryption, ๊ทธ๋ฆฌ๊ณ  ๋‹ˆ๋ชจ๋‹‰

    • โ€œ ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.โ€ ์ผ๋ฐ˜ ์›”๋ › ํˆด๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ๋˜ํ•œ ์ธํ„ฐ๋„ท ์ƒ์˜ ๊ธ€์„ ํ†ตํ•ด์„œ ์‹ค์ œ๋กœ ์ €๋Ÿฐ ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ์— ์–ด๋ ค์›€์ด ์žˆ์—ˆ๊ณ , ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜๊ธฐ๊นŒ์ง€ ๊ฝค ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์ง€๊ฐ‘ ์ƒ์„ฑ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•˜๊ณ  ์—ฐ๊ตฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉฐ, ์–ด๋–ค ๊ฒƒ์ด encryption๋˜๊ณ  decryption ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, ๋˜ ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ์ด๋ฃจ์–ด ์ง€๋Š”์ง€, ์ด๋Ÿฌํ•œ ๊ณผ์ •๋“ค์ด ๋ฌผ ํ๋ฅด๋“ฏ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋ฃจ์–ด ์ง€๋ ค๋ฉด ๊ฐ ๊ธฐ๋Šฅ์˜ input๊ณผ output์€ ์–ด๋–ป๊ฒŒ ๋˜์–ด์•ผ๋Š”์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
      • private key ๋ฐ private key๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ •๋ณด(๋‹ˆ๋ชจ๋‹‰ ์ฝ”๋“œ)๋Š” ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ (decrypted) ์ƒํƒœ์—์„œ local storage์— ์ €์žฅํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
      • ๋™์ผํ•œ ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๋ฒˆ ๊ฐ™์€ private key๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด private key๋ฅผ encryption/decryption ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ์ดํ•ด๋œ ๋’ค, ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์•Œ์•„๋ณด๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋‚ด๊ฐ€ ํ—ท๊ฐˆ๋ฆฌ๊ณ  ํ—ค๋งจ ๋ถ€๋ถ„์„ ๋” ์ง‘์ค‘ํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • โ€œ๋‹ˆ๋ชจ๋‹‰ ๊ตฌ๋ฌธ์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.โ€ โ‡’ โ€œ๋™์ผํ•œ ๋‹ˆ๋ชจ๋‹‰ ์ฝ”๋“œ๋กœ ๋™์ผํ•œ private key๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ๋‚ด๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ encryption๋œ private key๋Š” ๋˜‘๊ฐ™์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ decryptionํ•  ์ˆ˜ ์žˆ๋‹ค.โ€
  • Wallet User Data ์ €์žฅ

    • ์‚ฌ์šฉ์ž๊ฐ€ ๋ณธ์ธ ์†Œ์œ ์˜ ์ž์‚ฐ์„ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ง€๊ฐ‘์ด ์ต์Šคํ…์…˜ wallet์˜ ๋ชฉํ‘œ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋กœ์ปฌ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋„ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ• ์ง€ ํŒ€์›๋“ค๊ณผ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค.
    • ๊ตฌํ˜„ ์ดˆ๊ธฐ์—๋Š” Create Wallet ์ดํ›„ ์ƒ์„ฑ๋œ ์‚ฌ์šฉ์ž์˜ Wallet password, Mnemonic, Privatekey, Publickey, Address ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋ชจ๋‘ Chrome Storage์— ์ €์žฅํ•˜์˜€๊ณ , ์ดํ›„ ์ˆ˜์ •์„ ๊ฑธ์ณ ์•”ํ˜ธํ™”๋œ ์†Œ์ˆ˜์˜ ์ •๋ณด๋“ค๋งŒ ์ €์žฅ์„ ํ•˜์˜€๋‹ค.

Reference

NEO ๊ณต์‹ ๋ฌธ์„œ

Neo Documentation

Neon js ๊ณต์‹ ๋ฌธ์„œ

Neon js ๊นƒํ—ˆ๋ธŒ

neon-js/transfer.md at master ยท CityOfZion/neon-js

Authors

์ด๋ฆ„ ์—ญํ•  Github
์˜คํ•˜์˜ Explorer ๊ตฌํ˜„, Wallet multisig account, tx๊ตฌํ˜„, NEP17 ํ† ํฐ ์ „์†ก ํ…Œ์ŠคํŠธ https://github.com/Hayoung5
์ด์ข…ํ™˜ Node Setup, Daemon API, Rest API ๊ฐœ๋ฐœ, RPC Test https://github.com/novela77
์ •์›…์„ญ Wallet BE: ์›”๋ › ์ƒ์„ฑ, ๋‹ˆ๋ชจ๋‹‰ ์ฝ”๋“œ ์ƒ์„ฑ, ์•”ํ˜ธ ์žฌ์„ค์ •, ํ† ํฐ ์ „์†ก https://github.com/woongsup123
ํ™์œ ์ง„ NEO Wallet Extension ๊ตฌํ˜„, Wallet FE ๊ธฐ๋Šฅ https://github.com/yu-uj

About

Blockchain Neo Extension Wallet, Private Node, Explorer

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 87.1%
  • Python 7.8%
  • HTML 2.9%
  • CSS 1.6%
  • Other 0.6%