겉바속촉
[Hyperledger] basic network + simple asset chain code 본문
[Hyperledger] basic network + simple asset chain code
겉바속촉 2020. 8. 24. 10:46web server programming
1. npm init (🡺package.json이 작성되었음)
2. npm i express
3. npm i -g nodemon
4. public 폴더 생성 --> 하위에 index.html 과 index.jsx 생성
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" >
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-router/1.0.2/ReactRouter.js"></script>
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<link rel="stylesheet" type="text/css" href="index.css">
<title>React App</title>
</head>
<body>
<div id="root" ></div>
<script type="text/babel" src="index.jsx" />
</body>
</html>
index.jsx
var {Component} = React;
class Main extends Component{
render(){
return(
<div>aaa</div>
);
}
}
ReactDOM.render(
<Main />,
document.getElementById("root")
);
5. server.js 생성
const express=require("express");
const path=require("path");
const app=express();
app.use(express.static(path.join(__dirname,"/public")));
app.use(express.json());
app.listen(3000,function(){
console.log("3000 server ready...");
});
6. package.json에다가 "start":"nodemon server" 넣어주기
{
"name": "myweb",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "nodemon server",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1"
}
}
7. npm start
8. firefox에서 다음과 같은 창이 뜨는 지 확인
구조 파악했으니까 이제 시작해볼게요:)
index.html은 그대로 사용해줄게요
index.jsx
var {Component} = React;
var {Router, Route, IndexRoute, Link} = ReactRouter;
class Main extends Component{
render(){
return(
<div>
<h1>Hyperledger Fabric Study</h1>
<ul className="header" >
<li><Link exact to="/">Home</Link></li>
<li><Link to="/basic">BasicNetwork</Link></li>
<li><Link to="/first">FirstNetwork</Link></li>
</ul>
<div className="content">
{this.props.children}
</div>
</div>
);
}
}
class Home extends Component{
render(){
return(
<div>
<h2>HELLO</h2>
<p>안녕하세요? 하이퍼레저에 접속하는 노드 웹 예제입니다. 잘해보죠~!!!</p>
</div>
);
}
}
class BasicNetwork extends Component{
basic_network=()=>{
axios.get('/basic_network')
.then((response)=>{
console.log(response);
})
.catch((error)=>{
console.log(error);
});
}
send=()=>{
alert(this.amount.value);
axios.post('/basic_network',{"amount":this.amount.value})
.then((response)=>{
console.log(response);
})
.catch((error)=>{
console.log(error);
});
}
render(){
return(
<div>
<h2>BasicNetwork</h2>
<p><button onClick={this.basic_network}>연결</button></p>
<br/>
<div>a가 b에게 {' '}
<input placeholder='송금량' ref={ref=>this.amount=ref} />원을 {' '}
<button onClick={this.send} > 보내기</button><br/>
</div>
</div>
);
}
}
class FirstNetwork extends Component{
render(){
return(
<div>
<h2>FirstNetwork에 연결 해보세요</h2>
</div>
);
}
}
ReactDOM.render(
(<Router>
<Route path="/" component={Main} >
<Route path="basic" component={BasicNetwork}/>
<Route path="first" component={FirstNetwork} />
<IndexRoute component={Home} />
</Route>
</Router>)
,document.getElementById("root")
);
index.css
body{
background-color: #FFCC00;
padding:20px;
margin:0;
}
h1,h2,p,ul,li{
font-family:sans-serif;
}
ul.header li{
display: inline;
list-style-type:none;
margin:0;
}
ul.header{
background-color: #111;
padding: 0;
}
ul.header li a{
color:#FFF;
font-weight: bold;
text-decoration: none;
padding: 20px;
display: inline-block;
}
.content{
background-color: #FFF;
padding: 20px;
}
.content h2{
padding: 0;margin:0;
}
.content li{
margin-bottom: 10px;
}
a:hover{
background-color: #0099ff;
}
server.js
const express=require("express");
const path=require("path");
const app=express();
app.use(express.static(path.join(__dirname,"/public")));
app.use(express.json());
app.use('/basic_network', require('./routes/basic_network_router'));
app.listen(3000,function(){
console.log("3000 server ready...");
});
basic_network_router.js도 그대로 사용할게요
const express = require('express');
const router = express.Router();
/* GET */
router.get('/', function(req, res, next) {
res.json({"msg":"ok"});
});
module.exports = router;
npm start 명령 내려주신 후에 firefox에서 확인!!!
HLF 환경 구축
package.json의 dependecides에 다음을 추가할게요
HLF Node SDK라고 합니다.
"fabric-ca-client": "~1.4.0",
"fabric-client": "~1.4.0",
"fabric-network": "^1.4.4",
그리고 서버 종료
npm i
basic network 구동
파일 디렉토리를 열어주세요
다음과 같이 구조를 살펴보세요:)
신분증은 총 7개가 나와야합니다
peer 의 신분증 -> 소속, 공간, 관리자, 사용자 에 대한 신분증 4개
orderer 의 신분증 -> 소속, 공간, 관리자 에 대한 신분증 3개
사용자에 대한 msp는 peer에는 없고 orderer에만 있다는 점 주의해주세요
자 이제 tilix를 열어주세요
그래서 다음과 같이 표시한 명령어를 내려주세요
docker ps라는 명령어로 5개의 컨테이너가 돌아가는 지 확인해주세요
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a767cae6d6a hyperledger/fabric-peer "peer node start --p…" 2 minutes ago Up 2 minutes 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
7ee53aa6f1ed hyperledger/fabric-ca "sh -c 'fabric-ca-se…" 2 minutes ago Up 2 minutes 0.0.0.0:7054->7054/tcp ca.example.com
9e90d19e1473 hyperledger/fabric-tools "/bin/bash" 2 minutes ago Up 2 minutes cli
a531c9c4f842 hyperledger/fabric-couchdb "tini -- /docker-ent…" 2 minutes ago Up 2 minutes 4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp couchdb
07825378b4c4 hyperledger/fabric-orderer "orderer" 2 minutes ago Up 2 minutes 0.0.0.0:7050->7050/tcp orderer.example.com
그럼 터미널 하나 더 열어서 cli로 들어갈게요
터미널 하나 더 열어서 peer로 들어갈게요
현재 chaincode가 설치되어있지 않습니다
이제 설치해볼게요:)
체인코드 설치하기
tilix에서 우리가 cli로 들어간 터미널 있쥬?
cli 터미널에서 작성해주세요
peer chaincode install -n jes -v 1.0 -p github.com/sacc
그리고 instantiate
peer chaincode instantiate -n jes -v 1.0 -c '{"Args":["a","10"]}' -C mychannel
이렇게 하고 나면 escc, vscc라고 로그가 찍혀있을 텐데요
바로 system chaincode입니다:)
System ChainCode에 대한 간략한 설명
[System ChainCode]
|
체인코드 실행하기
계속 cli 터미널에서 명령 내려줄게요:)
a값이 10으로 나오는 지 확인해주세요
peer chaincode query -n jes -c '{"Args":["get","a"]}' -C mychannel
이제 set 메서드 작동을 할 건데요
값을 변경하는 과정이므로 block 생성이 되어야하기 때문에 query가 아니고 invoke명령을 내려주세요
peer chaincode invoke -n jes -c '{"Args":["set","a","20"]}' -C mychannel
그리고 query로 다시 a값을 확인해주세요
20이 나와야 합니다
peer chaincode query -n jes -c '{"Args":["get","a"]}' -C mychannel
현재까지 한 과정
'IT일기(하반기) > Hyperledger-fabric' 카테고리의 다른 글
[Hyperledger] (0) | 2020.08.26 |
---|---|
[Hyperledger] node와 java로 체인코드 개발해보기 (0) | 2020.08.24 |
[Hyperledger] 메서드 변경, transaction 생성, key생성 (0) | 2020.08.13 |
[Hyperledger] Orderer에 대해 알아보기 (0) | 2020.08.13 |
[Hyperledger] chain code와 privacy (0) | 2020.08.13 |