Hyperledger Indy (Transaction)

REi·2024년 4월 10일

Hyperledger Indy

목록 보기
2/2
post-thumbnail

개요

  • Hyperledger Indy 블록체인은 트랜잭션(Transaction)에 대한 합의를 수행한다.
    👉🏻 데이터가 트랜잭션 단위로 저장되어 있음.

  • 트랜잭션 검증 및 확인
    👉🏻 머클 트리(Merkle Tree) / 머클 패트리샤 트리 (Merkle Patricia Tree) 구조 사용

하이퍼레저 인디 블록체인 원장

  • indy-node(블록체인 노드)는 4가지 종류의 원장을 관리한다.
    (1) Domain Ledger
    (2) Config Ledger
    (3) Pool Ledger
    (4) Audit Ledger

기본적인 트랜잭션 구조

  • type 항목 : 해당 트랜잭션이 어떤 트랜잭션인지 나타냄 (101: SCHEMA | 1 : NYM)
  • data 항목 : 트랜잭션 타입에 적합한 데이터 (NYM => DID 관련 정보 | SCHEMA => 신원 증명에 사용할 양식 데이터 )
  • metadata 항목 : 트랜잭션 생성자에 대한 데이터
  • txnMetadata 항목 : 트랜잭션에 대한 데이터
  • reqSignature 항목 : 트랜잭션 생성자를 검증할 수 있는 서명이 포함됨

1. Domain Ledger

  • Schema : 신원 증명 양식 중 사용자 속성에 대한 항목을 정의하는 데이터
  • Credential Definition : 신원 증명에 어떤 Schema가 사용되었는지, 어떤 용도로 사용될 수 있는 지 추측할 수 있는 tag항목, 어떤 서명 기법을 사용하여 신원증명을 발행할 지 나타내는 type 항목, 신원증명 페기 관련 정보가 포함된 config 항목
  • Revocaation Registry : 신원 증명이 폐기 됐는지 여부를 확인할 수 있는 Accumulator, Witness, Tails file의 URL등의 데이터가 저장되어 있음.
  • 사용자의 신원 증명에 사용되는 데이터가 저장되어 있다.

  • DID Document 구성 요소를 각각 따로 저장한다.
    DID Resolver가 사용자와 indy-node 사이에 위치하여 public key, serviceEndPoint 등 데이터를 취합하여 사용자가 원하는 DID Document 형태로 반환하는 구조이다.

  • NYM, ATTRIBN, SCHEMA, CLAIM_DEF, REVOC_REG_DEF 등의 트랜잭션이 존재한다.

> NYM Transaction

{
   "ver": 1,
   "txn": {
       "type":"1",
       "ver": 1,        
       "protocolVersion":2,

       "data": {
           "dest":"GEzcdDLhCpGCYRHW82kjHd",
           "verkey":"~HmUWn928bnFT6Ephf65YXv",
           "role":101,
       },

       "metadata": {
           "reqId":1513945121191691,
           "from":"L5AD5g65TDQr1PPHHRoiGf",
           "digest": "4ba05d9b2c27e52aa8778708fb4b3e5d7001eecd02784d8e311d27b9090d9453",
           "payloadDigest": "21f0f5c158ed6ad49ff855baf09a2ef9b4ed1a8015ac24bccc2e0106cd905685",
           "taaAcceptance": {
               "taaDigest": "6sh15d9b2c27e52aa8778708fb4b3e5d7001eecd02784d8e311d27b9090d9453",
               "mechanism": "EULA",
               "time": 1513942017
            }
       },
   },
   "txnMetadata": {
       "txnTime":1513945121,
       "seqNo": 10,
       "txnId": "N22KY2Dyvmuu2PyyqSFKue|01"
   },
   "reqSignature": {
       "type": "ED25519",
       "values": [{
           "from": "L5AD5g65TDQr1PPHHRoiGf",
           "value": "4X3skpoEK2DRgZxQ9PwuEvCJpL8JHdQ8X4HDDFyztgqE15DM2ZnkvrAh9bQY16egVinZTzwHqznmnkaFM4jjyDgd"
       }]
   }

}

dest 항목 : 새롭게 등록한 DID
verkey 항목 : dest항목의 DID가 사용할 공개키
role 항목 : 새롭게 등록할 DID를 어떤 권한을 가진 그룹에 분류할지 결정하는 항목

  • 사용자의 DID Document 관련 정보와 사용자를 어떤 권한을 가진 그룹(Group)으로 분류하는지에 대한 데이터가 저장되어 있다.
  • Hyperledger Indy에서는 사용자를 5가지 그룹 중 하나로 분류한다.
    (1) None : Common User
    (2) 0 : Trustee
    (3) 2 : Steward
    (4) 101 : Endorser
    (5) 201 : NETWORK_MONITOR
  • if ) dest 항목의 DID가 블록체인에 이미 저장되어 있다면
    👉🏻 기존에 저장되어 있는 DID 정보를 변경하는 것으로 간주
    else ) 👉🏻 신규 사용자를 등록하는 DID로 간주

