Solo

Solo

질문 : Solo를 프로덕션에서 어떻게 배포할 수 있나요? 
대답 : Solo는 프로덕션에 포함되지 않습니다. 그것은 결코 용납하지 않습니다.

출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

General


일반(General)

질문 : Ordering service를 운영 중에 있는데 합의 알고리즘을 바꾸고 싶은데 어떻게 할 수 있나요? 
대답 : 그 부분은 명시적으로 지원되지는 않습니다.
질문 : 어플리케이션 채널을 업데이트한다면, 제 orderer 시스템 채널도 업데이트 해야하나요?
대답 : 한번 어플리케이션 채널이 생성되면,  다른 채널(orderer system channel 포함)들과 독립적으로 관리되어 집니다.  
변경에 따라, 변화는 다른 채널로 포팅하는 것은 바람직하지 않을 수 있다.
일반적으로, MSP 변경은 모든 채널 전반에 걸쳐 동기화되야하고, 반면 정책 변경은 특정 채널에만 적용될 수 있습니다.

질문 : ordering과 어플리케이션 역할 수행하는 구성을 가질 수 있나요? 대답 : 가능은 하지만, 그것은 매우 좋지 않은 구성입니다.

기본적 /Channel/Orderer/BlockValidation 정책은 ordering 조직의 유효한 인증서가 블록에 서명하도록 허용합니다. 

한 조직이 ordering 및 어플리케이션 역할을 모두 수행하는 경우 블록 서명자를 Ordering 권한이있는 인증서의 하위 집합으로 제한하기 위해 이 정책을 업데이트해야합니다

질문 : Fabric에 대한 합의 구현을 작성하려고합니다. 어디서부터 시작해야합니까? 
대답 : 합의 플러그인은  Consente의 구현과  consensus package(합의 패키지)Chain  인터페이스를 정의해야합니다. 이러한 인터페이스에 대해 이미 빌드 된 두 가지 플러그인이 있습니다 solo 와 Kafka . 당신은 자신의 구현을위한 단서를 얻기 위해 그들을 연구 할 수 있습니다. ordering 서비스 코드는 orderer pakage아래에 있습니다 .
질문 : ordering 서비스 구성을 변경하고 싶습니다 (예 : 일괄 처리 제한 시간). 네트워크를 시작한 후 어떻게해야합니까?
대답 : 이는 네트워크 재구성에 해당합니다. configtxlator에 대한 주제를 참조하십시오 .

출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

 

 

Differences in Most Recent Releases


Q. 릴리즈된 버전별 특징 차이점은 어디서 찾을 수 있나요?

A. 이후의 릴리즈 버전별 차이점은 Release Note 섹션에서 찾으실 수 있습니다.

Q. 위에서 대답받지 못한 기술적 질문들은 어디서 질문할 수 있나요?

A. StackOverflow를 확인하시면 됩니다.



출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

Chaincode(Smart Contracts and Digital Assets)

Q. Hyperledger Fabric은 Smart Contract 로직을 지원합니까?

A. 예. 이 기능을 ChainCode라고 합니다. 우리가 정의한 Smart Constract는  추가 기능이있는 스마트 계약 방법 / 알고리즘입니다,

Chaincode는 네트워크에서 배포 된 프로그래밍 방식의 코드로, 컨센서스 프로세스 중에 체인 유효성 검사기에서 함께 실행되며 유효성이 검사됩니다. 

개발자는 Chaincode를이용하여 비즈니스 계약, 자산 정의 및 집합 적으로 관리되는 분산 된 응용 프로그램을 개발할 수 있습니다.

 

Q. 비즈니스 컨트랙트는 어떻게 작성합니까?

A. 일반적으로 비즈니스 계약을 개발하는 두 가지 방법이 있습니다.
첫 번째 방법은 개별 계약을 독립 실행형 체인 코드 인스턴스로 코딩하는 것입니다.
두 번째 방법은 하나 또는 여러 유형의 비즈니스 계약의 수명주기를 관리하는 분산 응용 프로그램(decentralized applications)을 생성하고 최종 사용자가 이러한 응용 프로그램 내에서 계약 인스턴스를 인스턴스화 할 수 있도록 chaincode를 사용하는 것입니다.
그리고 아마도 더 효율적인 방법은 두번째 방법일 것입니다.

 

