일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자료구조 #알고리즘
- 블록체인 #layer2 #레이어2 #이더리움스케일링
- #국제채권시장 #유로본드 #유로커런시 #유로달러 #외국채 #금융중개기관 #간접금융 #거래비용#다우존스공업평균지수 #나스닥종합지수 #FTSE100 #DAX #CAC40 #straittimes #항생지수 #거래비용 #유동성 #위
- 미쉬킨의화폐와금융 #미쉬킨 #화폐금융론 #화폐와금융 #경제학 #교양 #경제지식 #경제공부
- #경제상식 #화폐 #금융 #화폐금융론 #경제학 #경제기본 #경제지식 #경제근육 #투자지식 #경제공부 #경제학전공 #금융이란 #화폐란 #금융시장 #금융시장역할 #화폐역할 #화폐역기능 #금융역기능 #
- html #js #parsing
- 페이스북유니버시티 #마케팅교육 #마케팅캠프
- vp #vc #did #신원인증 #블록체인
Archives
- Today
- Total
평행우주 : world 1
[실습 | 블록체인] Mnemonic Wallet 개발하기 본문
학습목표 : Mnemonic Wallet 개발하기
eth-lightwallet 모듈을 이용하여 간단한 Mnemonic Wallet을 개발하고, Postman을 사용하여 API 테스트 하기
- eth-lightwallet 모듈에 내장되어 있는 함수를 사용하여 개발
- 랜덤한 니모닉 코드를 생성
- 니모닉을 시드로 키스토어를 생성
- Postman을 사용하여 결과 확인
- fs 모듈을 이용한 키스토어 로컬 저장
Advanced Challenges
- 시드 값을 기반으로 파생된 주소 생성
- eth-lightwallet 모듈의 내장함수 사용하기
newMnemonic API 만들기
code
var express = require('express');
var router = express.Router();
const lightwallet = require("eth-lightwallet");
router.post('/newMnemonic', async(req,res) => {
let mnemonic;
try {
//mnemonic 변수에 lightwallet.keystore.generateRandomSeed()을 담아, mnemonic을 응답으로 전송
mnemonic = lightwallet.keystore.generateRandomSeed();
res.json({mnemonic});
} catch(err) {
console.log(err);
}
});
module.exports = router;
Postman으로 테스트하여 니모닉코드 얻기
로컬 서버를 실행시키고, 엔드포인트를 정확히 입력.
- http://localhost:3000/wallet/newMnemonic
- Postman에서 정확한 method POST 를 입력했다면, send를 눌러 서버로 요청
send를 누를 때 마다, 니모닉은 바뀐다
mnemonic code와 password를 이용해 newWallet API 만들기
code
//password 와 mnemonic 을 입력값으로, 서버에 요청
router.post('/newWallet', async(req, res) => {
let password = req.body.password
let mnemonic = req.body.mnemonic;
try {
//lightwallet.keystore.createVault를 사용하여 키스토어를 생성
lightwallet.keystore.createVault(
{
password: password,
seedPhrase: mnemonic,
hdPathString: "m/0'/0'/0'"
},
//두번째 인자(callback)에는 키스토어를 인자로 사용하는 함수 생성
function (err, ks) {
//인자에는 password, 두번째 인자(callback)에는 pwDerivedKey를 인자로 사용하는 함수 생성
ks.keyFromPassword(password, function (err, pwDerivedKey) {
//두번째 콜백함수가 실행되면, eth-lightwallet 모듈의 keystore.generateNewAddress(pwDerivedKey,
//[num])을 이용해 새로운 주소 생성 함수를 실행, 두 번째 인자인 숫자는 생성할 주소의 개수
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);
}
});
Postman을 이용해 keystore와 address의 응답 API 테스트
- 로컬 서버를 실행시키고, 엔드포인트를 정확히 입력.
- http://localhost:3000/wallet/newWallet
- Postman에서 정확한 method POST 를 입력했다면, send를 눌러 서버로 요청
- 위에서 얻은 니모닉 코드를 mnemonic이라는 키의 값으로, password에는 원하는 비밀번호를 입력 후 send
생성된 keystore를 json 파일로 만들어 로컬 서버에 저장하기
code
var express = require('express');
var router = express.Router();
const lightwallet = require("eth-lightwallet");
//wallet/index.js 파일에 fs 모듈을 import
const fs = require('fs');
// TODO : lightwallet 모듈을 사용하여 랜덤한 니모닉 코드를 얻습니다.
router.post('/newMnemonic', async(req,res) => {
let mnemonic;
try {
mnemonic = lightwallet.keystore.generateRandomSeed();
res.json({mnemonic});
} catch(err) {
console.log(err);
}
});
// TODO : 니모닉 코드와 패스워드를 이용해 keystore와 address를 생성합니다.
router.post('/newWallet', async(req, res) => {
let password = req.body.password
let mnemonic = req.body.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();
// keyFromPassword의 콜백 함수에서, 응답대신 fs.writeFile 또는 fs.writeFileSync 를 사용
//첫번째 인자에는 .json 형식의 파일이름, 두번째 인자에는 keystore
//세번째 인자에는 응답에 대한 콜백 함수를 입력
fs.writeFile('wallet.json',keystore,function(err,data){
//로컬 서버에 파일을 저장하기 때문에, 응답으로는 성공 또는 실패 메세지만 전송
if(err) {
res.json({code:999,message:"실패"});
} else {
res.json({code:1,message:"성공"});
}
});
});
}
);
} catch (exception) {
console.log("NewWallet ==>>>> " + exception);
}
});
module.exports = router;
Postman을 실행하여, 로컬에 키스토어 파일이 생기는지 확인하기
Reference keystore file(wallet.json)
{"encSeed":{"encStr":"low95I8NyboOjPWnjBqLqh2EHWMEWKFr4ugGWtHR9MyFPLMIwepIaCmnvQZbueQDVS8c+xzrXLIihqiK9/6/DoZu5u+Xwhs0is6U1PRUgEVJ9wlHCX54+TCQkrAEgsmNZw5W0tCacvBtAksXpTfzvlGSRNJDrXVZiQGo89Tf08xs1V7SUqvfkw==","nonce":"9d+yJS2zQrLkKdXkMF4z94YszobP6xKb"},"encHdRootPriv":{"encStr":"EzldevsVjLxCbgniR0l2cYgfiFs7jCO+n+y4FEX3V3buBApszXtvPyxuOKaRR+phWSdTWBvJ4UBjJbbF72zMMTPUViPecpxx1JBRZhht4jLggwQ5hb0gh77AFJ7N6PVi/osSF+YRzt/STokMgooaLB4Iaxtwa8K5/KND67aI/w==","nonce":"t6sAKrEgkZqvWPVWgpdnb+1fVnQU8MFg"},"addresses":["b48f0dac43b8a1bda5595d5bb2d46ba6b3b6cede"],"encPrivKeys":{"b48f0dac43b8a1bda5595d5bb2d46ba6b3b6cede":{"key":"t5ua+ZqO7A4it17rfFr66uNY4MT2Rwz4+UzGdkGsHFdXGC5mIVvD3GzAXvNblJlc","nonce":"PIsnwUkT/rvVNBr5tO1RAIxYBamvaOV5"}},"hdPathString":"m/0'/0'/0'","salt":"TABp5NmjYF1GoCfN6BgW7e85iOsVXFfsMlz5HOEPeAc=","hdIndex":1,"version":3}
'텃밭 1 : BlockChain > Solidity' 카테고리의 다른 글
[Solidity] Faucet을 구현하는 솔리디티 컨트랙트 분석 (0) | 2022.03.27 |
---|---|
[Solidity] Data type (0) | 2022.03.25 |
[크립토좀비] Solidity Path : 3. 고급 솔리디티 개념 (0) | 2022.02.22 |
[크립토좀비] Solidity Path : 2. 좀비가 희생물을 공격하다 (0) | 2022.02.19 |
[크립토좀비] Solidity Path : 1. 좀비 공장 만들기 (0) | 2022.02.15 |
Comments