본문 바로가기

블록체인 기반 핀테크 및 응용 SW개발자 양성과정 일기

[123일차] 블록체인 공개키 비밀키 만들기

반응형

 

src > wallet.js  파일 생성

 

secp256k1 - 암호화 알고리즘   

위 암호 알고리즘을 사용하기 위해 package 설치 (경로 : src ) 

npm i elliptic

wallet.js 에 가져오기 & console.log 찍어서 elliptic이 무엇인지 보기 

const ecdsa = require('elliptic')

console.log(ecdsa)

아래 ec 라는 아이를 사용할 것 ! 

 

const ecdsa = require('elliptic')

console.log(ecdsa)

const ec = ecdsa.ec("secp256k1")

console.log(ec)

뭔가 내용이 많음 

 

const ecdsa = require('elliptic')
const ec = ecdsa.ec("secp256k1")

// 키 만들기 
console.log(ec.genKeyPair().getPrivate().toString(16).toUpperCase())

toString()  숫자로

toString(16) 16진수로

 

const ecdsa = require('elliptic')
const ec = ecdsa.ec("secp256k1")

// 키 만들기 
console.log(ec.genKeyPair().getPrivate().toString(16).toUpperCase())

function generatorPrivateKey(){

    // const KeyParir = ec.genKeyPair()
    // const privateKey = KeyPair.getPrivate()
    // return privateKey.toString(16).toUpperCase();
    return ec.genKeyPair().getPrivate().toString(16).toUpperCase()
}


console.log(generatorPrivateKey())

주석처리한 3줄처럼 나눠서 쓰거나 한 줄로 처리 

지갑에서 요 키값이 id, / dcontent, data 

 

 

 

fs 내장객체 가져오기 

const ecdsa = require('elliptic')
const ec = ecdsa.ec("secp256k1")
const fs = require('fs')

    

node server.js 

특정폴더가 있으면 ->폴더 생성 X 

없으면 -> 폴더 생성 진행

function initWallet(){
    console.log(fs.existsSync("wallet/"))  //파일이 있으면 true/ 없으면 false 반환 
}

initWallet()

 

function initWallet(){
    if(!fs.existsSync("wallet/")){  //파일이 있으면 true/ 없으면 false 반환 
        //위의 값이 false일 경우 폴더를 생성 
        fs.mkdirSync("wallet/")
        
    }
}

initWallet()

다시한번 node. wallet.js  / server on 하면 wallet 폴더가 생김 ! (src > wallet 폴더) 

 

 

폴더 명 / 파일 명 정해주기 

// 폴더 명 / 파일 명 정해주기 
//const privateKeyLocation = "wallet/" + "default"
const privateKeyLocation = "wallet/" + (process.env.PRIVATE_KEY || "default")
const privateFile = `${privateKeyLocation}/private_key`
function initWallet(){
    if(!fs.existsSync("wallet/")){  //파일이 있으면 true/ 없으면 false 반환 
        //위의 값이 false일 경우 폴더를 생성 
        fs.mkdirSync("wallet/")
        
    }

    if(!fs.existsSync(privateKeyLocation)){
        fs.mkdirSync(privateKeyLocation)
    }
}

default 폴더가 생김 

 

 

폴더 안에 text 파일을 넣기 위함 

 

키 생성해주기 

function initWallet(){
    if(!fs.existsSync("wallet/")){  //파일이 있으면 true/ 없으면 false 반환 
        //위의 값이 false일 경우 폴더를 생성 
        fs.mkdirSync("wallet/")
    }

    if(!fs.existsSync(privateKeyLocation)){
        fs.mkdirSync(privateKeyLocation)
    }

    const newPrivateKey = generatorPrivateKey();
}

 

전체 코드 

const ecdsa = require('elliptic')
const ec = ecdsa.ec("secp256k1")
const fs = require('fs')

// 키 만들기 
//console.log(ec.genKeyPair().getPrivate().toString(16).toUpperCase())

// 폴더 명 / 파일 명 정해주기 
//const privateKeyLocation = "wallet/" + "default"
const privateKeyLocation = "wallet/" + (process.env.PRIVATE_KEY || "default")
const privateFile = `${privateKeyLocation}/private_key`

function generatorPrivateKey(){

    // const KeyParir = ec.genKeyPair()
    // const privateKey = KeyPair.getPrivate()
    // return privateKey.toString(16).toUpperCase();
    return ec.genKeyPair().getPrivate().toString(16).toUpperCase()
}
console.log(generatorPrivateKey())

