Minwook’s portfolio

Eth-LightWallet를 이용한 keystore와 address 생성 본문

Codestates 블록체인 부트캠프 6기

Eth-LightWallet를 이용한 keystore와 address 생성

yiminwook 2022. 8. 30. 19:15

 

 

keystore란?

인터페이스 기능을 가지고 있는 객체(Object)

12단어의 시드를 보유하고 이 시드를 통해 주소와 개인키를 생성하여 transaction에 사용 할 수 있다.

 

 

 

1. 패키지 설치

$npm install eth-lightwallet

 

 

2. 무작위 memonic 생성

let mnemonic = lightwallet.keystore.generateRandomSeed();
console.log(mnemonic); //camp vote couch goddess series purse stock fence boring either legend enrich

memonic은 항상 다른 결과가 출력됩니다.

 

 

 

3. 생성한 memonic으로 새로운 lightwallet keystore 생성

password, seedPhrase, hdPhrase 세가지 값은 항상 필수적으로 들어가야 합니다.

셋중 하나라도 입력하지 않을시 undefined가 출력됨.

 

const password = 사용할 비밀번호;
const mnemonic = 생성된 미모닉;
      
lightwallet.keystore.createVault({   
  password: "password",        //필수 암호화시 사용될 문자열
  seedPhrase: "mnemonic",      //필수 모든계정 생성시 사용할 니모닉
  hdPathString: "m/0'/0'/0'",  //필수 HD경로, BIP44 m/44'/60'/0'/0
  //salt: "salt"               //옵션 생략시 무작위
}, (err, ks) => console.log(ks);
})

 

 

cosnsole.log(ks)의 출력을 확인해보겠습니다.

salt 값을 생략할시 salt값이 매번 바뀌는 것을 확인할 수 있습니다.

KeyStore {
  salt: 'wk43breve1yZlR9JeiMSGqcPxRR/iYwaJrYZnyIsrAE=',
  hdPathString: "m/0'/0'/0'",
  encSeed: {
    encStr: 'JALKQN14hfXFKQ2vDHEE2JSzPpR+0vRej0MM7O72u2rmV1bQnl28CaizOwJ8C6m/58Giy8YFvfMLufNonOj+ch0LYpbeEaCioIeroLpkN5OcnfWPyHIGKCdVQjdzyuL7o0sKAxvdWE/iewZYdWdzCi0q8HP4HEy1mxSlP8oVWx5SMbqzAdNfWw==',
    nonce: 'h3FSnuqy6ipvk0+HiCZGRTUFsUQn7NtN'
  },
  encHdRootPriv: {
    encStr: 'Kl6lgQa9UxpT+xo5OQzSVzywHAoMQL7EVqYzyeLvYsuRlGqA66bo6LAH2l0NjzZicSmLBd3802L89lOknRn3lELGJPMk9UU6L8kcc9yiJ7+YH6EQmUW7N84GD9L5VBstxYWcyr6dYmmvE4XSnnyQhHKrbWfirk9fuXOf9PjyeA==',
    nonce: '9e6Xlze8zOfoYMiIsOfUwzHAGPEtaFzS'
  },
  version: 3,
  hdIndex: 0,
  encPrivKeys: {},
  addresses: []
}

 

 

4. address와 keystore객체를 문자열로 반환 

새로운 addres와 개인키를 생성하기 위해서는 generateNewAddress()를 사용해야 하는데

pwDerivedKey가 이 함수의 인자로 들어가야 하므로 keyFromPassword()를 먼저 실행하겠습니다.

ks.keyFromPassword(password, (err, pwDerivedKey) => {
  console.log(pwDerivedKey);
})

 

 

console.log(pwDerivedKey)를 확인해보면 

pwDerivedKey가 Unint8Array의 형태임을 알 수 있습니다.

Uint8Array(32) [
   64, 153, 159, 207, 228, 245,  35, 129,
  176,  59, 193,  68,  55, 239, 168,  12,
  194, 171, 186,  31, 190,  64, 148, 225,
   84,   8,  25,  80,   6, 194, 114,  50
]

 

 

이제 pwDerivedKey를 이용하여 address을 생성하겠습니다

