beeimp
BeeImp
beeimp
전체 방문자
오늘
어제
  • 분류 전체보기 (110)
    • Program_Language (17)
      • Python (13)
      • Go (0)
      • JavaScript (4)
      • TypeScript (0)
      • Rust (0)
      • Solidity (0)
    • OS (8)
      • UNIX&LINUX (7)
      • Windows (0)
      • MacOS (1)
    • Front-End (19)
      • Svelte (19)
      • React (0)
    • Blockchain (6)
      • Bitcoin (0)
      • Ethereum (1)
      • Klaytn (0)
      • Project (5)
    • Data Structure&Algorithm (11)
      • Greedy (7)
      • Dynamic Programming (1)
      • Sort (0)
      • DFS & BFS (2)
      • Recursive (1)
    • Security (0)
      • SDP (0)
      • Authentication (0)
    • Network (3)
      • OpenWrt (0)
      • SDN&NFV (1)
    • Git (5)
    • IT_News (0)
    • 베타 학습단 (12)
      • SQL (12)
    • Project (1)
    • Issues (1)
    • Reviews (3)
    • I Learned (23)
      • TIL (23)
      • WIL (0)
    • Other (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ubuntu
  • Ethereum
  • sql
  • greedy
  • Docker
  • jenkins
  • javascript
  • Nest.js
  • github
  • Git
  • 기초
  • 블록체인
  • mysql
  • PYTHON
  • blockchain
  • react
  • svelte
  • 탐욕법
  • solidity
  • typescript

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
beeimp

BeeImp

Blockchain/Project

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

2022. 6. 13. 02:01

니모닉 지갑

🔎 Goal

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

💻 Implementation

Main Functions - express.js를 활용한 API

  • POST - 랜덤한 니모닉 코드 생성
    • http://localhost:3000/wallet/newMnemonic
    // 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 - 니모닉 + 패스워드 = 키스토어 생성
    • http://localhost:3000/wallet/newWallet
    // 니모닉 코드와 패스워드를 이용한 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 - 파생된 주소 생성
    • http://localhost:3000/wallet/newSubWallet
    // 패스워드와 생성된 월랫을 이용한 파생주소 생성 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

  • 니모닉 지갑 API
  • Source Code

'Blockchain > Project' 카테고리의 다른 글

[Project] 누구(Who)가 아닌 기술을 신뢰하는 Klaytn 기반 티켓팅 서비스  (0) 2022.08.02
[Project] Web2.0 Blockchain Community  (0) 2022.07.03
[Project] OpenSea 클론코딩  (1) 2022.06.17
솔리디티를 활용한 가위바위보 게임 컨트랙트  (0) 2022.06.13
    'Blockchain/Project' 카테고리의 다른 글
    • [Project] 누구(Who)가 아닌 기술을 신뢰하는 Klaytn 기반 티켓팅 서비스
    • [Project] Web2.0 Blockchain Community
    • [Project] OpenSea 클론코딩
    • 솔리디티를 활용한 가위바위보 게임 컨트랙트

    티스토리툴바