상세 컨텐츠

본문 제목

Mnemonic Wallet 코드 공부 - eth-light-wallet

Blockchain

by Yongari 2023. 1. 16. 18:40

본문

 

 

기능구현  목표 

 

1. newMnemonic API 만들기

수도코드

  • mnemonic 변수를 만들기
  • 응답 mnemonic 변수에 lightwallet.keystore.generateRandomSeed()의 결과값을 담아서  mnemonic를 응답으로 전송하기

에러가 생기면 에러로 응답하기


자바스크립트 코드 

router.post("/newMnemonic", async (req, res) => {
  let mneMonic;
  try {
    let mneMonic = lightwallet.keystore.generateRandomSeed();
    
    return res.json({ mneMonic });
  } catch (err) {
    console.log(err);
  }
});

 

응답 mnemonic

{"mneMonic":"army join sport pistol inflict mention blade scare what goat cousin pony"}

 

 

 

2. mnemonic code와 password를 이용해 newWallet API 만들기 

 

수도코드 

 

password와 mnemonic 변수를 만들기

요청에 포함되어 있는 password와 mnemonic를 각 변수에 할당하기

 

(응답) 

  1. lightwallet.keystore.createVault를 사용하여 keystore를 생성하기
  2. 첫번째 인자에는(options) "password", "seedPhrase", "salt", "hdPathString"을 담기
  3. 두번째 인자에는(callback)에는 keystore를 인자로 사용하는 함수를 만들기 
  4. eth-lightwallet 모듈의 keystore.keyFromPassword(password, callback) 내장함수를 사용하기
  5. 첫번째 인자에는 password, 두번째 인자(callback)에는 pwDerivedKey를 인자로 사용하는 함수 만들기
  6. 두번째 콜백함수가 실행되면 eth-lightwallet 모듈의 keystore.generateNewAddress(pwDerivedKey, [num])을 이용해 새로운 주소 생성 함수를 실행합니다.
  7. address 변수를 만들고, keystore.getAddresses()를 문자열로 할당
  8. keystore 변수를 만들고, keystore.serialize()를 할당하기
  9. wallet 파일에 fs 모듈을 import하기 
  10. keyFromPassword의 콜백 함수에서, 응답 대신 fs.writeFile 또는 fs.writeFileSync를 사용하기
  11. 첫번째 인자에는 저장할 .json 파일형식의 파일 이름을 입력하고 두번째 인자에는 keystore를 입력하기 
  12. 세번째 인자에는 응답에 대한 콜백 함수를 입력하기 
  13. 로컬 서버에 파일을 저장하기 때문에 응답으로는 성공 또는 실패메시지만 전송하기 

 

 

router.post("/newWallet", async (req, res) => {
  let randomNum = Math.random().toString();
  let password = req.body.password;
  let mnemonic = req.body.mnemonic;
  console.log("password", password);
  console.log("mnemonic", mnemonic);
  try {
    lightwallet.keystore.createVault(
      {
        password: password,
        seedPhrase: mnemonic,
        salt: randomNum, //랜덤 난수를 대입,
        hdPathString: "m/0'/0'/0'",
      },
      function (err, ks) {
        console.log("err", err);
        console.log("ks", ks);
        ks.keyFromPassword(password, function (err, pwDerivedKey) {
          ks.generateNewAddress(pwDerivedKey, 1);
          let randomNum = Math.random().toString();
          let address = ks.getAddresses().toString();
          let keystore = ks.serialize();
          console.log("address", address);
          console.log("keystore", keystore);
          fs.writeFile("wallet.json", keystore, function (err, data) {
            if (err) {
              res.json({ code: 999, message: "실패" });
            } else {
              res.json({ code: 1, message: "성공" });
            }
          });
        });
      }
    );
  } catch (exception) {
    console.log("NewWallet", exception);
  }
});

module.exports = router;

 

eth-lightwallet의 기능 

keystore.createVault(options, callback)

이것은 새로운 lightwallet 키스토어를 생성하기 위한 인터페이스입니다.

