728x90
오늘 할 것은 암호화폐에 필요한 비밀키(개인키) 생성, 공개키 생성, 디지털 서명, 검증, 계정생성이다.
타원곡선이 블록체인에 어떻게 이용되는가? ↓
src/core/wallet/wallet.test.ts
import { randomBytes } from 'crypto'
import { SHA256 } from 'crypto-js'
import elliptic from 'elliptic'
const ec = new elliptic.ec('secp256k1')
// 저 알고리즘 결과를 리턴해주는 라이브러리가 있지 않을까?
// => elliptic 설치하기
describe('지갑 이해하기', () => {
let privKey: string, pubkey: string
let signature: elliptic.ec.Signature
it('비밀키 (privKey)', () => {
privKey = randomBytes(32).toString('hex') //16진수, 32바이트짜리 랜덤으로 생성해라.
console.log(privKey.length) //32바이트를 16진수로 변호나 --> 64글자
})
it('공개키 생성하기', () => {
const keyPair = ec.keyFromPrivate(privKey)
pubkey = keyPair.getPublic().encode('hex', true) // 비밀키를 공개키로 변환
console.log(pubkey)
})
it('디지털 서명', () => {
// 서명을 만들때 필요한 값
// 개인키, 해쉬값 (transaction hash)
const keyPair = ec.keyFromPrivate(privKey)
const hash = SHA256('ingoo').toString()
signature = keyPair.sign(hash, 'hex')
})
it('검증(verify)', () => {
// 서명, hash, 공개키
const hash = 'ingoo'
const pubkey2 = '020c486d27513a9be673dcbd6af8092bc4d8cc63b121b32ce8556c943716e8ef3d'
const verify = ec.verify(hash, signature, ec.keyFromPublic(pubkey2, 'hex'))
console.log(verify) //false
//이유: 내 암호가 아님
})
it('계정 만들기', () => {
const buffer = Buffer.from(pubkey)
const address = buffer.slice(24).toString() // 앞자리 24글자는 쳐낸다.
console.log(address.length) // 지갑 주소는 42글자
})
})
//npx jest ./scr/core/wallet
elliptic는 일반 자바 스크립트 구현에서 빠른 타원 곡선 암호화를 해주는 라이브러리이다.
참고:
https://www.npmjs.com/package/elliptic
728x90
'블록체인' 카테고리의 다른 글
[이더리움] 리눅스 환경에 Go lang(Go 언어), Geth 설치하기 (0) | 2022.06.27 |
---|---|
[Typesript] 암호화폐 지갑 웹으로 구현해보기(트랜잭션&정보입력) (0) | 2022.06.17 |
암호화폐 지갑(wallet)이란? (0) | 2022.06.16 |
[Typescript, 블록체인] P2P 네트워크를 통한 브로드캐스팅 구현하기 (0) | 2022.06.15 |
[Typescript] 타입스크립트로 블록체인 P2P 구현해보기(찍먹) (0) | 2022.06.14 |