먼저 커뮤니티를 이용하기 위해 회원가입을 진행한다! 지갑생성에는 lightwallet
을 이용하였고, DB는 MongoDB
를 사용하여 계정을 저장했다
🔍기능을 우선적으로 구현하기 위해 암호화단계는 거치지 않고 진행했다
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);
}
});
ID
, Password
를 받아와서 지갑주소, 니모닉과 PrivateKey를 생성 하여 DB
에 존재하는 지 확인 후 존재하면 가입 실패를 보여주고, 존재하지 않을 경우 가입을 진행한다실제 실행 화면
커뮤니티 활동을 통해 받은 토큰을 사용하기 위해서는 가스비 수수료가 필요하다.. 그래서 일단은 0.1eth
미만일 경우에는 버튼을 통해 서버를 통해 이더를 받을 수 있게 만들었다
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에도 저장하여 받아갈 수 있는 양을 제한했다실제 실행 화면
간단하게 회원가입 후 토큰 활용을 위한 이더를 받았다, 블로그를 작성하면서 생각하는 것 중 하나가 차라리 "회원가입성공과 동시에 더 적은 양의 이더를 보내는 방법"또는 "유저의 토큰이 어느 정도 기준에 충족 되면 자동으로 이더를 받도록 설정"하는 방법들을 더 생각해서 만들어 볼껄 후회가 되기도 한다 😢😢
아쉬움은 뒤로 한 채, 먼저 다음 목표를 위해 넘가보도록 하자! 😀😀