Skip to content

2018 성공회대학교 블록 체인 전자 투표 시스템

Notifications You must be signed in to change notification settings

bghgu/project_vote_main

Repository files navigation

project_vote_main

당신의 회장에게 투표하세요

블록체인을 이용한 전자 투표 시스템

  • 마이크로 서비스 아키텍쳐, 3개의 서비스 서버로 구성

선거 및 선관위 관리 시스템 / 투표 시스템 / 선거 정보 조회 시스템

프로젝트 기간 : 2018년 겨울 방학

맡은 역할 : PM, DB 설계, 투표 정보 조회 시스템 개발, 투표 시스템 개발

투표 시스템 작품제안서 - 작품 제안서

API : https://github.com/bghgu/project_vote_main/wiki

db.png

  • ER 다이어그램

구성

  • 전체 시스템 구성도

1.png

  • 투표 시스템 구성도
  • 기능
    • 선관위가 유권자 확인
    • 선관위가 유권자에게 인증번호 발급
    • 유권자는 인증번호로 로그인
    • 투표

2.png

  • 블록 체인 구성도

blockChain1.png

  • 블록 헤더
import com.skhu.vote.utils.SHA512EncryptUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.redis.core.RedisHash;

import java.io.Serializable;
import java.util.Date;
/**
 * Created by ds on 2018-02-04.
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BlockHeader implements Serializable {

    private static final long serialVersionUID = -597819263112668252L;

    //이전블록 해쉬값
    private String preBlockHash;
    //현재 블록 해쉬값 = 리스트의 키 값
    private String merkleHash;
    //블록 생성 시간
    private Date createBlockTime;
    //현재 블록 바디 해쉬값
    private String blockHash;
    //블록 바디 값
    private BlockBody blockBody;

    public BlockHeader(final BlockBody blockBody, final String preBlockHash) {
        this.preBlockHash = preBlockHash;
        this.blockHash = blockBody.hash();
        this.blockBody = blockBody;
        this.createBlockTime = new Date();
        this.setMerkleHash();
    }

    private void setMerkleHash() {
        if(merkleHash == null)
            this.merkleHash = SHA512EncryptUtils.encrypt(blockHash);
    }

}
  • 블록 바디
import com.skhu.vote.domain.BLOCKCHAIN;
import com.skhu.vote.model.Req.CandidateReq;
import com.skhu.vote.utils.BlockHashUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

/**
 * Created by ds on 2018-02-06.
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
public class BlockBody implements Serializable{

    private static final long serialVersionUID = -6156036100875586824L;

    //투표 시간
    private Date voteTime;
    //투표 값
    private int candidateId;
    //투표 종류
    private int voteId;
    //투표한 인증코드
    private String authCode;

    public BlockBody(final CandidateReq candidateReq, final String code) {
        this.voteTime = new Date();
        this.candidateId = candidateReq.getCandidateId();
        this.voteId = candidateReq.getVoteId();
        this.authCode = code;
    }

    public BlockBody(final BLOCKCHAIN blockchain) {
        this.voteTime = blockchain.getVoteTime();
        this.candidateId = blockchain.getCandidateId();
        this.voteId = blockchain.getVoteId();
        this.authCode = blockchain.getAuthCode();
    }

    public String hash() {
        return BlockHashUtils.hashCode(this.candidateId, this.voteId, this.authCode);
    }
}
  • 블록 체인
import com.skhu.vote.model.BlockHeader;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
import java.util.Date;

/**
 * Created by ds on 2018-02-04.
 */

@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class BLOCKCHAIN implements Serializable {
    private static final long serialVersionUID = -5893925423553544422L;
    //블록 헤더
    //이전블록 해쉬값
    private String preBlockHash;
    //현재 블록 해쉬값
    private String merkleHash;
    //블록 생성 시간
    private Date createBlockTime;
    //현재 블록 인덱스
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int blockId;
    //현재 블록 바디 해쉬값
    private String blockHash;
    //블록 바디
    //투표 시간
    private Date voteTime;
    //투표 값
    private int candidateId;
    //투표 종류
    private int voteId;
    //투표한 인증코드
    private String authCode;
    public BLOCKCHAIN(final BlockHeader blockHeader) {
        this.preBlockHash = blockHeader.getPreBlockHash();
        this.merkleHash = blockHeader.getMerkleHash();
        this.createBlockTime = blockHeader.getCreateBlockTime();
        this.blockHash = blockHeader.getBlockHash();
        this.voteTime = blockHeader.getBlockBody().getVoteTime();
        this.candidateId = blockHeader.getBlockBody().getCandidateId();
        this.voteId = blockHeader.getBlockBody().getVoteId();
        this.authCode = blockHeader.getBlockBody().getAuthCode();
    }
}

시작하기

모든 소스코드는 IntelliJ + Window10 + JAVA 8 환경에서 작성되었습니다.

이 프로젝트에서는 아래 같은 의존성 프로젝트가 포함되어있습니다.

pom.xml 파일에 아래와 같이 의존성 프로젝트를 추가해 주세요.

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jpa</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<scope>runtime</scope>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<optional>true</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-tomcat</artifactId>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
    <dependency>
		<groupId>org.apache.tomcat.embed</groupId>
         <artifactId>tomcat-embed-jasper</artifactId>
         <version>8.5.20</version>
    </dependency>
    <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-core</artifactId>
    </dependency>
    <!-- JWT -->
    <dependency>
         <groupId>io.jsonwebtoken</groupId>
         <artifactId>jjwt</artifactId>
         <version>0.9.0</version>
    </dependency>
    <!-- redis -->
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
         <groupId>redis.clients</groupId>
         <artifactId>jedis</artifactId>
	</dependency>
</dependencies>

실행하기

window 10 환경

  • jdk8maven 을 설치합니다.
  • JAVA_JOME 환경변수 설정을 합니다.
  • Pathmaven 환경변수 설정을 합니다.
  • 내장 톰캣을 이용해 서버를 배포 합니다.
  • spring boot 앱 실행
  • application.properties 파일이 필요합니다.
mvn spring-boot:run
  • 중지하려면, 키보드에서 Crtl + C를 누릅니다.
  • application.properties 파일이 필요합니다.

AWS EC2 Ubuntu 환경

  • jdk8maven 을 설치합니다.
  • 백 그라운드 spring boot 앱 실행
  • 내장 톰캣을 사용해 배포합니다.
nohup mvn spring-boot:run&
  • 중지하려면, netstat -tnlp 명령어를 통해 프로세스를 kill 하십시오.

배포

  • AWS EC2 - 애플리케이션 서버
  • AWS RDS - Mysql DB 서버
  • AWS ElastiCache - 인 메모리 데이터 서버

사용된 도구

저자

기여자 목록을 확인하여 이 프로젝트에 참가하신 분들을 보실 수 있습니다.

감사 인사

수상

  • 2018년 제 10회 소프트웨어공학과 경진대회 자유주제 부분 1위

About

2018 성공회대학교 블록 체인 전자 투표 시스템

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published