상세 컨텐츠

본문 제목

크레덴셜, issuer를 활용한 졸업증명서 발급 실습 - Solidity

Programming Language/Solidity

by Yongari 2023. 2. 24. 12:54

본문

 

사전에 파악해야 하는 개념

Issuer : 신원정보를 발급하는 발행자면서 주체 
Verifiable Credential(검증가능한 크리덴셜, VC)를 발행하는 주체 
정보 주체(holder)의 요구에 의해 VC와 did를 발급하는 기관

holder: 자격증명 소유자 
holder(소유자)는 신원정보를 소유한 주체 
did로 본인의 신원을 증명하고자 함 


Verifier(검증자) : 자격증명검증자
holder로부터 VP(Verifiable Presentation)를 받아 신원정보를 검증하는 주체 
did로 신원을 확인한 후 검증자는 이 신원정보가 Issuer가 발급한 정보인지 
검증데이터 저장소(분산원장, 블록체인 등 )을 통해 검증함


Verifiable DataRegistry(검증데이터 저장소) : 분산원장, 블록체인
Issuer(발급기관)의 인증서, 신원증명 해지내역, 신원증명 스키마 등이 등록된
분산원장 기반의 데이터 무결성이 확보된 저장소 
holder, issuer, verifier가 합의한 분산원장이면 사용가능 

 

 

https://ssimeetupkorea.github.io/vc-data-model/

 

검증가능한 크리덴셜 데이터 모델 (Verifiable Credentials Data Model) 1.0

발급자, 보유자, 검증자가 이 명세서에서 설명하고 있는 데이터를 처리할 때 인지하고 있어야 하는 보안 고려사항이 아주 많이 있다. 이 섹션에서 설명하는 내용이 함축하는 바를 무시하거나 이

ssimeetupkorea.github.io

 

https://next-block.tistory.com/entry/DID%EC%99%80-SSI-%EA%B7%B8%EB%A6%AC%EA%B3%A0-VC-VP%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

 

DID와 SSI 그리고 VC, VP에 대한 개념 정리

SSI는 무엇일까? SSI(Self-Sovereign Identity) : 자기주권신원이라고도 한다. 제 3자에게 자신을 증명할 수 있는 정보를 맡기지 않고 스스로 관리 및 보관하는 개념이다. DID(Decentralized Identity)는 SSI를 탈중

next-block.tistory.com

 

DID를 활용해서 졸업증명서를 솔리디티로 간단하게 발급하는 실습입니다.

DID 전체개념을 구현한 것은 아니고 크레덴셜과 Issuer를 포함하는 스마트 컨트랙트를 작성해보겠습니다.

이후 스마트컨트랙트를 발급해서  크레덴셜 데이터를 가져오는 것까지 실습해보겠습니다.

 

환경설정

 

메타마스크 - Goerli 테스트 네트워크

Remix - solidity IDE

 

 

솔리디티 코드

크레덴셜, issuer이 포함된 컨트랙트

holder가 issuer에게 졸업증명서를 요청할 때 사용하는 스마트컨트랙트

// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.10;

