1. 개발 내용
백신시스템의 기능
1. 중앙정부와 중앙정부에서 지정한 기관만이 백신증명서를 발급할 수 있다.
2. 지정한 기관은 중앙정부에서 추가할 수있다.
3. 지정한 기관을 삭제하고 추가할 수 있다.
4. 증명서에 들어갈 접종자의 백신 종류를 추가 할 수 있다.
5. 증명서에 들어갈 접종자의 백신 회차수를 추가 할 수 있다.
6. 백신 접종 여부를 판단 할 수 있다.
7. 백신증명서 발급시 백신 타입을 간단히 숫자로 입력받는데 해당 숫자에 해당하는 백신종류를 확인할 수 있다.
8. 백신 접종후 2주가 경과했는지 여부를 확인 할 수 있다.
백신증명서 발급
function claimCredential(address _vaccineAddress, uint8 _vaccineType, string calldata _value) onlyIssuer public returns(bool){
Credential storage credential = credentials[_vaccineAddress];
require(credentials[_vaccineAddress].id == 0);
credential.id = idCount;
credential.issuer = msg.sender;
credential.vaccineType = _vaccineType;
credential.value = _value;
credential.statusNumber = 1;
credential.createDate = block.timestamp;
idCount+=1;
return true;
}
발급받을 접종자주소, 백신타입, 외부에서 암호화된 접종자의 정보를 입력 받는다. 접종자의 접종횟수는 statusNumber로써 1을 할당한다.
백신 접종여부 확인
function checkCredential(address _vaccineAddress) public view returns (bool){
if(credentials[_vaccineAddress].statusNumber >=1) return true;
else return false;
}
백신 접종 횟수 추가
function changeStatus(address _vaccineAddress) onlyIssuer public returns (bool){
require(credentials[_vaccineAddress].statusNumber >=1);
credentials[_vaccineAddress].statusNumber += 1;
return true;
}
백신 접종 2주 경과 여부
function checkTwoWeeks(address _vaccineAddress) public view returns (bool) {
return ((block.timestamp-(credentials[_vaccineAddress].createDate)) > 2 weeks);
}
백신 종류 추가
function addVaccineType(uint8 _type, string calldata _value) onlyIssuer public returns (bool) {
require(bytes(vaccineEnum[_type]).length == 0);
vaccineEnum[_type] = _value;
return true;
}
타입 번호 별 백신 종류 확인
function getVaccineType(uint8 _type) public view returns (string memory) {
return vaccineEnum[_type];
}
2. 개발 회고
Keep: 개발작업의 방향을 우리가 일상 생활에서 qr코드로 본인의 코드를 인증할 때 백신을 맞았는지, 그리고 몇주가 지났는지 등을 알려주는것을 중점으로 이 시스템을 구축할려면 관리하는 중앙기관,정부에서 어떻게 컨트랙트로부터 정보를 입력받고 출력하여 그걸 활용해야할지 목표를 두고 개발하였다. 기존 owner와 issuer부분은 코드 졸업 증명서 부분을 그대로 사용하였고 OwnerTransferPropose에 인자로 넣는 부분에 오류가 있어 수정하는 과정을 거쳤다.
Problem: 증명서를 발급하는 함수에서 inCounter가 storage, 즉 블록체인에 기록되는가에 따라 다음 credential에 id로써 사용할 수 있는데 이 부분이 storage로 선언한 적도 없는데 알아서 +=1 한 값이 적용되고 다음 credential.id에 잘 할당 되었다. 처음 require(crendentials[_vaccineAddress].id == 0)은 require(credential.id==0)으로 했었는데 이는 다음 접종자에게 발급하는것에 제한이 된다. Credential storage credential = credentials[_vaccineAddress]에 의해
credentials[_vaccineAddress].id는 무조건 0부터 시작하게 되고 이후 = idCount에 의해 id인덱스가 정해진다는것을 알게되었다. 일반적인 언어에서는 특정 키의 값은 정해주어야하는데 솔리디티는 알아서 0부터 알아서 false부터 정해지는것이 아닌가 하는 생각이 들었고 찾아보게 되었다.
Try: 작성한 코드는 최종적으로 접종자의 극히 개인적인정보는 증명서를 발급할때 암호화된 _value로 받아 넣어서 만들게 된다. 외부에서 받을 암호화된 _value를 처음부터 내부에서 받아 암호화하여 저장하면 어떨지 작성해본다.
3. 작동 영상
4. 코드 및 주소
Github : https://github.com/Parkstelth/DID-VaccineSystem
Contract : https://ropsten.etherscan.io/address/0x222F9351e2f126F26068847f496dC8637F950e95
'포트폴리오 > Project_1' 카테고리의 다른 글
가위바위보 게임 개선하기(hand encoding) (0) | 2021.12.13 |
---|---|
Web3.js 서버프로젝트를 KAS기반 클레이튼 서버로 개발 (0) | 2021.12.12 |
니모닉 지갑 개발 (0) | 2021.12.12 |
관리자3명이 Owner 투표 / 락 재 사용 구현 (0) | 2021.12.10 |
댓글