> SCHEMA Transaction

{
    "ver": 1,
    "txn": {
        "type":101,
        "ver": 1,   
        "protocolVersion":2,

        "data": {
            "data": {
                "attr_names": ["undergrad","last_name","first_name","birth_date","postgrad","expiry_date"],
                "name":"Degree",
                "version":"1.0"
            },
        },

        "metadata": {
            "reqId":1513945121191691,
            "from":"L5AD5g65TDQr1PPHHRoiGf",
            "endorser": "D6HG5g65TDQr1PPHHRoiGf",
            "digest": "4ba05d9b2c27e52aa8778708fb4b3e5d7001eecd02784d8e311d27b9090d9453",
            "payloadDigest": "21f0f5c158ed6ad49ff855baf09a2ef9b4ed1a8015ac24bccc2e0106cd905685",
            "taaAcceptance": {
                "taaDigest": "6sh15d9b2c27e52aa8778708fb4b3e5d7001eecd02784d8e311d27b9090d9453",
                "mechanism": "EULA",
                "time": 1513942017
             }            
        },
    },
    "txnMetadata": {
        "txnTime":1513945121,
        "seqNo": 10,
        "txnId":"L5AD5g65TDQr1PPHHRoiGf1|Degree|1.0",
    },
    "reqSignature": {
        "type": "ED25519",
        "values": [{
            "from": "L5AD5g65TDQr1PPHHRoiGf",
            "value": "4X3skpoEK2DRgZxQ9PwuEvCJpL8JHdQ8X4HDDFyztgqE15DM2ZnkvrAh9bQY16egVinZTzwHqznmnkaFM4jjyDgd"
        }]
    }

}
  • 사용자 속성에 대한 항목이 정의되어 있음.

2. Config Ledger

  • 사용자 접근 권한을 지정할 수 있는 원장이다.
  • Hyperledger Indy는 Public Permissioned 블록체인 구조이다.
    👉🏻누구나 블록체인에 접근할 수 있지만, 블록체인에 기록하는 것은 허가된 사용자만 할 수 있다.
  • Hyperledger Indy 사용자 그룹 (5가지 분류)
    TRUSTEE>STEWARD>ENDORSER>NETWORKMONITOR>USERTRUSTEE > STEWARD > ENDORSER>NETWORK -MONITOR > USER
    (1) USER : indy-node 블록체인에 직접적으로 참여하지 않는 일반 사용자, 블록체인의 데이터를 읽어오는 권한만 있음
    (2) TRUSTEE : indy-node 블록체인을 구동한 최초의 구성원들로 구성된 그룹 (블록체인 운영에 관한 모든 권한을 가짐)
    (3) STEWARD : TRUSTEE 그룹의 허가하에 블록체인 노드 운영 권한을 가진 그룹
    (4) ENDORSER : 블록체인에 트랜잭션을 쓸 수 있는 권한을 가진 그룹
    (5) NETWORK_MONITOR : 블록체인 노드의 장애 여부나 성능을 모니터링하는 그룹
  • 블록체인 네트워크에 대한 다양한 설정 정보도 저장되어 있다.
  • Config Ledger에는 AUTH_RULE 트랜잭션이 저장된다.
    👉🏻 Default AUTH_MAP RULES에 정의된 것과 같이 사용자 그룹의 권한을 설정할 수 있다.

    > AUTH_RULE Transactoin

{  
   "txn":{  
      "type":"120",
      "protocolVersion":2,
      "data":{  
        "auth_type": "0", 
        "auth_action": "EDIT",
        "field" :"services",
        "old_value": [VALIDATOR],
        "new_value": []
        "constraint":{
              "constraint_id": "OR",
              "auth_constraints": [{"constraint_id": "ROLE", 
                                    "role": "0",
                                    "sig_count": 2, 
                                    "need_to_be_owner": False, 
                                    "metadata": {}}, 
                                   
                                   {"constraint_id": "ROLE", 
                                    "role": "2",
                                    "sig_count": 1, 
                                    "need_to_be_owner": True, 
                                    "metadata": {}}
                                   ]
        }, 
      },
      "metadata":{  
         "reqId":252174114,
         "from":"M9BJDuS24bqbJNvBRsoGg3",
         "digest":"6cee82226c6e276c983f46d03e3b3d10436d90b67bf33dc67ce9901b44dbc97c",
         "payloadDigest": "21f0f5c158ed6ad49ff855baf09a2ef9b4ed1a8015ac24bccc2e0106cd905685",
      }
   },
   "txnMetadata":{  
      "txnTime":1551785798,
      "seqNo":1
   },   
   "reqSignature":{  
      "type":"ED25519",
      "values":[  
         {  
            "value":"4wpLLAtkT6SeiKEXPVsMcCirx9KvkeKKd11Q4VsMXmSv2tnJrRw1TQKFyov4m2BuPP4C5oCiZ6RUwS9w3EPdywnz",
            "from":"M9BJDuS24bqbJNvBRsoGg3"
         }
      ]
   },
   "ver":"1"
}
  • 블록체인 노드의 Validator 역할을 파면할 수 있는 권한이 정의된 트랜잭션
  • Pool Ledger의 NODE 트랜잭션 내 service 항목 : 노드의 역할 명시
    VALIDATOR -> [] 변경
    👉🏻 service 항목에 아무런 값이 들어가지 않는다면, 해당 노드는 아무 역할도 수행할 수 없다는 것을 의미한다.
  • auth_constraints 항목 : 권한을 실행할 때 필요한 서명 수 등의 조건이 명시된다.
    TRUSTEE ('role' : 0)
    STEWARD('role' : 2)
  • constraint_id 항목 : auth_constraint에 명시된 두 노드 중 하나의 노드만 필요하다고 명시한 논리 연산자 OR이 명시되어 있음.

