티스토리 뷰
[Hyperledger Fabric v1.4]Operations Guides: Channel Configuration (configtx)
miiingo 2019. 2. 27. 17:43해당 글은 Hyperledger Fabric 페이지의 공식 문서를 번역 및 정리한 자료입니다.
원본 사이트 : https://hyperledger-fabric.readthedocs.io/en/release-1.4/configtx.html?highlight=system%20channel
Channel Configuration (configtx)
Hyperledger 패브릭 블록 체인 네트워크의 공유 구성은 채널 당 하나의 컬렉션 구성 트랜잭션에 저장됩니다. 각 구성 트랜잭션은 일반적으로 더 짧은 이름 configtx로 참조됩니다.
채널 구성에는 다음과 같은 중요한 속성이 있습니다.
- 버전 관리됨(Versioned) : 구성의 모든 요소에는 모든 수정과 함께 진행되는 관련 버전이 있습니다. 또한 커밋된 모든 구성은 시퀀스 번호를받습니다.
- 허가됨(Permissioned) : 구성의 각 요소는 해당 요소에 대한 수정이 허용되는지 여부를 결정하는 관련 정책을 가집니다. 이전 configtx 사본이 있고 추가 정보가 없는 사용자는 이 정책을 기반으로 새 구성의 유효성을 확인할 수 있습니다.
- 계층 구조(Hierarchical) : 루트 구성 그룹에는 하위 그룹이 포함되어 있으며 계층 구조의 각 그룹에는 연관된 값과 정책이 있습니다. 이러한 정책은 계층 구조를 활용하여 하위 수준의 정책에서 한 수준의 정책을 가져올 수 있습니다.
Anatomy of a configuration(구성 해부)
구성은 다른 트랜잭션이 없는 블록에 HeaderType_CONFIG
유형의 트랜잭션으로 저장됩니다 . 이러한 블록을 구성 블록(Configuration Blocks) 이라고하며 , 그 중 첫 번째 블록을 기원 블록(Genesis Block) 이라고 합니다.
구성을 위한 프로토 구조는 fabric/protos/common/configtx.proto
에 저장됩니다. HeaderType_CONFIG
형식의 Envelope는 ConfigEnvelope
메시지를 Payload data
필드로 인코딩 합니다. ConfigEnvelope
의 프로토 타입은 다음과 같이 정의됩니다.
message ConfigEnvelope {
Config config = 1;
Envelope last_update = 2;
}
last_update
필드는 아래의 Updates to configuration(구성 업데이트) 섹션에서 정의되어 있지만 구성을 읽을 경우가 아닌, 검증할 때만 필요합니다. 대신 현재 커밋된 구성은 Config
메시지를 포함하는 config
필드에 저장됩니다.
message Config {
uint64 sequence = 1;
ConfigGroup channel_group = 2;
}
sequence
번호는 각 구성이 커밋될 때마다 하나씩 증가합니다. channel_group
필드는 구성을 포함하는 root 그룹입니다. ConfigGroup
구조는 재귀적으로 정의되며 각 그룹에는 값(values)과 정책(policies)이 포함된 그룹 트리가 만들어집니다. 그것은 다음과 같이 정의됩니다. :
message ConfigGroup {
uint64 version = 1;
map<string,ConfigGroup> groups = 2;
map<string,ConfigValue> values = 3;
map<string,ConfigPolicy> policies = 4;
string mod_policy = 5;
}
ConfigGroup
은 재귀적 구조기 때문에 계층구조로 되어 있습니다. 다음 예는 golang 표기법을 명확하게 표현한 것입니다.
// Assume the following groups are defined
var root, child1, child2, grandChild1, grandChild2, grandChild3 *ConfigGroup
// Set the following values
root.Groups["child1"] = child1
root.Groups["child2"] = child2
child1.Groups["grandChild1"] = grandChild1
child2.Groups["grandChild2"] = grandChild2
child2.Groups["grandChild3"] = grandChild3
// The resulting config structure of groups looks like:
// root:
// child1:
// grandChild1
// child2:
// grandChild2
// grandChild3
각 그룹은 구성 계층에서 level을 정의하며 각 그룹은 관련된 값 집합(string 키로 인덱싱 됨)과 정책(string 키로 인덱싱 됨)을 갖습니다.
값은 다음과 같이 정의됩니다. :
message ConfigValue {
uint64 version = 1;
bytes value = 2;
string mod_policy = 3;
}
정책은 다음과 같이 정의됩니다. :
message ConfigPolicy {
uint64 version = 1;
Policy policy = 2;
string mod_policy = 3;
}
값, 정책 및 그룹에는 모두 version
및 mod_policy
가 있습니다. 요소(Element)의 version
은 해당 요소가 수정될 때마다 증가합니다. mod_policy
는 해당 요소를 수정하는 데 필요한 서명을 관리하는 데 사용됩니다. 그룹의 경우 수정은 값, 정책 또는 그룹 맵에 요소를 추가하거나 제거하는 것입니다(또는 mod_policy
를 변경). 값 및 정책의 경우 수정은 값 및 정책 필드를 각각 변경합니다(또는 mod_policy
변경). 각 요소 mod_policy
는 현재 구성 수준의 컨텍스트에서 평가됩니다. Channel.Groups["Application"]
에 정의된 mod 정책 예제를 고려하십시오 (여기서 golang 맵 참조 구문을 사용하므로 Channel.Groups["Application"].Policies["policy1"]
은 기본 Channel
그룹의 Application
그룹의 Policies
의 policy1
정책에 매핑됩니다.).
-
policy1
은Channel.Groups["Application"].Policies["policy1"]
에 매핑됩니다. -
Org1/policy2
는Channel.Groups["Application"].Groups["Org1"].Policies["policy2"]
에 매핑됩니다. -
/Channel/policy3
은Channel.Policies["policy3"]
에 매핑됩니다.
mod_policy
가 존재하지 않는 정책을 참조하는 경우에는 해당 항목을 수정할 수 없습니다.
Configuration updates(구성 업데이트)
구성 업데이트는 HeaderType_CONFIG_UPDATE
유형의 Envelope
메시지로 제출됩니다. 트랜잭션의 Payload
data
는 마샬링된(marshaled) ConfigUpdateEnvelope
입니다. ConfigUpdateEnvelope
는 다음과 같이 정의됩니다.
message ConfigUpdateEnvelope {
bytes config_update = 1;
repeated ConfigSignature signatures = 2;
}
signatures
필드에는 구성 업데이트 권한을 가진 일련의 서명 세트가 들어 있습니다. 메시지 정의는 다음과 같습니다.
message ConfigSignature {
bytes signature_header = 1;
bytes signature = 2;
}
서명이 ConfigUpdateEnvelope
메시지의 signature_header
바이트와 config_update
바이트의 연결을 넘는 동안 signature_header
는 표준 트랜잭션에 대해 정의된 것과 같습니다.
ConfigUpdateEnvelope
config_update
바이트는 다음과 같이 정의된 마샬링된 ConfigUpdate
메시지입니다. :
message ConfigUpdate {
string channel_id = 1;
ConfigGroup read_set = 2;
ConfigGroup write_set = 3;
}
channel_id
는 업데이트가 바인딩된 채널 ID이며, 이것의 재구성을 지원하는 서명의 범위를 지정하는 데 필요합니다.
read_set
은 기존 구성의 하위 집합을 지정하며 version
필드만 설정되고 다른 필드는 채워져서는 안되는 위치에 지정됩니다. 특정 ConfigValue
의 value(값)
또는 ConfigPolicy
의 policy(정책)
필드는 read_set
에 절대로 설정해서는 안됩니다. ConfigGroup
은 구성 트리의 더 깊은 요소를 참조 할 수 있도록 맵 필드의 하위 집합을 가질 수 있습니다.
예를 들어 Application
그룹을 read_set
에 포함시키려면 해당 부모(Channel
그룹)도 read set에 포함되어야하지만 Channel
그룹은 Orderer
Group
키와 같이 모든 키를 채울 필요는 없으며, values
또는 policies
키 중 하나를 선택해도 됩니다.
write_set
은 수정된 구성의 부분을 지정합니다. 구성의 계층적 특성으로 인해 계층 구조의 깊숙한 요소에 대한 쓰기는 해당 write_set
의 상위 수준 요소를 포함해야합니다. 그러나, 지정된 read_set
과 동일한 버전의 write_set
요소는 read_set
에서와 같이 요소를 띄엄띄엄 지정해야 합니다.
예를 들어, 다음과 같이 주어진 구성에서 :
Channel: (version 0)
Orderer (version 0)
Application (version 3)
Org1 (version 2)
Org1
을 수정하는 구성 업데이트를 제출하는 read_set
은 다음과 같습니다. :
Channel: (version 0)
Application: (version 3)
또한, write_set
은 다음과 같습니다. :
Channel: (version 0)
Application: (version 3)
Org1 (version 3)
CONFIG_UPDATE
가 수신되면 orderer는 다음을 수행하여 CONFIG
결과를 계산합니다. :
-
channel_id
및read_set
을 확인합니다.read_set
의 모든 요소는 주어진 버전으로 존재해야합니다. -
read_set
의 동일한 버전에 나타나지 않는write_set
의 모든 요소를 수집하여 업데이트 세트를 계산합니다 . - 업데이트 세트의 각 요소가 요소 업데이트의 버전 번호를 정확히 1만큼 증가시키는 지 확인합니다.
-
ConfigUpdateEnvelope
에 첨부된 서명 세트가 업데이트 세트의 각 요소에 대한mod_policy
를 충족시키는지 확인합니다. - 업데이트 세트를 현재 구성에 적용하여 새로운 전체 구성 버전을 계산합니다.
- 새로운 구성을
ConfigEnvelope
에 기록합니다. 여기에는last_update
필드로CONFIG_UPDATE
가 포함되고config
필드에 인코딩된 새로운 구성이 증가된sequence
값과 함께 기록됩니다. - 새로운
ConfigEnvelope
를CONFIG
유형의Envelope
에 기록하고 궁극적으로 이것을 새로운 구성 블록에 유일한 트랜잭션으로 씁니다.
피어(또는 다른 Deliver
수신자)가 이 구성 블록을 수신하면 현재 구성에 last_update
메시지를 적용하고 순서 계산된(orderer-computed) config
필드에 올바른 새 구성이 포함되어 있는지 확인하여 구성이 적절하게 만들어졌는지 확인해야합니다.
Permitted configuration groups and values(허용되는 구성 그룹 및 값)
모든 유효한 구성은 다음 구성의 서브 세트입니다.
여기서 우리는 peer.<MSG>
표기법을 사용하여 value
필드가 fabric/protos/peer/configuration.proto
에 정의된 이름 <MSG>
의 마샬링된(marshaled) 프로토 메시지임을 나타내는 ConfigValue
를 정의합니다.
common.<MSG>
, msp.<MSG>
및 orderer.<MSG>
표기법은 비슷하게 일치하지만 각각 fabric/protos/common/configuration.proto
, fabric/protos/msp/mspconfig.proto
및 fabric/protos/orderer/configuration.proto
에 정의된 메시지를 사용합니다.
{{org_name}}
와 {{consortium_name}}
key는 임의의 이름을 나타내며 다른 이름으로 반복될 수 있는 요소를 나타냅니다.
&ConfigGroup{
Groups: map<string, *ConfigGroup> {
"Application":&ConfigGroup{
Groups:map<String, *ConfigGroup> {
{{org_name}}:&ConfigGroup{
Values:map<string, *ConfigValue>{
"MSP":msp.MSPConfig,
"AnchorPeers":peer.AnchorPeers,
},
},
},
},
"Orderer":&ConfigGroup{
Groups:map<String, *ConfigGroup> {
{{org_name}}:&ConfigGroup{
Values:map<string, *ConfigValue>{
"MSP":msp.MSPConfig,
},
},
},
Values:map<string, *ConfigValue> {
"ConsensusType":orderer.ConsensusType,
"BatchSize":orderer.BatchSize,
"BatchTimeout":orderer.BatchTimeout,
"KafkaBrokers":orderer.KafkaBrokers,
},
},
"Consortiums":&ConfigGroup{
Groups:map<String, *ConfigGroup> {
{{consortium_name}}:&ConfigGroup{
Groups:map<string, *ConfigGroup> {
{{org_name}}:&ConfigGroup{
Values:map<string, *ConfigValue>{
"MSP":msp.MSPConfig,
},
},
},
Values:map<string, *ConfigValue> {
"ChannelCreationPolicy":common.Policy,
}
},
},
},
},
Values: map<string, *ConfigValue> {
"HashingAlgorithm":common.HashingAlgorithm,
"BlockHashingDataStructure":common.BlockDataHashingStructure,
"Consortium":common.Consortium,
"OrdererAddresses":common.OrdererAddresses,
},
}
Orderer system channel configuration(Orderer 시스템 채널 구성)
Ordering 시스템 채널은 ordering 매개 변수와 채널 생성을 위한 컨소시엄을 정의해야합니다. ordering 서비스를 위해서는 정확히 하나의 ordering 시스템 채널이 있어야하며, 생성된 (또는 더 정확하게 부트 스트랩 된) 첫 번째 채널입니다. ordering 시스템 채널 genesis 구성 내에서 응용 프로그램 섹션을 정의하지 않는 것이 좋습니다. 그러나 테스트를 위해 수행할 수 있습니다. ordering 시스템 채널에 대한 읽기 권한을 가진 member는 모든 채널 생성을 볼 수 있으므로 이 채널의 액세스는 제한되어야합니다.
ordering 매개 변수는 config의 다음 하위 집합으로 정의됩니다. :
&ConfigGroup{
Groups: map<string, *ConfigGroup> {
"Orderer":&ConfigGroup{
Groups:map<String, *ConfigGroup> {
{{org_name}}:&ConfigGroup{
Values:map<string, *ConfigValue>{
"MSP":msp.MSPConfig,
},
},
},
Values:map<string, *ConfigValue> {
"ConsensusType":orderer.ConsensusType,
"BatchSize":orderer.BatchSize,
"BatchTimeout":orderer.BatchTimeout,
"KafkaBrokers":orderer.KafkaBrokers,
},
},
},
ordering에 참여하는 각 조직은 Orderer
그룹 아래에 그룹 요소가 있습니다. 이 그룹은 해당 조직에 대한 암호화 신원 정보를 포함하는 단일 매개 변수 MSP
를 정의합니다. Orderer
그룹의 Values
에 따라 ordering 노드의 기능이 결정됩니다. 채널별로 존재하므로 orderer.BatchTimeout
은 한 채널에서 다른 채널과 다르게 지정할 수 있습니다.
시작시, orderer는 많은 채널들에 대한 정보가 들어 있는 파일 시스템에 직면하게 됩니다. orderer는 컨소시엄 그룹이 정의된 채널을 식별하여 시스템 채널을 식별합니다. 컨소시엄 그룹의 구조는 다음과 같습니다.
&ConfigGroup{
Groups: map<string, *ConfigGroup> {
"Consortiums":&ConfigGroup{
Groups:map<String, *ConfigGroup> {
{{consortium_name}}:&ConfigGroup{
Groups:map<string, *ConfigGroup> {
{{org_name}}:&ConfigGroup{
Values:map<string, *ConfigValue>{
"MSP":msp.MSPConfig,
},
},
},
Values:map<string, *ConfigValue> {
"ChannelCreationPolicy":common.Policy,
}
},
},
},
},
},
각 컨소시엄은 ordering 조직의 조직 구성원과 마찬가지로 구성원(members) 집합을 정의합니다. 각 컨소시엄은 또한 ChannelCreationPolicy
를 정의합니다. 이 정책은 채널 생성 요청을 승인하는 데 적용됩니다. 일반적으로 이 값은 채널 생성의 권한을 부여하기 위해 채널 서명의 새로운 구성원을 요구하는 ImplicitMetaPolicy
로 설정됩니다. 채널 생성에 대한 자세한 내용은 이 문서 뒷부분에 나와 있습니다.
Application channel configuration(응용 프로그램 채널 구성)
응용 프로그램 구성은 응용 프로그램 유형 트랜잭션을 위해 설계된 채널에 대한 것입니다. 그것은 다음과 같이 정의됩니다 :
&ConfigGroup{
Groups: map<string, *ConfigGroup> {
"Application":&ConfigGroup{
Groups:map<String, *ConfigGroup> {
{{org_name}}:&ConfigGroup{
Values:map<string, *ConfigValue>{
"MSP":msp.MSPConfig,
"AnchorPeers":peer.AnchorPeers,
},
},
},
},
},
}
Orderer
섹션과 마찬가지로 각 조직은 그룹으로 인코딩됩니다. 그러나 MSP
identity 정보만 인코딩하는 대신 각 조직은 AnchorPeers
의 목록을 추가로 인코딩합니다. 이 목록은 다른 조직의 peer가 peer 가십 네트워킹을 위해 서로 접촉할 수있게 합니다.
응용 프로그램 채널은 이 매개 변수의 결정적 업데이트를 허용하기 위해 orderer org 및 consensus 옵션의 사본을 인코딩하므로 orderer 시스템 채널 구성의 동일한 Orderer
섹션 이 포함됩니다. 그러나 응용 프로그램 관점에서 이것은 크게 무시 될 수 있습니다.
Channel creation(채널 생성)
orderer가 존재하지 않는 채널에 대해 CONFIG_UPDATE
를 수신하면, orderer는 이것이 채널 생성 요청이어야한다고 가정하고 다음을 수행합니다.
- orderer는 채널 생성 요청이 수행될 컨소시엄을 식별합니다. 최상위 레벨 그룹의
Consortium
값을 보고 이를 수행합니다. - orderer는
Application
그룹에 포함된 조직이 해당 컨소시엄에 포함된 조직의 하위 집합이며ApplicationGroup
이version
1
로 설정되어 있음을 확인합니다. - orderer는 컨소시엄에 member가 있는 경우, 새 채널에도 애플리케이션 member (생성 컨소시엄 및 멤버가 없는 채널은 테스트에만 유용함)이 있는지 확인합니다.
- orderer는 ordering 시스템 채널에서
Orderer
그룹을 가져와서, 새로 지정된 멤버로Application
그룹을 만들고 해당mod_policy
를 컨소시엄 구성에 지정된 대로ChannelCreationPolicy
로 지정하여 템플릿 구성을 만듭니다. 정책은 새로운 구성 컨텍스트에서 평가되므로 모든(ALL
) member를 요구하는 정책에는 컨소시엄의 모든 구성원이 아닌 모든 새 채널 구성원의 서명이 필요합니다. - 그러면 orderer는
CONFIG_UPDATE
를 이 템플릿 구성에 대한 갱신 사항으로 적용합니다.CONFIG_UPDATE
가Application
그룹(해당version
은1
)에 수정 사항을 적용하기 때문에 구성 코드는ChannelCreationPolicy
에 대해 이러한 업데이트의 유효성을 검사합니다. 채널 생성 시 개별 조직의 앵커 피어들과 같은 다른 수정 사항을 포함하고 있는 경우, 요소에 해당하는 mod 정책을 호출합니다. - 새 채널 구성을 사용하는 새로운
CONFIG
트랜잭션은 ordering 시스템 채널에서 ordering을 위해 포장되어 전송됩니다. ordering 후 채널이 생성됩니다.
'Blockchain > Hyperledger Fabric' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 코딩테스트
- codility
- ubuntu
- 하이퍼레저 페브릭
- 빅데이터 강의
- Hyperledger Fabric v1.1
- 블록 체인
- 어서와 데이터는 처음이지
- javascript
- ambrosus
- Hyperledger Indy
- 하이퍼레저 패브릭
- 직딩잇템
- docker
- 하이퍼레저 인디
- Hyperledger Fabric v1.2
- DOCs
- 코테
- 알고리즘
- 빅데이터 교육
- 기초 of 기초 데이터 개념
- Blockchain
- 빅데이터
- 빅데이터 기초
- 문제풀이
- Private Data
- Hyperledger Fabric
- 블록체인
- 코딜리티
- 암브로셔스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |