반응형

존재 증명 계약에 대해 알아보고자 한다.


예를들어 나의 주민등록증, 여권 등등을 블록체인에 어떻게 담을지에 대한 이야기를 하고자 한다.


아래 솔리디티 코드를 이용하여 간단하게 기관 증명에 관련된 dApp에서 구동 할 수 있는 존재 증명 계약 프로그래밍을 해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
pragma solidity ^0.4.19;
 
contract PersonCertification{
    address admin;
    
    struct AppDetail{
        bool allowReference;
        uint approveBlockNo;
        uint refLimitBlockNo;
        address applicant;
    }
    
    struct PersonDetail{
        string name;
        string birth;
        address[] orglist;
    }
    
    struct OrganizationDetail{
        string name;
    }
    
    mapping(address => AppDetail) appDetail;
    mapping(address => PersonDetail) personDetail;
    mapping(address => OrganizationDetail) orgDetail;
    
    function PersonCertification(){
        admin = msg.sender;
    }
    
    function setPerson(string _name, string _birth){
        personDetail[msg.sender].name = _name;
        personDetail[msg.sender].birth = _birth;
    }
    
    function setOrganization(string _name){
        orgDetail[msg.sender].name = _name;
    }
    
    function setBelong(address _person){
        personDetail[_person].orglist.push(msg.sender);
    }
    
    function setApprove(address _applicant, uint _span){
        appDetail[msg.sender].allowReference = true;
        appDetail[msg.sender].approveBlockNo = block.number;
        appDetail[msg.sender].refLimitBlockNo = block.number + _span;
        appDetail[msg.sender].applicant = _applicant;
    }
    
    function getPerson(address _person) public constant returns(
        bool _allowReference, uint _approveBlockNo, uint _refLimitBlockNo,
        address _applicant, string _name, string _birth, address[] _orglist){
            
            _allowReference = appDetail[_person].allowReference;
            _approveBlockNo = appDetail[_person].approveBlockNo;
            _refLimitBlockNo = appDetail[_person].refLimitBlockNo;
            _applicant = appDetail[_person].applicant;
            
            if(((msg.sender == _applicant) 
            && (_allowReference == true
            && (block.number < _refLimitBlockNo))
            || (msg.sender == admin)
            || (msg.sender == _person)){
                _name = personDetail[_person].name;
                _birth = personDetail[_person].birth;
                _orglist = personDetail[_person].orglist;
            }
    }
}
cs



본인 확인 계약을 위한 PersonCertification 컨트랙트를 작성한다.


이때 admin address는 계약 관리자의 주소가 된다.


    struct AppDetail{
        bool allowReference;
        uint approveBlockNo;
        uint refLimitBlockNo;
        address applicant;
    }
    
    struct PersonDetail{
        string name;
        string birth;
        address[] orglist;
    }
    
    struct OrganizationDetail{
        string name;
    }



AppDetail 구조체열람에 관련한 구조체를 나타내고 있다.

이 구조체의 특징은 여러 명에게는 열람을 허가할 수 없게 되어있고 열람이 허가된 정보는 누구나 볼 수 있다.


allowReference는 참조 허가 여부를 나타내고 있고 T면 허가, F면 거부이다.


approveBlockNo는 승인할 때의 블록 번호를 나타내고 있다.


refLimitBlockNo는 열람 기간을 종료할 블록 번호를 의미한다.


applicant 열람을 허용해줄 주소를 의미하고 있다.



PersonDetail은 이름, 생일, 이 기관을 다녔음을 증명하는 이더리움 주소 목록이 담겨있다.



OrganizationDetail에는 보통 기관 이름, 기관ID 등 다양한 기관 정보가 들어가야 하지만 여기서는 name에 대해서만 다루고 있다.




    mapping(address => AppDetail) appDetail;
    mapping(address => PersonDetail) personDetail;
    mapping(address => OrganizationDetail) orgDetail;
    
    function PersonCertification(){
        admin = msg.sender;
    }



각 주소별로 해당하는 구조체가 저장되고 생성자는 처음 msg.sender이 admin이 된다.


이때 맵 순서대로 해당 키 열람 허가 정보, 해당 키 본인 확인 정보, 해당 키 조직 정보가 들어간다.



    function setPerson(string _name, string _birth){
        personDetail[msg.sender].name = _name;
        personDetail[msg.sender].birth = _birth;
    }
    
    function setOrganization(string _name){
        orgDetail[msg.sender].name = _name;
    }
    
    function setBelong(address _person){
        personDetail[_person].orglist.push(msg.sender);
    }



setPerson에서는 자신의 이름, 생일을 수정 할 수 있도록 해주고


setOrganization에서는 자신의 기관 이름을 변경 할 수 있게 해준다.


setBelong에서는 해당 person의 정보에 msg.sender의 주소 즉, 기관의 주소를 넣어준다.




    function setApprove(address _applicant, uint _span){
        appDetail[msg.sender].allowReference = true;
        appDetail[msg.sender].approveBlockNo = block.number;
        appDetail[msg.sender].refLimitBlockNo = block.number + _span;
        appDetail[msg.sender].applicant = _applicant;
    }
    
    function getPerson(address _person) public constant returns(
        bool _allowReference, uint _approveBlockNo, uint _refLimitBlockNo,
        address _applicant, string _name, string _birth, address[] _orglist){
            
            _allowReference = appDetail[_person].allowReference;
            _approveBlockNo = appDetail[_person].approveBlockNo;
            _refLimitBlockNo = appDetail[_person].refLimitBlockNo;
            _applicant = appDetail[_person].applicant;
            
            if(((msg.sender == _applicant) 
            && (_allowReference == true
            && (block.number < _refLimitBlockNo))
            || (msg.sender == admin)
            || (msg.sender == _person)){
                _name = personDetail[_person].name;
                _birth = personDetail[_person].birth;
                _orglist = personDetail[_person].orglist;
            }
    }


setApprove에서는 이제 어느 곳에서 해당하는 개인 정보를 확인해도 되는지 설정해준다.


_applicant 인자에는 확인하고 싶어하는 대상의 주소를 넣어준다.(ex 기업 채용자)


_span은 자세히 살펴보자.



_span의 용도


현재 이더리움 기반 스마트 컨트랙트에서는 몇시간동안 열람을 허용해줄지에 대한 시간제한 같은것을 두기가 힘들다.


따라서 현재 시점의 블록에서 몇번째 다음 블록까지 열람을 허용해줄지로 결정하게 된다.


이더리움은 현재 블록 생성 주기가 10~20초이니 그에 맞게 평균적인 15초로 생각하여 15*블록수를 통해 열람 시간을 어림잡아 계산해준다.




getPerson 함수를 보자.



if문 위의 값들은 어느 누구나 열람이 가능하지만, name, birth, orglist는 개인 정보이기에 열람이 불가능하고 특정 조건에 해당하는 사람만 열람이 가능하다.


위의 조건은 컨트랙트 관리자 / 개인정보의 주인 / 개인정보 열람 권한을 가진 사람들만이 name, birth, orglist를 열람 가능하다.







반응형

'Applied > Blockchain' 카테고리의 다른 글

이더리움 백서 요약본  (0) 2018.05.17
Solidity에서 스트링 비교  (0) 2018.05.16
Solidity 회원관리 예제  (0) 2018.05.14
Solidity 블랙리스트 구현  (0) 2018.05.05
Sollidity 토큰 Contract 예제문  (0) 2018.05.04