구현하기


교육용으로 만들어진 코드임으로 보안 및 클래스화에 신경 쓰지 않았으니 이를 감안하여 참고하시기 바랍니다.





필요한 기능 정리해서 설계하기


각 노드에 공통적으로 필요한 페이지를 정리했습니다.


check.php - 각 노드들과 서버 코드 비교

give.php - 외부에서 코드(암호화된 코드)를 요청한 경우 제공하는 역할

index.php - 상대 거래처에서 대출 또는 투자 요청시 실명 인증을 위해 제공 되는 페이지

set.php - 새로운 코드가 발생하면 업데이트 하는 역할



인증센터의 경우는 노드와 약간 다릅니다.


check.php - 노드에서 요청한 코드 검사 수행 및 새로운 코드 생성 역할

give.php - 외부에서 코드(암호화된 코드)를 요청한 경우 제공하는 역할

set.php - 새로운 코드가 발생하면 업데이트 하는 역할







코딩하기


1. 노드 - check.php



<?

$server = "192.168.1.7";

$db = new mysqli('localhost','pi','pidb','pi');



$data = $_POST;


$data = base64_encode(json_encode($data));

$res = file_get_contents("http://".$server."/check.php?data=".$data);



if($res=='fail'){

    echo "인증에 실패하였습니다.";

}elseif($res=='success'){

    echo '인증에 성공하였습니다.';

}



?>


 



2. 노드 - index.php



 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

<title>192.168.1.6 - C은행</title>

<form method="post" action="check.php">

사업자번호 : <input type="text" name="company_number" vaue=""><br>

<br>

대출용도 : <input type="text" name="contents" vaue=""><br>

<br>

대출금액 : <input type="text" name="price" vaue=""><br>

<br>

<button>실명인증</button>

<br>

<br><div class="comment"></div>

</form>

 



3. 공통 - give.php



<?

    $db = new mysqli('localhost','pi','pidb','pi');


    $sql  = "select code from code limit 1";

    $res = $db->query($sql);

    list($code) = $res->fetch_array();


    echo $code;


?>

 




4. 공통 - set.php


<?

    $db = new mysqli('localhost','pi','pidb','pi');


    if($_GET['ip']=='192.168.1.7' && $_GET['new_code']){

        $sql = "update code set code='".$_GET['new_code']."'";

        $db->query($sql);

    }



?>

 




5. 인증센터 - check.php


<?

$db = new mysqli('localhost','pi','pidb','pi');


$result = true;


$data = json_decode(base64_decode($_GET['data']),'array');




//ip구하기

$sql = "select ip from member where company='".$data['company_number']."'";

$res = $db->query($sql);

list($ip) = $res->fetch_array();



//코드구해오기

$check_code = file_get_contents("http://".$ip."/give.php");



$sql = "select ip from member where company!='".$data['company_number']."'";

$res = $db->query($sql);

while($row = $res->fetch_array()){

    unset($code);

    $code = file_get_contents("http://".$row['ip']."/give.php");


    if($check_code!=$code){

        $result = false;

    }

}




if(!$result){

    //인증실패


    echo 'fail';


}else{

    //인증성공


    //새로운 코드 만들기

    $new_code = hash('sha256',$data['company_number'].$data['contents'].$data['price'].$check_code);



    //새로운 코드 배포

    $sql = "select ip from member where 1";

    $res = $db->query($sql);

    while($row = $res->fetch_array()){

        file_get_contents("http://".$row['ip']."/set.php?new_code=".$new_code."&ip=192.168.1.7");

    }



    echo 'success';


}



?>

 

*노란색으로 표시된 부분이 핵심 입니다. hash로 암호화 함으로 써 3편에서 설명했듯이 입력된 텍스트에 따라서 길이가 정해진 암호화 코드가 생성되며 텍스트에 따라서 결과는 달라 집니다.










데이터베이스 만들기


노드의 경우 암호화된 코드를 보관할 목적으로, 인증센터의 경우 서비스 제공을 목적으로 약간의 데이터베이스가 필요 합니다. 여기서는 mysql 을 이용하였습니다.




1. 공통 - sql


CREATE TABLE `code` (

  `code` text

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 



2. 인증센터 - sql


CREATE TABLE `member` (

  `company` varchar(50) DEFAULT NULL,

  `ip` varchar(50) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 





* 테스트는 5편에서 이어집니다. 함께 따라 해보고자 하시는 분들을 위하여 소스를 파일 첨부합니다.


node.zip center.zip







블록체인 만들기 1편 - 개요

블록체인 만들기 2편 - 시뮬레이션 환경 준비하기

블록체인 만들기 3편 - 어떤 블록체인을 만들것인가 기획하기

블록체인 만들기 4편 - 구현하기

블록체인 만들기 5편 - 테스트/마치며







[문의하기]




copyright ⓒ 2017. 워크식스



+ Recent posts