💻 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에서 이야기하는 기본적인 그래프 표기인 주체-속성-값에 대한 클레임을 개발한 것이다.
'블록체인 > WEB3 개발' 카테고리의 다른 글
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 |
Truffle(트러플), Truffle Develop, Truffle과 Ganache 연동 (0) | 2022.07.15 |
댓글