contract CredentialBox {
    //컨트랙트배포자, 메타마스크 계정주소를 담기위한 변수 
    address private issuerAddress;
    //id값을 카운트하는 변수, 발급할수록 카운트 체크해야해서 설정함 
    uint256 private idCount;
    // alumniEnum 매핑값 변수 인덱스=밸류와 같이 선언
    mapping(uint8 => string) private alumniEnum;

    //claimCredential 함수로 Credential을 발행하고, getCredential 함수를 통해 Credential을 발행한 주소에서 VC를 확인하는 간단한 구조
    struct Credential{
        uint256 id; //index 순서를 표기하는 idCount
        address issuer; //발급자, 하나 혹은 그 이상의 주체에 대한 클레임을 주장하고, 그 클레임으로부터 검증가능한 크리덴셜을 생성하며 검증가능한 크리덴셜을 보유자에게 전달하는 엔터티의 역할.
        uint8 alumniType;//졸업증명서 타입
        string value;//크리덴셜에 포함되어야 하는 암호화된 정보. 중앙화된 서버에서 제공하는 신원, 신원 제공자, 엔터티, 서명 등이 JSON 형태로 저장된다.
    }

    //address : Credential
    mapping(address => Credential) private credentials;

    //검증가능한 크리덴셜인 VC를 구현하기 위한 구조체
    constructor() {
        //발급자 주소를 담기위한 변수
        issuerAddress = msg.sender;
        //인덱스로 추정 
        idCount = 1;
        //배열값 
        alumniEnum[0] = "SEB";
        alumniEnum[1] = "BEB";
        alumniEnum[2] = "AIB";
    }

    //claimCredential 함수를 통해 발급자(issuer)는 어떠한 주체(_alumniAddress)에게 크리덴셜(Credential)을 발행(claim)할 수 있게 됩니다.
    function claimCredential(address _alumniAddress, uint8 _alumniType, string calldata _value) public returns(bool){
        //issuerAddress 발급주소가 메타마스크 계정이 맞는지 체크 
        require(issuerAddress == msg.sender, "Not Issuer");
				Credential storage credential = credentials[_alumniAddress]; 
        require(credential.id == 0); 
        //credential의 구조체 속성을 담기 
        credential.id = idCount;
        credential.issuer = msg.sender;
        credential.alumniType = _alumniType;
        credential.value = _value;
        //아이디 카운트에 +1하기 
        idCount += 1;

        //true 리턴 
        return true;
    }

    // /이 함수를 통해 어떠한 주체(_alumniAddress)를 통하여 발행(claim)한 크리덴셜(Credential)을 확인할 수 있습니다.
    function getCredential(address _alumniAddress) public view returns (Credential memory){
        //_alumniAddress에 컨트랙트 배포자, 메타마스크 주소 넣기 
        // credential 정보를 가져옴
        return credentials[_alumniAddress];
    }

}

 

 

 

1. 솔리디티 코드를 remix.ethereum.org에 복사&붙여넣기를 한다.

2. 왼쪽 세번째 탭에서 Compile 버튼을 클릭한 후 Compile 문제가 없는지 확인한다.

3. 왼족 네번째 탭을 클릭한 후 메타마스크 계정과 연동한 후 Deploy한다.

4. 다음 주소들을 넣고 "tranct"를 클릭한다.

_alumniAddress : 발급받고자 하는 이더리움 테스트넷 메타마스크 계정 주소

_alumniType : 1 (졸업증명서 타입)

_value : JWT 임시값 

다음은 이더스캔에서 확인할 수 있는 claimCredential 함수 호출 결과다. 

 

https://goerli.etherscan.io/tx/0xb2fdb6338c9337cc8b60f0f1c9b8538347b7296ebc265b1bcd20e8452f446617

 

Goerli Transaction Hash (Txhash) Details | Etherscan

Goerli (GTH) detailed transaction info for txhash 0xb2fdb6338c9337cc8b60f0f1c9b8538347b7296ebc265b1bcd20e8452f446617. The transaction status, block confirmation, gas fee, Ether (ETH), and token transfer are shown.

goerli.etherscan.io

 

발급완료된 컨트랙트에서 "getCredential"을 클릭하면 트랜잭션 데이터를 볼 수 있다.

https://goerli.etherscan.io/address/0x1da8ab45d722a1da6690beaa83bd651b209db537

 

Contract Address 0x1da8ab45d722a1da6690beaa83bd651b209db537 | Etherscan

The Contract Address 0x1da8ab45d722a1da6690beaa83bd651b209db537 page allows users to view the source code, transactions, balances, and analytics for the contract address. Users can also interact and make transactions to the contract directly on Etherscan.

goerli.etherscan.io

 

 

 

관련글 더보기