반응형
💻 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 |
댓글