유저들의 활발한 커뮤니티 활동을 위해 토큰을 기반으로 인센티브를 제공한다. 제공하는 토큰은 Solidity
ERC-20
을 이용했다
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;
});
};
transfer
함수를 이용해 사용자에게 제공한다🔍 사용한 ERC-20 컨트랙트는 Solidity 공식문서의 ERC20에 작성되어 있는 걸 사용했다
실제 실행 화면
보유한 토큰은 다른 유저들에게도 전송 가능하게 만들었다
아마 커뮤니티 활동 중 유용한 정보를 준 유저에게 보답의 의미로 토큰을 줄 수 있지 않을까....? 🧐
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
에서 유저의 정보를 찾아 지갑주소를 가져온 후 컨트랙트를 실행한다
위의 토큰을 보상으로 받는 개념과 비슷해서 크게 어렵지 않았다
실제 실행 화면
토큰을 지급받는 시스템을 만들어 보았다 이 커뮤니티가 더욱 발전하려면 " 질문글을 올리고, 좋은 답변을 받으면 질문글의 주인이 선택해서 토큰을 바로 보낼 수 있는 시스템"이 있으면 더욱 좋을 것 같다는 생각이 들었다 전 게시글에서도 그랬지만 이상하게 할 때는 생각을 못하다가 항상 블로그를 쓰면서 이런 생각이 드는 것을 왜일까... 😢😢
그치만 갈길이 멀기 때문에 일단은 메모해두고 넘가보도록 하자! 😀😀