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/
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 임시값
https://goerli.etherscan.io/tx/0xb2fdb6338c9337cc8b60f0f1c9b8538347b7296ebc265b1bcd20e8452f446617
발급완료된 컨트랙트에서 "getCredential"을 클릭하면 트랜잭션 데이터를 볼 수 있다.
https://goerli.etherscan.io/address/0x1da8ab45d722a1da6690beaa83bd651b209db537
ERC-721(NFT) 토큰 발급 및 전송 실습 (0) | 2023.02.16 |
---|---|
로컬 컴퓨터와 Remix 연결하기 (0) | 2023.02.16 |
ERC-721(NFT) Solidity 코드 및 토큰 분석 (0) | 2023.02.15 |
ERC-20 토큰 - 개선(SafeMath, OwnerHelper, TokenLock 추가) (0) | 2023.02.15 |
ERC-20 토큰(나만의 토큰 만들기 실습) (0) | 2023.02.13 |