Validator’s Note 12 — 뉴트론(Neutron)으로 살펴보는 컨슈머 체인의 시작 과정

Youngbin Park
DSRV
Published in
18 min readMay 12, 2023

--

Disclaimer: 이 글은 정보 전달을 위한 목적으로 작성되었으며, 특정 프로젝트에 대한 투자 권고, 법률적 자문 등 목적으로 하지 않습니다. 모든 투자의 책임은 개인에게 있으며, 이로 발생한 결과에 대해 어떤 부분에서도 DSRV는 책임을 지지 않습니다. 본문이 포괄하는 내용은 특정 자산에 대한 투자를 추천하는 것이 아니며, 언제나 본문의 내용만을 통한 의사결정은 지양하시길 바랍니다.

사용자가 자유롭게 앱을 배포할 수 있는 스마트 컨트랙트 플랫폼인 뉴트론(Neutron)이 코스모스 허브(Cosmos Hub)의 보안을 활용하는 최초의 컨슈머 체인으로 런칭했습니다! 이를 가능케한 Interchain Security (ICS)는 코스모스 허브와 같이 많은 가치가 스테이킹된, 즉 보안성이 높은 프로바이더(Provider) 체인이 밸리데이터를 공유하여 보안성이 낮은 컨슈머(Consumer) 체인의 블록을 대신 검증해주는 기능입니다. ICS의 첫 번째 단계인 Replicated Security(RS)가 최근 코스모스 허브에서 지난 v9 Lamda 업그레이드를 통해 활성화되어, 뉴트론이 그 첫 번째 타자로 코스모스 허브의 보안성을 공유 받는 컨슈머 체인이 되었습니다.

지난해 코스모스 허브에서서는 ICS 기능을 테스트 해보기 위해 Incentivized Testnet Program인 Game of Chains(GoC)가 진행되기도 하였으며, 이후에도 RS 테스트넷을 통해 여러가지 버그 수정 및 기능추가가 이루어졌습니다. DSRV 또한 GoC 및 RS 테스트넷에 참여하며 지속적으로 ICS에 관심을 가져왔는데요. 뉴트론 또한 이 RS 테스트넷에서 런칭 리허설을 거쳐 현재 성공적으로 메인넷을 런칭한 상태입니다.

오늘은 실제 코스모스 허브의 첫 컨슈머 체인인 Neutron을 통해 컨슈머 체인이 시작하는 과정을 한번 살펴보려고 합니다. (해당 글은 컨슈머 체인이 시작하는 과정만을 담고 있으므로 ICS에 대해 더 자세한 내용이 궁금하시다면 이전 아티클을 확인해 주세요.)

Passing Governance

출처: https://www.mintscan.io/cosmos/proposals/792

ICS의 현재 단계(Replicated Security)에서는 모든 코스모스 허브의 액티브 밸리데이터들이 컨슈머 체인으로 등록된 체인을 운영해야 하며, 그렇지 않으면 슬래싱을 당하게 됩니다. (뉴트론의 경우 soft opt-out이라는 기능으로 인해 voting power가 하위 5%에 속하는 밸리데이터는 슬래싱 당하지 않습니다.) 따라서 스팸 체인들이 컨슈머 체인이 된다면 운영자의 부담과 위험이 커지기 때문에, 이를 방지하기 위하여 컨슈머 체인은 코스모스 허브의 거버넌스 프로포절을 통과해야만 허브의 보안을 공유 받으며 체인을 시작할 수 있습니다. 뉴트론 또한 코스모스 프로포절 792번(Launch Neutron on Replicated Security)을 통해 거버넌스를 통과하여 코스모스의 컨슈머 체인으로 시작할 수 있게 되었습니다. 프로포절에는 네트워크 변수 및 chain id, 및 Spawn Time 등의 뉴트론 체인의 정보가 기록되어 있습니다.

- Chain Id : neutron-1
- Binary Hash : f20ab1432746c146924eaf6644d3f3e62759f64096fe3f347b740af7e0032369
- Genesis Hash : 4d897938a69a3809828e70f34c7400ec134817fe34ca4090dbe5991d72fa744c
- Spawn Time : 2023-05-08 20:00:00 (KST)