// 폴더 / 파일 / 내용이 업승면 채워넣는 함수 (있으면 패쓰)
function initWallet(){
    if(!fs.existsSync("wallet/")){  //파일이 있으면 true/ 없으면 false 반환 
        //위의 값이 false일 경우 폴더를 생성 
        fs.mkdirSync("wallet/")
    }

    if(!fs.existsSync(privateKeyLocation)){
        fs.mkdirSync(privateKeyLocation)
    }

    if(!fs.existsSync(privateFile)){
        console.log(`주소값 키값을 생성 중입니다..`)
        // 없으면 파일 생성 
        const newPrivateKey = generatorPrivateKey();    
        //첫번째 인자값은 경로 + 파일명
        //두번째 인자값은 파일 내용
        fs.writeFileSync(privateFile, newPrivateKey)
        console.log(`개인 키 생성이 완료되었습니다.`)
    }

    // 파일 있는 경우 
    
}

initWallet()

파일 체크하기 

 

 

function getPrivateFromWallet(){
    const buffer = fs.readFileSync(privateFile)
    console.log(buffer)
}

getPrivateFromWallet()

우리가 알아볼 수 있게 toString()을 붙이기

return하기 

function getPrivateFromWallet(){
    const buffer = fs.readFileSync(privateFile)
    console.log(buffer.toString())
    return buffer.toString()
}

getPrivateFromWallet()

 

 

 

공개키 / 비밀키 

function getPrivateFromWallet(){
    const buffer = fs.readFileSync(privateFile)
    return buffer.toString()
}

function getPublicFromWallet(){
    const privateKey = getPrivateFromWallet()
    const key = ec.keyFromPrivate(privateKey,"hex")
    return key.getPublic().encode("hex")
}

console.log(getPrivateFromWallet())
console.log(getPublicFromWallet())

비밀키로 공개키를 만듬  (복호화 가능) 

 

 

module로 빼기 & 전체 코드

const ecdsa = require('elliptic')
const ec = ecdsa.ec("secp256k1")
const fs = require('fs')

// 키 만들기 
//console.log(ec.genKeyPair().getPrivate().toString(16).toUpperCase())

// 폴더 명 / 파일 명 정해주기 
//const privateKeyLocation = "wallet/" + "default"
const privateKeyLocation = "wallet/" + (process.env.PRIVATE_KEY || "default")
const privateFile = `${privateKeyLocation}/private_key`

function generatorPrivateKey(){

    // const KeyParir = ec.genKeyPair()
    // const privateKey = KeyPair.getPrivate()
    // return privateKey.toString(16).toUpperCase();
    return ec.genKeyPair().getPrivate().toString(16).toUpperCase()
}

// 폴더 / 파일 / 내용이 업승면 채워넣는 함수 (있으면 패쓰)
function initWallet(){
    if(!fs.existsSync("wallet/")){  //파일이 있으면 true/ 없으면 false 반환 
        //위의 값이 false일 경우 폴더를 생성 
        fs.mkdirSync("wallet/")
    }

    if(!fs.existsSync(privateKeyLocation)){
        fs.mkdirSync(privateKeyLocation)
    }

    if(!fs.existsSync(privateFile)){
        console.log(`주소값 키값을 생성 중입니다..`)
        // 없으면 파일 생성 
        const newPrivateKey = generatorPrivateKey();    
        //첫번째 인자값은 경로 + 파일명
        //두번째 인자값은 파일 내용
        fs.writeFileSync(privateFile, newPrivateKey)
        console.log(`개인 키 생성이 완료되었습니다.`)
    }
    console.log(`키값 존재합니다. `)
}


function getPrivateFromWallet(){
    const buffer = fs.readFileSync(privateFile)
    return buffer.toString()
}

function getPublicFromWallet(){
    const privateKey = getPrivateFromWallet()
    const key = ec.keyFromPrivate(privateKey,"hex")
    return key.getPublic().encode("hex")
}


module.exports = {
    initWallet, getPublicFromWallet, 
}

 

 

 

 

server.js 

wallet 가져오기 

const express = require('express')
const app = express()
const port = process.env.PORT || 3000
const bodyParser = require('body-parser')
const bc = require('./block.js')
const ws = require('./network.js')
const wl = require('./wallet')                  //추가

폴더, 파일, 파일 안 키값 생성하기 위해 initWallet() 실행 

wl.initWallet()
ws.wsInit()
app.listen(port,()=>{
    console.log(`server start port ${port}`)
})

get address 만들기 

app.get('/address', (req,res)=>{
    const address = wl.getPublicFromWallet()
    res.send({address})
})

windows Terminal 에서 확인 

curl http://localhost:3000/address

windows Powershell
Command on Linux 

질문 위에 왜 다르게 나오는지!? 그리고 -X GET 은 리눅스에서만 가능한지 -> -X GET은 리눅스에서 해석해주는 shellscript 이고 윈도우는 다른os이므로 설정된 명령어 / 출력값도 달라진대 ! 

 

 

 

자료조사 할 것 ! 

 

상장한 토큰들 3가지

메인넷 vs 테스트넷

메타마스크

ERC20 ERC721

 

반응형