BlockChain>지갑 생성

YU YU·2021년 9월 9일
1

경일_BlockChain

목록 보기
5/24
post-thumbnail

01. 지갑 생성


오늘의 목적
1. 주소창에 http://localhost:3000/address를 입력한다.

  1. 지갑이 생성되었으면 이미 있는 지갑 주소를 보여주고, 지갑이 생성되지 않았으면 지갑을 생성하고 지갑의 주소를 보여준다.

그러기 위해서 우리가 만들어야 할 함수들.
1. 지갑 키 생성(공개, 비공개)
2. 파일 조작
3. url을 입력했을 때 동작하게끔

01-01. secp256k1알고리즘

지갑을 생성하기 위해 쓰이는 암호화 알고리즘이다.
node.js에서 $ npm i elliptic을 입력하여 elliptic 패키지를 다운받는다.
이는 타원곡선으로 암호화하는

01-02. wallet키(비밀키) 만들기

const ecdsa = require('elliptic');

console.log(ecdsa)

위 파일을 실행하면 ecdsa의 내용을 출력해준다. 그 중에서 우리는 ec를 이용할 것이다.

const ecdsa = require('elliptic');
const ec = eccsa.ec("secp256k1")
console.log(ec)

console.log(ec.genKeyPair().getPrivate().toString())
하면
이렇게 숫자로 나온다. 이걸 16진수로 바꿔보자. 그러려면 toString(16)을 입력한다.
console.log(ec.genKeyPair().getPrivate().toString(16))

그럼 다음과 같이 길이가 줄어든 것을 알 수 있다. 여기서 ec.genKeyPair().getPrivate().toString(16)은 랜덤키값이다. SHA256 암호화와는 또 다른 개념이다. SHA256은 특정 내용을 복호화가 안되는 단방향으로 암호화하는 반면 이건 로또처럼 랜덤으로 암호화한 키값을 반환해주는 것이다.

그래서 중복의 위험성이 있다. 그래서 그 문제를 해결하기 위해서 0과 1로 이루어진 256비트짜리를 만든다. 그러면 같은 키가 만들어질 확률이 22562^{256}로 줄어든다.

이 지갑 주소는 data베이스로 따지면 id와 같은 기능을 한다.

idcontentdata
B2487A07925C55197059C1F146E599A47E3F75894E3897E49361ED7E5E1CEBA7

블록체인은 database로 정보를 저장할 수도 있지만 파일로 데이터를 관리하는 것또한 가능하다.

01-03. wallet 폴더와 파일 만들기

initWallet이라는 함수를 만든다. node.js는 fs라는 내장객체를 활용해서 컴퓨터를 조작할 수 있다.

  1. wallet이라는 폴더가 생성되어있는지 확인해본다.없으면 만든다.
  2. wallet안에 "default"라는 폴더가 있는지 확인해본다. 없으면 만든다.
  3. default라는 폴더 안에 파일이 있는지 확인해본다. 없으면 만든다.