CCV Channel Initialization

A little background

그리고 컨슈머 체인이 프로바이더 체인의 보안을 빌리기 위해서는 먼저 CCV(Cross Chain Validation) 채널을 생성해야 합니다. CCV 채널은 이후 프로바이더 체인 밸리데이터 세트의 변화를 알리는 VSC(Validator Set Change) 패킷이나, 컨슈머 체인에서 잘못을 저지른 밸리데이터를 슬래싱(Slashing)하기 위한 슬래싱 패킷을 주고 받기 위한 통로입니다. CCV 채널은 컨슈머 체인이 프로바이더 체인의 밸리데이터 정보를 공유 받기 위한 중요한 역할을 합니다. 이 CCV 채널은 보통 토큰을 전송하는 IBC 채널과 다르게 컨슈머 체인당 하나만 생성될 수 있습니다.

출처: https://github.com/cosmos/ibc/blob/8d9d3b6fe7309b034df8457760b3bbd11d24b8e1/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md

새로운 컨슈머 체인의 CCV 채널을 처음 생성하는 과정은 위의 그림과 같이 진행됩니다.

  1. 프로포절에 기록된 Spawn Time이 지나면 프로바이더 체인에서 컨슈머 체인을 위한 클라이언트 생성이 트리거 됩니다. 프로바이더 체인은 Spawn Time 도달 시점의 CCV consumer parameter, validator set등의 상태와, 프로포절에 기록된 chain id를 바탕으로 뉴트론과 CCV 채널을 만들기 위한 클라이언트를 생성합니다.
  2. 그리고 프로바이더 체인은 ClientState, ConsensusState 그리고 밸리데이터 세트가 포함된 CCV genesis state를 생성합니다. 프로바이더 체인의 밸리데이터들은 모두가 같은 CCV genesis state를 가지고 있는지 확인하고, 이 정보를 쿼리하여 CCV genesis state가 비어있던 컨슈머 체인의 genesis file에 수동으로 추가하여 체인을 시작하고 클라이언트를 생성합니다.
  3. 정상적으로 블록이 생성된다면 그 다음으로는 릴레이어를 통해 CCV 채널을 연결해야 합니다. 먼저 릴레이어가 connection handshake를 통해 양쪽 체인의 RPC를 연결합니다. 그 후 CCV 채널 생성(channel handshake)이 릴레이어를 통한 네 가지 메세지(트랜잭션)를 통해 이루어집니다. 이는 기본적으로는 기존 IBC 사양(ICS-04)과 유사하지만, 추가적으로 프로바이더 체인에서 연결하려는 채널의 클라이언트가 컨슈머 체인으로 등록된(whitelisted)된 체인의 클라이언트인지 확인하는 과정이 수행됩니다. 해당 메세지 들에는 이전 단계가 정상적으로 수행되었음을 증명하는 proof도 포함되어있습니다.

In the case of Neutron

그럼 뉴트론과 코스모스 허브에서 이가 실제로 어떻게 진행되었는지 살펴보겠습니다. 뉴트론의 Spawn Time은 2023–05–08 11:00 (UTC)로 프로바이더 체인에서는 해당 시간에 클라이언트 및 CCV genesis state가 생성되었으나, 뉴트론은 실제로 2023–05–11 15:00 (UTC)에 체인이 시작하였습니다.(Genesis) 그리고 릴레이어를 통한 CCV 채널 연결은 하루가 더 지난 2023–05–12 15:00 (UTC)경에 이루어졌습니다.

CCV 채널 연결 과정을 살펴보면, 먼저 릴레이어가 뉴트론(컨슈머 체인)에 OnChainOpenInit 메세지를 보내 뉴트론이 연결하려는 채널의 클라이언트가 코스모스 허브(프로바이더 체인)의 클라이언트인지 확인하였습니다.

