๐Ÿงช๋ฐฑ์‹  ์ ‘์ข… ์ฆ๋ช… DID๐Ÿงช

์ด๋ฏผ์ •ยท2021๋…„ 12์›” 11์ผ
1

blockChain

๋ชฉ๋ก ๋ณด๊ธฐ
1/10
post-thumbnail

DID: Decentralized Identity ํƒˆ์ค‘์•™ ์‹ ์› ์ฆ๋ช…

๋ฐ์ดํ„ฐ์˜ ์ฃผ๊ถŒ์ด ๊ฐœ์ธ์—๊ฒŒ ์žˆ๊ณ 
ํ•„์š”ํ•œ ๋•Œ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์•™ํ™”๋œ ์‹œ์Šคํ…œ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ 

-> ์ž๊ธฐ ์ž์‹ ์ด ์‹ ์› ์ฆ๋ช…์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๊ฐ–๋„๋ก ํ•˜๊ฒ ๋‹ค๋Š” SSI ๊ฐœ๋…์„ ํ˜„์‹คํ™”

SSI: Self Sovereignty Identity ์ž๊ธฐ ์ฃผ๊ถŒ ์‹ ์›

์‹ ์›์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ง„ ์ฃผ์ฒด๊ฐ€ ์‹ ์›์— ๋Œ€ํ•œ ๊ถŒ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณต๊ฐœ ๋Œ€์ƒ๊ณผ ๋ฒ”์œ„๋ฅผ ์„ ํƒ

DID ์ฃผ์š” ์„œ๋น„์Šค ๋ชจ๋ธ

  • ์ธ์ฆ

  • ์ „์ž ์ฆ๋ช…์„œ

  • ์ถœ์ž… ํ†ต์ œ

๋ฐฑ์‹  ์ ‘์ข… ์ฆ๋ช… DID์™€ ๊ด€๋ จ ์žˆ๋Š” '์ „์ž ์ฆ๋ช…์„œ'์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž

์กธ์—… ์ฆ๋ช…์„œ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด์ž

โœ…Holder: ์‚ฌ์šฉ์ž
โœ…Issuer: ํ•™๊ต
โœ…Verified: ์ฆ๋ช…์„œ๋ฅผ ์š”๊ตฌํ•œ ๊ธฐ๊ด€
โœ…Verifiable Credential(VC): ์กธ์—… ์ฆ๋ช…์„œ

  1. Holder๋Š” ์ž์‹ ์˜ VC๋ฅผ Issuer์—๊ฒŒ ์š”๊ตฌ

  2. 1) Issuer๋Š” ๋ธ”๋ก์ฒด์ธ ์ €์žฅ์†Œ์— DID๋ฅผ ๋ฐœ๊ธ‰ํ•˜์—ฌ ๊ณต๊ฐœํ‚ค์™€ ํ•จ๊ป˜ ์ €์žฅ
    2) Holder์—๊ฒŒ ๊ฐœ์ธํ‚ค๊ฐ€ ๋‹ด๊ธด VC๋ฅผ ์ œ๊ณต

  3. 1) Holder๋Š” ์ž์‹ ์˜ DID๋ฅผ ๋ธ”๋ก์ฒด์ธ์— ์ €์žฅ
    2) ์ „๋‹ฌ ๋ฐ›์€ VC์— ์ž์‹ ์˜ ๊ฐœ์ธํ‚ค๋ฅผ ๋‹ด์•„ Verifier์—๊ฒŒ ์ œ์ถœ

  4. Verifier๋Š” VC๋‚ด์˜ ๊ฐœ์ธํ‚ค์™€ ๋ธ”๋ก์ฒด์ธ ๋‚ด์˜ ๊ณต๊ฐœํ‚ค๋ฅผ ํ™œ์šฉํ•˜์—ฌ VC์˜ ์ง„์œ„์—ฌ๋ถ€ ํ™•์ธ

ํ•จ์ˆ˜ ๊ด€๋ จ ๊ถŒํ•œ ๋“ฑ๊ธ‰

โœ…nation: ๊ตญ๊ฐ€(์ตœ์ƒ์œ„ ๊ด€๋ฆฌ์ž) && ๋ฐฑ์‹  ์ œ์•ฝํšŒ์‚ฌ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ ๊ถŒํ•œ
โœ…issuer: ๋ฐฑ์‹  ์ œ์•ฝ ํšŒ์‚ฌ && ๋ฐฑ์‹  ์ฆ๋ช…์„œ ๋ฐœ๊ธ‰ ๊ถŒํ•œ
โœ…requester: ์ฆ๋ช…์„œ ๋ฐœ๊ธ‰ ์„œ๋น„์Šค ์‚ฌ์šฉ์ž

