์ค๋์ eth-lightwallet๋ชจ๋์ ์๋ ๋ด์ฅํจ์๋ฅผ ํ ๋๋ก node.js๋ฅผ ์ด์ฉํ ์๋ฒ๊ฐ๋ฐ๊ณผ react๋ฅผ ์ด์ฉํ client๊ฐ๋ฐ๋ก ๊ธฐ๋ณธ ๋๋ชจ๋์ง๊ฐ ๊ฐ๋ฐ์ ํ์ํ ๋ถ๋ถ์ ์๋ฒ๋ฅผ ํตํด ์๋ต๋ฐ๊ณ ์ง๊ฐ์ฃผ์๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ๋ฉด์ ์์ฑํด๋ณผ ๊ฒ์ ๋๋ค.
๋ธ๋ก์ฒด์ธ์์๋ ํ๋์ ์๋ํค(seed key)๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ณ์ ์ ์์ฑํด ๋ด๋ ์ง๊ฐ๋ค์ด ์กด์ฌํ๋๋ฐ ์ด๋ฅผ ๊ณ์ธต์ ๊ฒฐ์ ์ง๊ฐ์ด๋ผ ํฉ๋๋ค. ๊ทธ ์ค ๋๋ชจ๋์ ํด์ฑ๋์ด ๊ธฐ์ต๋๊ธฐ ์ด๋ ค์ด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์๋ํค๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ฝ๋๋ก ์์์ ์๋จ์ด๋ก ์นํํ์ฌ ์์ฑํด์ฃผ๋ ๊ฒ์ ๋งํฉ๋๋ค. ๋๋ชจ๋์ผ๋ก ์๋๊ฐ์ ์์ฑํ๋ฉด ์์ฑํ ์๋๊ฐ์์ ํ์ํ์ฌ ์ฌ๋ฌ ๊ณ์ ์ ์์ฑํ ์ ์๊ฒ ๋ฉ๋๋ค.
mkdir MnemonicWallet
mkdir server
creaete-react-app client
cd client
npm intall axios
cd server
npm init
npm install express
npm install cors
npm install nodemon
npm install eth-lightwallet
touch index.js
mkdir routes
cd routes
touch index.js
cd ..
mkdir controllers
cd controllers
touch index.js
eth-lightwallet_Gitํ์ด์ง ์ eth-ligthwallet_npm ์ฐธ๊ณ ํ์ฌ ๊ฐ๋ฐ๊ณผ์ ์๊ฐํด๋ณด๊ธฐ
server
routes์์ ์๋ก์ด mnemonic์์ฑ์ ์ํ ์ํธํฌ์ธํธ newmnemonic๊ณผ ์๋ก์ด ๊ณ์ ์์ฑ ์ํ newwallet์ผ๋ก ๋ถ๊ธฐํ๊ธฐ
ํด๋๊ตฌ์กฐ
// newMnemonic
axios
.post("http://localhost:4000/wallet/newmnemonic", {
headers: {
"Content-Type": "application/json",
},
withCredentials: true,
})
.then((res) => {
setNewMnemonic(res.data);
});
// newWallet
axios
.post(
"http://localhost:4000/wallet/newwallet",
{
mnemonic: newMnemonic,
pwd: pwd,
},
{
headers: {
"Content-Type": "application/json",
},
withCredentials: true,
}
)
.then((res) => {
setAddress(res.data.address);
setKeystore(res.data.keystore);
});
// newMnemonic
newmnemonic: {
post: async (req, res) => {
let mnimonic;
try {
mnemomic = lightwallet.keystore.generateRandomSeed();
res.send(mnemomic);
} catch (err) {
console.log(err);
}
},
}
// newWallet
newwallet: {
post: async (req, res) => {
const mnemonic = req.body.mnemonic;
const password = req.body.pwd;
console.log(mnemonic);
try {
lightwallet.keystore.createVault(
{
password: password,
seedPhrase: mnemonic,
hdPathString: "m/0'/0'/0'",
},
function (err, ks) {
ks.keyFromPassword(password, function (err, pwDerivedKey) {
ks.generateNewAddress(pwDerivedKey, 1);
let address = ks.getAddresses().toString();
let keystore = ks.serialize();
res.json({ keystore: keystore, address: address });
});
}
);
} catch (exception) {
console.log(` >>> newWallet ${exception}`);
}
},
}
Github ์ฃผ์ ํตํด ์คํ ๊ฐ๋ฅํฉ๋๋ค.
๋๋ชจ๋ ์ง๊ฐ ๊ฐ๋ฐ์ ํตํด์ ์ผ๋จ ๋ชจ๋์ ์์คํจ๊ณผ ๋ง๋ค์ด์ง ๋ชจ๋๋ค์ ์ ์ดํดํ๊ณ ๊ฐ๋ฐํ๋ ๊ณผ์ ์ ์ค์์ฑ๋ ๋ค์๊ธ ๊นจ๋ซ๋ ์๊ฐ์ด ๋์์ต๋๋ค. ๋ชจ๋์ ํตํด ๋๋ชจ๋ ์ง๊ฐ์ด ์ด๋ค ๊ณผ์ ์ผ๋ก ๋ง๋ค์ด ์ง๋์ง ์ด๋ก ์ผ๋ก๋ง ํ์ตํ๋ ๋ด์ฉ์ ์ ์ฉํด ๋ณผ ์ ์๊ฒ ๋๋ ์๊ฐ์ด์์ต๋๋ค.
CSS๋ ์ญ์ ์ด๋ ต๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์๋ฌด๋ฆฌ ์ ๊ฐ์ ธ์๋ ๊น๋ํ๊ฒ ๋ณด์ฌ์ค ์ ์๋ค๋ฉด ๋ฏธ์์ฑ์ ๋๋์ด ๋๊ฒ ๋ค๋ผ๋ ๋๋์ด ๋ค์ด ๊ตฌ์กฐ์ ์ผ๋ก CSS๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์ถ๊ฐ์ ์ธ ํ์ต์ด ํ์ํ๋ค ์๊ฐํ์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก, keystore๋ฅผ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ๋ค์ด ๋ฐ์ ์ ์ฅํ ์ ์๋๋ก ํ ์์ ์ ๋๋ค.