출처: https://www.mintscan.io/neutron/txs/CEADBAB3268FF2264CB6B84EC5C1C542E35A589D5F0C115CE542843B7FFC3C54?height=6527
3:44PM INF client state updated client-id=07-tendermint-0 height=4-15255239 module=x/ibc/client
3:44PM INF created new capability module=ibc name=capabilities/ports/consumer/channels/channel-0
3:44PM INF claimed capability capability=6 module=ccvconsumer name=capabilities/ports/consumer/channels/channel-0
3:44PM INF channel state updated channel-id=channel-0 module=x/ibc/channel new-state=INIT port-id=consumer previous-state=NONE
3:44PM INF burned tokens from module account amount=4927untrn from=cons_redistribute module=x/bank
3:44PM INF executed block height=6527 module=state num_invalid_txs=0 num_valid_txs=1

그 후 코스모스 허브는 OnChanOpenTry 메세지를 받아 뉴트론의chain id를 통해, 자신이 연결하려는 채널의 클라이언트가 등록된(whitelisted) 뉴트론의 클라이언트인지, 기존에 해당 chain id로 연결된 채널이 없는지 확인하였습니다.

출처: https://www.mintscan.io/cosmos/txs/E81128D059427C3B391345A50F44BE1EB57322A0EA3F3601C67F33240B632F39?height=15255243
3:44PM INF client state updated client-id=07-tendermint-1119 height=1-6528 module=x/ibc/client
3:44PM INF created new capability module=ibc name=capabilities/ports/provider/channels/channel-568
3:44PM INF claimed capability capability=572 module=provider name=capabilities/ports/provider/channels/channel-568
3:44PM INF channel state updated channel-id=channel-568 module=x/ibc/channel new-state=TRYOPEN port-id=provider previous-state=NONE
3:44PM INF VSCPacket enqueued: chainID=neutron-1 len unbonding ops=0 len updates=3 module=x/ibc-provider vscID=784743
3:44PM INF executed block height=15255243 module=state num_invalid_txs=0 num_valid_txs=7

다시 뉴트론이 OnChanOpenAck을 받아 코스모스 허브의 CCV 채널을 등록하였습니다.

출처: https://www.mintscan.io/neutron/txs/646D48A56AF6A5B98551A7ED296786D8C388D8A3519765E12DC2D2E7102C1D8B?height=6530
3:45PM INF client state updated client-id=07-tendermint-0 height=4-15255244 module=x/ibc/client
3:45PM INF channel state updated channel-id=channel-0 module=x/ibc/channel new-state=OPEN port-id=consumer previous-state=STATE_OPEN
3:45PM INF created new capability module=ibc name=capabilities/ports/transfer/channels/channel-1
3:45PM INF claimed capability capability=7 module=transfer name=capabilities/ports/transfer/channels/channel-1
3:45PM INF channel state updated channel-id=channel-1 module=x/ibc/channel new-state=INIT port-id=transfer previous-state=NONE
3:45PM INF burned tokens from module account amount=5118untrn from=cons_redistribute module=x/bank
3:45PM INF executed block height=6530 module=state num_invalid_txs=0 num_valid_txs=1

그 후 코스모스 허브가 OnChanOpenConfirm을 받아 허브 측 까지 최종적으로 CCV 채널이 생성되었습니다. 채널이 생성된 후에는 VSC 패킷이 모두 전송되기 시작했습니다. 하지만 뉴트론이 실제 온체인에 기록된 Spawn Time 보다 약 2일 늦게 체인을 시작했고, 릴레이어가 연결된 것은 약 3일 후이기 때문에, 그동안 코스모스 허브에서 전송되지 못하고 쌓여(pending) 있던 약 14000개의 VSC 패킷이 모두 전송되는데에 3시간 이상이 소요되었습니다.

