[블록체인] ICT 이노베이션 블록체인 개발자 18일차 Dapp

IT/Blockchain|2020. 11. 25. 14:27

 

ICT 이노베이션 블록체인 개발자 18일 차 Dapp 

Teamate예제

 

비지니스 모델 분석 

주제군->주제 선정 -> 비슷한 애플리케이션, 서비스 찾기

블록체인을 포함한 서비스

블록체인을 포하하지 않는 서비스

 

 

등으로 처음에  자신이 구연하고 싶은 블록체인 dapp에 대해서 토론하는데

여러 가지 서비스 중  블록체인을 이용안 해도 되는 서비스가 있고 블록체인이 큰 역할을 하는 서비스가 있는데 이것을 구분하는 게 제일 중요한 것 같다.

 

비즈니스 모델이랑 비즈니스 프로세스를 생각해서 자신의 서비스를 설계해야 한다.

 

나는 생각해봤는데 

 

해외에서 여러 학교 들을  졸업했는데 한국에서는 학위 인증이 안 되는 경우도 있다.

 

연구자 /취업희망자를 위한  대학교 학위 인증/ 시험 결과 인증 블록체인 서비스를 생각해보았다.

 

자신의 해외 및 국내 대학교 졸업 정보 , 논문 , 프로젝트 , 성적 등의 인증 

마케팅 활용으로는 - 유학원 및 취업연계 서비스 

 

설계

네트워크 , 컨트랙트 , 애플리케이션 설계

설계 후 프로토타입 구현 - 

 

구현

 

 

암호화폐 예시 : 

 

 

 

예시로는 밑 에이 예제를 사용했다.

youtu.be/J9 oNA1 szBZ8

github.com/saarc/teamate

팀 매이트 - 블록체인 네트워크를 이용해서 팀메이트 등록하고 다른 사람이 웹페이지를 이용해서 등록된 팀메이트들 보고 자신의 프로젝트 등의 팀메이트를 구할 수 있음.

 

 

 

 

 

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 :

 

t

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)
	}
}

 

 

반응형

댓글()