요구사항
간단하게 만들어보기 위해서라고는 하지만, 기존에 REMIX, 이더리움 테스트 넷 Ropsten 주소와 Ropsten 가스비가 어느 정도 필요합니다.
사용법과 가스비가 필요하신 분은 기존 사용법과 가스비 받는 방법을 적어 두었으니, 필요하신 분은 참고 바랍니다.
solidity - 테스트넷 simple token 배포하기 - 1 / 2 편
ERC-20 이론부터 배포까지 ERC-20 (Ethereum Request for Comment 20), 20은 리퀘스트 숫자입니다. 이더리움 네트워크의 개선안을 제안하는 EIPs(Ethereum Improvement Proposals) 에서 관리하는 공식 프로토콜입..
wooong.dev
solidity - 테스트넷 simple token 배포하기 - 2 / 2 편
solidity - 테스트넷 simple token 배포하기 - 2 / 2 편 이번편에는 필요한 준비물이 두개 있습니다. 하나는 메타스크지갑(ropsten)이고, 둘은 remix 연동입니다. 만약 준비물이 이미 준비가 되어있다면 배포
wooong.dev
solidity code 작성
백신 증명에 필요한 것
- 몇 회 차인지?
- 백신 회사는?
(1). 아스트라제네카 전달체 백신(바이러스 벡터) AstraZeneca
(2). 얀센 전달체 백신(바이러스 벡터) Janssen
(3). 화이자 핵산백신(mRNA) 2회 21일 Pfizer
(4). 모더나 핵산백신(mRNA) 2회 4주 Moderna - 몇회차인지?
- 발행자?
- 특별한 값, 신원
solidity 전체 코드
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.10;
contract VaccineBox {
address private issuerAddress;
uint256 private idCount;
mapping(uint8 => string) private vaccineEnum;
struct Vaccine{
uint256 id;
address issuer;
uint256 num;
string vaccineType;
string value;
}
mapping(address => Vaccine) private vaccines;
constructor() {
issuerAddress = msg.sender;
idCount = 1;
vaccineEnum[0] = "Janssen";
vaccineEnum[1] = "Pfizer";
vaccineEnum[2] = "Moderna";
vaccineEnum[3] = "AstraZeneca";
}
function claimVaccine(address _vaccineAddress, uint8 _vaccineType, string calldata _value) public returns(bool){
require(issuerAddress == msg.sender, "Not Issuer");
Vaccine storage vaccine = vaccines[_vaccineAddress];
require(vaccine.id == 0);
vaccine.id = idCount;
vaccine.issuer = msg.sender;
vaccine.vaccineType = vaccineEnum[_vaccineType];
vaccine.num = 1;
vaccine.value = _value;
idCount += 1;
return true;
}
function claimAddVaccine(address _vaccineAddress, uint8 _vaccineType) public returns(bool) {
require(issuerAddress == msg.sender, "Not Issuer");
vaccines[_vaccineAddress].num += 1;
vaccines[_vaccineAddress].vaccineType = vaccineEnum[_vaccineType];
return true;
}
function getVaccine(address _vaccineAddress) public view returns (Vaccine memory){
return vaccines[_vaccineAddress];
}
}
코드 해설
- struct Certificate
struct Vaccine{
uint256 id;
address issuer;
uint256 num;
string vaccineType;
string value;
}
id
는 백신 index를 확인할 수 있는 id이며, issuer
는 발급자,num
은 몇 번째 백신인지 확인 , vaccineType은 마지막으로 어떤 회사의 백신을 맞았는지, value
는 정보가 들어가며, 중앙화된 서버에서 제공하는 암호화된 정보, 신원, 신원 제공자, 서명 등이 json 형태로 제공됩니다.
- claimVaccine function
function claimVaccine(address _vaccineAddress, uint8 _vaccineType, string calldata _value) public returns(bool){
require(issuerAddress == msg.sender, "Not Issuer");
Vaccine storage vaccine = vaccines[_vaccineAddress];
require(vaccine.id == 0);
vaccine.id = idCount;
vaccine.issuer = msg.sender;
vaccine.vaccineType = vaccineEnum[_vaccineType];
vaccine.num = 1;
vaccine.value = _value;
idCount += 1;
return true;
}
claimVaccine
을 통해서 발행자인지, 첫 발행인지 확인을 진행하고, 이로써 vaccineAddress와 vaccineType, _value를 받아서 초기 값을 세팅 발행을 가능하게 합니다.
3. ClaimAddVaccine
function claimAddVaccine(address _vaccineAddress, uint8 _vaccineType) public returns(bool) {
require(issuerAddress == msg.sender, "Not Issuer");
vaccines[_vaccineAddress].num += 1;
vaccines[_vaccineAddress].vaccineType = vaccineEnum[_vaccineType];
return true;
}
claimAddVaccine
은 마지막으로 맞은 백신과, 백신 횟수를 업데이트해주고 발행합니다.
4. getVaccine
function getVaccine(address _vaccineAddress) public view returns (Vaccine memory){
return vaccines[_vaccineAddress];
}
이 함수를 통해 어떠한 주체를 통하여 발행한 Vaccine
을 확인할 수 있습니다.
스마트 컨트랙트 배포 및 사용
이제 코드를 완성했으니, 배포하고, 사용하여 잘 돌아가는지 확인하는 시간을 가지겠습니다.
컴파일 및 배포
이미지가 작다면, 클릭 후 확대해주세요.
1번
에서는 완성했던 코드를 붙여 넣은 뒤, 2번
컴파일, 3번
배포 탭으로 이동 후, 4번
배포를 진행합니다.
이제, 잘 배포가 되어있는지 확인하려면, 직접 사용도 해봐야 합니다. 사용해보겠습니다.
사용
Vaccine(백신 증명서)를 받을 테스트 넷 주소, 백신 타입, 그리고 값(값에는 발행 주체가 원하는 데이터가 들어있습니다), 저는 test라고 진행하겠습니다. 그리고 정상적으로 발행된 것을 확인할 수 있습니다. 한번 조회를 해보겠습니다.
조회
정상적으로 조회가 됩니다.
회고
막상 코드를 써보니 허술한 점이 많았습니다. 변수명이 명확하지 않다는 점, 마지막 백신만 조회되는 점, 백신 회사가 한정적이고 추가가 안 되는 점 앞으로 수정하고 보완하여 완성도를 높여볼 생각입니다.
한줄평
쉽지 않다.
'etc > solidity' 카테고리의 다른 글
ERC-721, NFT 뜻과 함수에 대해서 알아보자 (0) | 2022.01.21 |
---|---|
solidity - 테스트넷 simple token 배포하기 - 2 / 2 편 (0) | 2022.01.20 |
solidity - 테스트넷 simple token 배포하기 - 1 / 2 편 (0) | 2022.01.19 |
솔리디티(solidity) 문법 (간단 정리) (0) | 2022.01.17 |