옵션

  • password: (필수) 일련화 시 볼트를 암호화하는 데 사용되는 문자열입니다.
  • seedPhrase: (필수) 모든 계정을 생성하는 데 사용되는 12단어 니모닉입니다.
  • salt: (선택 사항) 사용자는 볼트를 암호화 및 해독하는 데 사용되는 솔트를 제공할 수 있습니다. 그렇지 않으면 임의의 솔트가 생성됩니다.
  • hdPathString(필수): 사용자는 BIP39준수 HD 경로 문자열을 제공해야 합니다. 이전의 기본값은 m/0'/0'/0'였으며 또 다른 인기 있는 값은 BIP44 경로 문자열 m/44'/60'/0'/0입니다. 

keystore.keyFromPassword(password, callback)

이 인스턴스 메서드는 내부적으로 구성된 솔트를 사용하여 적절한 pwDerivedKey.

사용자의 암호를 입력으로 Uint8Array사용하고 키 저장소를 암호화/암호 해독하는 데 사용되는 유형의 대칭 키를 생성합니다.

 

keystore.generateNewAddress(pwDerivedKey, [num])

저장소에서 추가 내부 주소/개인 키 쌍을 생성할 수 있습니다. 

가장 간단한 사용법은 ks.generateNewAddress(pwDerivedKey)입니다. 

num에 대한 호출과 함께 반환될 시드 구에서 키 저장소에 새 주소/개인 키 쌍을 생성합니다.

(  ex)) ks.getAddresses()  )

 

 

 

전체 코드

const express = require("express");
const router = express.Router();
const lightwallet = require("eth-lightwallet");
const fs = require("fs");

// TODO : lightwallet 모듈을 사용하여 랜덤한 니모닉 코드를 얻습니다.
router.post("/newMnemonic", async (req, res) => {
  let mneMonic;
  try {
    let mneMonic = lightwallet.keystore.generateRandomSeed();
    return res.json({ mneMonic });
  } catch (err) {
    console.log(err);
  }
});

// TODO : 니모닉 코드와 패스워드를 이용해 keystore와 address를 생성합니다.
router.post("/newWallet", async (req, res) => {
  let randomNum = Math.random().toString();
  let password = req.body.password;
  let mnemonic = req.body.mnemonic;
  console.log("password", password);
  console.log("mnemonic", mnemonic);
  try {
    lightwallet.keystore.createVault(
      {
        password: password,
        seedPhrase: mnemonic,
        salt: randomNum,
        hdPathString: "m/0'/0'/0'",
      },
      function (err, ks) {
        console.log("err", err);
        console.log("ks", ks);
        ks.keyFromPassword(password, function (err, pwDerivedKey) {
          ks.generateNewAddress(pwDerivedKey, 1);

          let address = ks.getAddresses().toString();
          let keystore = ks.serialize();
          console.log("address", address);
          console.log("keystore", keystore);
          fs.writeFile("wallet.json", keystore, function (err, data) {
            if (err) {
              res.status(400).json({ code: 999, message: "실패" });
            } else {
              res.status(200).json({ code: 1, message: "성공" });
            }
          });
        });
      }
    );
  } catch (exception) {
    console.log("NewWallet", exception);
  }
});

module.exports = router;

 

 

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

 

GitHub - ConsenSys/eth-lightwallet: Lightweight JS Wallet for Node and the browser

Lightweight JS Wallet for Node and the browser . Contribute to ConsenSys/eth-lightwallet development by creating an account on GitHub.

github.com

 

'Blockchain' 카테고리의 다른 글

Obol Network  (0) 2023.03.30
What is DVT (2023 DE-FERENCE 참고)  (0) 2023.03.30
leewayhertz가 설명하는 Cosmos 체인 (2)  (0) 2023.03.29
leewayhertz가 설명하는 Cosmos 체인 (1)  (0) 2023.03.28
지분증명 (PoS)  (0) 2023.02.02

관련글 더보기