Q. Asset은 어떻게 만듭니까?

A. 사용자는 비즈니스 규칙 용 체인 코드와 디지털 토큰용 멤버십 서비스를 사용하여 자산을 관리하고 관리하는 논리를 설계 할 수 있습니다.

대부분의 블록 체인 솔루션에서 자산을 정의하는 데는 두 가지 방법이 일반적입니다. 즉, 계정 잔액이 과거 트랜잭션 레코드로 인코딩되는 State 비 저장 UTXO 모델입니다. 계정 잔액은 원장의 State 저장 공간에 보관됩니다.

각 접근 방식에는 각각 장점과 단점이 있습니다. 이 블록 체인 기술은 다른 블록을 옹호하지 않습니다. 대신 첫 번째 요구 사항 중 하나는 두 가지 접근 방식을 모두 쉽게 구현할 수 있도록하는 것이 었습니다.

 

Q. 체인 코드 작성을 위해 지원되는 언어는 무엇입니까?

A. 체인 코드는 모든 프로그래밍 언어로 작성되고 컨테이너에서 실행될 수 있습니다. 

   최초로 완벽하게 지원되는 체인 코드 언어는 Golang입니다.

   추가 언어에 대한 지원과 템플릿 언어 개발에 대한 논의가 있었으며 자세한 내용은 가까운 장래에 발표 될 예정입니다.

   Hyperledger Composer를 사용하여 Hyperledger Fabric 응용 프로그램을 만들 수도 있습니다 .

 

Q. Hyperledger 패브릭에 기본 통화가 있습니까?

A. 아닙니다. 그러나 체인 네트워크에 고유 통화가 실제로 필요한 경우 chaincode로 고유 통화를 개발할 수 있습니다. 

    기본 통화의 공통 속성 중 하나는 트랜잭션이 체인에서 처리 될 때마다 금액이 트랜잭션되고 (해당 통화를 정의하는 체인 코드가 호출 됨)는 것입니다.



출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

 

[포스팅개정]

2018.06.08 2차 번역 까칠한마녀

Application-side Programming Model

트랜잭션 실행 결과 :

Q. 애플리케이션 클라이언트는 트랜잭션의 결과를 어떻게 알 수 있습니까?

A. 거래 시뮬레이션 결과는 제안서 응답에서 Endorser가 고객에게 반환합니다. 여러 명의 동의원이 있는 경우 클라이언트는 응답이 모두 같은지 확인하고 Order 및 약정에 대한 결과 및 Endorsement를 제출할 수 있습니다. 궁극적으로 커밋하는 동료는 트랜잭션을 확인하거나 무효화하고 클라이언트는 SDK를 통해 응용 프로그램 클라이언트가 사용할 수있게 하는 이벤트를 통해 결과를 알게됩니다.

원장 쿼리 :

Q. 원장 데이터는 어떻게 조회합니까?

A. chaincode 내에서 키를 기반으로 쿼리 할 수 ​​있습니다. 키는 범위별로 쿼리 할 수 ​​있으며 복합 키는 여러 매개 변수에 대해 등가 쿼리를 사용할 수 있도록 모델링 할 수 있습니다. 예를 들어, (owner, asset_id)의 복합 키를 사용하여 특정 엔티티가 소유 한 모든 자산을 조회 할 수 있습니다. 이러한 키 기반 쿼리는 원장에 대한 읽기 전용 쿼리 및 원장을 업데이트하는 트랜잭션에 사용할 수 있습니다.

자산 데이터를 체인 코드의 JSON으로 모델링하고 CouchDB를 State 데이터베이스로 사용하는 경우 chaincode 내의 CouchDB JSON 쿼리 언어를 사용하여 체인 코드 데이터 값에 대해 복잡한 리치 쿼리를 수행 할 수도 있습니다. 응용 프로그램 클라이언트는 읽기 전용 조회를 수행 할 수 있지만 일반적으로 이러한 응답은 트랜잭션의 일부로 Ordering Service에 제출되지 않습니다.

Q. 내역 데이터를 쿼리하여 데이터 출처를 이해하려면 어떻게해야합니까?

