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

DID를 활용한 졸업증명서에 기능 추가하기

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

💻 DID를 활용한 졸업증명서에 기능 추가하기

 

https://ejh-crypto-lab.tistory.com/108

 

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

💻 DID를 활용한 졸업증명서 개발하기 먼저 검증 가능한 크레덴셜(Verifiable Credential)과 크레덴셜이 저장될 공간을 고려해야 한다. vc-data-model 페이지에서 정의하는 크레덴셜은 다음과 같다. ✓ 크

ejh-crypto-lab.tistory.com

이전에 개발했던 졸업증명서에 솔리디티 문법을 활용하여 기능을 추가해보자!

 

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.10;

abstract contract OwnerHelper {
    address private owner;
    event OwnerTransferPropose (address indexed _from, address indexed _to);
    modifier onlyOwner{
        require(msg.sender == owner);
        _;
    }

    constructor(){
        owner = msg.sender;
    }

    function transferOwnership(address _to) onlyOwner public{
        require(_to != owner);
        require(_to != address(0x0));
        owner = _to;
        emit OwnerTransferPropose(owner, _to);
    }
}

// IssuerHelper에서는 Issuer를 추가하고 삭제하는 기능이 존재한다.
// 추가하고 삭제하는 기능은 onlyOwner로 제한되어 Owner만 컨트롤이 가능하다.
abstract contract IssuerHelper is OwnerHelper{
    mapping(address => bool) public issuers;

    event AddIssuer(address indexed _issuer);
    event DelIssuer(address indexed _issuer);

    modifier onlyIssuer{
        require(isIssuer(msg.sender) == true);
        _;
    }

    constructor(){
        issuers[msg.sender] = true;
    }

    function isIssuer(address _addr) public view returns (bool){
        return issuers[_addr];
    }

    function addIssuer(address _addr) onlyOwner public returns (bool){
        require(issuers[_addr] == false);
        issuers[_addr] = true;
        emit AddIssuer(_addr);
        return true;
    }

    function delIssuer(address _addr) onlyOwner public returns (bool) {
        require(issuers[_addr] == true);
        issuers[_addr] = false;
        emit DelIssuer(_addr);
        return true;
    }
}

contract CredentialBox is IssuerHelper {
    uint256 private idCount;
    mapping(uint8 => string) private alumniEnum;
    mapping(uint8 => string) private statusEnum;

    struct Credential {
        uint256 id;
        address issuer;
        uint8 alumniType;
        uint8 statusType;
        string value;
        uint256 createDate;
    }

    mapping(address => Credential) private credentials;

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

// claimCredential에서 block.timestamp를 활용해 크레덴셜을 클레임한 시간을 크레덴셜에 저장할 수 있다.
    function claimCredential (address _alumniAddress, uint8 _alumniType, string calldata _value) public returns(bool){
        Credential storage credential = credentials[_alumniAddress];
        require(credential.id == 0);
        credential.id = idCount;
        credential.issuer = msg.sender;
        credential.alumniType = _alumniType;
        credential.statusType = 0;
        credential.value = _value;
        credential.createDate = block.timestamp;

        idCount +=1 ;

        return true;
    }

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

    function addAlumniType(uint8 _type, string calldata _value) onlyIssuer public returns (bool){
        require(bytes(alumniEnum[_type]).length == 0);
        alumniEnum[_type] = _value;
        return true;
    }

    function getAlumniType(uint8 _type) public view returns (string memory) {
        return alumniEnum[_type];
    }

    function addStatusType(uint8 _type) public view returns (string memory) {
        return statusEnum[_type];
    }

// 특정사용자의 상태를 변경하는 함수. 
// 이 함수를 통해 크레덴셜 내부에 존재하는 statusType의 값을 가져와 변경할 수 있다.
    function changeStatus(address _alumni, uint8 _type) onlyIssuer public returns (bool) {
        require(credentials[_alumni].id != 0);
        require(bytes(statusEnum[_type]).length != 0);
        credentials[_alumni].statusType = _type;
        return true;
    }
}

 

 

✓ 실행결과

 

반응형

'블록체인 > WEB3 개발' 카테고리의 다른 글

Web3.js란?  (0) 2022.07.29
Web3.js란?  (0) 2022.07.29
DID를 활용한 졸업증명서 개발하기  (0) 2022.07.27
Local에서 ERC-721 개발해 Truffle 로 배포하기  (0) 2022.07.21
Remix에서 ERC-721 개발하기  (0) 2022.07.20

댓글