블록체인과 상호작용을 하기 위해 사용하는 라이브러리
-잔고 조회: 특정 주소의 ETH 잔고 확인
-트랜잭션 송금: 지갑에서 다른 주소로 이더 전송
-블록 조회: 특정 블록의 정보나 트랜잭션 목록 조회
-스마트 컨트랙트 호출: 배포된 컨트랙트 함수 실행
지갑 관련 기능 제공(생성)
-안전한 난수(seed) 생성
-니모닉 단어로 변환 (BIP-39 표준)
-개인키, 공개키, 주소를 파생 (BIP-32 / BIP-44 표준)
Wallet/HDNodeWallet차이점
니모닉을 생성할때HDNodeWallet의createRandom()를 사용하면,
사용자가 옵션으로 비밀번호 를 지정할 수 있고 이 비밀번호는 니모닉으로부터 시드를 만들 때 추가로 섞여 적용된다
그래서 같은 니모닉이라도 다른 시드와 주소가 생성되어 보안이 더 높아진다
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"
}
*/
const phrase = random.mnemonic.phrase;
/*
"fiber salute silent reform garage invite coral damage flavor anxiety bulb novel"
*/
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 복원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 객체를 생성했는데 왜 또다시 니모닉을 검증해야하는지 의문이 들었다.
찾아본 결과, 이미 저장되어 있는 니모닉을 다시 불어올때 같은 지갑이 만들어지는지 확인하기 위해 거치는 과정이라고 한다.
만약 사용자가 앱을 껐다가 다시 들어올때 기존 니모닉을 입력하면 니모닉 검증을 통해 원래의 지갑을 복원할 수 있다.
웹페이지를 주로 만들던 내가 블록체인이라는 새로운 기술을 접하면서 기존에 해왔던 작업들과는 완전히 다른 프로젝트를 만들어봤다.
처음에는 블록체인이라는 개념조차 이해가 안가서 많이 힘들고 어려웠지만, 직접 코드를 구현하고 문서를 읽어보고 부딪혀 나가면서 점점 블록체인의 개념에 한발짝 다가가게 되었고 어느정도 작업의 흐름을 알게되었다.
이번 작업에서 아직 지갑생성과 복원 같은 작은 부분만 다뤘지만 앞으로 트랜잭션이나 송금 등 다른 부분까지 코드로 구현해보며 이해해나가야겠다.
그리고 작업을 하면서 재사용 함수를 만드는게 쉽지 않다는걸 느꼈고 아직은 미숙하고 내가 사용하는 코드가 최선인지 확실하지 않지만 이렇게 차츰 배워나가는거겠지...