A. chaincode API의 GetHistoryForKey()는 키의 값 기록을 반환합니다.

Q. 특히 쿼리 된 피어가 복구 중이고 블록 처리를 따라 잡을 때 쿼리 결과가 정확함을 보장하는 방법?

A. 클라이언트는 여러 피어를 쿼리하고, 블록 높이를 비교하고, 쿼리 결과를 비교하고, 높은 블록 높이에서 피어를 선호 할 수 있습니다.



출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

Security & Access Control

 보안 & 접근 통제

데이터 프라이버시와 접근 통제

Q. 데이터 프라이버시를 어떻게 보장하나요?

A. 데이터 프라이버시에는 다양한 측면이 있습니다. 우선, 당신의 네트워크를 Chaincode의 데이터를 볼 수 있고 채널에서 실행할 수 있도록 허가 받은 각각의 참여자의 집합으로 대표되는 채널 단위로 분리합니다.

둘째로, 가시성 세팅을 사용해서 동의자의 집합만을 위한 Chaincode의 인풋 데이터를 제한받게 됩니다. 가시성 설정은 아웃풋 데이터와 비교하여 인풋 및 아웃풋 체인 코드 데이터가 제출 된 트랜잭션에 포함되는지 여부를 결정합니다. 셋째로, Chaincode를 호출하기 이전에 데이터를 해시하거나 암호화 할 수 있습니다. 데이터를 해시하면 원본 데이터를 공유 할 수있는 방법을 제공해야합니다. 데이터를 암호화하는 경우 해독 키를 공유 할 수있는 방법을 제공해야합니다. 넷째, 조직의 특정 역할에 대한 데이터 액세스를 제한 할 수 있습니다. 체인 코드 로직에 액세스 제어를 구축합니다. 다섯째, 나머지 원장 데이터는 피어에서 파일 시스템 암호화를 통해 암호화 할 수 있으며 전송 중 데이터는 TLS를 통해 암호화됩니다.

Q. Orderer가 트랜잭션 데이터를 볼 수 있습니까?

A. 아닙니다. Orderer는 거래만 순서 지정하며 거래를하지 않습니다. 데이터가 순서 지정자를 거치지 않고 인풋 데이터에 대해서만 염려하는 경우 가시성 설정을 사용할 수 있습니다. 가시성 설정은 아웃풋 데이터와 비교하여 인풋 및 아웃풋 체인 코드 데이터가 제출 된 트랜잭션에 포함되는지 여부를 결정합니다. 따라서 인풋 데이터는 동의자 전용으로 사용할 수 있습니다. Orderer가 chaincode 아웃풋을 보지 못하도록하려면 chaincode를 호출하기 전에 데이터를 해시하거나 암호화 할 수 있습니다. 데이터를 해시하는 경우 원본 데이터를 공유하는 의미를 제공해야합니다. 데이터를 암호화하는 경우 해독 키를 공유 할 수있는 방법을 제공해야합니다.


출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

 

Endorsement

동의

endorsement 아키텍쳐:

Q. 네트워크 내부의 Peer 중 얼마나 트랜잭션을 동의해야하나요?

A. 동의 해야하는 피어의 수는 Chaincode 설치시에 설정된 Endorsement policy에 의해서 결정됩니다.

Q. 어플리케이션 클라이언트는 모든 피어와 연결되어 있어야만 하나요?

A. 클라이언트는 오직 Chaincode의 Endorsement policy에 의해 설정된 피어 수만큼만 연결될 필요가 있습니다.




출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

Gossip data dissemination protocol

Hyperledger 패브릭은 트랜잭션 실행 (승인 및 커밋) 피어 및 트랜잭션 Orderer Node에서 작업 부하를 나누어 블록 체인 네트워크 성능, 보안 및 확장 성을 최적화합니다. 이러한 네트워크 운영 분리는 데이터 무결성 및 일관성을 보장하기 위해 안전하고 신뢰할 수 있으며 확장 가능한 데이터 보급 프로토콜을 필요로합니다. 이러한 요구 사항을 충족시키기 위해 Hyperledger Fabric은 gossip data dissemination protocol을 구현 합니다 .

Gossip protocol

