๋ฐ์ดํฐ์ ์ฃผ๊ถ์ด ๊ฐ์ธ์๊ฒ ์๊ณ
ํ์ํ ๋ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ค์ํ๋ ์์คํ
์ ๊ฑฐ์น์ง ์๊ณ ์ฆ๋ช
ํ ์ ์๋ ๊ธฐ์
-> ์๊ธฐ ์์ ์ด ์ ์ ์ฆ๋ช ์ ๋ํ ๊ถํ์ ๊ฐ๋๋ก ํ๊ฒ ๋ค๋ SSI ๊ฐ๋ ์ ํ์คํ
์ ์์ ์์ ๊ถ์ ๊ฐ์ง ์ฃผ์ฒด๊ฐ ์ ์์ ๋ํ ๊ถ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ๊ณต๊ฐ ๋์๊ณผ ๋ฒ์๋ฅผ ์ ํ
์ธ์ฆ
์ ์ ์ฆ๋ช ์
์ถ์ ํต์
๋ฐฑ์ ์ ์ข ์ฆ๋ช DID์ ๊ด๋ จ ์๋ '์ ์ ์ฆ๋ช ์'์ ๋ํด ๋ ์์ธํ ์์๋ณด์
์กธ์ ์ฆ๋ช ์๋ก ์๋ฅผ ๋ค์ด ๋ณด์
โ
Holder: ์ฌ์ฉ์
โ
Issuer: ํ๊ต
โ
Verified: ์ฆ๋ช
์๋ฅผ ์๊ตฌํ ๊ธฐ๊ด
โ
Verifiable Credential(VC): ์กธ์
์ฆ๋ช
์
Holder๋ ์์ ์ VC๋ฅผ Issuer์๊ฒ ์๊ตฌ
1) Issuer๋ ๋ธ๋ก์ฒด์ธ ์ ์ฅ์์ DID๋ฅผ ๋ฐ๊ธํ์ฌ ๊ณต๊ฐํค์ ํจ๊ป ์ ์ฅ
2) Holder์๊ฒ ๊ฐ์ธํค๊ฐ ๋ด๊ธด VC๋ฅผ ์ ๊ณต
1) Holder๋ ์์ ์ DID๋ฅผ ๋ธ๋ก์ฒด์ธ์ ์ ์ฅ
2) ์ ๋ฌ ๋ฐ์ VC์ ์์ ์ ๊ฐ์ธํค๋ฅผ ๋ด์ Verifier์๊ฒ ์ ์ถ
Verifier๋ VC๋ด์ ๊ฐ์ธํค์ ๋ธ๋ก์ฒด์ธ ๋ด์ ๊ณต๊ฐํค๋ฅผ ํ์ฉํ์ฌ VC์ ์ง์์ฌ๋ถ ํ์ธ
โ
nation: ๊ตญ๊ฐ(์ต์์ ๊ด๋ฆฌ์) && ๋ฐฑ์ ์ ์ฝํ์ฌ ์ถ๊ฐ ๋ฐ ์ญ์ ๊ถํ
โ
issuer: ๋ฐฑ์ ์ ์ฝ ํ์ฌ && ๋ฐฑ์ ์ฆ๋ช
์ ๋ฐ๊ธ ๊ถํ
โ
requester: ์ฆ๋ช
์ ๋ฐ๊ธ ์๋น์ค ์ฌ์ฉ์
Credential: ์ ์ ํ์ธ์ ํ์ํ ์ ๋ณด
// ์ ์ข
์: ์ฆ๋ช
์ ๋ฐ๊ธ
// ๋ฏธ์ ์ข
์: ์ฆ๋ช
์ ๋ฐ๊ธ ๋ถ๊ฐ
struct Credential{
uint id;
string company; // ๋ฐฑ์ ์ ์กฐ์ฌ: ํ์ด์, ๋ชจ๋๋, AZ
string degree; // ์ ์ข
์ฐจ์: 1์ฐจ, 2์ฐจ, 3์ฐจ
uint createdDate; // ์ ์ข
์ผ์
string value; // credentail์ ํฌํจ๋์ด์ผํ๋ ์ํธํ๋ ์ ๋ณด
}
constructor(){
companyArr[0] = unicode"๐งชํ์ด์";
companyArr[1] = unicode"๐งช๋ชจ๋๋";
companyArr[2] = unicode"๐งชAZ";
degreeArr[1] = unicode"1๏ธโฃ์ฐจ ์ ์ข
์๋ฃ";
degreeArr[2] = unicode"2๏ธโฃ์ฐจ ์ ์ข
์๋ฃ";
degreeArr[3] = unicode"3๏ธโฃ์ฐจ ์ ์ข
์๋ฃ";
}
// onlyNation: ๊ตญ๊ฐ์์๋ง ํด๋น ํจ์ ์ฌ์ฉ ๊ฐ๋ฅ
// ์๋ก์ด ์ ์ฝํ์ฌ์์ ๋ฐฑ์ ๊ฐ๋ฐ ์ฑ๊ณต
function addIssuer(address _addr) onlyNation public returns (bool){
issuers[_addr] = true;
require(issuers[_addr] == true); // ์ ๋๋ก ์ ์ฉ๋์๋์ง ํ์ธ
emit AddIssuer(_addr);
return true;
}
// ํด๋น ์ ์ฝํ์ฌ์ ๋ฐฑ์ ๋ถ์์ฉ์ด ๋ฐํ์ง์ ๋ฐ๋ผ ์ญ์ ์กฐ์น
function delIssuer(address _addr) onlyNation public returns (bool){
issuers[_addr] = false;
require(issuers[_addr] == false); // ์ ๋๋ก ์ ์ฉ๋์๋์ง ํ์ธ
emit DelIssuer(_addr);
return true;
}
๋ฐฑ์ ์ ์ข
์ ํ์ง ์์ ๊ฒฝ์ฐ์๋ "๋ฐ๊ธ ๊ฐ๋ฅํ ์ฆ๋ช
์๊ฐ ์์ต๋๋ค" ์ถ๋ ฅ
// onlyIssuer: ํ๊ฐ๋ฐ์ ์ ์ฝํ์ฌ์์๋ง claim ๋ฐํ ๊ฐ๋ฅ
function claimCredential(address _requester, uint8 _companyEnum, uint8 _degreeEnum, string calldata _value) onlyIssuer public returns (bool){
if(_degreeEnum <= 0){
emit FaultCredential(unicode"โ๋ฐ๊ธ ๊ฐ๋ฅํ ์ฆ๋ช
์๊ฐ ์์ต๋๋คโ");
return false;
}
emit SuccessCredential(unicode"โ
์ฆ๋ช
์๊ฐ ๋ฐ๊ธ๋์์ต๋๋คโ
");
Credential storage credential = credentials[_requester]; // ๋ฐ๊ธํ credential์ storage์ ์ ์ฅํ์ฌ ๋ธ๋ก์ฒด์ธ์ ์๊ตฌ์ ์ผ๋ก ๊ธฐ๋ก
credential.id = 1;
credential.company = companyArr[_companyEnum];
credential.degree = degreeArr[_degreeEnum];
credential.createdDate = block.timestamp;
credential.value = _value;
return true;
}
function getCredential(address _requester) public view returns (Credential memory credential){
require(credentials[_requester].id != 0, unicode"โ๋ฐ๊ธ ๊ฐ๋ฅํ ์ฆ๋ช
์๊ฐ ์์ต๋๋คโ");
return credentials[_requester];
}
issuer ์ถ๊ฐ ์ , isIssuer: false
issuer ์ถ๊ฐ ํ, isIssuer: true
issuer ์ญ์ ํ, isIssuer: false
git: https://github.com/mjlee0326/VaccineCredential_DID.git
transaction hash: (Ropsten ํ
์คํธ ๋คํธ์ํฌ)
0x67c7761fdcc56ab974fa40a95477a9ac1f21b1ad921423890e70be9ca61403a9
EtherScan: https://ropsten.etherscan.io/address/0x20d8c4d265fc5923f26707fdfadae7d5950d57ca
๋ธ๋ก์ฒด์ธ ๊ธฐ๋ฐ ์๋ฐฉ์ ์ข
์์คํ
์ธ COOV(์ฟ ๋ธ)๋ฅผ ์ฒ์ ๋ดค์ ๋ ์ ๊ธฐํ๋ค
์ฌ์ค ์ฐ๋ฆฌ ์ผ์์์ ์์ง๊น์ง ๋ธ๋ก์ฒด์ธ์ด ์๋ฟ๋ ์ฌ๋ก๊ฐ ๋ณ๋ก ์์์ผ๋๊น!
์ ์ฝ๋๋ ์์ฃผ ๊ฐ๋จํ ๋ด์ฉ์ด์์ง๋ง
์ข ๋ ํ์ฅํด์ COOV ํด๋ก ์ฝ๋ฉ์ ํด๋ด๋ ์ฌ๋ฐ๋ ํ๋ก์ ํธ๊ฐ ๋ ๊ฒ ๊ฐ๋ค