무지개곰
article thumbnail
반응형

블록체인 기술은 디지털 자산의 안전한 보호와 관리를 위한 혁신적인 방법을 제공합니다. 이 중에서도 블록체인 지갑은 사용자의 자산을 보호하기 위한 핵심 요소입니다. 하지만 긴 비밀키를 기억하거나 안전하게 저장하는 것은 많은 사용자들에게 어려운 문제입니다. 이를 해결하기 위해 니모닉(mnemonic)이라는 개념이 도입되었습니다. 이번 글에서는 니모닉은 무엇이며 코드로 구현하는 방법을 알아보겠습니다.

 

목차

니모닉이란?

니모닉을 이용한 지갑 생성 구현

니모닉을 이용하여 privateKey 복구


니모닉이란?

니모닉이란 단어를 사용하여 정보를 기억하는 기술은 오랜 역사를 가지고 있습니다. 니모닉은 그리스어 'mnēmonikos'에서 유래되었으며 '기억력이 뛰어난'이라는 뜻을 가지고 있습니다.

 

이런 니모닉은 블록체인 지갑의 비밀키를 생성하고 관리하기 위한 방법으로 사용되고 있습니다. 이는 일련의 단어로 구성된 문구로, 일반적으로 12개 또는 24개의 단어로 구성됩니다. 니모닉 단어는 미리 정의된 단어 목록에서 선택되며, 이는 BIP39(Bitcoin Improvement Proposal 39)에 따라 표준화되어 있습니다. 이러한 니모닉은 보안과 사용자 편의성을 동시에 제공하는 중요한 개념으로 사용자가 비밀키를 보다 쉽게 생성하고 기억할 수 있도록 도와주는 것입니다. 니모닉을 타인에게 노출된다면 니모닉을 통하여 지갑에 해당하는 private key를 타인이 얻을 수 있기 때문에 항상 주의하여야 하며 니모닉을 분실 시 지갑 계정을 복구할 방법이 없어 분실하지 않도록 주의하여야 합니다.


니모닉을 이용한 지갑 생성 구현

package

코드를 구현하기 전에 필요한 package를 install 하여야 합니다. 필요로 하는 package는 3가지로 install 방법은 아래와 같습니다.

npm i bip39 hdkey ethereumjs-wallet

bip39 : 니모닉을 생성

hdkey : 니모닉으로부터 파생된 마스터 시드를 사용하여 여러 개인키와 주소를 생성

ethereumjs-wallet : privateKey를 이용하여 지갑을 생성


코드

import * as bip39 from "bip39";
import HDKey from "hdkey";
import Wallet from "ethereumjs-wallet";

function generateWalletFromMnemonic(mnemonic) {
  const seed = bip39.mnemonicToSeedSync(mnemonic);
  const root = HDKey.fromMasterSeed(seed);
  const derived = root.derive("m/44'/60'/0'/0/0");
  const privateKey = derived.privateKey;
  const wallet = Wallet.fromPrivateKey(privateKey);

  console.log("seed", seed);
  console.log("root", root);
  console.log("derived", derived);
  console.log("privateKey", privateKey);
  console.log("wallet", wallet);

  return wallet;
}

const mnemonic = bip39.generateMnemonic();
const wallet = generateWalletFromMnemonic(mnemonic);

console.log("Mnemonic:", mnemonic);
console.log("wallet:", wallet);
console.log("Address:", wallet.getAddressString());
console.log("Private Key:", wallet.getPrivateKeyString());

1. wallet을 만들기 위한 generateWalletFromMnemonic이라는 함수를 먼저 생성합니다.

2. 함수의 구성은 bip39를 이용하여 매개변수로 받는 니모닉으로 seed를 생성합니다.

3. hdkey를 사용하여 마스터 시드로부터 파생된 자식 키를 생성하고 해당 자식 키의 privateKey, publicKey, address를 생성합니다.

4. derived는 주어진 경로를 따라 계층 구조에서 키를 파생시킵니다. root.derive("m/44' /60' /0' /0/0")은 BIP32의 파생 경로 표기법을 사용하여 44번째 하드웨어 지갑, 60번째 이더리움 네트워크, 0번째 외부 주소, 0번째 내부 주소, 0번째 자식 키를 파생시킵니다.

5. Wallet.fromPrivateKey(privateKey)는 주어진 개인키를 사용하여 EthereumJSWallet 객체를 생성합니다. 이 객체는 지갑 주소와 개인키를 포함하고 있습니다.

 

위의 코드가 실행되면 아래와 같은 console.log가 찍히게 됩니다.

함수 실행 console.log

제일 마지막에 생성된 Private Key를 메타마스크를 이용하여 계정을 추가를 하면 메타마스크에 계정이 등록됩니다.


메타마스크에 계정 등록

계정 등록 1번

메타마스크에서 위에 표시된 부분을 클릭 시 '내 계정'이라는 화면이 나옵니다.

계정 등록 2번

'내 계정'에서 계정 가져오기를 선택하여 생성된 계정을 가져올 수 있습니다.

계정 등록 3번

'계정 가져오기' 창에서 위에 표시된 부분에 위의 코드로 발급받은 privateKey를 입력하면 계정이 등록됩니다.


니모닉을 이용하여 privateKey 복구

privateKey를 복구하는 방법은 어렵지 않습니다. privateKey를 생성할 때 입력한 니모닉과 동일한 니모닉을 위에서 생성한  generateWalletFromMnemonic함수의 매개변수로 입력을 한다면 동일한 privateKey를 반환해 줍니다.

 

따라서 니모닉을 보관하고 있다면 privateKey를 복구할 수 있고 privateKey를 노출시킨다면 타인이 privateKey를 복구하여 계정에 접근할 수 있으므로 니모닉을 안전하게 보관하여야 합니다.

 

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!