겉바속촉

[Hyperledger] basic network + simple asset chain code 본문

IT일기(하반기)/Hyperledger-fabric

[Hyperledger] basic network + simple asset chain code

겉바속촉 2020. 8. 24. 10:46
728x90
반응형

web 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]

  1. Configuration System Chaincode (CSCC) -- core/scc/cscc/configure.go

  2. Life Cycle System Chaincode (LSCC) -- core/scc/lscc/lscc.go

  3. Query System Chaincode (QSCC) -- core/scc/qscc/query.go

  4. Endorser System Chaincode (ESCC) -- core/scc/escc/endorser_onevalidsignature.go

  5. Validator System Chaincode (VSCC) -- core/scc/vscc/validator_onevalidsignature.go

 

 

체인코드 실행하기

 

계속 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

 

 

 

현재까지 한 과정

 

 

 

 

728x90
반응형