2번째 인자로 주소를 몇개 생성할지 option으로 넣을 수 있습니다.

keystore.generateNewAddress(pwDerivedKey, [num]) //생략시 default는 1

 

 

생성한 address는 아래 함수를 통해 조회할 수 있습니다.

keystore.getAddresses()

address는 배열의 형태로 반환되므로 toString(), [0]를 사용하여 원하는 형태로 변환시킬 수 있습니다.

같은 니모닉에서 생성된 address는 일정합니다.

 

 

 

또한 pwDerivedkey를 geySeed()의 인자로 전달하여 입력된 12단어의 시드(미모닉)를 확인할 수 있습니다.

keystore.getSeed(pwDerivedKey);

 

 

 

keystore의 객체는 아래코드로 json형식으로 인코딩하여 문자열로 반환 할 수 있습니다.

keystore.serialize()

 

 

Eth-Lightwallet은 실험적인 소프트웨어이므로 실제 자산을 보관하는것은 보안상 취약할 수 있습니다.

 

 


 

 

예시코드

const mnemonic = lightwallet.keystore.generateRandomSeed(); //nothing engage tonight muscle tenant into gentle onion wide purpose wasp delay
const password = "password";

lightwallet.keystore.createVault({   
  password: password,
  seedPhrase: mnemonic,
  hdPathString: "m/0'/0'/0'",
  //salt: "salt"
}, (err, ks) => {
   ks.keyFromPassword(password, (err, pwDerivedKey) => {
    ks.generateNewAddress(pwDerivedKey, 1);
    const address = ks.getAddresses();
    cosnt seed = ks.getSeed(pwDerivedKey);
    const keystore = ks.serialize();   
    
    console.log(address);            //[ '0x77d4664809c87a346e94d224d8cf949bce3fc2e9' ]
    console.log(address[0]);         //0x77d4664809c87a346e94d224d8cf949bce3fc2e9
    console.log(address.toString()); //0x77d4664809c87a346e94d224d8cf949bce3fc2e9
    console.log(seed);               //nothing engage tonight muscle tenant into gentle onion wide purpose wasp delay 맨첫줄에 선언한 mnemonic과 동일한 값
    console.log(keystore);           //{"encSeed":{"encStr":"WWcsqrVgth/ZfJX7nD3SXBcYzlmu5pe8UUvf4uO+OnV17NKyqdCBJwlQan+nndTrtQsI/4cJohzgWfPs+0tV2LQF7kYPVYJjmjcYFSUceTUOBBY9TQopVU53vr7SOHrlAq8dcv2la+UIMdwK//XT1NcepOfD3Xojey/FpeZt5X3e/+itu2zn6g==","nonce":"iuKlmK8PsLv8MHwZV0Hy5WiyX7qQpNZ0"},"encHdRootPriv":{"encStr":"x89Bzq7XsLi0CMvn7vklJzrg/NGzvAhzQvADpEyf2JV9g6jO8JaJnvvH3MCHklG8vfpgm6NmV2ySRBUaWkr0zXEpsbcKDmh3K6eBPIgjMGRlLd13Z8Vgse6lYBzn4JjVAXQ8PGqUOtfO36wjZoX5Z9atEVGdKN38jj+sgyk3NQ==","nonce":"fs1HabFVXQRrEp8aNtZxMlInglNr8E6m"},"addresses":["77d4664809c87a346e94d224d8cf949bce3fc2e9"],"encPrivKeys":{"77d4664809c87a346e94d224d8cf949bce3fc2e9":{"key":"j8gYJbbaij1AykQb4nCiS7h5140WI1VdhoL4dPETAiTqZDp86/L4aNEN3xq4p0x6","nonce":"BYvXHFRGmiVr/xn8UEghsbXqT+LZO1Ft"}},"hdPathString":"m/0'/0'/0'","salt":"l7fRH0UvV7QkQQWP+xQc1YT7Y0Ej6PW4YlqpeeH8BHI=","hdIndex":1,"version":3}
   });
 });

 

 


 

 

참고

https://github.com/ConsenSys/eth-lightwallet#readme

 

 

Comments