피어들은 gossip을 활용하여 원장과 채널 데이터를 확장 가능한 방식으로 방송합니다. gossip  메시지는 계속되고 채널의 각 피어는 여러 피어에서 지속적으로 최신의 일관된 원장 데이터를 수신합니다. 각각의 gossip  메시지에 서명함으로써 위조 된 메시지를 보내는 비잔틴 참가자가 쉽게 식별되고 원치 않는 목표에 대한 메시지 배포를 막을 수 있습니다. 지연, 네트워크 파티션 또는 블록 손실로 이어지는 기타 원인으로 인해 영향을받은 피어는 이러한 누락 된 블록을 소유 한 피어에게 연락하여 현재 원장 State로 동기화됩니다.

gossip  기반 데이터 보급 프로토콜은 Hyperledger 패브릭 네트워크에서 세 가지 기본 기능을 수행합니다.

  1. 사용 가능한 구성원 피어를 계속 식별하고 결국 오프라인이 된 피어를 감지하여 피어 검색 및 채널 구성원을 관리합니다.
  2. 채널의 모든 피어간에 원장 데이터를 보급합니다. 나머지 채널과 동기화되지 않은 데이터가있는 피어는 누락 된 블록을 식별하고 올바른 데이터를 복사하여 동기화합니다.
  3. 원장 데이터의 피어 - 투 - 피어 State 이전 업데이트를 허용하여 새로 연결된 피어를 최대 속도로 가져옵니다.

gossip 기반 방송은 다른 피어로부터 채널의 메시지를 수신 한 피어가 작동 한 다음 이 메시지를 채널의 무작위로 선택된 여러 피어로 전달합니다.이 숫자는 구성 가능한 상수입니다. 피어는 메시지 전달을 기다리는 대신 끌어 오기 메커니즘을 사용할 수도 있습니다. 이 주기가 반복되어 채널 구성원의 결과로 원장과 State 정보가 지속적으로 최신 State로 유지됩니다. 새로운 블록을 보급하기 위해 채널 의 리더 피어는 Ordering Service에서 데이터를 가져 와서 동료에게 gossip  전파를 시작합니다.

Leader election

리더 선거 (leader election) 메커니즘은 Ordering Service와의 연결을 유지하고 자체 조직의 친구들간에게 새로 도착한 블록의 배포를 시작할 각 조직마다 하나의 피어 를 선출 하는 데 사용됩니다 . 리더 선거를 활용하면 시스템에서 Ordering Service의 대역폭을 효율적으로 활용할 수 있습니다. 리더 선거 모듈에는 두 가지 작동 모드가 있습니다.

  1. 정적(Static) - 시스템 관리자는 조직의 한 피어를 리더가되도록 수동으로 구성합니다 (예 : Ordering Service와 열린 연결을 유지하는 것).
  2. 다이나믹(Dynamic) - 피어는 리더 선출 절차를 실행하여 조직의 한 피어를 선택하여 리더가되고, Ordering Service에서 블록을 가져오고, 조직의 다른 피어에게 블록을 보급합니다.

Static leader election

정적 리더 선거를 사용하면 조직 내의 리더 피어 집합을 수동으로 정의 할 수 있습니다. 하나의 노드를 리더 또는 모든 사용 가능한 피어로 정의 할 수 있으므로 Ordering에 너무 많은 피어를 연결해야합니다 서비스가 비효율적 인 대역폭 사용을 유발할 수 있습니다. 정적 리더 선택 모드를 사용하려면 core.yaml 섹션에서 다음 매개 변수를 구성하십시오.

peer:
    # Gossip related configuration
    gossip:
        useLeaderElection: false
        orgLeader: true

또는 이러한 매개 변수를 환경 변수로 구성하고 재정의 할 수 있습니다.

export CORE_PEER_GOSSIP_USELEADERELECTION=false
export CORE_PEER_GOSSIP_ORGLEADER=true

1. 다음 구성은 피어를 대기 모드로 유지 합니다. 즉 피어가 리더가 되려고하지 않습니다.

export CORE_PEER_GOSSIP_USELEADERELECTION=false
export CORE_PEER_GOSSIP_ORGLEADER=false

