Blockmunity (2)

이민기·2022년 3월 7일
0

Blockmunity

목록 보기
3/7
post-thumbnail
post-custom-banner

Blockmunity

3. ✓ 토큰 보상

유저들의 활발한 커뮤니티 활동을 위해 토큰을 기반으로 인센티브를 제공한다. 제공하는 토큰은 Solidity ERC-20을 이용했다


Code🖋

const serveToken = async (receiptAccount, value) => {
  Contract.setProvider("HTTP://127.0.0.1:7545");
  const sender = process.env.TOKEN_ADDRESS;
  const senderPK = process.env.TOKEN_PRIVATEKEY;
  var contractABI = erc20Abi;
  var contract = await new Contract(contractABI, process.env.ERC20ADDR);

  const txData = contract.methods.transfer(receiptAccount, value).encodeABI();
  const rawTransaction = {
    to: process.env.ERC20ADDR,
    gas: 100000,
    data: txData,
  };
  web3.eth.accounts
    .signTransaction(rawTransaction, senderPK)
    .then(async (signedTx) => {
      web3.eth.sendSignedTransaction(signedTx.rawTransaction, async (err, req) => {
        if (!err) {
          await contract.methods
            .balanceOf(receiptAccount)
            .call()
            .then((balance) => {
              db.collection("users").updateOne({ address: receiptAccount }, { $set: { erc20: parseInt(balance) } }, () => {
                console.log("업데이트 완료");
              });
            });
        } else {
          console.log("실패");
        }
      });
    })
    .catch((err) => {
      console.log(err);
      return false;
    });
};
  • 토큰을 전송받는 경우는 크게 로그인, 게시판에 글쓰기, 댓글 작성시에 실행 될 수 있도록 따로 함수로 작성했다
  • 전송받는 주소와 전송받을 토큰 양을 인자로 넣어 ERC-20컨트랙트와 연결하여 서버 계정의 토큰을 transfer함수를 이용해 사용자에게 제공한다

🔍 사용한 ERC-20 컨트랙트는 Solidity 공식문서의 ERC20에 작성되어 있는 걸 사용했다


실제 실행 화면


2. ✓ 토큰 전송하기

보유한 토큰은 다른 유저들에게도 전송 가능하게 만들었다
아마 커뮤니티 활동 중 유용한 정보를 준 유저에게 보답의 의미로 토큰을 줄 수 있지 않을까....? 🧐


Code🖋

app.post("/sendtoken", async (req, res) => {
  Contract.setProvider("HTTP://127.0.0.1:7545");
  var contractABI = erc20Abi;
  var contract = await new Contract(contractABI, process.env.ERC20ADDR);
  const value = req.body.value;
  const reciptUser = req.body.reciptUser;
  const senderAccount = req.body.address;
  const senderPK = req.body.privateKey;
  db.collection("users").findOne({ username: reciptUser }, async (err, result) => {
    const reciptAddress = result.address;
    const txData = contract.methods.transfer(reciptAddress, value).encodeABI();
    const rawTransaction = {
      to: process.env.ERC20ADDR,
      gas: 100000,
      data: txData,
    };
    web3.eth.accounts
      .signTransaction(rawTransaction, senderPK)
      .then(async (signedTx) => {
        web3.eth.sendSignedTransaction(signedTx.rawTransaction, async (err, req) => {
          if (!err) {
            await contract.methods
              .balanceOf(reciptAddress)
              .call()
              .then((balance) => {
                db.collection("users").updateOne({ address: reciptAddress }, { $set: { erc20: parseInt(balance) } }, () => {
                  console.log("상대 업데이트 완료");
                });
                db.collection("users").updateOne({ address: senderAccount }, { $inc: { erc20: -1 * value } }, () => {
                  console.log("본인 업데이트 완료");
                });
              });
          } else {
            console.log("실패", err);
          }
        });
      })
      .catch((err) => {
        console.log(err);
        return false;
      });
  });
});
  • 상대유저의 지갑주소가 아닌 UserName으로 전송을 하기 때문에 먼저 MongoDB 에서 유저의 정보를 찾아 지갑주소를 가져온 후 컨트랙트를 실행한다

  • 위의 토큰을 보상으로 받는 개념과 비슷해서 크게 어렵지 않았다

실제 실행 화면



마치며

토큰을 지급받는 시스템을 만들어 보았다 이 커뮤니티가 더욱 발전하려면 " 질문글을 올리고, 좋은 답변을 받으면 질문글의 주인이 선택해서 토큰을 바로 보낼 수 있는 시스템"이 있으면 더욱 좋을 것 같다는 생각이 들었다 전 게시글에서도 그랬지만 이상하게 할 때는 생각을 못하다가 항상 블로그를 쓰면서 이런 생각이 드는 것을 왜일까... 😢😢
그치만 갈길이 멀기 때문에 일단은 메모해두고 넘가보도록 하자! 😀😀

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

0개의 댓글