diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 000000000..583b28852 Binary files /dev/null and b/.DS_Store differ diff --git a/ko/ECOSYSTEM.md b/ko/ECOSYSTEM.md new file mode 100644 index 000000000..3235a9fdc --- /dev/null +++ b/ko/ECOSYSTEM.md @@ -0,0 +1,49 @@ +## 인터블록체인(Interblockchain) 통신 규약 생태계 + +### 핸들러(Handler) 구현 + +사양에 정의된 표준 IBC 프로토콜 및 핸들러의 구현입니다. + +각 클라이언트 언어로 작성된 블록체인과의 통합에 적합합니다. + +상태 | 언어 | 개발팀 | 링크 +--- | --- | --- | --- +알파 버전 | Golang | [All in Bits](https://tendermint.com) | [이슈 트래킹](https://github.com/cosmos/ics/issues/145), [소스 코드](https://github.com/cosmos/cosmos-sdk/pull/4548) +예정 | Rust | [Interchain Foundation](https://interchain.io) | 미정 +예정 | Haskell | [Kadena](https://kadena.io) | 미정 +예정 | Javascript | [Agoric](https://agoric.com) | 미정 +예정 | Rust | [CodeChain](https://codechain.io) | [소스 코드](https://github.com/CodeChain-io/codechain) + +### 브릿지(Bridges) + +IBC 프로토콜과 깔끔하게 통합된 특별한 브릿지입니다. + +상태 | 블록체인 | 개발팀 | 링크 +--- | --- | --- | --- +알파 버전 | Bitcoin | [Nomic](https://nomic.io) | [소스 코드](https://github.com/nomic-io/bitcoin-peg) +알파 버전 | Ethereum | [Swish Labs](http://www.swishlabs.com/) | [소스 코드](https://github.com/swishlabsco/peggy) +예정 | Substrate | [SpeckleOS](https://www.speckleos.io/) | 미정 + +### Relayers + +독립된 프로세스 또는 지갑에 통합된 relayer 구현체입니다. + +(추가 예정) + +### 원장(Ledgers) + +IBC를 사용하는 운영 분산 원장입니다. + +(추가 예정) + +### 어플리케이션(Applications) + +IBC를 이용하는 탈중앙화 어플리케이션입니다. + +(추가 예정) + +### 탐색기(Explorers) + +IBC 트랜잭션을 분석하고 추적할 수 있는 블록 탐색기입니다. + +(추가 예정) diff --git a/ko/ibc/1_IBC_TERMINOLOGY.md b/ko/ibc/1_IBC_TERMINOLOGY.md new file mode 100644 index 000000000..b30bbf534 --- /dev/null +++ b/ko/ibc/1_IBC_TERMINOLOGY.md @@ -0,0 +1,155 @@ +# 3 : IBC 용어 + +**IBC 사양에서 사용되는 용어에 대한 개요입니다.** + +**아키텍처 개요는 [여기를](./2_IBC_ARCHITECTURE.md) 참조 하십시오.** + +**광범위한 프로토콜 설계 원칙은 [여기를](./3_IBC_DESIGN_PRINCIPLES.md) 참조 하십시오.** + +**사용 사례는 [여기를](./4_IBC_USECASES.md) 참조 하십시오.** + +**디자인 패턴에 대한 설명은 [여기를](./5_IBC_DESIGN_PATTERNS.md) 참조 하십시오.** + +이 문서는 IBC 사양 전체에서 사용되는 핵심 용어에 대한 한국어 정의를 제공합니다. + +## Abstraction definitions + +### 액터(Actor) + +*액터* 또는 *사용자* (교환 가능하게 사용)는 IBC 프로토콜과 상호 작용하는 엔티티입니다. 액터는 일반 사용자, 블록 체인에서 실행되는 모듈 또는 스마트 컨트랙트 또는 트랜잭션에 서명 할 수있는 오프 체인 relayer 프로세스 일 수 있습니다. + +### 머신(Machine) / 체인(Chain) / 원장(Ledger) + +*머신*, *체인*, *블록체인* 또는 *원장* (상호 교환하여 사용가능)은 IBC 사양의 일부 또는 전부를 구현하는 상태 머신 (분산 원장 또는 "블록 체인"일 수 있지만 엄격하게 블록이 체인으로 연결된 형태를 필요로 하지 않을 수도 있음)입니다. + +### 중계(Relayer) 프로세스 + +*중계 프로세스* 는 블록체인의 상태를 스캔하고 트랜잭션을 제출하여 둘 이상의 블록체인간에 IBC 패킷 데이터 및 메타 데이터를 전달하는 오프 체인 프로세스입니다. + +### 상태 머신 + +특정 체인의 *상태 머신* 은 상태의 구조 뿐만 아니라 체인의 합의 알고리즘에 의해 합의 된 현재 상태를 기반으로 상태 전환(state-transitions)을 유발하는 유효한 트랜잭션을 결정하는 규칙 세트도 정의합니다. + +### 합의 + +*합의* 알고리즘은 분산 원장을 운영하는 일련의 프로세스가 일반적으로 제한된 수의 비잔틴 결함이있는 상태에서도 동일한 상태로 합의하기 위해 사용되는 프로토콜입니다. + +### 합의 상태 + +*합의 상태* 는 해당 합의 알고리즘의 결과에 관하여 증명하는데 필요한 합의 알고리즘의 상태에 대한 정보 집합입니다. + +### Commitment + +*A cryptographic commitment* 는 매핑에서 키/값 쌍의 멤버 자격 또는 비 멤버쉽을 저렴하게 확인하는 방법으로, 짧은 감시 문자열로 매핑을 커밋 할 수 있습니다. + +### 헤더 + +*헤더* 는 "가벼운 클라이언트" 알고리즘에 의해 잘 정의 된 방식으로 검증 될 수 있는 현재 상태에 대한 약속을 포함하여 특정 블록 체인의 합의 상태에 대한 업데이트입니다. + +### CommitmentProof + +*CommitmentProof* 은 특정 키가 기록 대상 세트의 특정 값에 맵핑되는지 여부를 증명하는 증명 구조입니다. + +### 핸들러 모듈 + +[ICS 25](../spec/ics-025-handler-module)를 구현한 IBC *핸들러 모듈* 은 클라이언트, 커넥션 및 채널을 관리하고, 증명을 확인하고, 패킷에 대한 적절한 기록을 저장하는 상태 머신 내의 {em1}모듈{/em1} 입니다. + +### 라우팅 모듈 + +[ICS 26](../spec/ics-026-routing-module)를 구현한 IBC *라우팅 모듈* 은 상태 머신 내의 모듈로서, 라우팅 모듈의 외부 인터페이스를 이용하는 호스트 상태 머신상의 핸들러 모듈과 다른 모듈 사이에서 패킷을 라우팅 합니다. + +### 데이터 그램 + +*데이터 그램* 은 일부 물리적 네트워크를 통해 전송되는 바이트 스트링이며 원장의 상태 시스템에서 구현 된 IBC 라우팅 모듈에 의해 처리됩니다. 일부 구현들에서, 데이터 그램은 다른 정보 (예를 들어, 스팸 방지 비용, 재생 공격(replay attack) 방지를 위한 논스, IBC 핸들러로 라우팅하기위한 타입 식별자 등)를 포함하는 특정 원장의 트랜잭션 또는 메시지 데이터 구조의 필드 일 수 있습니다. 모든 IBC의 하위 프로토콜 (예: 커넥션(Connection) 열기, 채널 만들기, 패킷 보내기)은 라우팅 모듈을 통해 들어온 데이터를 처리하기 위한 데이터 그램 및 프로토콜 세트로 정의됩니다. + +### 커넥션(Connection) + +*커넥션(Connection)* 은 다른 원장의 합의 상태에 대한 정보를 포함하는 두 체인의 영구 데이터 구조의 집합입니다. 한 체인의 합의 상태를 업데이트하면 다른 체인의 커넥션(Connection) 상태가 변경됩니다. + +### 채널 + +*채널* 은 패킷 순서 지정, exactly-once delivery 및 재생 방지를 용이하게하기 위해 메타 데이터를 포함하는 두 체인의 영구 데이터 구조 세트입니다. 채널을 통해 전송 된 패킷은 내부 상태를 변경합니다. 채널은 다-대-일 관계의 커넥션(Connection)과 연관되어 있습니다. 단일 커넥션은 여러 개의 연관된 채널을 가질 수 있으며 모든 채널은 하나의 연관된 커넥션(Connection)을 가져야하며 이는 채널을 생성하기 전에 생성해야합니다. + +### 패킷 + +*패킷* 은 순서 관련 메타 데이터 (IBC 사양에 의해 정의 됨) 및 패킷 *데이터* 라고 하는 오파크(opaque) 필드(응용 프로그램 계층에 의해 정의 된 의미, 예를 들어 토큰 양 및 명칭)를 갖는 특정 데이터 구조입니다. 패킷은 특정 채널(좀 더 확장하여 설명하면 특정 커넥션)을 통해 전송됩니다. + +### 모듈 + +*모듈* 은 특정 블록 체인의 상태 머신의 하위 구성 요소로, IBC 핸들러와 상호 작용하고 전송하거나 받는 특정 IBC 패킷의 *데이터* 필드에 따라 상태를 변경 시킬 수 있습니다 (예: 토큰 발행 혹은 소각). + +### 핸드셰이크(Handshake) + +*핸드 셰이크* 는 여러 데이터 그램(Datagram)을 포함하는 특정 하위 프로토콜로, 일반적으로 두 개의 관련된 체인에서 서로의 합의 알고리즘에 대해 신뢰 할 수 있는 상태와 같은 일부 공통 상태를 초기화하는 데 사용됩니다. + +### 하위 프로토콜 + +하위 프로토콜은 블록 체인을 구현하는 IBC 핸들러 모듈에 의해 구현되어야하는 데이터 그램 종류 및 함수 세트로 정의됩니다. + +데이터 그램은 외부 relayer 프로세스에 의해 체인간에 중계 되어야 합니다. 이 relayer 프로세스는 임의의 방식으로 작동한다고 가정합니다. +프로세스는 일반적으로 적어도 하나의 올바른 relayer 프로세스에 의존하지만, 어떠한 안전 특성도 그 동작에 의존하지 않습니다 + +IBC 하위 프로토콜은 두 체인 `A` 와 `B` 간의 상호 작용으로 추론됩니다. 이 두 체인 간에는 사전에 구별이 없으며 동일한 IBC 프로토콜을 실행하는 것으로 간주됩니다. `A` 는 단순히 하위 프로토콜에서 첫 번째 체인이고 `B` 는 두 번째 체인입니다. 프로토콜 정의는 일반적으로 혼동을 피하기 위해 변수 이름에 `A` 와 `B` 를 포함하지 않아야합니다 (체인 자체가 프로토콜에서 `A` 인지 `B` 인지 알 수 없기 때문에). + +### 인증 + +*인증* 은 실제로 데이터 그램이 IBC 핸들러에 의해 정의 된 방식으로 특정 체인에 의해 전송되도록하는 속성입니다. + +## 속성 정의 + +### 완결성 + +*완결성* 은 validator 집합의 동작에 대한 특정 가정에 따라 특정 블록이 되돌리지 않을 것이라는 합의 알고리즘에 의해 제공되는 수량화 가능한 보증입니다. IBC 프로토콜은 절대적일 필요는 없지만 완결성을 요구합니다. (예를 들어, Nakamoto 합의 알고리즘의 임계값 완결성 장치는 채굴자의 행동 방식에 대한 경제적인 가정에 따라 완결성을 제공합니다.) + +### 오작동 + +*오작동* 은 합의 알고리즘에 의해 정의되고 해당 합의 알고리즘의 라이트 클라이언트가 감지 할 수있는 합의 오류의 유형 입니다. + +### Equivocation + +*Equivocation* 은 유효하지 않은 방식으로 여러 개의 다른 후속 작업에 대한 투표를 단일 블록에 서명하는 validator가 저지른 특정 합의 오류의 유형입니다. +모든 Equivocation은 오작동 입니다. + +### 데이터 가용성 + +*데이터 가용성* 은 일정 기간 내에 machine의 상태에서 데이터를 조회할 수 있는 오프 체인 replayer 프로세스 기능입니다. + +### 데이터 기밀성 + +*데이터 기밀성* 은 호스트 상태 머신이 IBC 프로토콜의 기능을 손상시키지 않으면서 특정 당사자가 특정 데이터를 사용할 수 없도록 거부하는 특성입니다. + +### 부인 방지 + +*부인 방지* 는 machine이 특정 패킷을 보냈거나 특정 상태를 커밋 한 것에 대해 이의를 제기 할 수없는 능력입니다. IBC는 부인 할 수 없는 프로토콜이며, 모듈로 데이터 기밀성 선택은 상태머신에서 선택됩니다. + +### 합의 liveness + +*합의 liveness* 는 특정 머신의 합의 알고리즘에 의한 블록 생성의 연속성입니다. + +### Transactional liveness + +*Transactional liveness* 는 특정 머신의 합의 알고리즘에 의해 들어오는 트랜잭션 (컨텍스트에 의해 명확해야 함)을 지속적으로 확인하는 것입니다. Transactional liveness는 합의 liveness 가 필요하지만, 합의 liveness가 반드시 Transactional liveness를 제공하지는 않습니다. Transactional liveness는 검열 저항을 의미합니다. + +### Bounded consensus liveness + +*Bounded consensus liveness* 는 특정 바운드 내의 Consensus liveness 입니다. + +### Bounded consensus liveness + +*Bounded consensus liveness* 는 특정 범위 내에서 Transactional liveness 입니다. + +### Exactly-once safety + +*Exactly-once safety*는 패킷이 한 번 이상 확인되지 않는 속성입니다(그리고 일반적으로 Exactly-once란 결국 Transactional liveness을 가정합니다). + +### 전송 또는 시간 제한 안전성 + +*전송 또는 시간 제한 안전성* 은 패킷이 전송 및 실행되거나 발신자에게 입증 될 수있는 방식으로 시간이 초과되는 속성입니다. + +### 상수 (복잡도에 대해) + +공간 또는 시간 복잡도를 언급 할 때 *상수* 는 `O(1)` 의미합니다. + +### Succinct + +공간 또는 시간 복잡도를 언급 할 때 *Succinct* 는 `O(log n)` 이상을 의미합니다. diff --git a/ko/ibc/2_IBC_ARCHITECTURE.md b/ko/ibc/2_IBC_ARCHITECTURE.md new file mode 100644 index 000000000..e49763c33 --- /dev/null +++ b/ko/ibc/2_IBC_ARCHITECTURE.md @@ -0,0 +1,183 @@ +# 1: Inter-blockchain Communication Protocol Architecture + +**IBC 프로토콜의 고수준의 아키텍처 및 데이터 흐름에 대한 개요입니다.** + +**IBC 사양에 사용되는 용어에 대한 정의는 [여기를](./1_IBC_TERMINOLOGY.md) 참조하십시오.** + +**일반적인 프로토콜 설계 원칙에 대해서는 [여기를](./3_IBC_DESIGN_PRINCIPLES.md) 참조하십시오.** + +**사용 사례는 [여기를](./4_IBC_USECASES.md) 참조하십시오.** + +**디자인 패턴에 대한 설명은 [여기를](./5_IBC_DESIGN_PATTERNS.md) 참조하십시오.** + +이 문서는 블록체인간 통신 (IBC) 스택에서 사용되는 인증 계층, 통신 계층, 오더링(ordering) 계층에 대해서 간략하게 설명합니다. 이 문서는 프로토콜의 세부 사항에 대해서는 설명하지 않습니다. -- 세부 사항들은 개별 ICS 문서에 포함되어 있습니다. + +> 참고 : 이 문서 전체에서 *원장* , *체인* 및 *블록 체인* 은 일반적으로 사용되는 의미를 따릅니다. + +## IBC란 무엇인가 + +*블록체인간 통신 프로토콜*(IBC)은 신뢰할 수 있고 안전한 모듈간 통신 프로토콜이며, 여기서 모듈은 결정적인 프로세스들을 말하며 각 프로세스는 복제된 독립적인 머신들 위에서 동작합니다. 그리고 이 독립적인 머신들은 복제된 상태를 가지는 머신을 포함하는 것을 말합니다. (좀 더 구체적으로 복제된 상태를 가지는 머신은 "블록체인"이나 "분산된 원장"을 말합니다.) + +IBC는 안정적이고 안전한 모듈 간 통신을 기반으로 구축 된 모든 응용 프로그램에서 사용할 수 있습니다. 애플리케이션 예로는 교차 체인 자산 전송(cross-chain asset transfer), 아토믹 스왑(atomic swap), 다중 체인 스마트 계약 (서로 호환되지 않는 VM을 가지는 체인을 포함해서) 그리고 다양한 종류의 데이터 및 코드 샤딩이 있습니다. + +## IBC에서 제공하지 않는것들 + +IBC는 응용 프로그램 계층 프로토콜이 아니며 데이터 전송, 인증 및 안정성만 처리합니다. + +IBC는 아토믹 스왑(atomic-swap) 프로토콜이 아닙니다. 임의의 서로 다른 체인을 넘나드는 데이터 전송 및 연산이 지원됩니다. + +IBC는 토큰 전송 프로토콜이 아닙니다. 토큰 전송은 IBC 프로토콜을 응용 프로그램 계층에서 사용할 수 있습니다. + +IBC는 샤딩 프로토콜이 아닙니다. 단일 스테이트 머신이 체인간에 분산되어 사용되는 것이 아니라 다양한 종류의 다른 스테이트 머신들이 공용 인터페이스를 가지고 있으며 각각이 다른 체인위에서 동작합니다. + +IBC는 Layer-2 스케일링 프로토콜이 아닙니다. IBC를 구현하는 모든 체인은 동일한 "계층"에 존재하지만 각 체인은 네트워크 토폴로지 다른 부분에 있을 수 있습니다. 하지만 그 중에 꼭 루트 체인이 있거나 한 개의 검증자가 있는 것은 아닙니다. + +## 동기 + +현재 비트코인과 이더리움과 같은 주요 블록체인에 대해서 쓰기 작업을 할 때 초당 7~20개의 트랜잭션의 속도를 지원합니다. 두 체인 모두 여전히 얼리어답터 애호가들이 주로 사용하고 있지만 최근까지 비교적 안정적으로 운영되고 있습니다. 낮은 처리량이 대부분의 블록체인 사용 사례에서 한계점으로 꼽히고 있습니다. 그리고 낮은 처리량은 분산 스테이트 머신의 근본적인 한계로 알려져있습니다. +네트워크에 존재하는 모든 (검증하는) 노드들은 모든 트랜잭션(모듈식 영지식 구성은 현재 문서에서 논외로 합니다.)을 처리해야하기 때문에 모든 상태를 저장하고 다른 검증 노드들과 통신합니다. [Tendermint](https://github.com/tendermint/tendermint) 와 같은 빠른 합의 알고리즘은 처리량을 큰 상수의 요소로 증가시킬 수는 있지만 이 이유로 무한정 늘릴 수는 없습니다. 트랜잭션 처리량과 응용 프로그램 다양성 그리고 효율적인 비용을 통한 분산 원장 어플리케이션 배포를 지원하려면 동시에 실행할 수있는 여러 독립적인 합의 인스턴스간에 실행 및 저장소를 분리해야합니다. + +한 가지 설계 방향은 "샤드"라고 하는 하나의 프로그래밍이 가능한 스테이트 머신을 다른 체인들로 나누는 것입니다. 그리고 각 샤드는 동시에 실행될 수 있고 상태의 서로 다른 부분을 저장할 수 있습니다. 안전성과 생동성을 고려하고 샤드간에 데이터와 코드를 올바르게 라우팅하려면 이러한 설계는 "하향식 접근 방식"을 취해야합니다 -- 이것은 네트워크 토폴로지를 구성하는 것, 하나의 루트를 가지는 원장과 트리 형태의 샤드를 만드는 것, 프로토콜 규약을 만드는 것과 토폴로지들에게 인센티브를 주는 것을 포함합니다. 이러한 접근 방식은 간단하고 예측 가능하다는 것에 장점이 있지만 어려운 [기술적 문제를](https://medium.com/nearprotocol/unsolved-problems-in-blockchain-sharding-2327d6517f43) 직면하고 있습니다. 이러한 문제에서는 모든 샤드들이 각자 하나의 검증자의 집합을 가져야 하며 하나의 스테이트 머신 혹은 상호 호환 가능한 VM을 가져야 합니다. 그리고 가까운 미래에 네트워크 토폴로지를 변경하기 위한 합의를 확장하기 어렵다는 문제를 가질 수 있습니다. + +또한 단일 합의 알고리즘, 스테이트 머신, 시빌 저항성(sybil resistence)에서 충분한 수준의 보안 및 다양성을 제공하지 못할 수도 있습니다. 합의에 참여하는 인스턴스의 숫자는 그들이 지원할 수 있는 독립적인 인스턴스 수에 제한되어 있습니다. 이것은 합의에 참여하는 인스턴스의 숫자가 늘어남에 따라 특정 오퍼레이터를 손상시켰을 때 발생하는 이익이 커지는 것을 뜻합니다 -- 오퍼레이터를 손상시키기 위한 비용은 항상 최적의 비용을 따라가려고 할 것입니다. (예 : 물리적 키 유출 또는 사회 공학) 그러므로 이 비용은 무한정 증가하지 않습니다. 하나의 글로벌 스테이트 머신은 다양한 어플리케이션들 중 공통의 것들을 수용해야합니다. 이를 통해 특별한 스테이트 머신 보다 특정 형태의 어플리케이션을 덜 적합하도록 만들 수 있습니다. 하나의 합의 인스턴스의 운영자들은 그들의 권력을 남용하여 쉽게 리더 선출에서 빠져나갈 수 없는 어플리케이션으로부터 수수료를 가져갈 수 있습니다. 그렇기 때문에 별도의 독립적인 합의 인스턴스들이 최소한의 필요한 공통 인터페이스만을 가져가면서 상호작용하는 구조를 만들어나가는 것이 더 적합합니다. + +*인터 블록 체인 통신 프로토콜* 은 스케일링과 상호 운용성 문제에 대해서 다른 접근방식을 취하고 있습니다. 이종 분산 원장 네트워크의 안전하고 신뢰할 수있는 상호 운용을 가능하게하며 알려지지 않은 토폴로지로 정렬하고 가능한 경우 비밀을 유지하며 원장을 다양화할 수 있습니다. 그리고 네트워크에서 원장들은 다양화될 수 있고, 발전할 수 있으며 독립적으로 관리될 수 있습니다. 또한 특정 조건의 토폴로지나 특정 형태의 스테이트 머신 디자인을 따라서도 다르게 구성될 수 있습니다. +더 넓고 동적인 여러 네트워크에 걸쳐있는 체인들은 이따금 일어나는 Byzantine faults가 일어날 수 있으며 따라서 이러한 경우에 대비해 프로토콜 레벨에서 이를 발견하고 극복할 수 있어야합니다. 더 자세한 설계 원칙 목록은 [여기를](./3_IBC_DESIGN_PRINCIPLES.md) 참조하십시오. + +다양한 형태의 블록체인이 서로 소통을 편하게 하기 위해서는 블록체인간 커뮤니케이션 프로토콜은 "상향식" 접근 방법을 취하고 있습니다. 이 프로토콜에서는 상호 운용을 구현하는데 필요한 요구 사항, 기능, 그리고 다른 두 원장이 소통하는데 필요한 특징들을 명시해야하며 고수준의 프로토콜의 요구사항을 만족하며 여러 원장들이 소통하기 위한 다양한 방법들을 명시해야합니다. 따라서 IBC는 전체 네트워크 토폴로지에 대해 아무 것도 가정하지 않으며 구현 원장에 대해서는 알려진 최소한의 기능만 사용할 수 있고 몇 가지의 특징만 충족하면 됩니다. 실제로 IBC내의 원장들은 그들의 light client 합의 검증 기능들로 정의되어있기때문에 단일머신과 복잡한 알고리즘을 통해 "원장"의 기능들을 확장시키는 것으로 볼 수 있습니다. + +IBC는 엔드 투 엔드(end-to-end)로 이어져있고, 연결 지향적이고 상태를 가지며 떨어진 머신들끼리 모듈을 통해 인증된 통신을 가능하게 해줍니다. IBC 구현체는 호스트의 스테이트 머신에서 고수준의 모듈들과 프로토콜의 스펙을 만족해야합니다. IBC를 호스팅하는 스테이트 머신은 합의 사본을 검증할 수 있는 기능과 암호학적인 작업 증명을 생성할 수 있는 기능을 제공해야합니다. 그리고 IBC 패킷 릴레이어는 (오프 체인 프로세스) 네트워크 프로토콜들에 접근할 수 있어야하며 스테이트 머신의 상태를 읽고 다른 머신에게 데이터를 전송하기 위해서 물리적인 데이터 링크에 접근할 수 있어야합니다. + +## 범위 + +IBC는 별도의 시스템에 존재하는 모듈간의 중계를 위해 사용되는 구조화된 데이터 패킷의 인증, 전송 및 오더링을 처리합니다. 이 프로토콜은 두 시스템의 모듈 사이에 정의되어 있지만, 임의의 토폴로지들로 연결된 여러 시스템의 여러 모듈 사이에서도 안전한 동시 사용을 위해 설계되었습니다. + +## 인터페이스 + +IBC는 스마트 컨트랙트, 다른 상태 머신 컴포넌트 혹은 상태 머신의 독립적인 애플리케이션 로직과 같은 모듈들과 기본 합의 프로토콜, 시스템 및 네트워크 인프라 (예 : TCP/IP) 사이에 있습니다. + +IBC는 동일한 상태 머신에 존재하는 다른 모듈과 상호 작용하기 위해서 다음과 같은 기능들을 모듈에 제공합니다: 커넥션 & 채널이 맺어진 상태에서 데이터 패킷 전송 및 수신 (인증 및 오더링을 위한 기본 요소, [definition](./1_IBC_TERMINOLOGY.md) 부분 참조) - 뿐만 아니라 프로토콜 상태를 관리하기 위한 call들을 제공합니다: 1) 커넥션과 채널들을 열고 닫기, 2) 커넥션, 채널, 패킷 전송 옵션 선택하기, 3) 커넥션 & 채널의 상태 조회하기 + +IBC는 [ICS 2](../../spec/ics-002-client-semantics)에 정의된 완결성 (또는 임계값을 이용한 완결성), 저렴하게 검증 가능한 합의 결과 및 간단한 키/벨류 저장 기능과 같은 기본 합의 프로토콜 및 시스템의 기능 및 속성들을 가정하고 있습니다. 네트워크 측면에서 IBC는 최종 데이터 전달만을 요구합니다. 인증, 동기화 또는 오더링과 같은 속성들은 나중에 정확하게 정의되기 때문에 가정하지 않습니다. + +### 프로토콜 관계도 + +``` ++------------------------------+ +------------------------------+ +| Distributed Ledger A | | Distributed Ledger B | +| | | | +| +--------------------------+ | | +--------------------------+ | +| | State Machine | | | | State Machine | | +| | | | | | | | +| | +----------+ +-----+ | | +---------+ | | +-----+ +----------+ | | +| | | Module A | <-> | IBC | | | <----> | Relayer | <----> | | | IBC | <-> | Module B | | | +| | +----------+ +-----+ | | +---------+ | | +-----+ +----------+ | | +| +--------------------------+ | | +--------------------------+ | ++------------------------------+ +------------------------------+ +``` + +## 기능 + +IBC의 주요 목적은 독립된 호스트 시스템에서 실행되는 모듈간의 신뢰할 수 있고, 인증되어 있으며, 순서대로 통신할 수 있도록 도와주는 것입니다. 이를 위해서는 다음 영역들에서 프로토콜 로직이 필요합니다. + +- 데이터 중계 +- 데이터 기밀성 및 가독성 +- 신뢰성 +- 흐름 제어 +- 인증 +- 상태 유지 +- 다중화 +- 직렬화 + +다음 단락에서는 각 영역에 대한 IBC 내의 프로토콜 논리에 대해서 간략하게 설명합니다. + +### 데이터 중계 + +IBC 아키텍처에서 모듈은 네트워킹 인프라를 통해 서로에게 메시지를 직접 전송하는 것이 아니라 "릴레이어 프로세스"를 모니터링하여 물리적으로 중계할 메시지를 생성합니다. IBC는 기본 네트워크 프로토콜 스택 (예 : TCP/IP, UDP/IP 또는 QUIC/IP) 및 물리적 상호 연결 인프라에 접근할 수 있는 일련의 릴레이어 프로세스가 있다고 가정합니다. 이러한 릴레이어 프로세스는 IBC 프로토콜을 구현하는 시스템들을 모니터링하여 각 시스템의 상태를 지속적으로 스캔하고 송신 패킷이 커밋된 경우 다른 시스템 상에서 트랜잭션을 실행합니다. 두 시스템 간의 커넥션에서 올바른 작동 및 진행을 위해 IBC에서는 시스템간에 중계할 수 있는 하나 이상의 올바른 라이브 릴레이어 프로세스만 있으면됩니다. + +### 데이터 기밀성 및 가독성 + +IBC 프로토콜은 IBC 프로토콜의 올바른 작동에 필요한 최소한의 데이터 만 사용 가능하고 읽기 가능하도록하고 (표준 형식으로 직렬화됩니다.) 스테이트 머신은 특정한 릴레이어들에게만 데이터를 전달할 수 있도록 릴레이어를 선출하는 과정이 있을 수 있습니다. (릴레이어를 선출하는 자세한 과정은 이 문서의 범위를 벗어납니다.) 이 데이터는 합의 상태, 클라이언트, 커넥션, 채널 및 패킷 정보와 특정 키 / 값 쌍의 포함 또는 제외 증명을 구성하는 데 필요한 상태로 구성됩니다. 또한 다른 머신에서도 증명해야하는 모든 데이터를 읽을 수 있어야합니다. 즉,이 표준에 정의 된 형식으로 직렬화해야합니다. + +### 신뢰성 + +네트워크 레이어와 릴레이어 프로세스들은 임의의 방식대로 동작할 수 있습니다. 예를들어 패킷을 유실, 재정렬 혹은 복제하거나 혹은 의도적으로 유효하지 않은 트랜잭션을 보내는 등 비잔틴 노드처럼 행동할 수 있습니다. 이러한 악의적인 행동은 IBC의 동작에 영향을 끼쳐서는 안됩니다. 이러한 행동을 막기 위해서 각 패킷에 시퀀스 번호를 지정하고 IBC 커넥션을 통해 전송합니다. 그리고 이것은 패킷을 수신하는 쪽 머신의 IBC 핸들러가 검증하고 (IBC 프로토콜을 구현하는 스테이트 머신의 일부입니다.) 메세지를 전송하는 머신이 다음 패킷을 전송하거나 혹은 다른 액션을 취하기 전에 패킷을 수신한 쪽의 머신이 패킷을 제대로 받고 핸들링했다는 것을 알려줄 수 있는 방법을 제공해야합니다. 암호화된 커밋들은 데이터의 위변조를 방지하기 위해 사용됩니다: 송신하는 머신은 발신 패킷에 커밋을 하고 수신하는 머신은 이 커밋을 확인합니다. 그래서 통신과정에서 변조된 데이터는 릴레이어에의해서 거부됩니다. IBC는 또한 순차적으로 데이터를 전송하지 않는 채널도 지원하는데,이 채널은 송신에 대한 패킷 수신 순서를 강제하지 않지만 정확히 한 번만 전달되도록합니다. + +### 흐름 제어 + +IBC는 컴퓨팅 레벨과 경제학적인 흐름에 대한 컨트롤과 관련된 조항에 대해서 명시하지 않습니다. 기본즉어로 머신들은 처리량과 흐름 제어 메커니즘에 대해 한계를 가지고 있습니다. ("gas" 시장과 같은 것이 있습니다.) 어플리케이션 레벨의 경제학적인 흐름은 보안 속성을 보장하고(하나의 머신의 값을 제한합니다.) Byzantine faults에 대해 극복할 수 있게 해줍니다. (챌린지 기간을 제공하며 그 다음 커넥션을 끊습니다.) 예를 들어, IBC 채널을 통해 값을 전송하는 응용 프로그램은 잠재적 인 비잔틴 행동으로 인한 피해를 제한하기 위해 블록 당 값 전송 속도를 제한 할 수 있습니다. IBC는 모듈이 패킷을 거부하고 세부 사항을 상위 레벨 애플리케이션 프로토콜로 남겨 둘 수있는 기능을 제공합니다. + +### 인증 + +IBC의 모든 데이터는 인증됩니다. 송신 머신의 합의 알고리즘에 의해 완성 된 블록은 암호화 커밋을 통해 발신 패킷에 포함시켜야하며 수신 체인의 IBC 핸들러는 액션을 취하기 전에 합의에 대한 사본과 암호화 커밋 증거를 모두 검증해야합니다. + +### 상태 유지 + +위에서 설명한 안정성, 흐름 제어 및 인증을 위해서는 IBC가 각 데이터 스트림에 대한 특정 상태 정보를 초기화하고 유지해야합니다. 이 정보는 커넥션과 채널이라는 두 가지 추상화로 나뉩니다. 각 커넥션 개체에는 연결된 컴퓨터의 합의 상태에 대한 정보가 포함됩니다. 한 쌍의 모듈에 특정한 각 채널에는 협상 된 인코딩 및 멀티플렉싱 옵션과 상태 및 시퀀스 번호에 관한 정보가 포함됩니다. 두 모듈이 통신을 원할 경우 두 시스템간에 기존 커넥션 및 채널을 찾거나 존재하지 않는 경우 새 커넥션 및 채널을 초기화해야합니다. 커넥션 및 채널을 초기화하려면 다단계 핸드 셰이크가 필요합니다.이 단계를 완료하면 연결시 두 대의 머신 만 연결되고 두 개의 모듈이 연결되고 릴레이 된 향후 데이터 그램이 인증, 인코딩 및 인코딩됩니다. 채널의 경우 원하는대로 시퀀싱됩니다. + +### 다중화 + +단일 호스트 시스템 내의 많은 모듈이 IBC 커넥션을 동시에 사용할 수 있도록 IBC는 각 커넥션 내에서 일련의 채널을 제공합니다. 각 채널은 순서가 지정된 패킷의 경우 순서대로 패킷을 보낼 수있는 데이터 스트림을 고유하게 식별합니다. 수신 시스템의 대상 모듈에 항상 정확히 한 번만 표시됩니다. 채널은 일반적으로 각 시스템의 단일 모듈과 연결될 것으로 예상되지만 일대다 및 다대일 채널도 가능합니다. 채널 수는 제한이 없으며 합의 정보를 추적하는 데 필요한 단일 커넥션만있는 기본 시스템의 처리량에 의해서만 동시 처리량이 제한됩니다. + +### 직렬화 + +IBC는 상호 이해하기 어려운 기계 간의 인터페이스 경계 역할을하며, 프로토콜을 올바르게 구현하는 두 기계가 서로를 이해할 수 있도록 최소한의 데이터 구조 인코딩 및 데이터 그램 형식의 필수 상호 이해를 제공해야합니다. 이를 위해 IBC 사양은 데이터 구조의 표준 인코딩을 정의하며,이 리포지토리에서 프로토 타입 형식으로 제공되는 IBC를 통해 통신하는 두 시스템 간의 증거로 직렬화 및 릴레이 또는 확인되어야합니다. + +> 표준 인코딩 (동일한 구조의 데이터는 항상 같은 바이트로 직렬화 되어야 합니다.)을 제공하는 proto3을 사용해야합니다. 따라서 맵 형식과 알 수없는 필드는 금지되어 있습니다. + +## 데이터 흐름 + +IBC는 계층화 된 프로토콜 스택으로 개념화 될 수 있으며,이를 통해 데이터가 위에서 아래로 (IBC 패킷을 보낼 때) 그리고 아래에서 위로 (IBC 패킷을받을 때) 흐릅니다. + +"핸들러"는 IBC 프로토콜을 구현하는 상태 머신의 일부이며, 모듈에서 패킷으로 또는 패킷으로의 호출을 변환하고 채널 및 커넥션으로 적절히 라우팅하는 역할을 담당합니다. + +두 체인 사이의 IBC 패킷 경로를 고려하십시오 *-A* 와 *B* 라고 부릅니다. + +### 다이어그램 + +``` ++---------------------------------------------------------------------------------------------+ +| Distributed Ledger A | +| | +| +----------+ +----------------------------------------------------------+ | +| | | | IBC Module | | +| | Module A | --> | | --> Consensus | +| | | | Handler --> Packet --> Channel --> Connection --> Client | | +| +----------+ +----------------------------------------------------------+ | ++---------------------------------------------------------------------------------------------+ + + +---------+ +==> | Relayer | ==> + +---------+ + ++--------------------------------------------------------------------------------------------+ +| Distributed Ledger B | +| | +| +---------------------------------------------------------+ +----------+ | +| | IBC Module | | | | +| Consensus --> | | --> | Module B | | +| | Client -> Connection --> Channel --> Packet --> Handler | | | | +| +---------------------------------------------------------+ +----------+ | ++--------------------------------------------------------------------------------------------+ +``` + +### 과정 + +1. 체인 *A* + 1. 모듈 (응용 프로그램 별) + 2. 핸들러 (다른 ICS에 정의 된 파트) + 3. 패킷 ( [ICS 4에](../spec/ics-004-channel-and-packet-semantics) 정의 됨) + 4. 채널 ( [ICS 4에](../spec/ics-004-channel-and-packet-semantics) 정의 됨) + 5. 커넥션 ( [ICS 3에](../spec/ics-003-connection-semantics) 정의 됨) + 6. 클라이언트 ( [ICS 2에](../spec/ics-002-client-semantics) 정의 됨) + 7. 합의 (발신 패킷과의 거래를 확인) +2. 오프 체인 + 1. 중계기 ( [ICS 18에](../spec/ics-018-relayer-algorithms) 정의 됨) +3. 체인 *B* + 1. 합의 (수신 패킷과의 거래를 확인) + 2. 클라이언트 ( [ICS 2에](/../spec/ics-002-client-semantics) 정의 됨) + 3. 커넥션 ( [ICS 3에](/../spec/ics-003-connection-semantics) 정의 됨) + 4. 채널 ( [ICS 4에](/../spec/ics-004-channel-and-packet-semantics) 정의 됨) + 5. 패킷 ( [ICS 4에](/../spec/ics-004-channel-and-packet-semantics) 정의 됨) + 6. 핸들러 (다른 ICS에 정의 된 파트) + 7. 모듈 (응용 프로그램 별) diff --git a/ko/ibc/3_IBC_DESIGN_PRINCIPLES.md b/ko/ibc/3_IBC_DESIGN_PRINCIPLES.md new file mode 100644 index 000000000..e94be2a7f --- /dev/null +++ b/ko/ibc/3_IBC_DESIGN_PRINCIPLES.md @@ -0,0 +1,57 @@ +# 2: IBC 디자인 원칙 + +**이것은 IBC의 "디자인 원칙"에 대한 설명입니다.** + +**IBC에서 사용되는 용어들의 정의는, [여기](./1_IBC_TERMINOLOGY.md)를 참조 하십시오.** + +**설계 개요는 [여기](./2_IBC_ARCHITECTURE.md)를 참조 하십시오.** + +**예제 use case는, [여기](./4_IBC_USECASES.md)를 참조 하십시오.** + +**디자인 패턴에 대한 설명은 [여기](./5_IBC_DESIGN_PATTERNS.md)를 참조 하십시오.** + +"블록체인 간 통신 프로토콜"의 설계 범위는 매우 넓고, 용어 자체로도 많은 것을 포괄합니다. "블록체인 간 커뮤니케이션 프로토콜" (IBC)은 상호 운용 가능한 블록체인의 인터체인 환경에서 다양성, 지역성, 모듈성 및 효율성을 제공하기 위한 프로토콜을 뜻합니다. 이 문서에서는 IBC를 사용하는 "이유"에 대해 간략히 설명하고, 기본적인 상위 레벨의 디자인 목표에 대해 세세하게 알아보도록 하겠습니다. + +## 다양성 (Versatility) + +IBC는 *가변적인* 프로토콜을 지향합니다. 이 프로토콜은 서로 다른 언어로 구현되고, 다른 의미를 갖는 *이종의* 블록체인을 지원합니다. IBC 위에서 작성된 애플리케이션은 함께 *구성될 수 있으며*, IBC 프로토콜의 단계들은 *자동화 될 수 있습니다.* + +### 이질성 (Heterogeneity) + +IBC는 기본적인 요구사항(빠른 완결성, 임의의 합의 알고리즘과 상태 머신, 상수 시간복잡도의 상태 커밋, 간결한 증명)들을 만족하는 합의 알고리즘과 상태 머신으로 구성될 수 있습니다. 프로토콜은 멀티 체인 애플리케이션에서 일반적으로 요구하는 사항인 데이터 검증, 전송, 정렬에 대해서 다루지만, 애플리케이션 그 자체의 의미와는 무관합니다. IBC로 연결된 서로 다른 두 개의 체인은 반드시 애플리케이션 층에서 호환되는 "인터페이스" (토큰 전송 방법과 같은)에 대해 알고 있어야 하지만, IBC 인터페이스 핸들러를 거치면서 상태 머신은 임의의 맞춤형 기능(보호된 트랜잭션과 같은)을 제공할 수 있습니다. + +### 구성가능성 (Composability) + +IBC 위에서 작성된 여러 애플리케이션은 각 프로토콜 개발자와 사용자에 의해 함께 구성될 수 있습니다. IBC는 인증, 전송, 정렬과 관련된 기본적인 요소들과, 자산과 데이터 시멘틱을 위한 애플리케이션 레이어 기준들을 정의합니다. 호환 가능한 기준들을 제공하는 체인들은 커넥션을 연 유저 (또는 커넥션을 재사용하는 유저)들에 의해 서로 연결되고, 거래에 사용될 수 있습니다. 자산과 데이터는 여러 체인들에 자동("멀티-홉"), 또는 수동으로(여러 IBC에 릴레이된 트랜잭션들을 순서대로 전송하며) 전송 될 수 있습니다. + +### 자동성 (Automatability) + +IBC에서 연결을 설정하고, 채널을 만들며, 패킷을 전송하고 비잔틴을 보고 하는 등의 역할을 하는 "사용자" 또는 "행위자"는, 사람일 수도 있지만 꼭 사람일 필요는 없습니다. 모듈들, 스마트 컨트랙트, 자동화된 off-chain 프로세스들은 프로토콜(예를 들어, 가스 비용 계산)을 사용하여 자체적으로나 공동으로 역할을 담당할 수 있습니다. 여러 체인에서 발생하는 복잡한 상호 작용들은(예를 들어 3단계 연결 설정을 위한 handshake, 또는 다중 hop 토큰 전송) 초기화 작업을 제외한 모든 것들을 사용자로부터 추상화 할 수 있도록 설계되었습니다. 결과적으로, 새로운 블록체인(모듈로 물리적 인프라 프로비져닝)을 자동으로 가동하고, IBC 연결을 시작하며 새로운 상태 머신과 성능을 자동으로 사용할 수 있습니다. + +## 모듈성 (Modularity) + +IBC는 *모듈로 구성된* 프로토콜로 디자인 되었습니다. 이 프로토콜은 명확한 보안 속성들과 요구사항을 만족하는 계층 구조로 구성되었습니다. 특정 층의 컴포넌트 구현은 상위 계층에 제공하는 여러 필수 요구사항(예를 들어, 서로 다른 합의 알고리즘, 또는 연결 설정 단계)에 따라 달라질 수 있습니다.(예를 들어 확정성, < 1/3 비잔틴 안전성, 또는 두 체인에 포함된 신뢰할 수 있는 상태). 상태 머신은 안전한 상호 작용을 위해 오로지 호환성 있는 IBC 프로토콜의 서브셋(예를 들어, 상호간의 합의를 위한 가벼운 클라이언트 검증 알고리즘)만을 이해하면 됩니다. + +## 지역성 (Locality) + +IBC는 로컬 프로토콜로 디자인 되었으며, 이는 단지 서로 연결된 두 체인은 보안과 양방향 IBC 연결에 대한 정확성에 대해서만 알 필요가 있다는 뜻입니다. 인증을 위한 보안 요구사항들은 연결된 블록체인의 합의 알고리즘과 검증자 집합에만 관련 있으며, IBC 연결들의 집합을 유지하는 블록체인은 서로 어떤 체인에 연결되어있는 것과 상관 없이, 연결된 블록체인의 상태만을 알고 있으면 됩니다. + +### 정보와 커뮤니케이션의 지역성 + +IBC는 네트워크 토폴로지의 구조에 의존하지 않습니다. 글로벌 블록체인들의 네트워크 토폴로지는 고려할 필요가 없습니다: 보안 및 정확성은 두 체인간의 단일 연결 수준에서 토폴로지의 하위 그래프를 추론할 수 있습니다. 유저들과 체인들은 그들이 신뢰하고 있는 블록체인의 일부 정보만을 이용하여 그들의 가정과 리스크를 추론할 수 있습니다. + +IBC에서는 "루트(root)체인"이 필요 없습니다. 글로벌 네트워크의 몇몇 서브 그래프들은 허브-스포크 구조로 진화할 수도 있고, 다른 네트워크들은 단단하게 결합된 채로 유지될 수도 있습니다. 또 다른 네트워크들은 더욱 이국적인 토폴로지를 유지할 수도 있습니다. 채널들은 점대점 연결로 동작합니다. IBC의 첫번째 버전은 오직 하나의 hop paths를 지원하지만, 미래에는 다중 hop paths를 지원할 것입니다.(연관된 합의 알고리즘의 정확성 가정으로 인해 자동 라우팅이 반드시 필요하거나 안전하지 않을수도 있습니다.) + +그러나 애플리케이션의 데이터는 복잡한 다중 hop 경로로 전송되었을 수도 있는 토큰의 기존 영역, 원래 지분 또는 검증자가 크로스 체인 검증에 제공하는 그들의 신원, 또는 대체 불가능한 토큰을 관리하는 키와 관련된 스마트 컨트랙트와 같은 지역적이지 않은 속성들을 갖고 있을 것입니다. 이런 지역적이지 않은 속성들을 IBC 프로토콜이 이해할 필요는 없지만, 유저나 상위 레벨에 애플리케이션들에 의해 추론될 필요가 있습니다. + +### 정확성 가정 & 보안의 지역성 + +IBC를 사용하는 유저는(사람 또는 스마트 컨트랙트) 어떤 합의 알고리즘을 사용할지, 어떤 상태 머신을 사용할지, 그들이 "옳다고 믿는" 검증자를 어떻게 선택할지 정해야 합니다. IBC 프로토콜이 올바르게 구현되었다고 가정하면, 유저들은 비잔틴 공격이나 잘못된 상태 머신 전환 등에 의해 발생하는 애플리케이션 레벨에서의 위험(자산 인플레이션과 같은) 등에 노출되지 않습니다. 이 특징은 미래의 거대한 인터체인 블록체인 네트워크 토폴로지와, 검증자 집단이 비잔틴 행위를 할 가능성이 있다는 점에서 매우 중요합니다. 보수적으로 구현된 IBC는 이런 위험을 제한하고 발생할 수 있는 피해를 줄일 수 있습니다. + +### 허용 지역성 + +연결을 열고, 채널을 만들고 패킷을 전송하는 등의 IBC의 행동들은 상태 머신들과 연결된 특정 두 체인에 의해 지역적으로 허용됩니다. 독립적인 체인들은 애플리케이션 레벨의 행동들에 대한 권한 부여 메커니즘(합의와 같은)의 승인을 요구할 수 있지만, 기본적인 프로토콜에서 대부분의 행위는 모듈러 가스, 비용 부과 정책 등에 의해 제한됩니다. 기본적으로 커넥션 연결과 채널 생성은 가능하고, 패킷 또한 허용 프로세스 없이 전송될 수 있습니다. 물론, 유저들은 반드시 각 IBC 연결의 상태와 합의에 대해 점검해야 하고, 그것들이 충분히 안전한지 결정해야 합니다(신뢰할 수 있는 상태 저장과 같은 방법을 이용하여). + +## 호율성 + +IBC는 *효율적인* 프로토콜로 설계되었습니다: 데이터 및 자산의 릴레이 중 발생하는 상각 비용은 주로 패킷과 연관된 기본 상태 전이 또는 운영 비용 (예 토큰을 전송하는 등), 일부 작은 상수 시간의 오버헤드로 구성되어야합니다. \ No newline at end of file diff --git a/ko/ibc/4_IBC_USECASES.md b/ko/ibc/4_IBC_USECASES.md new file mode 100644 index 000000000..0bf6a36c0 --- /dev/null +++ b/ko/ibc/4_IBC_USECASES.md @@ -0,0 +1,169 @@ +# 4: IBC 활용 사례들 + +**블록체인 간 통신 프로토콜 사양에서 사용되는 응용 프로그램 수준의 활용 사례들에 대한 설명입니다.** + +**IBC 사양에 사용되는 용어에 대한 정의는 [여기를](./1_IBC_TERMINOLOGY.md) 참조 하십시오.** + +**아키텍처 개요는 [여기를](./2_IBC_ARCHITECTURE.md) 참조 하십시오.** + +**광범위한 프로토콜 설계 원칙에 대해서는 [여기를](./3_IBC_DESIGN_PRINCIPLES.md) 참조 하십시오.** + +**디자인 패턴은 [여기를](./5_IBC_DESIGN_PATTERNS.md) 참조 하십시오.** + +이 문서는 블록체인 간 통신 프로토콜(IBC)에 대한 구체적인 활용 사례들에 대한 설명과는 거리가 멀며, 프로토콜의 설계를 평가할 수 있는 일련의 관점을 제공하고, 영감을 주기 위한 의도로 작성되었습니다. + +각각의 사례에 대해서 관련된 체인들의 요구사항, 상위 레벨의 패킷 처리 로직, 연관된 체인의 결합된 상태 관점에서 유지되는 응용프로그램의 속성, 비교 우위가 다른 잠재적 관련 영역들의 목록 또는 다른 응용 프로그램의 특성들을 정의합니다. + +## 자산 이동 + +호환가능한 기본 자산 표현이 존재하는 경우, IBC를 이용하여 두 체인간에 자산을 전송할 수 있습니다. + +### 대체 가능한(Fungible) 토큰 + +IBC는 체인들간에 대체 가능한 토큰을 전송하는데 사용할 수 있습니다. + +#### 표현 + +비트코인에서는 `UTXO`, 이더리움에서는 `ERC20`, 코스모스 SDK에서는 `sdk.Coins`이라고 표현합니다. + +#### 구현 + +두 개의 체인은 IBC 패킷을 전송 및 처리할 때 필요에 따라 예치, 예치 해제, 발행과 소각과 같이 의미적으로 호환되는 표현을 서로 연결하도록 선택합니다. + +전체 토큰 잔액으로 시작하는 "소스 영역(source zone)"과 토큰 잔액 0으로 시작하는 "타켓 영역(target zone)"이 있거나 두 영역이 모두 0이 아닌 잔액(아마 세번째 영역(zone)에서 발행된 토큰)으로 시작될 수 있습니다. 또는 두 개의 영역의 발행량을 결합하여 이전에 별개로 존재하던 두 개의 토큰을 교환 할 수 있도록 선택할 수 있습니다. + +#### 불변값 + +모든 연결된 표현에 걸쳐 임의의 금액의 대체 가능성(fungibility), 체인 전체에 걸쳐 일정한 (또는 인플레이션 자산의 경우 공식적인) 총 발행량 누적분 또는 토큰은 한번에 하나의 체인에서 소비 가능한 형태로만 존재합니다. + +### 대체 불가능한(Non-fungible) 토큰 + +IBC는 체인들간에 대체 불가능한 토큰을 전송하는데 사용할 수 있습니다. + +#### 표현 + +이더리움에서는 `ERC721`, 코스모스 SDK에서는 `sdk.NFT`이라고 표현합니다. + +#### 구현 + +두 개의 체인은 의미적으로 호환되는 두 개의 대체 불가능한(non-fungible) 토큰의 네임스페이스를 서로 "연결(peg)"하여 IBC 패킷을 전송 및 처리할 때 필요에 따라 예치, 예치 해제, 생성과, 소멸 기능을 실행하도록 합니다. + +특정 토큰으로 시작하고 토큰 관련 로직 (예 : CryptoKitties의 교배, 디지털 티켓 교환)이 포함된 시작 "소스 영역(source zone)"이 있거나 모든 관련 체인이 이해할 수있는 형식으로 관련 로직이 NFT와 함께 패키지될 수 있습니다. + +#### 불변값 + +대체 불가능한(non-fungible) 토큰은 특정 계정이 소유하고 있는한 한 체인에 언제라도 고유하게 존재하며, 필요하다면 관련 작업 (예 : CryptoKitties의 교배)을 수행하기 위해 언제든 "소스(source)"영역으로 다시 전송할 수 있습니다. + +### 관련된 영역(zone)들 + +#### Vanilla payments + +코스모스 허브와 같은 "vanilla payments"영역(zone)은 IBC를 통해 들어오고 나가는 대체 가능(fungible) 토큰과 대체 불가능(non-fungible) 토큰의 전송을 혀용할 수 있습니다. 사용자는 높은 보안 성 또는 높은 연결성으로 인해 이러한 영역에 자산을 유지하도록 선택할 수 있습니다. + +#### Shielded payments + +Zcash 블록체인 (pending [UITs](https://github.com/zcash/zcash/issues/830))과 같은 "shielded payments"영역(zone)은 IBC를 통해 들어오고 나가는 대체 가능(fungible) 토큰과 대체 불가능(non-fungible) 토큰의 전송을 혀용할 수 있습니다. 이러한 영역(zone)으로 전송된 토큰은 영지식 회로를 통해 보호되고, 보유, 전송, 거래 등이 가능합니다. 사용자가 익명을 요구하는 목적을 달성하면 IBC를 통해 다른 영역으로 다시 전송 될 수 있습니다. + +#### DEX + +"DEX"영역(zone)은 IBC를 통해 들어오고 나가는 대체 가능(fungible) 토큰과 대체 불가능(non-fungible) 토큰의 전송을 혀용할 수 있으며, Uniswap 또는 0x(또는 미래의 그러한 프로토콜) 스타일의 DEX 프로토콜을 통해 해당 영역에 저장된 토큰을 서로 교환할 수 있습니다. + +#### De-Fi + +이더리움 블록체인과 같은 "De-Fi"영역(zone)은 IBC를 통해 들어오고 나가는 대체 가능(fungible) 토큰과 대체 불가능(non-fungible) 토큰의 전송을 혀용할 수 있으며, 해당 영역(zone)에 저장된 토큰이 담보 대출, 유동성 풀과 같이 다양한 De-Fi 상품들과 상호 작용할 수 있습니다. + +## 멀티체인 컨트랙트 + +여러 체인들에 컨트랙트들이 있어 로직이 분리되어 있는 경우, IBC를 이용하여 컨트랙트들간에 메세지 및 데이터를 전달할 수 있습니다. + +### 크로스체인 컨트랙트 호출 + +IBC를 사용하면 별도의 스마트 컨트랙트 플랫폼 체인들간에 calldata와 return data를 포함한 임의의 컨트랙트-컨트랙트 호출을 실행할 수 있습니다. + +#### 표현 + +컨트랙트: 이더리움에서는 `EVM`, `WASM` (그 외 다양함), Tezos에서는 `Michelson`, Agoric에서는 `Jessie`라고 표현합니다.. + +Calldata: 이더리움에서는 `ABI`라고 하며, RLP, Protobuf 또는 JSON과 같은 일반 직렬화 형식으로 표현됩니다. + +#### 구현 + +한 영역(zone)에서 다른 영역(zone)에 존재하는 컨트랙트를 호출하려는 컨트랙트는 IBC패킷을 통해 대상 컨트랙트의 calldata 및 주소를 직렬화해야 하며, IBC 커넥션을 통해 대상 체인의 IBC 핸들러로 중계될 수 있습니다. 지정된 컨트랙트를 호출, 관련 로직 실행 및 호출의 결과를 반환하는 것(해당하는 경우)은 두번째 IBC 패킷을 통해 다시 호출했던 컨트랙트로 전송합니다. 이때 이 동작은 비동기적으로 처리해야 합니다. + +체인들을 구현하면 Go 또는 Haskell과 같은 언어의 다중 프로세스 동시성 프로그래밍의 채널과 매우 유사한 송신 엔드(send end), 수신 엔드(receive end), 구성 가능한 버퍼 크기 등을 컨트랙트 개발자에게 "채널" 개체로 제공할 수 있습니다. + +#### 불변값 + +컨트랙트에 따라 다릅니다. + +### 크로스체인 수수료 지불 + +#### 표현 + +위의 **대체 가능한(Fungible) 토큰**에서의 표현과 동일합니다. + +#### 구현 + +한 체인에서 자산을 가지고 있는 계정은 두번째 체인의 검증자에 의해 제어되고 있는 첫번째 체인의 다른 계정에 토큰을 전송하고 첫번째 체인에서 두번째 체인으로 토큰을 전송했다는 증거를 포함함으로써 다른 체인의 수수료 지불에 사용될 수 있습니다. + +해당 자산은 수수료 지불을 위해 IBC 커넥션을 통해 첫번째 체인에서 두번째 체인으로 정기적으로 다시 보낼 수 있습니다. + +#### 불변값 + +두 체인들 중 한쪽에서만 수수료가 지불됩니다. + +### 인터체인 담보물 + +> 담보물이란 인터체인 프로토콜에서 검증자가 되기 위해 제출하는 토큰을 의미 + +한 체인에서 지정된 검증자 그룹의 일부는 다른 체인의 유효성을 검사하도록 선택할 수 있고, IBC 커넥션을 통해 제출된 해당 체인에서 커밋에 결함이 있을 경우 책임을 져야하며, 두번째 체인은 동일한 IBC 커넥션을 통해 첫번째 체인에 검증자 업데이트 로직을 위임할 수 있습니다. + +#### 표현 + +ABCI에서는 `Evidence` 와 `ValidatorUpdate`라고 표현합니다. + +#### 구현 + +1차(담보) 체인의 검증자 그룹의 일부에 대한 `ValidatorUpdate`는 IBC 패킷에서 담보 체인으로 중계되며, 이를 사용하여 자체 검증자 그룹을 설정합니다. + +어떤 소유의 `Evidence`는 담보 체인에서 기본 체인으로 다시 중계되어 위변조를 한 검증자에 대해서 담보물 몰수(slashing)를 진행할 수 있습니다. + +#### 불변값 + +검증에 실수를 저지른 검증자들은 하나 이상의 체인에서 몰수(slashing)가 가능하며, 담보 체인의 검증자 그룹은 기본(담보) 체인의 검증자들 그룹에 바인딩될 수 있습니다. + +## 샤딩 + +IBC를 사용하면 블록체인간에 스마트 계약 및 데이터를 상호 이해 가능한 가상 머신 및 데이터 형식으로 마이그레이션 할 수 있습니다. + +### 코드 마이그레이션 + +#### 표현 + +위의 **크로스체인 컨트랙트 호출**에서의 표현과 동일하며, 관련된 모든 코드가 직렬화 가능하고 관련 체인에 의해 상호 이해 가능 (실행 가능)해야한다는 추가 요구 사항이 있습니다. + +#### 구현 + +참여하는 체인은 컨트랙트들을 마이그레이션하며, 알려진 밸런싱 알고리즘("샤딩")에 따라 체인들 사이에서 모두 실행할 수 있습니다. 또한 자주 상호 작용하는 컨트랙트들에 대해서 로드를 균등하게 하거나 효율적인 지역성을 달성하도록 설계되었습니다. + +체인을 자주 전환하는 컨트랙트들 사이에 크로스체인 컨트랙트 호출을 올바르게 라우팅하려면 코어 IBC 위에 라우팅 시스템이 필요합니다. + +#### 불변값 + +어떤 종류의 라우팅 시스템에 의해 코드의 의미(semantics)와 네임스페이스가 보존됩니다. + +### 데이터 마이그레이션 + +IBC를 사용하면 스토리지 비용을 접근 비용으로 교환할 수 있는 임의의 깊이의 멀티체인 "캐시"시스템을 구현하는데 사용할 수 있습니다. + +#### 표현 + +Amino, RLP, Protobuf, JSON과 같은 일반 직렬화 형식으로 표현합니다. + +#### 구현 + +임의의 깊이의 IBC 커넥션(계산에 최적화된 첫번째 체인과 더 저렴한 스토리지에 최적화된 두번째 체인을 이용하여 연결)으로 연결된 체인들의 링크드 리스트는 어떤 체인의 일정 기간동안 사용되지 않은 데이터를 리스트의 다음 체인으로 마이그레이션하는 계층적인 캐시를 구현할 수 있습니다. 컨트랙트 호출 또는 스토리지 접근을 위해 데이터가 필요한데 찾는 데이터가 해당 체인에 저장되지 않은 경우, IBC 패킷을 통해 해당 체인으로 다시 중계되어야합니다(일정 기간동안 다시 캐시할 수 있음). + +#### 불변값 + +필요한 경우 IBC hop의 알려진 범위로 기본 (계산) 체인에서 모든 데이터에 액세스 할 수 있습니다. diff --git a/ko/ibc/5_IBC_DESIGN_PATTERNS.md b/ko/ibc/5_IBC_DESIGN_PATTERNS.md new file mode 100644 index 000000000..1bf5190a1 --- /dev/null +++ b/ko/ibc/5_IBC_DESIGN_PATTERNS.md @@ -0,0 +1,45 @@ +# 5 : IBC 디자인 패턴 + +**인터 블록 체인 통신 프로토콜 사양에서 사용되는 디자인 패턴에 대한 설명입니다.** + +**IBC 사양에 사용되는 용어에 대한 정의는 [여기를](./1_IBC_TERMINOLOGY.md) 참조 하십시오.** + +**아키텍처 개요는 [여기를](./2_IBC_ARCHITECTURE.md) 참조 하십시오.** + +**광범위한 프로토콜 설계 원칙에 대해서는 [여기를](./3_IBC_DESIGN_PRINCIPLES.md) 참조 하십시오.** + +**사용 사례의 예는 [여기를](./4_IBC_USECASES.md) 참조 하십시오.** + +## 계산(computation) 대신 검증(verification) + +분산 원장에서 계산은 비용이 많이 듭니다. IBC 핸들러에서 수행되는 계산은 모든 전체 노드에 복제되어야합니다. 따라서 계산을 수행하는 대신 계산 결과를 단순히 *검증*할 수 있는 경우 IBC 핸들러는 이를 수행하고, 필요에 따라 추가 매개 변수를 요구해야합니다. + + 어떤 경우에는 비용 차이가 없습니다. 예를 들어 두 숫자를 더하는 것과 두 숫자의 합을 특정 값과 비교하는 것은 모두 한 번의 덧셈만을 필요로 하기 때문에 비용 차이가 없습니다. 이런 경우 IBC 핸들러는 더 간단한 작업을 수행하도록 선택합니다. + + 그러나 다른 경우에는 계산을 수행하는 것이 훨씬 비용이 많이 들 수 있습니다. 예를 들어, 연결 및 채널 식별자는 고유하게 생성되어야합니다. 이것은 의사 난수 식별자를 생성하기 위해 새로운 채널이 생성 될 때 초기 상태와 nonce를 합쳐서 해싱하는 IBC 핸들러에 의해 구현 될 수 있습니다. 하지만, 체인 내에서(on-chian) 해시 함수를 계산해야하므로 비용이 많이 듭니다. 이 방법 대신, IBC 핸들러는 랜덤 식별자 생성을 체인 밖에서(off-chain) 수행해야하며 새로운 채널 생성 시도가 이전에 예약 된 식별자를 사용하지 않는지 확인하는 것만 해야합니다. + +## 호출 리시버(Call receievr) + +IBC 핸들러 기능의 핵심은 동일한 머신에서 실행중인 다른 모듈에 대한 인터페이스이므로 패킷 전송 요청을 수락하고 수신 패킷을 모듈로 라우팅 할 수 있습니다. 호스트 상태 머신에 부과되는 구현 복잡성 및 요구 사항을 줄이려면 인터페이스가 가능한 한 최소화되어야합니다. + +이러한 이유로 코어 IBC 로직은 직관적인 데이터 흐름과 약간 다른 수신 전용 호출 패턴을 사용합니다. 누군가는 예상했겠지만, 모듈은 IBC 핸들러를 호출하여 연결, 채널을 생성하고 패킷을 보냅니다. 그러나 IBC 핸들러 대신 다른 체인에서 패킷을 수신하고 적절한 모듈을 선택하여 호출하면 모듈 자체는 IBC 핸들러에서 `recvPacket` 을 호출해야합니다 (채널 생성 핸드 셰이크 승인과 동일). `recvPacket` 이 호출되면 IBC 핸들러는 호출 모듈이 패킷을 수신 및 처리 할 수 있는지 (포함 된 증명 및 알려진 연결 / 채널 상태에 기반하여) 확인하고, 적절한 상태 업데이트 (replay를 방지하기 위해 시퀀스 번호 증가)를 수행하고, 모듈 컨트롤로 돌아가거나 에러를 발생시킵니다. IBC 핸들러는 모듈을 절대 직접 호출하지 않습니다. + +비록 처음에는 직관적이지 않지만, 이 패턴에는 몇 가지 주목할만한 장점이 있습니다. + +- IBC 핸들러는 다른 모듈을 호출하거나 참조를 저장하는 방법을 이해할 필요가 없으므로 호스트 상태 머신의 요구 사항을 최소화합니다. +- 핸들러 상태로 모듈 lookup 테이블을 관리 할 필요가 없습니다. +- 모듈 리턴 데이터 혹은 실패에 대해서 처리 할 필요가 없습니다. 모듈이 패킷을 수신하지 않으려는 경우 (아마도 추가 인증을 구현 한 경우) 단순히 `recvPacket` 호출하지 않습니다. 라우팅 로직이 IBC 핸들러에서 구현 된 경우 핸들러는 모듈의 장애를 처리해야하므로 해석하기가 까다 롭습니다. + +또 한 가지 주목할만한 단점이 있습니다. + +- 추가적인 추상화가 없으면 오프 체인 Relayer 프로세스가 패킷을 보낼 수있는 시점을 결정하기 위해 여러 모듈의 상태를 추적해야하므로 Relayer 로직이 더욱 복잡해집니다. + +이러한 이유로, 호출 디스패치 인터페이스를 제공하는 "라우팅 모듈"이라는 추가 IBC가 있습니다. + +## 호출 디스패치(Call dispatch) + +일반적인 중계 패턴(relay pattern)의 경우, 모듈 디스패치 테이블을 유지하고 Relayer의 작업을 단순화하는 "IBC 라우팅 모듈"을 구현할 수 있습니다. + +호출 디스패치 패턴에서, 데이터그램 (호스트 상태 머신에 의해 정의 된 트랜잭션 유형 내에 포함됨)은 라우팅 모듈로 직접 중계 된 다음 적절한 모듈 (데이터그램이 전송 된 채널 및 포트 가진 모듈)을 찾고 적절한 기능(이전에 라우팅 모듈에 등록되어 있어야 함)을 호출합니다 . 이를 통해 모듈은 데이터그램을 직접 처리하는 것을 피할 수 있으며, 패킷을 보내거나 받는 것과 관련하여 발생해야하는 원자 상태 전이 실행(atomic state transition execution)을 우연히 망치는 것을 어렵게 만듭니다 (모듈은 패킷을 직접 처리하지 않고 유효한 패킷을 수신하면 라우팅 모듈에 의해 호출되는 함수만 제공하기 때문에). + +또한 라우팅 모듈은 핸드 셰이크 데이터그램 처리를위한 기본 로직 (모듈 대신 수신 핸드 셰이크 허용)을 구현할 수 있으며, 이는 고유한 커스텀 로직을 구현할 필요가 없는 모듈에 편리합니다. diff --git a/ko/ibc/README.md b/ko/ibc/README.md new file mode 100644 index 000000000..ba3e53335 --- /dev/null +++ b/ko/ibc/README.md @@ -0,0 +1,13 @@ +# 인터블록체인 통신 프로토콜 (IBC, Inter-blockchain Communication) + +*블록체인 간 통신 프로토콜*은 신뢰할 수 있고 안전한 모듈간 통신 프로토콜이며, 여기서 모듈은 독립적인 분산형 원장(블록체인 이라고도 함)에서 실행되는 결정론적 프로세스입니다. IBC는 안정적이고 안전한 인터체인 통신을 기반으로하는 모든 application에서 사용할 수 있습니다. application의 예로는 cross-chain asset transfer, atomic swap, multi-chain 스마트 컨트랙트 (mutually comprehensible한 VM의 유무에 상관없이) 와 다양한 종류의 데이터 및 코드 샤딩이 있습니다. + +IBC 프로토콜에 대한 개요는 다음 문서를 번호순으로 읽으십시오. + +1. [IBC Terminology](./1_IBC_TERMINOLOGY.md) +2. [IBC Architecture](./2_IBC_ARCHITECTURE.md) +3. [IBC Design Principles](./3_IBC_DESIGN_PRINCIPLES.md) +4. [IBC Usecases](./4_IBC_USECASES.md) +5. [IBC Design Patterns](./5_IBC_DESIGN_PATTERNS.md) + +만약 관심 있다면, [research compilation](./RESEARCH.md)도 보십시오. diff --git a/ko/ibc/RESEARCH.md b/ko/ibc/RESEARCH.md new file mode 100644 index 000000000..d77c57758 --- /dev/null +++ b/ko/ibc/RESEARCH.md @@ -0,0 +1,5 @@ +# 관련 연구 + +## 멀티체인 라우팅(Multi-chain routing) & 상태 변화 원자성 + +- [Anonymous Multi-Hop Locks for Blockchain Scalability and Interoperability](https://eprint.iacr.org/2018/472.pdf) - 라이트닝 네트워크(lightning network)을 다루지만 관련 있는 연구 diff --git a/ko/spec/ics-001-ics-standard/README.md b/ko/spec/ics-001-ics-standard/README.md new file mode 100644 index 000000000..208da61c9 --- /dev/null +++ b/ko/spec/ics-001-ics-standard/README.md @@ -0,0 +1,152 @@ +--- +ics: '1' +title: ICS 사양 표준 +stage: 초안 +category: meta +author: Christopher Goes +created: '2019-02-12' +modified: '2019-08-25' +--- + +## ICS 란 무엇인가? + +인터체인 표준(Inter-chain standard, ICS)은 어떤 프로토콜, 표준, 또는 코스모스 생태계가 사용될 것이라고 기대되는 기능들을 설명하는 설계 문서입니다. ICS는 필요한 요소들을 나열하고, 설계 근거를 설명하며, 간결하고 포괄적인 기술적인 사양을 제공해야 합니다. ICS 저자는 표준화 프로세스를 통해 제안하고, 커뮤니티의 지원이나 리뷰를 요청하며, 사회적 합의를 위해 관련된 이해 관계자와 의사소통을 해야합니다. + +인터 체인 표준화 프로세스는 생태계 전반의 프로토콜과 변화, 특징을 제안하는 주요 수단이 되어야 하며, ICS 문서들은 합의 후에도 향후 구현자를 위해 설계 결정사항과 각종 정보들을 유지해야 합니다. + +인터체인 표준은 코스모스 허브와 같은 특정 블록체인의 변경을 제안하거나, 구현상에 있어서의 특징들(언어 별 데이터 구조 등) 또는 이미 존재하는 Cosmos 블록체인의 거버넌스 제안을 위해 사용되어서는 안됩니다. 이는 코스모스 생태계에 있는 개별 블록체인들이 인터체인 표준을 사용할지 말지를 정할 거버넌스를 이용할 수 있음에도 제한됩니다. + +## 구성요소 + +ICS는 헤더, 개요, 명세, 히스토리 로그, 저작권 공시로 구성됩니다. 이 구성요소는 필수로 작성해야 합니다. 레퍼런스는 링크 형태나, 필요시 하단의 표 형태로 반드시 포함돼야 합니다. + +### 헤더 + +ICS 헤더는 관련된 메타데이터를 포함합니다. + +#### 필수 필드 + +`ics: #` - ICS 번호 (순차적으로 할당됩니다.) + +`title` - ICS 제목 (짧고 명료하게 표현해야 합니다.) + +`stage` - 현재 ICS 단계를 나타내며, 사용할 수 있는 단계들은 [PROCESS.md](../../PROCESS.md) 에서 확인할 수 있습니다. + +ICS의 승인 단계들에 대한 설명은 [README.md](../../README.md)을 참조하십시오. + +`category` - ICS 카테고리, 다음 중 하나입니다: + +- `meta` - ICS 절차와 관련된 표준 +- `IBC/TAO` - 블록체인간 통신에서의 전송, 인증, 순서 정렬과 같은 코어 시스템 단 프로토콜에 대한 표준 +- `IBC/APP` - 블록체인간 통신 시스템 어플리케이션 레이어 프로토콜 표준 + +`author` - ICS 저자 & 연락 정보 (선호 순서 : 이메일, Github, Twitter, 기타 응답을 요구할 수 있는 연락 방법). +제 1 저자는 기본적으로 ICS의 "소유자(owner)"이고, 표준화 과정을 통해 발전시켜야 할 책임이 있습니다. 이어지는 저자들의 순서는 기여한 양에 따라 정해져야 합니다. + +`created` - ICS가 처음 만들어진 날짜 (`YYYY-MM-DD`) + +`modified` - ICS가 마지막으로 수정된 날짜 (`YYYY-MM-DD`) + +#### 선택적 필드 + +`requires` - 이 표준에서 요구하거나 의존하는 다른 ICS 표준(번호에 의해 참조됩니다.) + +`required-by` - 이 표준을 요구하는 다른 ICS 표준 (번호에 의해 참조됩니다.) + +`replaces` - 해당되는 경우, 이 표준으로 대체되는 다른 ICS 표준 + +`replaced-by` - 해당되는 경우, 이 표준을 대체하는 다른 ICS 표준 + +### 개요 (Synopsis) + +개요는 헤더에 이어지며, ICS는 반드시 명세에 대한 높은 수준의 설명과 논리적 근거를 제공하는 200자 이내의 간략한 개요를 포함해야 합니다. + +### 명세 + +명세는 ICS의 가장 중요한 구성요소이고, 프로토콜 문서, 설계의 논리적 근거, 필요한 레퍼런스, 그리고 적절한 기술 내용들을 포함해야 합니다. + +#### 하위 구성요소 (Sub-components) + +명세는 특정 ICS에 적합한 여러 종류의 하위 구성요소를 가질 수 있습니다. 포함되는 하위 구성요소는 아래 순서대로 나열돼야 합니다. + +- *Motivation* - 제안한 기능의 존재 여부, 혹은 기능 변경 제안에 대한 논리적 근거 +- *Definitions* - 이 ICS에서 사용되거나 이를 이해하기 위해 필요한 새로운 용어 또는 개념 목록. 가장 상위 docs 폴더에서 정의되지 않은 용어들은 반드시 이 항목에서 정의되어야 합니다. +- *Desired Properties* - 명세된 프로토콜 또는 기능이 원하는 속성, 그리고 기대 효과나 속성이 위반되었을 경우 발생하는 실패에 대한 목록입니다. +- *Technical Specification* - 구문, 시맨틱, 하위 프로토콜, 자료구조, 알고리즘과 적절한 의사코드를 포함하는 모든 기술적인 내용입니다. 기술 명세는 서로 의존하지 않는 분리된 구현체들이 호환될 수 있도록 충분히 상세해야 합니다. +- *Backwards Compatibility* - 이전의 기능 또는 프로토콜 버전과의 호환성(또는 비호환성)에 대한 설명 +- *Forwards Compatibility* - 앞으로 구현할 예정이거나 기대되는 기능, 또는 프로토콜 버전과의 호환성(또는 비호환성)에 대한 설명 +- *Example Implementation* - 구현자들에게 주요 참고 자료로 이용할 수 있는 자세한 구현 예제 또는 설명 +- *Other Implementations* - 제작중이거나 완성된 구현체들의 목록(외부 참조) + +### 히스토리 (History) + +ICS는 히스토리 항목을 포함하며, 도움이되는 문서들과 중요한 변화들에 대한 로그들을 기록합니다. + +히스토리 항목의 예제는 [아래](#history-1)를 참조하세요. + +### 저작권 (Copyright) + +ICS는 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0)를 통해 권리를 포기하는 저작권 항목을 포함해야 합니다. + +## 서식 (Formatting) + +### 일반 + +ICS 명세는 반드시 GitHub과 호환 가능한 Markdown 으로 작성되어야 합니다. + +Github와 호환 가능한 Markdown cheat sheet는 [여기](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)를 참조하세요. 로컬 Markdown 렌더러의 대한 내용은 [여기](https://github.com/joeyespo/grip)를 참조하세요. + +### 언어 + +ICS 명세는 반드시 간단한 영어로 작성되어야 하며, 모호한 용어와 불필요한 전문용어는 지양해야 합니다. 간단한 영어의 좋은 예제는, [Simple English Wikipedia](https://simple.wikipedia.org/wiki/Main_Page)를 참조하세요. + +명세에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 그리고 "OPTIONAL" 와 같은 단어들은 [RFC 2119](https://tools.ietf.org/html/rfc2119)에서 설명된 대로 해석됩니다. + +### 의사코드 (Pseudocode) + +명세에서의 의사코드는 언어에 구애받지 않아야 하며, 줄 수, 변수, 간단한 조건문, 반복문, 또는 스케줄링 타임아웃과 같이 기능에 대한 설명이 필요한 부분은 작은 영어 문단으로 표현하는 것과 같이 간단한 표준 형태여야 합니다. LaTeX 이미지는 diff 형태로 리뷰하기 어렵기 때문에 피해야 합니다. + +구조체에 대한 의사코드는 간단한 TypeScript를 이용하여, 인터페이스로 작성되어야 합니다. + +구조체 의사코드 예제: + +```typescript +interface Connection { + state: ConnectionState + version: Version + counterpartyIdentifier: Identifier + consensusState: ConsensusState +} +``` + +알고리즘에 대한 의사코드는 간단한 Typescript를 이용하여, 함수로 작성되어야 합니다. + +알고리즘 의사코드의 예제: + +```typescript +function startRound(round) { + round_p = round + step_p = PROPOSE + if (proposer(h_p, round_p) === p) { + if (validValue_p !== nil) + proposal = validValue_p + else + proposal = getValue() + broadcast( {PROPOSAL, h_p, round_p, proposal, validRound} ) + } else + schedule(onTimeoutPropose(h_p, round_p), timeoutPropose(round_p)) +} +``` + +## 히스토리 + +이 명세는 Bitcoin의 BIP 프로세스와 Python의 PEP 프로세스에서 파생된 이더리움의 [EIP 1](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1.md)에서 크게 영감을 얻었습니다. 이전 저자들은 이 ICS 명세나 절차의 부족함에 대해 책임이 없습니다. 모든 코멘트는 ICS 레포지토리 관리자에게 보내주세요. + +2019년 3월 4일: 초안 작성 및 PR로 제출 +2019년 3월 7일: 초안 병합 +2019년 4월 11일: 의사 코드 포맷팅 업데이트, 하위 섹션 정의 추가 +2019년 4월 17일: 카테고리 분류 + +## 저작권 + +여기의 모든 내용들은 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0)에 따라 라이센스가 부여됩니다. diff --git a/ko/spec/ics-005-port-allocation/README.md b/ko/spec/ics-005-port-allocation/README.md new file mode 100644 index 000000000..5cb20a5a6 --- /dev/null +++ b/ko/spec/ics-005-port-allocation/README.md @@ -0,0 +1,209 @@ +--- +ics: '5' +title: 포트 할당 +stage: 초안 +requires: '24' +required-by: '4' +category: IBC/TAO +author: Christopher Goes +created: '2019-06-20' +modified: '2019-08-25' +--- + +## 개요 + +이 표준은 IBC 핸들러에 의해 할당된 고유한 이름의 포트에 모듈을 바인딩 할 수 있는 포트 할당 시스템에 관한 설명입니니다. 이렇게 할당된 포트들은 채널을 여는데 사용될 수 있으며, 바인딩된 모듈에 의해 포트는 소유권이 이전되거나 나중에 해제될 수 있습니다. + +### 의도 + +블록체인 간 통신 프로토콜은 모듈 간 트래픽을 촉진하도록 설계되었습니다. 여기서 모듈은 독립적이며 상호 신뢰할 수 없으며, 독립된 원장(sovereign ledger)에서 실행되는 독립적인 코드 요소입니다. IBC에서 요구되는 종단간 시멘틱(semantics)을 제공하려면 IBC 핸들러가 특정 모듈에 대한 채널을 허용해야합니다. +이 사양은 해당 모델을 실행하는 *포트 할당 및 소유권* 시스템을 정의합니다. + +대체 가능한(fungible) 토큰 처리를 위한 "뱅크" 또는 체인 간 담보를 위한 "스테이킹"과 같이 특정 포트 이름에 어떤 종류의 모듈 로직이 바인딩되어 있는지에 대한 규칙이 나타날 수 있습니다. +이는 HTTP 서버에서 포트 80의 일반적인 사용과 유사합니다. - 프로토콜은 특정 모듈 로직이 실제로 기존 포트에 바인딩 되도록 강제할 수 없으므로 사용자 스스로 확인해야합니다. 임시 프로토콜 처리를 위해 의사 난수 식별자가 있는 임시 포트를 만들 수 있습니다. + +모듈은 여러 개의 포트에 바인딩될 수 있으며 별도의 머신에 존재하는 다른 모듈에 의해 바인딩된 여러 개의 포트에 연결될 수 있습니다. 여러 (고유하게 식별된) 채널들이 동시에 하나의 포트를 사용할 수 있습니다. 채널은 두 포트 사이에서 종단 간이며, 각각의 포트는 모듈에 의해 먼저 바인딩되어 있어야 하며, 채널의 끝을 제어합니다. + +호스트 상태 머신은 포트에 바인딩할 수 있는 기능 키(capability key)를 생성함으로써, 특별한 권한이 부여된 모듈 관리자에게만 포트 바인딩을 선택적으로 노출하도록 할 수 있습니다. 그런 다음 모듈 관리자는 사용자 정의 규칙에 의해 어떤 포트가 어떤 모듈로 바인딩 할 수 있는지를 제어할 수 있고, 포트 이름 및 모듈의 유효성 검사가 된 경우에만 포트를 모듈로 전송할 수 있습니다. 이 역할은 라우팅 모듈에서 수행할 수 있습니다 ( [ICS 26](../ics-026-routing-module) 참조). + +### 정의 + +`Identifier` , `get` , `set` 및 `delete`는 [ICS 24](../ics-024-host-requirements)에서 정의하고 있습니다. + +*포트*는 채널 열기 및 모듈 사용을 허용하는데 사용되는 특별한 종류의 식별자입니다. + +*모듈*은 IBC 핸들러와 무관한 호스트 상태 머신의 하위 구성 요소입니다. 모듈의 예로는 Ethereum 스마트 컨트랙트 및 Cosmos SDK & Substrate 모듈 등이 있습니다. IBC 사양은 호스트 상태 머신이 오브젝트 기능(object-capability) 또는 출발지 인증(source authentication)을 사용하여 모듈에 포트에 대한 권한을 부여하는 것 이외의 모듈 기능을 가정하지 않습니다. + +### 지향 속성 + +- 일단 모듈이 포트에 바인딩되면 해당 모듈이 스스로 해제하기 전까지 다른 모듈들은 해당 포트를 사용할 수 없습니다. +- 모듈은 옵션에 따라 포트를 해제하거나 다른 모듈로 소유권을 이전할 수 있습니다. +- 하나의 모듈은 여러 포트에 한 번에 바인딩될 수 있습니다. +- 포트들은 선착순으로 할당되며, 알려진 모듈에 대한 "예약된" 포트들은 체인이 처음 시작될 때 바인딩될 수 있습니다. + +유용한 비교로서, 다음과 같은 TCP와의 비교가 있으며 이는 대략 정확합니다: + +IBC 컨셉 | TCP/IP 컨셉 | 차이점 +--- | --- | --- +IBC | TCP | 많음, IBC를 설명하는 아키텍처 문서를 참조하세요 +포트 (예시. "은행") | 포트 (예시. 80) | 낮은 숫자의 예약된 포트는 없으며, 포트들은 문자열입니다. +모듈 (예시. "은행") | 응용 프로그램 (예시. Nginx) | 응용 프로그램 별로 다릅니다 +클라이언트 | - | 직접적인 비교할 수 있는 부분 없음, L2 라우팅 또는 TLS와 유사합니다 +커넥션 | - | 직접적인 비교할 수 있는 부분 없음, TCP의 Connection들에 포함됩니다. +채널 | 커넥션 | 여러 채널을 동시에 포트로부터 열거나 포트로 열 수 있습니다 + +## 기술 사양 + +### 자료 구조 + +호스트 상태 머신은 모듈에 대한 (1) 오브젝트 기능(object-capability) 또는 (2) 출발지 인증(source authentication)을 지원해야 합니다. + +(1) 오브젝트 기능(object-capability)의 경우, IBC 핸들러는 *오브젝트 기능(object-capability)*과 모듈로 전달 될 수 있으며 다른 모듈에서는 복제 할 수 없는 고유하고 불투명한 참조를 생성할 수 있어야 합니다. 각각의 예는 Cosmos SDK에서 사용되는 저장소 키 ( [참조](https://github.com/cosmos/cosmos-sdk/blob/master/store/types/store.go#L224) )와 Agoric의 Javascript 런타임 ( [reference](https://github.com/Agoric/SwingSet) )에서 사용되는 객체 참조입니다. + +```typescript +type CapabilityKey object +``` + +```typescript +function newCapabilityPath(): CapabilityKey { + // provided by host state machine, e.g. pointer address in Cosmos SDK +} +``` + +(2) 출발지 인증(source authentication)의 경우, IBC 핸들러는 호출하는 모듈의 *출발지 식별자(source identifier)*와 모듈에 의해 변경되거나 다른 모듈에 의해 위조 될 수 없는 호스트 상태 머신의 각 모듈에 대한 고유한 문자열을 안전하게 읽을 수 있어야합니다. 예시로는 Ethereum에서 사용되는 스마트 컨트랙트 주소 ( [reference](https://ethereum.github.io/yellowpaper/paper.pdf) )가 있습니다. + +```typescript +type SourceIdentifier string +``` + +```typescript +function callingModuleIdentifier(): SourceIdentifier { + // provided by host state machine, e.g. contract address in Ethereum +} +``` + +`generate` 및 `authenticate` 함수는 다음과 같이 정의됩니다. + +(1) 오브젝트 기능(object-capability)의 경우, `generate` 함수는 외부 계층 함수에 의해 반환되어야 하는 새로운 오브젝트 기능(object-capability)키를 리턴해야 하며, 그리고 `authenticate` 함수는 외부 계층 함수에서 호스트 상태 머신에 의해 고유성이 강화된 오브젝트 기능(object-capability)키인 `capability`를 추가 인자로 받을 것을 요구합니다. 외부 계층 함수들은 IBC 핸들러 ( [ICS 25](../ics-025-handler-interface) ) 또는 라우팅 모듈 ( [ICS 26](../ics-026-routing-module) )에 의해 모듈로 노출되는 함수들입니다. + +``` +function generate(): CapabilityKey { + return newCapabilityPath() +} +``` + +``` +function authenticate(key: CapabilityKey): boolean { + return capability === key +} +``` + +(2) 출발지 인증(source authentication)의 경우, `generate` 함수는 호출 모듈의 식별자를 반환하고 `authenticate` 함수는 단순히 그것을 확인합니다. + +``` +function generate(): SourceIdentifier { + return callingModuleIdentifier() +} +``` + +``` +function authenticate(id: SourceIdentifier): boolean { + return callingModuleIdentifier() === id +} +``` + +#### 저장 경로 + +`portPath` 는 `Identifier` 를 가져 와서 포트와 연관된 오브젝트 기능(object-capability) 참조 또는 소유자 모듈 식별자가 저장될 저장소 경로를 반환합니다. + +```typescript +function portPath(id: Identifier): Path { + return "ports/{id}" +} +``` + +### 하위 프로토콜 + +#### 식별자 검증 + +포트의 소유자 모듈 식별자는 고유한 `Identifier` 접두사 아래 저장됩니다. +검증 함수인 `validatePortIdentifier` 가 제공될 수 있습니다. + +```typescript +type validatePortIdentifier = (id: Identifier) => boolean +``` + +검증 함수가 제공되지 않으면, 기본적으로 `validatePortIdentifier` 함수가 항상 `true`를 반환합니다. + +#### 포트 바인딩 + +IBC 핸들러는 반드시 `bindPort` 구현하고 있어야 합니다. `bindPort` 는 할당되지 않은 포트를 찾아 바인딩하며, 포트가 이미 할당되어 있는 경우에는 실패하게 됩니다. + +호스트 상태 머신이 포트 할당을 제어하기 위해 특수 모듈 관리자를 구현하지 않으면 모든 모듈에서 `bindPort` 함수를 사용할 수 있어야 합니다. 이 경우, `bindPort` 는 모듈 관리자만 호출할 수 있어야 합니다. + +```typescript +function bindPort(id: Identifier) { + abortTransactionUnless(validatePortIdentifier(id)) + abortTransactionUnless(privateStore.get(portPath(id)) === null) + key = generate() + privateStore.set(portPath(id), key) + return key +} +``` + +#### 포트 소유권 이전 + +호스트 상태 머신이 객체 기능(object-capabilities)을 지원하는 경우, 포트 참조가 운반 기능(bearer capability)이므로 추가 프로토콜이 필요하지 않습니다. 그렇지 않은 경우 IBC 핸들러는 다음 `transferPort` 함수를 구현할 수 있습니다. + +모든 모듈에서 `transferPort`를 사용할 수 있어야 합니다. + +```typescript +function transferPort(id: Identifier) { + abortTransactionUnless(authenticate(privateStore.get(portPath(id)))) + key = generate() + privateStore.set(portPath(id), key) +} +``` + +#### 포트 해제 + +IBC 핸들러는 `releasePort` 함수를 구현해야하며, 이를 통해 모듈은 다른 모듈이 해당 포트에 바인딩될 수 있도록 포트를 해제할 수 있습니다. + +모든 모듈에서 `releasePort`는 사용할 수 있어야 합니다. + +> 경고 : 포트를 해제하면 다른 모듈이 해당 포트에 바인딩되어 들어오는 채널 오프닝 핸드셰이크를 가로챌 수 있습니다. 모듈은 안전한 경우에만 포트를 해제해야 합니다. + +```typescript +function releasePort(id: Identifier) { + abortTransactionUnless(authenticate(privateStore.get(portPath(id)))) + privateStore.delete(portPath(id)) +} +``` + +### 속성 및 불변량 + +- 기본적으로 포트 식별자는 선착순입니다. 일단 모듈이 포트에 바인딩되면 모듈이 포트의 소유권을 이전하거나 해제할 때까지 해당 모듈만 포트를 활용할 수 있습니다. 모듈 관리자는 이를 재정의(override)하는 커스텀 로직을 구현할 수 있습니다. + +## 하위 호환성 + +적용되지 않습니다. + +## 상위 호환성 + +포트 바인딩은 유선 프로토콜이 아니므로 소유권 의미(semantics)가 영향을 받지 않는 한 인터페이스가 별도의 체인에서 독립적으로 변경 될 수 있습니다. + +## 구현 예제 + +곧 게시될 예정입니다. + +## 다른 구현 + +곧 게시될 예정입니다. + +## 히스토리 + +2019년 6월 29일 - 초안 + +## 저작권 + +이 게시물의 모든 내용은 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) 라이센스에 의해 보호받습니다. diff --git a/ko/spec/ics-025-handler-interface/README.md b/ko/spec/ics-025-handler-interface/README.md new file mode 100644 index 000000000..d12675585 --- /dev/null +++ b/ko/spec/ics-025-handler-interface/README.md @@ -0,0 +1,89 @@ +--- +ics: '25' +title: 핸들러 인터페이스 +stage: 초안 +category: IBC/TAO +requires: 2, 3, 4, 23, 24 +author: Christopher Goes +created: '2019-04-23' +modified: '2019-08-25' +--- + +## 개요 + +이 문서는 동일한 상태 머신 내의 모듈들에 대한 표준 IBC 구현 (IBC 핸들러라고 함)에 의해 노출되는 인터페이스와 해당 인터페이스의 구현에 대해 설명합니다. + +### 동기 + +IBC는 모듈 간 통신 프로토콜로, 별도의 블록체인에서 모듈간에 신뢰할 수 있고 인증 된 메시지 전달을 용이하게 하도록 설계되었습니다. 모듈은 인터페이스를 안전하게 사용하기 위해 상호 작용하는 인터페이스와 준수해야하는 요구 사항에 대해 추론 할 수 있어야합니다. + +### 정의 + +관련된 정의들은 (함수들이 정의되어 있는) 이전 표준들에 정의되어 있습니다. + +### 요구 속성 + +- 클라이언트, 커넥션 및 채널들의 생성은 가능한 한 별도의 권한이 없이도 가능해야 합니다. +- 모듈의 집합은 동적이어야 합니다: 체인은 모듈을 추가 및 제거할 수 있어야 합니다. 모듈은 지속적으로 IBC 핸들러를 사용하여 포트에 바인딩하거나 포트에서 바인딩을 해제할 수 있습니다. +- 핸들러 모듈의 신뢰성을 위한 추가적인 약속(semantic) 혹은 보장(guarantee)을 제공하기 위해 IBC 위에 자체적으로 더 복잡한 추상화를 작성할 수 있어야 합니다. + +## 기술 사양 + +> 참고: 만약 호스트 상태머신이 obejct capability 인증([ICS 005](../ics-005-port-allocation) 참고)을 사용중이라면, 포트를 사용하는 모든 함수들은 추가적인 capability 키 매개변수를 사용합니다. + +### 클라이언트 생명주기 관리 + +기본적으로 클라이언트는 소유되지 않습니다. 어떤 모듈이던지 새로운 클라이언트를 생성하고, 기존 클라이언트를 쿼리하고, 기존 클라이언트를 업데이트하고, 사용하지 않는 어떤 기존 클라이언트도 삭제할 수 있습니다. + +[ICS 2](../ics-002-client-semantics)에 정의된대로 핸들러 인터페이스는 `createClient`, `updateClient`, `queryClientConsensusState`, `queryClient`와 `submitMisbehaviourToClient` 를 노출합니다. + +### 커넥션 생명주기 관리 + +[ICS 3](../ics-003-connection-semantics)에 정의된대로 핸들러 인터페이스는 `connOpenInit`, `connOpenTry`, `connOpenAck`, `connOpenConfirm`과 `queryConnection`을 노출합니다 . + +기본 IBC 라우팅 모듈 SHALL은 `connOpenTry`, `connOpenAck`와 `connOpenConfirm`으로의 외부 호출을 허용합니다. + +### 채널 생명주기 관리 + +기본적으로 채널은 채널을 만든 포트가 소유하게 됩니다. 즉, 해당 포트에 바인딩된 모듈만 채널을 검사, 종료 또는 전송을 할 수 있습니다. 모듈은 동일한 포트를 사용하여 여러 채널을 생성할 수 있습니다. + +[ICS 4](../ics-004-channel-and-packet-semantics)에 정의된대로 핸들러 인터페이스는 `chanOpenInit`, `chanOpenTry`, `chanOpenAck`, `chanOpenConfirm`, `chanCloseInit`, `chanCloseConfirm`과 `queryChannel`을 노출합니다. + +기본 IBC 라우팅 모듈 SHALL은 `chanOpenTry`, `chanOpenAck`, `chanOpenConfirm`과 `chanCloseConfirm`으로의 외부 호출을 허용합니다. + +### 패킷 중계 + +패킷들은 채널에 의해 허용됩니다 (오직 채널을 가지고 있는 포트만 송수신 가능). + +[ICS 4](../ics-004-channel-and-packet-semantics)에 정의된대로 핸들러 인터페이스는 `sendPacket`, `recvPacket`, `acknowledgePacket`, `timeoutPacket`, `timeoutOnClose`와 `cleanupPacket`을 노출합니다. + +기본 IBC 라우팅 모듈 SHALL은 `sendPacket`, `recvPacket`, `acknowledgePacket`, `timeoutPacket`, `timeoutOnClose`와 `cleanupPacket`으로의 외부 호출을 허용합니다. + +### 속성 및 불변량 + +여기에 정의된 IBC 핸들러 모듈 인터페이스는 연관된 스펙에 정의된 함수의 속성들을 상속받습니다. + +## 하위 호환성 + +적용되지 않습니다. + +## 상위 호환성 + +이 인터페이스는 시맨틱이 동일하게 유지되는 한 새 체인에서 구현되거나 기존 체인으로 업그레이드될 때 변경될 수 있습니다. + +## 구현 예제 + +곧 게시될 예정입니다. + +## 다른 구현 + +곧 게시될 예정입니다. + +## 히스토리 + +2019년 6월 9일 - 초안 작성 +2019년 8월 24일 - 개정, 정리 + +## 저작권 + +이 게시물의 모든 내용은 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) 라이센스에 의해 보호받습니다. diff --git a/ko/spec/ics-026-routing-module/README.md b/ko/spec/ics-026-routing-module/README.md new file mode 100644 index 000000000..fa397a1b1 --- /dev/null +++ b/ko/spec/ics-026-routing-module/README.md @@ -0,0 +1,689 @@ +--- +ics: '26' +title: 라우팅 모듈 +stage: 초안 +category: IBC/TAO +author: Christopher Goes +created: '2019-06-09' +modified: '2019-08-25' +--- + +## 개요 + +라우팅 모듈은 외부 데이터그램들을 수신하고 블록체인 간 통신 프로토콜 핸들러를 호출하여 핸드셰이크 및 패킷 중계를 처리하는 보조 모듈의 기본 구현입니다. +라우팅 모듈은 패킷을 수신할 때 모듈을 조회하고 호출하는데 사용할 수 있는 모듈의 룩업 테이블을 유지하므로 외부 relayer가 라우팅 모듈에 패킷을 중계만 하면 됩니다. + +### 동기 + +기본 IBC 핸들러는 포트 바인딩, 핸드셰이크 시작, 핸드셰이크 수락, 패킷 송수신 등을 위해 모듈이 개별적으로 IBC 핸들러를 호출해야 하는 수신자 호출(receiver call) 패턴을 사용합니다. 이 방법은 유연하고 간단하지만([디자인 패턴](../../ibc/5_IBC_DESIGN_PATTERNS.md)참고) 이해하기 약간 까다롭고 모듈의 상태를 추적해야 하는 relayer 프로세스 부분에서 추가 작업이 필요할 수 있습니다. 이 표준은 가장 일반적인 기능들을 자동화하고, 패킷들을 라우팅하며, relayer들의 작업을 단순화하는 IBC "라우팅 모듈"을 설명합니다. + +라우팅 모듈은 [ICS 5](../ics-005-port-allocation)에서 설명한대로 모듈 관리자로서의 역할을 수행할 수 있으며 모듈을 포트에 바인딩할 수 있는 시기와 해당 포트의 이름을 지정할 수 있는 로직을 구현할 수 있습니다. + +### 정의 + +IBC 핸들러 인터페이스가 제공하는 모든 함수들은 [ICS 25](../ics-025-handler-interface) 에서와 같이 정의됩니다. + +`generate` 및 `authenticate` 함수는 [ICS 5](../ics-005-port-allocation) 와 같이 정의됩니다. + +### 요구 속성 + +- 모듈들은 라우팅 모듈을 통해 포트 및 자체 채널에 바인딩할 수 있어야 합니다. +- 간접 호출(call indirection) 계층 이외의 패킷 송수신에는 오버헤드가 추가되어서는 안됩니다. +- 라우팅 모듈은 패킷을 처리할 때 지정된 핸들러 함수를 모듈에서 호출해야 합니다. + +## 기술 사양 + +> 참고: 만약 호스트 상태머신이 obejct capability 인증([ICS 005](../ics-005-port-allocation) 참고)을 사용중이라면, 포트를 사용하는 모든 함수들은 추가적인 capability 매개변수를 사용합니다. + +### 모듈 콜백 인터페이스 + +다양한 데이터그램들을 수신할 때 호출되는 모듈들은 다음과 같은 함수 시그니처들을 라우팅 모듈에 노출해야 합니다. + +```typescript +function onChanOpenInit( + order: ChannelOrder, + connectionHops: [Identifier], + portIdentifier: Identifier, + channelIdentifier: Identifier, + counterpartyPortIdentifier: Identifier, + counterpartyChannelIdentifier: Identifier, + version: string) { + // defined by the module +} + +function onChanOpenTry( + order: ChannelOrder, + connectionHops: [Identifier], + portIdentifier: Identifier, + channelIdentifier: Identifier, + counterpartyPortIdentifier: Identifier, + counterpartyChannelIdentifier: Identifier, + version: string, + counterpartyVersion: string) { + // defined by the module +} + +function onChanOpenAck( + portIdentifier: Identifier, + channelIdentifier: Identifier, + version: string) { + // defined by the module +} + +function onChanOpenConfirm( + portIdentifier: Identifier, + channelIdentifier: Identifier) { + // defined by the module +} + +function onChanCloseInit( + portIdentifier: Identifier, + channelIdentifier: Identifier) { + // defined by the module +} + +function onChanCloseConfirm( + portIdentifier: Identifier, + channelIdentifier: Identifier): void { + // defined by the module +} + +function onRecvPacket(packet: Packet): bytes { + // defined by the module, returns acknowledgement +} + +function onTimeoutPacket(packet: Packet) { + // defined by the module +} + +function onAcknowledgePacket(packet: Packet) { + // defined by the module +} + +function onTimeoutPacketClose(packet: Packet) { + // defined by the module +} +``` + +실패를 표시하고 핸드셰이크, 패킷 수신 등을 거부할 때는 반드시 예외가 발생해야 합니다. + +위에서 나열한 함수 시그니처들은 `ModuleCallbacks` 인터페이스에서 함께 결합됩니다: + +```typescript +interface ModuleCallbacks { + onChanOpenInit: onChanOpenInit, + onChanOpenTry: onChanOpenTry, + onChanOpenAck: onChanOpenAck, + onChanOpenConfirm: onChanOpenConfirm, + onChanCloseConfirm: onChanCloseConfirm + onRecvPacket: onRecvPacket + onTimeoutPacket: onTimeoutPacket + onAcknowledgePacket: onAcknowledgePacket, + onTimeoutPacketClose: onTimeoutPacketClose +} +``` + +콜백은 모듈이 포트에 바인딩될 때 호출됩니다. + +```typescript +function callbackPath(portIdentifier: Identifier): Path { + return "callbacks/{portIdentifier}" +} +``` + +콜백을 변경해야할 경우 향후 인증을 위해 호출 모듈 식별자도 저장됩니다. + +```typescript +function authenticationPath(portIdentifier: Identifier): Path { + return "authentication/{portIdentifier}" +} +``` + +### 모듈 매니저로서의 포트 바인딩 + +IBC 라우팅 모듈은 핸들러 모듈( [ICS 25](../ics-025-handler-interface) )과 호스트 상태 머신의 개별 모듈들 사이에 위치합니다. + +모듈 관리자 역할을 하는 라우팅 모듈은 두 종류의 포트를 구분합니다. + +- "기존 이름" 포트: "은행"과 같이 사전적으로 표준화된 의미를 갖고 있는 이름들은 선착순으로 지정할 수 있는 것이 아닙니다. +- "새로운 이름" 포트 : (스마트 컨트랙트와 같이) 이전과는 관계가 없는 새로운 존재, 새로운 랜덤 넘버 포트, 생성 후 포트 이름은 다른 채널을 통해 통신할 수 있습니다 + +라우팅 모듈이 호스트 상태 머신에 의해 인스턴스화되면 기존의 이름들의 집합이 해당 모듈과 함께 할당됩니다. +라우팅 모듈은 모듈별로 언제든지 새로운 포트를 할당할 수 있지만 특정 표준화된 접두사를 사용해야 합니다. + +`bindPort` 함수는 라우팅 모듈을 통해 포트에 바인딩하고 콜백을 설정하기 위해 모듈에 의해 호출될 수 있습니다. + +```typescript +function bindPort( + id: Identifier, + callbacks: Callbacks) { + abortTransactionUnless(privateStore.get(callbackPath(id)) === null) + handler.bindPort(id) + capability = generate() + privateStore.set(authenticationPath(id), capability) + privateStore.set(callbackPath(id), callbacks) +} +``` + +콜백을 변경하기 위해 모듈에서 `updatePort` 함수를 호출할 수 있습니다. + +```typescript +function updatePort( + id: Identifier, + newCallbacks: Callbacks) { + abortTransactionUnless(authenticate(privateStore.get(authenticationPath(id)))) + privateStore.set(callbackPath(id), newCallbacks) +} +``` + +`releasePort` 함수는 이전에 사용중인 포트를 해제하기 위해 모듈에 의해 호출 될 수 있습니다. + +> 경고 : 포트를 해제하면 다른 모듈이 해당 포트에 바인딩되어 들어오는 채널 오프닝 핸드셰이크를 가로챌 수 있습니다. 모듈은 안전한 경우에만 포트를 해제해야 합니다. + +```typescript +function releasePort(id: Identifier) { + abortTransactionUnless(authenticate(privateStore.get(authenticationPath(id)))) + handler.releasePort(id) + privateStore.delete(callbackPath(id)) + privateStore.delete(authenticationPath(id)) +} +``` + +라우팅 모듈은 특정 포트에 바인딩된 콜백을 조회하기 위해 `lookupModule` 함수를 사용할 수 있습니다. + +```typescript +function lookupModule(portId: Identifier) { + return privateStore.get(callbackPath(portId)) +} +``` + +### 데이터그램 핸들러 (쓰기) + +*데이터그램*은 라우팅 모듈에서 트랜잭션으로 허용되는 외부 데이터(대용량 바이너리 객체)입니다. 이 섹션은 각 데이터그램에 대한 *핸들러 함수*를 정의하며, 관련 데이터그램이 트랜잭션으로 라우팅 모듈에 제출될 때 실행됩니다. + +모든 데이터그램은 다른 모듈에 의해 라우팅 모듈로 안전하게 제출될 수 있습니다. + +명시적으로 표시된 것외의 메시지 서명이나 데이터 유효성 검사는 가정하고 있지 않습니다. + +#### 클라이언트 생명주기 관리 + +`ClientCreate` 는 지정된 식별자 및 합의 상태로 새 라이트 클라이언트를 만듭니다. + +```typescript +interface ClientCreate { + identifier: Identifier + type: ClientType + consensusState: ConsensusState +} +``` + +```typescript +function handleClientCreate(datagram: ClientCreate) { + handler.createClient(datagram.identifier, datagram.type, datagram.consensusState) +} +``` + +`ClientUpdate` 는 지정된 식별자 및 새 헤더로 기존 라이트 클라이언트를 업데이트합니다. + +```typescript +interface ClientUpdate { + identifier: Identifier + header: Header +} +``` + +```typescript +function handleClientUpdate(datagram: ClientUpdate) { + handler.updateClient(datagram.identifier, datagram.header) +} +``` + +`ClientSubmitMisbehaviour` 는 지정된 식별자를 사용하여 기존의 라이트 클라이언트에 허위 증명을 제출합니다. + +```typescript +interface ClientMisbehaviour { + identifier: Identifier + evidence: bytes +} +``` + +```typescript +function handleClientMisbehaviour(datagram: ClientUpdate) { + handler.submitMisbehaviourToClient(datagram.identifier, datagram.evidence) +} +``` + +#### 커넥션 생명주기 관리 + +`ConnOpenInit` 데이터그램은 다른 체인의 IBC 모듈과의 커넥션 핸드셰이크 프로세스를 시작합니다. + +```typescript +interface ConnOpenInit { + identifier: Identifier + desiredCounterpartyIdentifier: Identifier + clientIdentifier: Identifier + counterpartyClientIdentifier: Identifier + version: string +} +``` + +```typescript +function handleConnOpenInit(datagram: ConnOpenInit) { + handler.connOpenInit( + datagram.identifier, + datagram.desiredCounterpartyIdentifier, + datagram.clientIdentifier, + datagram.counterpartyClientIdentifier, + datagram.version + ) +} +``` + +`ConnOpenTry` 데이터그램은 다른 체인의 IBC 모듈에서 핸드셰이크 요청을 수락합니다. + +```typescript +interface ConnOpenTry { + desiredIdentifier: Identifier + counterpartyConnectionIdentifier: Identifier + counterpartyClientIdentifier: Identifier + clientIdentifier: Identifier + version: string + counterpartyVersion: string + proofInit: CommitmentProof + proofHeight: uint64 + consensusHeight: uint64 +} +``` + +```typescript +function handleConnOpenTry(datagram: ConnOpenTry) { + handler.connOpenTry( + datagram.desiredIdentifier, + datagram.counterpartyConnectionIdentifier, + datagram.counterpartyClientIdentifier, + datagram.clientIdentifier, + datagram.version, + datagram.counterpartyVersion, + datagram.proofInit, + datagram.proofHeight, + datagram.consensusHeight + ) +} +``` + +`ConnOpenAck` 데이터그램은 다른 체인의 IBC 모듈이 핸드셰이크를 수락했음을 확인합니다. + +```typescript +interface ConnOpenAck { + identifier: Identifier + version: string + proofTry: CommitmentProof + proofHeight: uint64 + consensusHeight: uint64 +} +``` + +```typescript +function handleConnOpenAck(datagram: ConnOpenAck) { + handler.connOpenAck( + datagram.identifier, + datagram.version, + datagram.proofTry, + datagram.proofHeight, + datagram.consensusHeight + ) +} +``` + +`ConnOpenConfirm` 데이터그램은 다른 체인의 IBC 모듈에 의한 핸드셰이크 수락을 인지하고 연결을 마무리합니다. + +```typescript +interface ConnOpenConfirm { + identifier: Identifier + proofAck: CommitmentProof + proofHeight: uint64 +} +``` + +```typescript +function handleConnOpenConfirm(datagram: ConnOpenConfirm) { + handler.connOpenConfirm( + datagram.identifier, + datagram.proofAck, + datagram.proofHeight + ) +} +``` + +#### 채널 생명주기 관리 + +```typescript +interface ChanOpenInit { + order: ChannelOrder + connectionHops: [Identifier] + portIdentifier: Identifier + channelIdentifier: Identifier + counterpartyPortIdentifier: Identifier + counterpartyChannelIdentifier: Identifier + version: string +} +``` + +```typescript +function handleChanOpenInit(datagram: ChanOpenInit) { + module = lookupModule(datagram.portIdentifier) + module.onChanOpenInit( + datagram.order, + datagram.connectionHops, + datagram.portIdentifier, + datagram.channelIdentifier, + datagram.counterpartyPortIdentifier, + datagram.counterpartyChannelIdentifier, + datagram.version + ) + handler.chanOpenInit( + datagram.order, + datagram.connectionHops, + datagram.portIdentifier, + datagram.channelIdentifier, + datagram.counterpartyPortIdentifier, + datagram.counterpartyChannelIdentifier, + datagram.version + ) +} +``` + +```typescript +interface ChanOpenTry { + order: ChannelOrder + connectionHops: [Identifier] + portIdentifier: Identifier + channelIdentifier: Identifier + counterpartyPortIdentifier: Identifier + counterpartyChannelIdentifier: Identifier + version: string + counterpartyVersion: string + proofInit: CommitmentProof + proofHeight: uint64 +} +``` + +```typescript +function handleChanOpenTry(datagram: ChanOpenTry) { + module = lookupModule(datagram.portIdentifier) + module.onChanOpenTry( + datagram.order, + datagram.connectionHops, + datagram.portIdentifier, + datagram.channelIdentifier, + datagram.counterpartyPortIdentifier, + datagram.counterpartyChannelIdentifier, + datagram.version, + datagram.counterpartyVersion + ) + handler.chanOpenTry( + datagram.order, + datagram.connectionHops, + datagram.portIdentifier, + datagram.channelIdentifier, + datagram.counterpartyPortIdentifier, + datagram.counterpartyChannelIdentifier, + datagram.version, + datagram.counterpartyVersion, + datagram.proofInit, + datagram.proofHeight + ) +} +``` + +```typescript +interface ChanOpenAck { + portIdentifier: Identifier + channelIdentifier: Identifier + version: string + proofTry: CommitmentProof + proofHeight: uint64 +} +``` + +```typescript +function handleChanOpenAck(datagram: ChanOpenAck) { + module.onChanOpenAck( + datagram.portIdentifier, + datagram.channelIdentifier, + datagram.version + ) + handler.chanOpenAck( + datagram.portIdentifier, + datagram.channelIdentifier, + datagram.version, + datagram.proofTry, + datagram.proofHeight + ) +} +``` + +```typescript +interface ChanOpenConfirm { + portIdentifier: Identifier + channelIdentifier: Identifier + proofAck: CommitmentProof + proofHeight: uint64 +} +``` + +```typescript +function handleChanOpenConfirm(datagram: ChanOpenConfirm) { + module = lookupModule(portIdentifier) + module.onChanOpenConfirm( + datagram.portIdentifier, + datagram.channelIdentifier + ) + handler.chanOpenConfirm( + datagram.portIdentifier, + datagram.channelIdentifier, + datagram.proofAck, + datagram.proofHeight + ) +} +``` + +```typescript +interface ChanCloseInit { + portIdentifier: Identifier + channelIdentifier: Identifier +} +``` + +```typescript +function handleChanCloseInit(datagram: ChanCloseInit) { + module = lookupModule(portIdentifier) + module.onChanCloseInit( + datagram.portIdentifier, + datagram.channelIdentifier + ) + handler.chanCloseInit( + datagram.portIdentifier, + datagram.channelIdentifier + ) +} +``` + +```typescript +interface ChanCloseConfirm { + portIdentifier: Identifier + channelIdentifier: Identifier + proofInit: CommitmentProof + proofHeight: uint64 +} +``` + +```typescript +function handleChanCloseConfirm(datagram: ChanCloseConfirm) { + module = lookupModule(datagram.portIdentifier) + module.onChanCloseConfirm( + datagram.portIdentifier, + datagram.channelIdentifier + ) + handler.chanCloseConfirm( + datagram.portIdentifier, + datagram.channelIdentifier, + datagram.proofInit, + datagram.proofHeight + ) +} +``` + +#### 패킷 중계 + +패킷은 모듈에서 IBC 핸들러를 호출하는 모듈에 의해 직접 전송됩니다. + +```typescript +interface PacketRecv { + packet: Packet + proof: CommitmentProof + proofHeight: uint64 +} +``` + +```typescript +function handlePacketRecv(datagram: PacketRecv) { + module = lookupModule(datagram.packet.sourcePort) + acknowledgement = module.onRecvPacket(datagram.packet) + handler.recvPacket( + datagram.packet, + datagram.proof, + datagram.proofHeight, + acknowledgement + ) +} +``` + +```typescript +interface PacketAcknowledgement { + packet: Packet + acknowledgement: string + proof: CommitmentProof + proofHeight: uint64 +} +``` + +```typescript +function handlePacketAcknowledgement(datagram: PacketAcknowledgement) { + module = lookupModule(datagram.packet.sourcePort) + module.onAcknowledgePacket( + datagram.packet, + datagram.acknowledgement + ) + handler.acknowledgePacket( + datagram.packet, + datagram.acknowledgement, + datagram.proof, + datagram.proofHeight + ) +} +``` + +#### 패킷 타임아웃 + +```typescript +interface PacketTimeout { + packet: Packet + proof: CommitmentProof + proofHeight: uint64 + nextSequenceRecv: Maybe +} +``` + +```typescript +function handlePacketTimeout(datagram: PacketTimeout) { + module = lookupModule(datagram.packet.sourcePort) + module.onTimeoutPacket(datagram.packet) + handler.timeoutPacket( + datagram.packet, + datagram.proof, + datagram.proofHeight, + datagram.nextSequenceRecv + ) +} +``` + +```typescript +interface PacketTimeoutOnClose { + packet: Packet + proof: CommitmentProof + proofHeight: uint64 +} +``` + +```typescript +function handlePacketTimeoutOnClose(datagram: PacketTimeoutOnClose) { + module = lookupModule(datagram.packet.sourcePort) + module.onTimeoutPacket(datagram.packet) + handler.timeoutOnClose( + datagram.packet, + datagram.proof, + datagram.proofHeight + ) +} +``` + +#### 타임아웃에 의한 클로저 & 패킷 정리 + +```typescript +interface PacketCleanup { + packet: Packet + proof: CommitmentProof + proofHeight: uint64 + nextSequenceRecvOrAcknowledgement: Either +} +``` + +```typescript +function handlePacketCleanup(datagram: PacketCleanup) { + handler.cleanupPacket( + datagram.packet, + datagram.proof, + datagram.proofHeight, + datagram.nextSequenceRecvOrAcknowledgement + ) +} +``` + +### (읽기 전용) 쿼리 함수들 + +클라이언트, 연결 및 채널에 대한 모든 (읽기 전용) 쿼리 함수들은 IBC 핸들러 모듈에 의해 직접 노출되어야합니다. + +### 인터페이스 활용 예제 + +사용 예시는 [ICS 20](../ics-020-fungible-token-transfer) 을 참조하십시오. + +### 속성 및 불변량 + +- 프록시 포트 바인딩은 선입선출입니다. 일단 모듈이 IBC 라우팅 모듈을 통해 포트에 바인딩되면 포트를 해제하기 전까지 해당 모듈만이 해당 포트를 사용할 수 있습니다. + +## 하위 호환성 + +적용되지 않습니다. + +## 상위 호환성 + +라우팅 모듈은 IBC 핸들러 인터페이스와 밀접한 관련이 있습니다. + +## 구현 예제 + +곧 게시될 예정입니다. + +## 다른 구현 + +곧옵니다. + +## 히스토리 + +2019년 6월 9일 - 초안 제출 +2019년 7월 28일 - 주요 개정 +2019년 8월 25일 - 주요 개정 + +## 저작권 + +이 게시물의 모든 내용은 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) 라이센스에 의해 보호받습니다.