2. true 값으로 CORE_PEER_GOSSIP_USELEADERELECTION 및 CORE_PEER_GOSSIP_USELEADERELECTION을 설정하면 모호하며 오류가 발생합니다.

3. 정적 구성에서 조직 관리자는 실패 또는 충돌시 리더 노드의 고 가용성을 제공해야합니다.

Dynamic leader election

역동적 인 리더 선거를 통해 조직 동료는 Ordering Service에 연결하고 새로운 블록을 꺼낼 피어 하나 를 선출 할 수 있습니다 . 리더는 각 조직의 동료를 위해 독립적으로 선출됩니다.

선출 된 리더는 활동의 증거로 다른 동료들에게 하트 비트 메시지 를 보내는 책임이 있습니다 . 한 명 이상의 동료가 일정 기간 동안 하트 비트 업데이트를 받지 못하면 새로운 리더 선출 절차를 시작하여 결국 새로운 리더를 선출하게됩니다. 최악의 경우 네트워크 파티션의 경우 조직을 위해 한 명 이상의 능동적 인 리더가 있으므로 탄력성과 가용성을 보장하여 조직의 동료가 계속 발전 할 수 있도록합니다. 네트워크 파티션이 치유되면 지도자 중 하나가 리더십을 포기할 것이므로 안정된 State에서 각 조직의 네트워크 파티션이 없으면 Ordering Service에 연결하는  하나의 능동적 인 리더 가있게 됩니다 .

다음 구성은 리더 하트 비트 메시지의 빈도를 제어 합니다.

peer:
    # Gossip related configuration
    gossip:
        election:
            leaderAliveThreshold: 10s

동적 리더 선거를 사용하려면 core.yaml 내에 다음 매개 변수를 구성해야합니다.

peer:
    # Gossip related configuration
    gossip:
        useLeaderElection: true
        orgLeader: false

또는 이러한 매개 변수를 환경 변수로 구성하고 재정의 할 수 있습니다.

export CORE_PEER_GOSSIP_USELEADERELECTION=true
export CORE_PEER_GOSSIP_ORGLEADER=false

Gossip messaging

온라인 피어는 공개 키 인프라 (PKI) ID 및 보낸 사람의 메시지 서명을 포함하는 "활성"메시지를 지속적으로 브로드 캐스트하여 가용성을 나타냅니다 . 피어는 이러한 살아있는 메시지를 수집하여 채널 멤버쉽을 유지합니다. 피어가 특정 피어로부터 살아있는 메시지를 수신하지 않으면이 "죽은"피어는 결국 채널 멤버쉽에서 제거됩니다. "살아있는"메시지는 암호로 서명되기 때문에 악의적 인 피어는 루트 인증 기관 (CA)이 승인 한 서명 키가 없기 때문에 절대로 다른 피어를 사칭 할 수 없습니다.

수신 된 메시지를 자동으로 전달하는 것 외에도 State 조정 프로세스 는 각 채널의 피어간에 world state 를 동기화 합니다. 각 피어는 불일치가 확인되면 자체 State를 복구하기 위해 채널의 다른 피어에서 계속 블록을 가져옵니다. 가십 거리의 데이터 보급을 유지하기 위해 고정 연결이 필요하지 않기 때문에이 프로세스는 노드 충돌에 대한 내구성을 포함하여 공유 원장에 데이터 일관성 및 무결성을 안정적으로 제공합니다.

채널이 분리되어 있기 때문에 한 채널의 피어는 다른 채널에서 정보를 보내거나 공유 할 수 없습니다. 모든 피어가 여러 채널에 속할 수 있지만 분할 메시징은 피어의 채널 구독을 기반으로 메시지 라우팅 정책을 적용하여 채널에없는 피어로 블록이 전파되는 것을 방지합니다.

노트:

1. 지점 간 메시지의 보안은 피어 TLS 계층에서 처리되며 서명이 필요하지 않습니다. 피어는 CA에서 할당 한 인증서로 인증됩니다. TLS 인증서도 사용되지만 가십 계층에서 인증 된 것은 피어 인증서입니다. 원장 블록은 Ordering Service에서 서명 한 다음 채널의 리더 피어에게 전달합니다. 