const privateKeyLocation = "wallet/"+( process.env.PRIVATE_KEY || "default"
const privateFile = `${privateKeyLocation}/private_key`
                                      
function initWallet(){
    if(!fs.existsSync('wallet/')){
            fs.mkdirSync("wallet/")
    }
    if(!fs.existsSync(privateKeyLocation)){
            fs.mkdirSync(privateKeyLocation)
    }
    if(!fs.existsSync(privateFile)){
        //파일이 없다면 true이고 있으면 false임
        console.log(`주소값 키값을 생성중입니다.`)
        const newPrivateKey = generatorPrivateKey()
        fs.writeFileSync(privateFile,newPrivateKey)
        //첫번째 인자값은 경로+파일명, 넣을 내용들
        console.log(`개인키 생성이 완료되었습니다.`)
        
        fs.mkdirSync(privateKeyLocation)
    }
    
}

fs.existSync('폴더나 파일')은 폴더나 파일이 존재하는지 안하는지 알려주는 함수이다. 폴더나 파일이 존재하면 true값을 반환하고 존재하지 않으면 false값을 반환한다.
fs.mkdirSync('폴더')는 폴더를 만들어주는 함수이다.
fs.writeFileSync('경로+파일명','파일에 들어갈 내용)는 파일을 만들고 그 안에 내용도 넣어주는 함수이다. 첫번째 인잣값으로는 '경로+파일명'을 넣고, 두번째 인잣값으로는 '파일 내용'을 넣는다.
여기서 넣는 파일 내용은 비밀키(인증서)내용이다.

함수를 실행하니 wallet이라는 폴더가 만들어지고 그 안에 default라는 폴더가 생겨났다. 그리고 그 폴더에 private_key라는 파일이 생겨났다.

01-04. 비밀키(인증서) 출력하는 함수

공개키와 비밀키를 만들 수 있는데 보통은 비밀키를 조작해서 공개키를 만드는 과정으로 진행한다. 지금 작성하는 코드는 컴퓨터를 사용해서 복호화가 가능하게끔 하는 코드이지만 원래는 복호화가 안되게 하는게 맞다.

아래의 함수는 비밀키를 출력해주는 코드이다.

function getPrivateFromWallet(){
    const buffer = fs.readFileSync(privateFile)
    //console.log(buffer.toString())//toString()붙이면 우리가 알아들을 수 있는 결과물로 출력한다.
    return buffer.toString()
}

fs.readFileSync(파일명)은 파일 안의 내용을 출력해주는 역할을 한다. 여기서 우리가 만든 파일의 내용을 txt로 인식하지 않는다. 그래서 buffer형태로 출력해준다. 그래서 꼭 toString()을 써주도록 하자.

01-05. 공개키(지갑 주소) 만들기

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

다음과 같이 입력하면 공개키와 암호키를 다 만든 것이다. 공개키는 암호키보다 짧다.

01-06. server.js를 통해 url을 치면 공개키를 출력하는 함수를 만들기

http://localhost:3000/address를 주소창에 입력되면
node server.js를 실행해서 특정 폴더 특정 팡리에 그 결과물이 나올 수 있도록 하자.

아래와 같이 server.js에 코드들을 추가한다.

//server.js
const wl = require('./wallet')
...
app.get('/address',(req,res)=>{
    const address = wl.getPrivateFromWallet();
    res.send({ address })
});
...
wl.initWallet()

initWallet()은 server.js파일을 실행할 때 먼저 지갑을 생성하도록 한다. 그다음에 /address라는 url을 입력하면 wl.getPrivateFromWallet이라는 함수를 통해 지갑의 공개키 주소가 출력되도록 한다. 반환된 내용을 객체에 담아 형태는 객체형태로 출력되도록 한다.

windows terminal에 다음과 같이 입력한다.
$ curl http://localhost:3001/address
그러면 다음과 같이 지갑의 공개키가 나온다.

02.암호화폐란?

비트코인 vs 알트코인

비트코인 : 네트워크 구성까지 완료가 되어있음.
알트코인 : 비트코인을 제외한 모든 코인들.
투표받기 위한 목적으로 만들어진 코인들.

코인 vs 토큰

코인: 자체적으로 네트워크를 구성하고 있음

토큰 : 다른 코인의 네트워크을 기반으로 만들어진 암호화폐

코인의 계열들

비트코인캐시 : 비트코인 git clone 하고 이름 변경한거

라이트코인 : 비트코인 로직 그대로 C++을 이용해서 만듦
(이걸로 빌드를 해서 구현을 할 것임)

이더리움 : 네트워크 구성 등 모든 것을 다 만듦. 이더리움 네트워크를 빌려다가 만든 코인들이 많다. 그래서 이더리움 1개당 코인을 교환할 수 있는 것이다.

바나나톡: 이더리움 네트워크 코인
ERC 20 : 이더리움이 만든 프로토콜의 한 종류

web3라는 라이브러리로 이더리움의 결과를 front로 뿌려줄 수 있다. 그래서 dapp이라는 개념이 만들어졌다.

메인넷 테스트넷

메인넷 : 실서버
테스트넷 : 개발 서버

profile
코딩 재밌어요!

0개의 댓글