[TIL] Ethers.js 을 이용한 블록체인 지갑 생성

ohoho·2일 전
0

React

목록 보기
16/16

Ethers.js

Ethers Class

  1. 블록체인과 상호작용을 하기 위해 사용하는 라이브러리
    -잔고 조회: 특정 주소의 ETH 잔고 확인
    -트랜잭션 송금: 지갑에서 다른 주소로 이더 전송
    -블록 조회: 특정 블록의 정보나 트랜잭션 목록 조회
    -스마트 컨트랙트 호출: 배포된 컨트랙트 함수 실행

  2. 지갑 관련 기능 제공(생성)
    -안전한 난수(seed) 생성
    -니모닉 단어로 변환 (BIP-39 표준)
    -개인키, 공개키, 주소를 파생 (BIP-32 / BIP-44 표준)


지갑 생성 클래스

BaseWallet

  • Private Key를 생성해 해당 키로 서명만 가능한 지갑 생성

Wallet

  • Private Key, Mnemonic, 암호화된 JSON을 생성, 트랜잭션 전송, 잔고조회 가능

HDNodeWallet

  • Wallet과 비슷하지만 하나의 Mnemonic 시드에서 여러개의 지갑을 만들 수 있다(Address를 여러개 만들기 가능)

Wallet / HDNodeWallet 차이점
니모닉을 생성할때 HDNodeWalletcreateRandom()를 사용하면,
사용자가 옵션으로 비밀번호 를 지정할 수 있고 이 비밀번호는 니모닉으로부터 시드를 만들 때 추가로 섞여 적용된다
그래서 같은 니모닉이라도 다른 시드와 주소가 생성되어 보안이 더 높아진다


지갑 생성 과정

HDNodeWallet.createRandom(password)

  • createRandom(사용자 지정 비밀번호) 비밀번호 옵션을 추가해 니모닉과 지갑을 생성
const random = HDNodeWallet.createRandom(password);

/*
HDNodeWallet {
  address: '0x9F2b1A6c4a...B3E7',
  publicKey: '0x02c8f4b6...',
  privateKey: '0x7a9c9b7e...',
  mnemonic: Mnemonic { phrase: 'fiber salute silent reform ...' },
  path: "m/44'/60'/0'/0/0"
}
*/

니모닉 단어 추출

  • 생성된 wallet 객체에서 니모닉 단어 추출
const phrase = random.mnemonic.phrase;

/*
"fiber salute silent reform garage invite coral damage flavor anxiety bulb novel"

*/

Mnemonic.fromPhrase()

  • fromPhrase(시드단어)를 사용해 니모닉 단어가 유효한지 확인 및 니모닉 객체 생성
const random = HDNodeWallet.createRandom(password);
const phrase = random.mnemonic.phrase;
const mnemonic = Mnemonic.fromPhrase(phrase);

/*
Mnemonic {
  phrase: "fiber salute silent reform garage invite coral damage flavor anxiety bulb novel",
  locale: "en"
}

*/

HDNodeWallet.fromMnemonic(mnemonic)

  • 시드단어가 유효한지 확인후 검증된 니모닉 으로 HDNodeWallet 복원
const random = HDNodeWallet.createRandom(password);
const phrase = random.mnemonic.phrase;
const mnemonic = Mnemonic.fromPhrase(phrase);
const mnemonicAdd = HDNodeWallet.fromMnemonic(mnemonic);

/*
HDNodeWallet {
  address: '0x9F2b1A6c4a...B3E7',
  publicKey: '0x02c8f4b6...',
  privateKey: '0x7a9c9b7e...',
  mnemonic: Mnemonic { phrase: 'fiber salute silent reform ...' },
  path: "m/44'/60'/0'/0/0"
}
*/

작업을 하면서 createRandom으로 처음에 wallet 객체를 생성했는데 왜 또다시 니모닉을 검증해야하는지 의문이 들었다.
찾아본 결과, 이미 저장되어 있는 니모닉을 다시 불어올때 같은 지갑이 만들어지는지 확인하기 위해 거치는 과정이라고 한다.
만약 사용자가 앱을 껐다가 다시 들어올때 기존 니모닉을 입력하면 니모닉 검증을 통해 원래의 지갑을 복원할 수 있다.


Wallet 저장

  • 지갑을 생성 한 후 로그인을 통해서 사용자의 지갑에 자유롭게 접근 할 수 있도록 구현을 하려면 사용자의 정보를 담아야하는곳이 필요해 localStorage를 선택했다.
    다만, 정보 그대로 localStorage에 노출되면 보안 위험이 크기에 Crypto-js를 사용해 암호화하여 저장했다.

localStorage

  • localStorage를 선택한 이유는 창을 닫아도 사용자의 정보가 남아있기 때문에 니모닉으로 지갑을 복원했을때 사용자의 정보가 그대로 저장되어 있는 지갑이 불러와진다

Crypto-Js

  • 정보를 암호화, 복호화 해주는 라이브러리

배운점 & 느낀점

웹페이지를 주로 만들던 내가 블록체인이라는 새로운 기술을 접하면서 기존에 해왔던 작업들과는 완전히 다른 프로젝트를 만들어봤다.
처음에는 블록체인이라는 개념조차 이해가 안가서 많이 힘들고 어려웠지만, 직접 코드를 구현하고 문서를 읽어보고 부딪혀 나가면서 점점 블록체인의 개념에 한발짝 다가가게 되었고 어느정도 작업의 흐름을 알게되었다.
이번 작업에서 아직 지갑생성과 복원 같은 작은 부분만 다뤘지만 앞으로 트랜잭션이나 송금 등 다른 부분까지 코드로 구현해보며 이해해나가야겠다.

그리고 작업을 하면서 재사용 함수를 만드는게 쉽지 않다는걸 느꼈고 아직은 미숙하고 내가 사용하는 코드가 최선인지 확실하지 않지만 이렇게 차츰 배워나가는거겠지...

0개의 댓글