Blockchain/Project

eth-lightwallet을 사용한 니모닉 지갑 개발

beeimp 2022. 6. 13. 02:01

니모닉 지갑

🔎 Goal

  • eth-lightwallet 모듈에 내장되어 있는 함수를 사용하여 개발
    • 랜덤한 니모닉 코드를 생성
    • 니모닉을 시드로 키스토어를 생성
  • Postman을 사용하여 결과 확인
  • fs 모듈을 이용한 키스토어 로컬 저장
  • Advanced - 파생된 주소 생성

💻 Implementation

Main Functions - express.js를 활용한 API

  • POST - 랜덤한 니모닉 코드 생성
    // lightwallet 모듈을 사용한 랜덤한 니모닉 코드 생성 API
    router.post('/newMnemonic', async (req, res) => {
      // 니모닉 변수 생성
      let mnemonic;
      try {
        // mnemonic 변수에 lightwallet.keystore.generateRandomSeed()을 담아, mnemonic을 응답으로 전송
        mnemonic = lightwallet.keystore.generateRandomSeed();
        res.json({ mnemonic });
      } catch (err) {
        // (에러) 에러를 응답합니다.
        console.log(err);
      }
    });
  • POST - 니모닉 + 패스워드 = 키스토어 생성
    // 니모닉 코드와 패스워드를 이용한 keystore와 address 생성 API
    router.post('/newWallet', async (req, res) => {
      // 요청에 포함된 니모딕, 패스워드
      const { password, mnemonic } = req.body;
      try {
        // 키스토어 생성
        lightwallet.keystore.createVault({
          password: password,
          seedPhrase: mnemonic,
          hdPathString: "m/0'"
        }, (err, ks) => {
          // 파생키 생성
          ks.keyFromPassword(password, (err, pwDerivedKey) => {
            // 새로운 주소 생성
            ks.generateNewAddress(pwDerivedKey, ks.getAddresses().length);
    
            const address = ks.getAddresses().toString();
            const keystore = ks.serialize();
    
            // res.json({keystore: keystore, address: address});
            fs.writeFile('wallet.json', keystore, (err, data) => {
              if (err) throw err;
              res.json({
                code: 1,
                message: `지갑 생성!(${__dirname + '/wallet.json'})`,
                address: ks.getAddresses()[0]
              });
            })
          })
        })
      } catch (error) {
        console.error("NewWallet ==>>>>", error);
      }
    });
  • POST - 파생된 주소 생성
    // 패스워드와 생성된 월랫을 이용한 파생주소 생성 API
    router.post('/newSubWallet', async (req, res) => {
      const { password } = req.body;
      try {
        const wallet = require('../wallet.json');
        const ks = lightwallet.keystore.deserialize(JSON.stringify(wallet));
        ks.keyFromPassword(password, (err, pwDerivedKey) => {
          ks.generateNewAddress(pwDerivedKey, 1);
          const keystore = ks.serialize();
          fs.writeFile('wallet.json', keystore, (err, data) => {
            if (err) throw err;
            res.json({
              code: 1,
              message: `지갑 생성!(${__dirname + '/wallet.json'})`,
              address: ks.getAddresses()[ks.getAddresses().length - 1]
            });
          })
        })
      } catch (error) {
        res.status(404).send(error);
      }
    })

💡 Keep (장점, 유지할 점)

  • 매우 간단하게 임시 문자와 지갑의 패스워드를 넣어 니모닉 지갑 생성이 가능함

🔨 Problem (단점, 변경 또는 버릴 점)

  • 생성된 지갑 정보는 fs모듈을 통해 json 파일로 생성하여 충돌 위험

🏊🏻‍♂️ Try (시도할 점, 앞으로의 행동)

  • 파일 충돌 해결 → DB 연동을 통한 지갑 정보 관리

🔗 Link