오늘의 목적
1. 주소창에 http://localhost:3000/address를 입력한다.
- 지갑이 생성되었으면 이미 있는 지갑 주소를 보여주고, 지갑이 생성되지 않았으면 지갑을 생성하고 지갑의 주소를 보여준다.
그러기 위해서 우리가 만들어야 할 함수들.
1. 지갑 키 생성(공개, 비공개)
2. 파일 조작
3. url을 입력했을 때 동작하게끔
지갑을 생성하기 위해 쓰이는 암호화 알고리즘이다.
node.js에서 $ npm i elliptic
을 입력하여 elliptic 패키지를 다운받는다.
이는 타원곡선으로 암호화하는
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비트짜리를 만든다. 그러면 같은 키가 만들어질 확률이 로 줄어든다.
이 지갑 주소는 data베이스로 따지면 id와 같은 기능을 한다.
id | content | data |
---|---|---|
B2487A07925C55197059C1F146E599A47E3F75894E3897E49361ED7E5E1CEBA7 |
블록체인은 database로 정보를 저장할 수도 있지만 파일로 데이터를 관리하는 것또한 가능하다.
initWallet
이라는 함수를 만든다. node.js는 fs
라는 내장객체를 활용해서 컴퓨터를 조작할 수 있다.
- wallet이라는 폴더가 생성되어있는지 확인해본다.없으면 만든다.
- wallet안에 "default"라는 폴더가 있는지 확인해본다. 없으면 만든다.
- 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라는 파일이 생겨났다.
공개키와 비밀키를 만들 수 있는데 보통은 비밀키를 조작해서 공개키를 만드는 과정으로 진행한다. 지금 작성하는 코드는 컴퓨터를 사용해서 복호화가 가능하게끔 하는 코드이지만 원래는 복호화가 안되게 하는게 맞다.
아래의 함수는 비밀키를 출력해주는 코드이다.
function getPrivateFromWallet(){
const buffer = fs.readFileSync(privateFile)
//console.log(buffer.toString())//toString()붙이면 우리가 알아들을 수 있는 결과물로 출력한다.
return buffer.toString()
}
fs.readFileSync(파일명)
은 파일 안의 내용을 출력해주는 역할을 한다. 여기서 우리가 만든 파일의 내용을 txt로 인식하지 않는다. 그래서 buffer형태로 출력해준다. 그래서 꼭 toString()을 써주도록 하자.
function getPublicFromWallet(){
const privateKey = getPrivateFromWallet();
const key = ec.keyFromPrivate(privateKey,"hex")
return key.getPublic().encode("hex")
}
다음과 같이 입력하면 공개키와 암호키를 다 만든 것이다. 공개키는 암호키보다 짧다.
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
그러면 다음과 같이 지갑의 공개키가 나온다.
비트코인 : 네트워크 구성까지 완료가 되어있음.
알트코인 : 비트코인을 제외한 모든 코인들.
투표받기 위한 목적으로 만들어진 코인들.
코인: 자체적으로 네트워크를 구성하고 있음
토큰 : 다른 코인의 네트워크을 기반으로 만들어진 암호화폐
비트코인캐시 : 비트코인 git clone 하고 이름 변경한거
라이트코인 : 비트코인 로직 그대로 C++을 이용해서 만듦
(이걸로 빌드를 해서 구현을 할 것임)
이더리움 : 네트워크 구성 등 모든 것을 다 만듦. 이더리움 네트워크를 빌려다가 만든 코인들이 많다. 그래서 이더리움 1개당 코인을 교환할 수 있는 것이다.
바나나톡: 이더리움 네트워크 코인
ERC 20 : 이더리움이 만든 프로토콜의 한 종류
web3라는 라이브러리로 이더리움의 결과를 front로 뿌려줄 수 있다. 그래서 dapp이라는 개념이 만들어졌다.
메인넷 : 실서버
테스트넷 : 개발 서버