컨슈머 체인 밸리데이터가 블록에 서명하기 위한 validator key는 프로바이더 체인의 validator key와 동일하게 사용하거나 프로바이더 체인에서 key-assignment 기능을 통해 변경할 수 있습니다. 하지만 Spawn Time 이후에 컨슈머 체인의 validator key를 변경한 밸리데이터는, 이미 컨슈머 체인이 Spawn Time시점의 validator key로 CCV genesis state가 만들어졌으므로 VSC패킷 업데이트 이전까지는 변경전의 validator key로 컨슈머 체인의 컨센서스에 참여해야 합니다. 이후 VSC패킷 업데이트를 통해 변경에 대한 정보가 컨슈머 체인으로 전달되면 변경된 validator key를 사용해야 합니다.

그러나, pending되어 있던 VSC 패킷이 어느 시점에 업데이트 될지 정확히 알 수 없었으므로, validator key를 Spawn Time이후에 변경한 밸리데이터가 Genesis부터 중단없이 컨센서스에 참여하기 위해서는 변경 전후의 validator key를 모두 이용하여 2대의 뉴트론 노드를 운영하는 것이 권장되었습니다.

출처: https://www.mintscan.io/cosmos/txs/7CF75E20752777643BDD48AD3EACF3B75817B0E818BB018197AB3483842064E7?height=15255249
3:45PM INF client state updated client-id=07-tendermint-1119 height=1-6531 module=x/ibc/client
3:45PM INF channel state updated channel-id=channel-568 module=x/ibc/channel new-state=OPEN port-id=provider previous-state=TRYOPEN
3:45PM INF created new capability module=ibc name=capabilities/ports/transfer/channels/channel-569
3:45PM INF claimed capability capability=573 module=transfer name=capabilities/ports/transfer/channels/channel-569
3:45PM INF channel state updated channel-id=channel-569 module=x/ibc/channel new-state=TRYOPEN port-id=transfer previous-state=NONE
3:45PM INF packet sent dst_channel=channel-0 dst_port=transfer module=x/ibc/channel sequence=106846 src_channel=channel-391 src_port=transfer
3:45PM INF IBC fungible token transfer amount=6652180 module=x/ibc-transfer receiver=stride1pczxmqaw2tgete03r6jwk7uvyy4355skhdcuur sender=cosmos1pczxmqaw2tgete03r6jwk7uvyy4355sk5xcqg0 token=uatom
3:45PM INF packet sent dst_channel=channel-0 dst_port=consumer module=x/ibc/chan
...
3:45PM INF packet sent dst_channel=channel-0 dst_port=consumer module=x/ibc/channel sequence=14508 src_channel=channel-568 src_port=provider
3:45PM INF packet sent dst_channel=channel-0 dst_port=consumer module=x/ibc/channel sequence=14509 src_channel=channel-568 src_port=provider
3:45PM INF Ensure peers module=pex numDialing=0 numInPeers=40 numOutPeers=10 numToDial=0
3:45PM INF executed block height=15255249 module=state num_invalid_txs=0 num_valid_txs=4

또한 그림에는 나타나 있지 않지만 릴레이어는 네 가지 트랜잭션들을 전송할 때 UpdateClient 메세지도 함께 전송합니다. UpdateClient 메세지는 컨슈머 체인의 상태 및 밸리데이터들의 서명을 포함하고 있습니다. 따라서 위 과정에서는 chain id만을 사용하지만 올바르지 않은 밸리데이터 세트를 가진 스팸 체인이나 악의적인 릴레이어가 프로바이더 체인을 속이려고 하는 것을 방지할 수 있습니다.

CCV 채널이 생성되고 필요한 패킷을 주고받을 수 있게 되면, 마침내 컨슈머 체인이 보안이 공유된 상태에 있다고 할 수 있습니다. 저희는 밸리데이터로서 모든 진행 과정을 열심히 지켜봐 왔으며, 첫 번째 컨슈머 체인이 성공적으로 출시되는 것을 보게 되어 매우 기쁩니다. 뉴트론을 시작으로 더 많은 의미 있는 컨슈머 체인들이 코스모스 허브 생태계를 다양화할 수 있기를 기대합니다. 감사합니다.

Written by
Youngbin Park, Research Engineer, DSRV Validator Team (Twitter @bin0_0bin)
Heejin Lee, Software Engineer and Validator, DSRV Validator Team (Twitter @heeheejin)

--

--