โž• ์ฃผ์š” ๊ธฐ๋Šฅ

Credential ๊ตฌ์กฐ

Credential: ์‹ ์› ํ™•์ธ์— ํ•„์š”ํ•œ ์ •๋ณด


    // ์ ‘์ข…์ž: ์ฆ๋ช…์„œ ๋ฐœ๊ธ‰
    // ๋ฏธ์ ‘์ข…์ž: ์ฆ๋ช…์„œ ๋ฐœ๊ธ‰ ๋ถˆ๊ฐ€
    struct Credential{
        uint id;
        string company; // ๋ฐฑ์‹  ์ œ์กฐ์‚ฌ: ํ™”์ด์ž, ๋ชจ๋”๋‚˜, AZ
        string degree; // ์ ‘์ข… ์ฐจ์ˆ˜: 1์ฐจ, 2์ฐจ, 3์ฐจ
        uint createdDate; // ์ ‘์ข… ์ผ์ž
        string value; // credentail์— ํฌํ•จ๋˜์–ด์•ผํ•˜๋Š” ์•”ํ˜ธํ™”๋œ ์ •๋ณด
    }

contract ์ƒ์„ฑ์ž

    constructor(){
        companyArr[0] = unicode"๐Ÿงชํ™”์ด์ž";
        companyArr[1] = unicode"๐Ÿงช๋ชจ๋”๋‚˜";
        companyArr[2] = unicode"๐ŸงชAZ";

        degreeArr[1] = unicode"1๏ธโƒฃ์ฐจ ์ ‘์ข… ์™„๋ฃŒ";
        degreeArr[2] = unicode"2๏ธโƒฃ์ฐจ ์ ‘์ข… ์™„๋ฃŒ";
        degreeArr[3] = unicode"3๏ธโƒฃ์ฐจ ์ ‘์ข… ์™„๋ฃŒ";
    }

์ œ์•ฝ ํšŒ์‚ฌ ๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ(onlyNation)

    // 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;
    }

Credential ๋ฐœ๊ธ‰(onlyIssuer)


๋ฐฑ์‹  ์ ‘์ข…์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” "๋ฐœ๊ธ‰ ๊ฐ€๋Šฅํ•œ ์ฆ๋ช…์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค" ์ถœ๋ ฅ

    // 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];
    }

โž• Deployed Contracts

GIF

์ฆ๋ช…์„œ ๋ฐœ๊ธ‰

  • ๋ฐœ๊ธ‰ ์„ฑ๊ณต
  • ๋ฐœ๊ธ‰ ์‹คํŒจ

issuer ์ถ”๊ฐ€

  • issuer ์ถ”๊ฐ€ ์ „, isIssuer: false

  • issuer ์ถ”๊ฐ€ ํ›„, isIssuer: true

  • issuer ์‚ญ์ œ ํ›„, isIssuer: false

โž• Git

git: https://github.com/mjlee0326/VaccineCredential_DID.git

transaction hash: (Ropsten ํ…Œ์ŠคํŠธ ๋„คํŠธ์›Œํฌ)
0x67c7761fdcc56ab974fa40a95477a9ac1f21b1ad921423890e70be9ca61403a9

EtherScan: https://ropsten.etherscan.io/address/0x20d8c4d265fc5923f26707fdfadae7d5950d57ca

ํšŒ๊ณ 

๋ธ”๋ก์ฒด์ธ ๊ธฐ๋ฐ˜ ์˜ˆ๋ฐฉ์ ‘์ข… ์‹œ์Šคํ…œ์ธ COOV(์ฟ ๋ธŒ)๋ฅผ ์ฒ˜์Œ ๋ดค์„ ๋•Œ ์‹ ๊ธฐํ–ˆ๋‹ค
์‚ฌ์‹ค ์šฐ๋ฆฌ ์ผ์ƒ์—์„œ ์•„์ง๊นŒ์ง€ ๋ธ”๋ก์ฒด์ธ์ด ์™€๋‹ฟ๋Š” ์‚ฌ๋ก€๊ฐ€ ๋ณ„๋กœ ์—†์—ˆ์œผ๋‹ˆ๊นŒ!

์œ„ ์ฝ”๋“œ๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ ๋‚ด์šฉ์ด์—ˆ์ง€๋งŒ
์ข€ ๋” ํ™•์žฅํ•ด์„œ COOV ํด๋ก  ์ฝ”๋”ฉ์„ ํ•ด๋ด๋„ ์žฌ๋ฐŒ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€