🔥 AUTH_RULE에 정의된 조건
VALIDATOR 역할을 박탈하기 위한 조건 => 1 TRUSTEE OR 1 Owner STEWARD

> Pool_Upgrade Transaction

{
    "ver": 1,
    "txn": {
        "type":109,
        "ver":1,
        "protocolVersion":2,

        "data": {
            "name":"upgrade-13",
            "action":"start",
            "version":"1.3",
            "schedule":{"4yC546FFzorLPgTNTc6V43DnpFrR8uHvtunBxb2Suaa2":"2017-12-25T10:25:58.271857+00:00","AtDfpKFe1RPgcr5nnYBw1Wxkgyn8Zjyh5MzFoEUTeoV3":"2017-12-25T10:26:16.271857+00:00","DG5M4zFm33Shrhjj6JB7nmx9BoNJUq219UXDfvwBDPe2":"2017-12-25T10:26:25.271857+00:00","JpYerf4CssDrH76z7jyQPJLnZ1vwYgvKbvcp16AB5RQ":"2017-12-25T10:26:07.271857+00:00"},
            "sha256":"db34a72a90d026dae49c3b3f0436c8d3963476c77468ad955845a1ccf7b03f55",
            "force":false,
            "reinstall":false,
            "timeout":1,
            "justification":null,
        },

        "metadata": {
            "reqId":1513945121191691,
            "from":"L5AD5g65TDQr1PPHHRoiGf",
            "digest": "4ba05d9b2c27e52aa8778708fb4b3e5d7001eecd02784d8e311d27b9090d9453",
            "payloadDigest": "21f0f5c158ed6ad49ff855baf09a2ef9b4ed1a8015ac24bccc2e0106cd905685",
        },
    },
    "txnMetadata": {
        "txnTime":1513945121,
        "seqNo": 10,
    },
    "reqSignature": {
        "type": "ED25519",
        "values": [{
            "from": "L5AD5g65TDQr1PPHHRoiGf",
            "value": "4X3skpoEK2DRgZxQ9PwuEvCJpL8JHdQ8X4HDDFyztgqE15DM2ZnkvrAh9bQY16egVinZTzwHqznmnkaFM4jjyDgd"
        }]
    }
}
  • POOL_UPGRADE 트랜잭션 생성은 가장 높은 권한을 가진 TRUSTEE 그룹만 가능하다.
  • 블록체인 네트워크를 업그레이드 할 수 있다.
  • Schedule 항목 : 블록체인 네트워크에 속한 노드 중 업그레이드가 되는 노드의 DID와 업그레이드가 시작되는 시간이 명시되어 있다.
    이외에도, 업그레이드 명칭, 버전, 설치 방법 등에 대한 메타데이터가 해당 트랜잭션에 포함되어 있다.

3. Pool Ledger

  • 블록체인 네트워크로 구성하는 노드의 IP/Port 정보 등이 포함되어 있다.
  • 처음 블록체인을 구동할 때 사용하는 Genesis Transaction에 최초의 블록체인 노드 정보가 포함되어 있다.
  • Pool Ledger에 NODE 트랜잭션을 전송하여 기존 노드를 삭제하거나 / 노드의 Ip 및 Port 정보등을 변경할 수 있음 / 새로운 노드 추가하는 작업을 수행할 수도 있다.

4. Audit Ledger

  • 다른 세 개의 원장에서 발생하는 트랜잭션을 모두 순서대로 취합하여 저장한다.
  • Audit Ledger 기능
    (1) 서로 다른 원장 간의 동기화
    (2) 새로 추가되거나 장애로부터 복구된 노드 업데이트

0개의 댓글