[블록체인] ICT 이노베이션 블록체인 개발자 18일차 Dapp
ICT 이노베이션 블록체인 개발자 18일 차 Dapp
Teamate예제
비지니스 모델 분석
주제군->주제 선정 -> 비슷한 애플리케이션, 서비스 찾기
블록체인을 포함한 서비스
블록체인을 포하하지 않는 서비스
등으로 처음에 자신이 구연하고 싶은 블록체인 dapp에 대해서 토론하는데
여러 가지 서비스 중 블록체인을 이용안 해도 되는 서비스가 있고 블록체인이 큰 역할을 하는 서비스가 있는데 이것을 구분하는 게 제일 중요한 것 같다.
비즈니스 모델이랑 비즈니스 프로세스를 생각해서 자신의 서비스를 설계해야 한다.
나는 생각해봤는데
해외에서 여러 학교 들을 졸업했는데 한국에서는 학위 인증이 안 되는 경우도 있다.
연구자 /취업희망자를 위한 대학교 학위 인증/ 시험 결과 인증 블록체인 서비스를 생각해보았다.
자신의 해외 및 국내 대학교 졸업 정보 , 논문 , 프로젝트 , 성적 등의 인증
마케팅 활용으로는 - 유학원 및 취업연계 서비스
설계
네트워크 , 컨트랙트 , 애플리케이션 설계
설계 후 프로토타입 구현 -
구현
암호화폐 예시 :
예시로는 밑 에이 예제를 사용했다.
팀 매이트 - 블록체인 네트워크를 이용해서 팀메이트 등록하고 다른 사람이 웹페이지를 이용해서 등록된 팀메이트들 보고 자신의 프로젝트 등의 팀메이트를 구할 수 있음.
1. contract - 3가지 예시
2. application - 4페이지짜리 웹사이트 쉽게 만드는 툴
network-안에 teardown.sh를 사용하면 모든 걸 삭제해준다!
teardown.sh는 아래처럼
네트워크가 있으면 삭제해주고, 이미지도 있으면 삭제해주고 네트워크도 있는지 확인해주고 삭제해준다!.
#!/bin/bash
#
# Exit on first error, print all commands.
set -e
# Shut down the Docker containers for the system tests.
#docker-compose -f docker-compose.yml kill && docker-compose -f docker-compose.yml down
# remove the local state
rm -f ~/.hfc-key-store/*
# remove chaincode docker images
cons=$(docker ps -aq)
if [ -n "$cons" ]; then
docker rm -f $(docker ps -aq)
fi
imgs=$(docker images dev-* -q)
if [ -n "$imgs" ]; then
docker rmi -f $(docker images dev-* -q)
fi
netb=$(docker network ls | grep net_basic)
if [ -n "$netb" ]; then
docker network rm net_basic
fi
docker ps -a
docker images dev-*
docker network ls
# Your system is now clean
network directory에서 밑에 3가지 모두 실행한다
./teardown.sh
./generate.sh
./start.sh
간편하게 모두 네트워크까지 올라간다.
그럼 체인 코드 설치 배포
cc_tea.sh 에 인자 두 개를 더 넣어야 한다 instatntiate 1.0.0까지 붙여서 써준다
cc_tea.sh:
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Arguments are missing. ex) ./cc_tea.sh instantiate 1.0.0"
exit 1
fi
instruction=$1
version=$2
첫 번째 인자 instruction 에는 instantiate or upgrade?
두 번째 인자는 버전을 넣어줘야 시작할 수 있다.
./cc_tea.sh instantiate 1.0.0
그럼 이렇게 나온다!
체인 코드 배포됐으니 웹서비스 :
prototye directory에서
npm insatll :
npm 패키지 설치 -
sever start 인증서 다운로드?
서버 시작하면
npm install
node enrollAdmin.js
node server.js
localhost:8080에서 프로토타입 페이지를 볼 수 있다.
virutal box 안에 네트워크에서 포트 포워딩 8080 설정을 해놓으면 원래 os에서도 8080으로 접근 가능
tamate.go chaincode설명 :
package main
import (
"encoding/json"
"fmt"
"strconv"
"github.com/hyperledger/fabric/core/chaincode/shim"
sc "github.com/hyperledger/fabric/protos/peer"
)
type SmartContract struct {
}
type UserRating struct{
User string `json:"user"`
Average float64 `json:"average"`
Rates []Rate `json:"rates"`
}
type Rate struct{
ProjectTitle string `json:"projecttitle"`
Score float64 `json:"score"`
}
func (s *SmartContract) Init(APIstub shim.ChaincodeStubInterface) sc.Response {
return shim.Success(nil)
}
func (s *SmartContract) Invoke(APIstub shim.ChaincodeStubInterface) sc.Response {
function, args := APIstub.GetFunctionAndParameters()
if function == "addUser" {
return s.addUser(APIstub, args)
} else if function == "addRating" {
return s.addRating(APIstub, args)
} else if function == "readRating" {
return s.readRating(APIstub, args)
}
return shim.Error("Invalid Smart Contract function name.")
}
func (s *SmartContract) addUser(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
if len(args) != 1 {
return shim.Error("fail!")
}
var user = UserRating{User: args[0], Average: 0}
userAsBytes, _ := json.Marshal(user)
APIstub.PutState(args[0], userAsBytes)
return shim.Success(nil)
}
func (s *SmartContract) addRating(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
if len(args) != 3 {
return shim.Error("Incorrect number of arguments. Expecting 3")
}
// getState User
userAsBytes, err := APIstub.GetState(args[0])
if err != nil{
jsonResp := "\"Error\":\"Failed to get state for "+ args[0]+"\"}"
return shim.Error(jsonResp)
} else if userAsBytes == nil{ // no State! error
jsonResp := "\"Error\":\"User does not exist: "+ args[0]+"\"}"
return shim.Error(jsonResp)
}
// state ok
user := UserRating{}
err = json.Unmarshal(userAsBytes, &user)
if err != nil {
return shim.Error(err.Error())
}
// create rate structure
newRate, _ := strconv.ParseFloat(args[2],64)
var Rate = Rate{ProjectTitle: args[1], Score: newRate}
rateCount := float64(len(user.Rates))
user.Rates=append(user.Rates,Rate)
user.Average = (rateCount*user.Average+newRate)/(rateCount+1)
// update to User World state
userAsBytes, err = json.Marshal(user);
APIstub.PutState(args[0], userAsBytes)
return shim.Success([]byte("rating is updated"))
}
func (s *SmartContract) readRating(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
if len(args) != 1 {
return shim.Error("Incorrect number of arguments. Expecting 1")
}
UserAsBytes, _ := APIstub.GetState(args[0])
return shim.Success(UserAsBytes)
}
func main() {
// Create a new Smart Contract
err := shim.Start(new(SmartContract))
if err != nil {
fmt.Printf("Error creating new Smart Contract: %s", err)
}
}
'IT > Blockchain' 카테고리의 다른 글
[블록체인] ICT 이노베이션 블록체인 개발자 20일차 (0) | 2020.11.27 |
---|---|
[블록체인] ICT 이노베이션 블록체인 개발자 19일차 SimpleAssetChaincode (0) | 2020.11.26 |
[블록체인] ICT 이노베이션 블록체인 개발자 17일차 First network (0) | 2020.11.25 |
[블록체인] ICT 이노베이션 블록체인 개발자 16일차 하이퍼렛져 네트워크 구성 (0) | 2020.11.23 |
[블록체인] ICT 이노베이션 블록체인 개발자 14일 &15일차 Hyper ledger (0) | 2020.11.20 |