본문 바로가기
블록체인/WEB3 개발

DID를 활용한 졸업증명서 개발하기

by 제이제이_은재 2022. 7. 27.
반응형

 

💻 DID를 활용한 졸업증명서 개발하기

 

먼저 검증 가능한 크레덴셜(Verifiable Credential)과 크레덴셜이 저장될 공간을 고려해야 한다. vc-data-model 페이지에서 정의하는 크레덴셜은 다음과 같다.

 

✓ 크레덴셜 (Credential)

Issuer가 제기한 하나 이상의 Claim 집합. Verifiable Credential은 암호환된 검증을 생성할 수 있는 변조 방지 Credential이다. VC를 사용하여 암호화된 Verifiable Presentation을 만들수도 있다.

 

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.10;

contract CredentialBox {
    address private issuerAddress;
    uint256 private idCount;
    mapping(uint8 => string) private alumniEnum;

    struct Credential {
        uint256 id;
        address issuer;
        uint alumniType;
        string value;
    }

    mapping(address => Credential) private credentials;

    constructor() {
        issuerAddress = msg.sender;
        idCount = 1;
        alumniEnum[0] = "SEB";
        alumniEnum[1] = "BEB";
        alumniEnum[2] = "AIB";
    }

    function claimCredential (address _alumniAddress, uint _alumniType, string calldata _value) public returns(bool){
        require(issuerAddress == msg.sender, "Not Issuer");
                Credential storage credential = credentials[_alumniAddress];
        require(credential.id == 0);
        credential.id = idCount;
        credential.issuer = msg.sender;
        credential.alumniType = _alumniType;
        credential.value = _value;

        idCount +=1 ;

        return true;
    }

    function getCredential(address _alumniAddress) public view returns (Credential memory){
        return credentials[_alumniAddress];
    }
}

 

지금 만드는 졸업증명서 개발하기는 claimCredential 함수로 Credential을 발행하고, getCredential 함수를 통해 Credential을 발행한 주소에서 VC를 확인하는 간단한 주소이다. 이제 코드를 하나하나 분석해보자.

 

1. Credential부터 확인한다.

struct Credential {
    uint256 id;
    address issuer;
    uint alumniType;
    string value;
}

위 코드는 검증가능한 크레덴셜인 VC를 구현하기 위한 구조체이다. 이 구조체에는 id, issuer, alumniType, value 가 포함되어 있다.

 

* id: index순서를 표기하는 idCount.

* issuer: 발급자, 하나 혹은 그 이상의 주체에 대한 클레임을 주장하고, 그 클레임으로부터 검증가능한 크레데션을 생성하며 검증가능한 크레덴셜을 보유자에게 전달하는 엔티티의 역할.

* alumniType: 졸업증명서 타입

* value: 크레덴셜에 포함되어야하는 암호화된 정보. 중앙화된 서버에서 제공하는 신원, 신원 제공자, 엔티티, 서명 등이 JSON 형태로 저장된다.

 

 

2. claimCredential 함수

function claimCredential (address _alumniAddress, uint _alumniType, string calldata _value) public returns(bool){
    require(issuerAddress == msg.sender, "Not Issuer");
            Credential storage credential = credentials[_alumniAddress];
    require(credential.id == 0);
    credential.id = idCount;
    credential.issuer = msg.sender;
    credential.alumniType = _alumniType;
    credential.value = _value;

    idCount +=1 ;

    return true;
}

claimCredential 함수를 통해 발급자(issuer)는 어떠한 주체(_alumniAddress)에게 크레덴셜(Credential)을 발행(claim) 할 수 있게 된다.

 

 

3. getCredential 함수

function getCredential(address _alumniAddress) public view returns (Credential memory){
    return credentials[_alumniAddress];
}

이 함수를 통해 어떠한 주체(_alumniAddress)를 통하여 발행한 크레덴셜을 확인할 수 있다.

 

 

✓ Remix를 이용하여 스마트 컨트랙트 배포 & 사용

 

1. Remix에서 CrendetialBox.sol이라는 파일을 만들고 전체 코드를 입력한다.

 

2. 컨트랙트 코드를 컴파일한다.

 

 

3. 컨트랙트 코드를 Ropsten 테스트넷에 배포한다.

 

4. 배포가 완료되면 claimCredential 함수를 실행한다.

 

 

- _alumniAddress: Credential을 발행받을 테스트넷 주소

- _alumniType: 졸업증명서 타입

- value: JWT로 암호화된 토큰

 

 

5. Credential 컨펌이 완료되었면, getCredential 함수를 실행한다.

 

- _alumniAddress: Credential을 발행받은 주소

 

getCredential 함수를 통해 해당 주소에게 저장되어있던 검증가능한 크레덴셜이 발행되었음을 확인할 수 있다.

 

위 코드는 DID에서 이야기하는 기본적인 그래프 표기인 주체-속성-값에 대한 클레임을 개발한 것이다.

 

반응형

댓글