Blockmunity (1)

이민기·2022년 3월 7일
0

Blockmunity

목록 보기
2/7
post-thumbnail

Blockmunity

1. ✓ 회원가입

먼저 커뮤니티를 이용하기 위해 회원가입을 진행한다! 지갑생성에는 lightwallet을 이용하였고, DB는 MongoDB를 사용하여 계정을 저장했다

🔍기능을 우선적으로 구현하기 위해 암호화단계는 거치지 않고 진행했다


Code🖋

app.post("/signup", async (req, res) => {
  let username = req.body.username;
  let password = req.body.pw;
  let mnemonic;
  let address;
  let pk;

  try {
    mnemonic = lightwallet.keystore.generateRandomSeed();
    lightwallet.keystore.createVault(
      {
        password: password,
        seedPhrase: mnemonic,
        hdPathString: "m/0'/0'/0'",
      },
      function (err, ks) {
        ks.keyFromPassword(password, function (err, pwDerivedKey) {
          ks.generateNewAddress(pwDerivedKey);
          ks.generateNewAddress(pwDerivedKey);
          address = ks.getAddresses()[0];
          pk = ks.exportPrivateKey(address, pwDerivedKey);

          db.collection("users").findOne({ username: username }, (err, result) => {
            if (err) {
              console.log(err);
            }
            if (result == null) {
              db.collection("users").insertOne({ username: username, password: password, address: address.toString(), privateKey: pk, mnemonic: mnemonic, erc20: 0, eth: 0 });
              res.send({ message: "OK" });
            } else {
              res.send({ message: "이미 있는 ID" });
            }
          });
        });
      }
    );
  } catch (err) {
    console.log(err);
  }
});
  • 먼저 UserID, Password를 받아와서 지갑주소, 니모닉과 PrivateKey를 생성 하여 DB에 존재하는 지 확인 후 존재하면 가입 실패를 보여주고, 존재하지 않을 경우 가입을 진행한다

실제 실행 화면


2. ✓ 이더 받기

커뮤니티 활동을 통해 받은 토큰을 사용하기 위해서는 가스비 수수료가 필요하다.. 그래서 일단은 0.1eth 미만일 경우에는 버튼을 통해 서버를 통해 이더를 받을 수 있게 만들었다


Code🖋

app.post("/ethFaucet", async (req, res) => {
  const sendAccount = process.env.GANACHE_ADDRESS;
  const privateKey = process.env.GANACHE_PRIVATEKEY;
  const receiptAccount = req.body.address;

  const tx = {
    from: sendAccount,
    to: receiptAccount,
    gas: 500000,
    value: web3.utils.toWei("0.1", "ether"),
  };
  await web3.eth.accounts.signTransaction(tx, privateKey).then((signedTx) => {
    web3.eth.sendSignedTransaction(signedTx.rawTransaction, async (err, hash) => {
      if (err) {
        console.log("transaction 실패 : ", err);
      } else {
        const balance = await web3.eth.getBalance(receiptAccount);
        db.collection("users").updateOne({ address: receiptAccount }, { $set: { eth: web3.utils.fromWei(balance, "ether") } });
        res.json({
          message: "성공",
          data: {
            address: receiptAccount,
            balance: parseFloat(web3.utils.fromWei(balance, "ether")),
          },
        });
      }
    });
  });
});
  • 먼저 버튼을 클릭할 때 유저 정보중 지갑주소를 가져오며, Ganache 서버 계정을 통해 이더를 공급받도록 하였다, 그 후 사용된 충전된 eth를 db에도 저장하여 받아갈 수 있는 양을 제한했다

실제 실행 화면



마치며

간단하게 회원가입 후 토큰 활용을 위한 이더를 받았다, 블로그를 작성하면서 생각하는 것 중 하나가 차라리 "회원가입성공과 동시에 더 적은 양의 이더를 보내는 방법"또는 "유저의 토큰이 어느 정도 기준에 충족 되면 자동으로 이더를 받도록 설정"하는 방법들을 더 생각해서 만들어 볼껄 후회가 되기도 한다 😢😢
아쉬움은 뒤로 한 채, 먼저 다음 목표를 위해 넘가보도록 하자! 😀😀

profile
블로그를 옮기는 중입니다. https://min71.dev

0개의 댓글