2. 인증은 피어에 대한 멤버쉽 서비스 공급자의 관리를받습니다. 피어가 처음으로 채널에 연결되면 TLS 세션이 멤버 자격 정보와 바인딩됩니다. 이는 본질적으로 네트워크와 채널의 구성원 자격과 관련하여 연결 피어에 대한 각 피어를 인증합니다.


출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

Read-Write set semantics


 트랜잭션 시뮬레이션 및 읽기 - 쓰기 세트

endorser 에서 트랜잭션을 시뮬레이션하는 동안 트랜잭션에 대해 읽기 - 쓰기 세트가 준비됩니다. 읽기 집합에는 시뮬레이션 중에 트랜잭션이 읽는 고유 키 및 커밋 된 버전의 목록이 포함됩니다. 쓰기 세트에는 고유 키 목록 (읽기 세트에있는 키와 중복 될 수 있음)과 트랜잭션이 작성하는 새 값 목록이 들어 있습니다. 트랜잭션에 의해 수행 된 갱신이 키를 삭제하는 것이면 키의 h 제 표시자가 (새 값 대신에) 설정됩니다.

또한 트랜잭션이 키에 여러 번 값을 쓰는 경우 마지막으로 기록 된 값만 유지됩니다. 또한 트랜잭션이 키에 대한 값을 읽는 경우 트랜잭션이 읽기 전에 해당 값을 갱신하더라도 커밋 된 상태의 값이 반환됩니다. 즉, 읽기 - 쓰 기 의미론은 지원되지 않습니다.

앞서 언급했듯이 키의 버전은 읽기 세트에만 기록됩니다. 쓰기 세트에는 고유 키 목록과 트랜잭션에 의해 설정된 최신 값이 포함됩니다.

버전을 구현하기위한 다양한 계획이있을 수 있습니다. 버전 관리 체계에 대한 최소한의 요구 사항은 주어진 키에 대해 반복되지 않는 식별자를 생성하는 것입니다. 예를 들어, 버전에 대해 단조롭게 증가하는 숫자를 사용하면 이러한 스키마가 될 수 있습니다. 현재 구현에서는 커밋 트랜잭션의 높이가 트랜잭션에 의해 수정 된 모든 키의 최신 버전으로 사용되는 블록 체인 높이 기반 버전 관리 체계를 사용합니다. 이 체계에서 트랜잭션의 높이는 튜플로 표시됩니다 (txNumber는 블록 내의 트랜잭션 높이입니다). 이 계획은 증분 번호 체계보다 많은 장점을 가지고 있습니다. 주로 설계된 선택, 트랜잭션 시뮬레이션 및 유효성 검사와 같은 다른 구성 요소를 사용하여 효율적인 설계를 선택할 수 있습니다.

다음은 가상 트랜잭션의 시뮬레이션으로 준비된 읽기 쓰기 세트의 예입니다. 단순화를 위해 그림에서 버전을 나타내는 데 필요한 증분 숫자를 사용합니다.

<TxReadWriteSet>
  <NsReadWriteSet name="chaincode1">
    <read-set>
      <read key="K1", version="1">
      <read key="K2", version="1">
    </read-set>
    <write-set>
      <write key="K1", value="V1"
      <write key="K3", value="V2"
      <write key="K4", isDelete="true"
    </write-set>
  </NsReadWriteSet>
<TxReadWriteSet>

또한 트랜잭션이 시뮬레이션 중에 범위 쿼리를 수행하는 경우 범위 쿼리와 그 결과가 쿼리 정보로 읽기 / 쓰기 집합에 추가됩니다.

Transaction validation and updating world state using read-write set

커미터는 읽기 쓰기 세트의 읽기 세트 부분을 사용하여 영향을받는 키의 버전과 값을 업데이트하기 위해 읽기 쓰기 세트의 쓰기 세트 부분과 트랜잭션의 유효성을 검사합니다.

유효성 검사 단계에서 트랜잭션의 읽기 세트에있는 각 키의 버전이 전 세계 상태의 동일한 키에 대한 버전과 일치 할 경우 트랜잭션이 유효한 것으로 간주됩니다. 이전의 모든 유효한 트랜잭션 (이전의 동일한 트랜잭션 블록)이 커밋 (커밋 - 상태)됩니다. 읽기 - 쓰기 세트에 하나 이상의 query-info도 포함되어 있으면 추가 유효성 검사가 수행됩니다.

이 추가 검증은 쿼리 정보에 캡처 된 결과의 수퍼 범위 (즉, 범위의 합집합)에 키가 삽입 / 삭제 / 업데이트되지 않았 음을 보장해야합니다. 즉, 커밋 된 상태에서 유효성 검사 중에 범위 쿼리 (시뮬레이션 중에 수행 한 트랜잭션)를 다시 실행하면 시뮬레이션시 트랜잭션이 관찰 한 것과 동일한 결과가 나타납니다. 이 확인은 트랜잭션이 커밋 중에 팬텀 항목을 관찰하는 경우 트랜잭션이 유효하지 않은 것으로 표시되어야 함을 보장합니다. 이 팬텀 보호는 범위 쿼리 (즉, 체인 코드의 GetStateByRange 함수)로 제한되며 다른 쿼리 (즉, 체인 코드의 GetQueryResult 함수)에는 아직 구현되지 않았습니다. 다른 쿼리는 유령의 위험이 있으므로 응용 프로그램이 시뮬레이션과 유효성 검사 / 커밋 시간 사이에 결과 집합의 안정성을 보장 할 수없는 경우 Order에 제출되지 않은 읽기 전용 트랜잭션에서만 사용해야합니다.

트랜잭션이 유효성 검사를 통과하면 커미터는 쓰기 상태를 사용하여 세계 상태를 업데이트합니다. 업데이트 단계에서 쓰기 세트에있는 각 키의 경우 동일한 키에 대한 월드 상태의 값이 쓰기 세트에 지정된 값으로 설정됩니다. 또한, 세계 상태의 키의 버전이 최신 버전을 반영하도록 변경됩니다.

Example simulation and validation

이 섹션은 예제 시나리오를 통한 의미 이해에 도움이됩니다. 이 예제의 목적을 위해, 세계 상태에서 키 k의 존재는 튜플 (k, ver, val)로 표현되며, 여기서 ver은 값을 val로 갖는 키 k의 최신 버전입니다.

이제 세계 상태의 동일한 스냅 샷에서 시뮬레이션 된 다섯 개의 트랜잭션 T1, T2, T3, T4 및 T5를 고려해보십시오. 다음은 트랜잭션이 시뮬레이션되는 세계 상태의 스냅 샷과 이러한 각 트랜잭션이 수행하는 읽기 및 쓰기 활동의 순서를 보여줍니다.

World state: (k1,1,v1), (k2,1,v2), (k3,1,v3), (k4,1,v4), (k5,1,v5)
T1 -> Write(k1, v1'), Write(k2, v2')
T2 -> Read(k1), Write(k3, v3')
T3 -> Write(k2, v2'')
T4 -> Write(k2, v2'''), read(k2)
T5 -> Write(k6, v6'), read(k5)

이제 이러한 트랜잭션이 T1, .., T5 순서로 정렬되어 있다고 가정합니다 (단일 블록 또는 다른 블록에 포함될 수 있음)

  1. T1은 읽기를 수행하지 않기 때문에 유효성 검사를 통과합니다. 또한, 월드 상태의 키 (k1, k2)의 튜플은 (k1,2, v1 '), (k2,2, v2')
  2. 앞의 트랜잭션 (T1)에 의해 수정 된 키 k1을 읽음으로써 T2의 유효성 검사에 실패합니다.
  3. T3은 읽기를 수행하지 않기 때문에 유효성 검사를 통과합니다. 또한, 세계 상태에서 키의 튜플은 (k2,3, v2 '')로 업데이트되고,
  4. 이전 트랜잭션 T1에 의해 수정 된 키 k2를 읽으므로 T4가 유효성 검사에 실패합니다.
  5. T5는 앞선 트랜잭션에 의해 수정되지 않은 키 k5를 읽으므로 유효성 검사를 통과합니다.

Note : 여러 읽기 / 쓰기 세트가있는 트랜잭션은 아직 지원되지 않습니다.




출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

Peer channel-based event services

 개요

이전 버전의 Fabric에서는 피어 이벤트 서비스를 이벤트 허브라고했습니다. 이 서비스는 해당 블록이 속한 채널에 관계없이 새로운 블록이 피어의 원장에 추가 될 때마다 이벤트를 보내고 이벤트 피어를 실행하는 조직의 구성원 (예 : 이벤트에 연결되어있는 구성원만 액세스 할 수있었습니다 ).

v1.1부터는 이벤트를 제공하는 두 가지 새로운 서비스가 있습니다. 이러한 서비스는 완전히 다른 디자인을 사용하여 채널별로 이벤트를 제공합니다. 즉, 이벤트 등록은 피어 대신 채널 수준에서 발생하므로 피어 데이터에 대한 액세스를 세부적으로 제어 할 수 있습니다. 이벤트 수신 요청은 피어 조직 외부의 ID (채널 구성에 의해 정의 됨)로부터 허용됩니다. 또한 연결 안정성 문제 또는 피어가 이미 실행중인 네트워크에 참여했기 때문에 손실 된 이벤트를 수신 할 수있는 뛰어난 안정성과 방법을 제공합니다.

사용 가능한 서비스

  • Deliver

이 서비스는 커미트 된 전체 블록을 원장에게 보냅니다. 체인 코드에 의해 이벤트가 설정되면, 블록의 ChaincodeActionPayload에서 찾을 수 있습니다.

  • DeliverFiltered

이 서비스는 "필터링 된"블록, 장부에 커밋 된 블록에 대한 최소한의 정보 집합을 보냅니다. 동료의 소유자가 외부 클라이언트가 주로 트랜잭션 및 트랜잭션 State에 대한 정보를 받기를 원하는 네트워크에서 사용하기위한 것입니다. 체인 코드에 의해 이벤트가 설정되면 필터링 된 블록의 FilteredChaincodeAction에서 찾을 수 있습니다.

이벤트 등록 방법

두 서비스의 이벤트 등록은 전달 시작 정보 메시지가 들어있는 봉투를 원하는 시작 및 정지 위치, 탐색 동작 (준비가되지 않았 으면 실패 또는 준비가되지 않은 경우)까지 포함하는 피어에게 보냄으로써 수행됩니다. 원장에서 가장 오래된 (즉, 첫 번째) 블록 또는 가장 새로운 (즉, 마지막) 블록을 나타내는 데 사용할 수있는 헬퍼 변수 SeekOldest 및 SeekNewest가 있습니다. 서비스가 이벤트를 무기한으로 보내도록하려면 SeekInfo 메시지에 MAXINT64의 중지 위치가 있어야합니다.

상호 TLS가 피어에서 활성화되어 있으면 TLS 인증서 해시를 봉투의 채널 헤더에 설정해야합니다.

기본적으로 두 서비스 모두 채널 판독기 정책을 사용하여 요청 클라이언트에 이벤트를 인증할지 여부를 결정합니다

전달 응답 메시지 개요(Overview of deliver response messages)

이벤트 서비스는 DeliverResponse메시지를 다시 보냅니다.

각 메시지에는 다음 중 하나가 포함됩니다.

  • status - HTTP 상태 코드입니다. 오류가 발생하면 두 서비스 모두 적절한 실패 코드를 반환합니다. 그렇지 않으면 서비스가 완료되면 SeekInfo 메시지에 의해 요청 된 모든 정보를 전송하고 200 - SUCCESS를 반환합니다.
  • block - Deliver 서비스에 의해서만 반환됩니다.
  • 필터링 된 블록 - DeliverFiltered 서비스에 의해서만 반환됩니다.

필터링 된 블록에는 다음이 포함됩니다.

  • 채널 ID.
  • 번호 (즉, 블록 번호).
  • 필터링 된 트랜잭션의 배열.
  • 트랜잭션 ID.
    • type (e.g. ENDORSER_TRANSACTIONCONFIG.)
    • transaction validation code.
  • 필터링 된 트랜잭션 작업.
    • 필터링 된 체인 코드 동작의 배열입니다.
      • 트랜잭션에 대한 chaincode 이벤트 (페이로드가 누락 된 State).





출처 : http://hyperledger-fabric.readthedocs.io/en/release-1.1/

+ Recent posts