infrablockchain-docs
ko
ko
  • 인프라블록체인
    • 배우기
      • 아키텍처
        • 아키텍처
        • 네트워크 참여자
        • 파라체인
          • 시스템 파라체인
      • 프로토콜
        • 시스템 토큰
        • 트랜잭션 수수료
        • Proof of Transaction
      • Substrate
        • 배우기
          • 기초 지식
            • 암호학
            • 블록체인 기본 개념
            • 합의
            • 네트워크와 노드
            • 트랜잭션과 블록 기본 사항
            • 트랜잭션 수명주기
            • 오프체인 작업
            • 라이트 클라이언트
            • Substrate를 위한 Rust
            • 라이브러리 소개
            • 아키텍처와 Rust 라이브러리
            • 파일 구조
            • 계정, 주소 및 키
            • 트랜잭션 형식
            • 난수 생성
          • 프레임
            • FRAME 팔레트
            • FRAME 매크로
            • 커스텀 팔레트
            • 팔레트 커플링
            • Origin
            • 이벤트와 에러
            • 런타임 스토리지 구조
            • 상태 전이와 스토리지
            • SCALE 인코딩
            • 트랜잭션, Weight 및 수수료
            • 런타임 API
            • 런타임 업그레이드
            • 런타임 개발
          • 계정 데이터 구조
          • 주소 형식
          • 용어집
          • cli
            • 아카이브
            • 메모리 프로파일러
            • 노드 템플릿
            • 사이드카
            • srtool
            • 서브키
            • subxt
            • try-runtime
            • tx-wrapper
          • 런타임 개발
            • 기본
              • Genesis 상태 구성하기
              • 런타임 상수 구성
              • 체인 스펙을 커스텀하기
              • 팔레트 가져오기
              • 도우미 함수 사용하기
            • 합의 모델
              • 작업 증명을 사용하는 체인 구성
              • 하이브리드 노드 생성하기
            • 오프체인 워커
              • 오프체인 HTTP 요청하기
              • 오프체인 인덱싱
              • 오프체인 로컬 스토리지
            • 팔레트 설계
              • 크라우드펀딩 구성하기
              • 스토리지 구조체 (struct) 생성하기
              • 잠금 가능한 통화 구현
              • 무작위성 적용하기
              • 느슨한 팔레트 결합 사용하기
              • 타이트한 팔레트 결합 사용하기
            • 파라체인 개발
              • HRMP 채널 추가하기
              • 로컬 파라체인 노드 추가하기
              • 릴레이 체인에 연결하기
              • 솔로 체인을 변환하기
              • 론칭 준비
              • 콜레이터 선택
              • 파라체인 업그레이드
            • 스토리지 마이그레이션
              • 기본 저장소 마이그레이션
              • 스토리지 마이그레이션 트리거
            • 테스트
              • 기본 테스트 설정하기
              • 전송 함수 테스트하기
            • 도구
              • 체인을 위한 txwrapper 생성
              • REST 엔드포인트를 사용하여 체인 데이터 가져오기
              • try-runtime 사용하기
              • Wasm 바이너리 검증하기
            • 가중치
              • 벤치마크 추가
              • 수수료 계산하기
              • 조건부 가중치 사용
              • 사용자 정의 가중치 사용하기
        • 빌드하기
          • 제작할 것을 결정하세요
          • 빌드 프로세스
          • 결정론적 런타임 빌드
          • 체인 스펙
          • Genesis 구성
          • 애플리케이션 개발
          • RPC
          • 문제 해결
        • 튜토리얼
          • 설치하기
            • 개발자 도구
            • 리눅스 개발 환경
            • macOS 개발 환경
            • Rust 툴체인
            • Rust 문제 해결 방법
            • Windows 개발 환경
          • 빠른 시작
            • 코드 탐색하기
            • 런타임 수정하기
            • 노드 시작하기
            • Substrate 한눈에 보기
          • 블록체인 구축
            • 신뢰할 수 있는 노드 추가
            • 특정 노드 승인
            • 로컬 블록체인 구축하기
            • 네트워크 시뮬레이션
            • 실행 중인 네트워크 업그레이드
          • 애플리케이션 로직 구축
            • 런타임에 팔레트 추가하기
            • 오프체인 워커 추가
            • 사용자 정의 팔레트 게시
            • 함수 호출의 출처 지정하기
            • 사용자 정의 팔레트에서 매크로 사용하기
          • 유용한 도구들
            • EVM 계정에 접근하기
            • 이더리움 통합
            • 사이드카 엔드포인트 탐색하기
            • 경량 클라이언트 노드 통합
          • 스마트 컨트랙트
            • 스마트 컨트랙트
            • 토큰 계약 작성하기
            • 스마트 컨트랙트 개발하기
            • 첫 번째 계약 준비하기
            • 스마트 컨트랙트 문제 해결
            • 값 저장을 위한 맵 사용
      • XCM
        • XCM
        • XCM 형식
    • 서비스 체인
      • 인프라DID
      • 인프라EVM
      • URAuth(Universal Resource Auth)
    • 데브 옵스
      • 체인 빌드
      • 배포
      • 모니터링
    • 튜토리얼
      • 기초
        • 시스템 토큰 관리 프로세스
        • 시스템 토큰을 트랜잭션 수수료로 사용해보기
        • 트랜잭션에 투표 포함 시키기
        • 밸리데이터 보상 받기
      • 구축하기
        • 인프라릴레이체인 구축하기
        • 파라체인 구축하기
        • 메시지 전달 채널 열기
        • XCM을 이용하여 토큰 전송하기
        • Asynchronous Backing 적용하기
      • 테스트
        • 벤치마크
        • 런타임 확인
        • 디버그
        • 테스트 네트워크에서 파라체인 시뮬레이션하기
        • 단위 테스트
      • 서비스체인
        • 인프라DID
          • 구축하기
          • 공개키 추가하기
          • 서비스 엔드포인트 등록하기
          • DID 생성하기
        • 인프라EVM
          • 구축하기
          • EVM에 자금 입금 및 인출하기
          • ERC20 토큰 컨트랙트 배포하기
          • ERC721 토큰 컨트랙트 배포하기
          • ERC1155 토큰 컨트랙트 배포하기
  • 뉴날 데이터 마켓
Powered by GitBook
On this page
  • 개요
  • 파라체인 업데이트
  • 참고
  1. 인프라블록체인
  2. 튜토리얼
  3. 구축하기

Asynchronous Backing 적용하기

Inclusion 과 Backing 을 분리하여 파라체인 throughput 을 증가시킬 수 있는 async backing 을 적용하는 방법에 대해 설명합니다.

개요

기존 릴레이 체인의 파라체인 블록은 Inclusion 과 Backing 파이프라인이 서로 의존적(a.k.a Synchronous Backing) 으로 진행되어 파라체인 블록이 생성되고 다음 블록이 생성되는 시간에 큰 딜레이(e.g 파라체인 블록 생성 시간 = 12초)가 있었습니다. 이를 보안하기 위해 두 파이프라인을 분리하여 비동기적으로 파라체인 블록을 검증할 수 있는 프로토콜인 Asynchronous Backing 을 적용하여 기존 파라체인 노드를 업그레이드 하는 방법에 대해 설명합니다.

파라체인 업데이트

Phase 1 - 파라체인 런타임 업데이트

  • ConsensusHook 타입

    // runtime/src/lib.rs
    
    pub const UNINCLUDED_SEGMENT_CAPACITY: u32 = 3;
    
    pub const BLOCK_PROCESSING_VELOCITY: u32 = 1;
    
    pub const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000;
    

    UNINCLUDED_SEGMENT_CAPACITY : 릴레이 체인에 의해 확정되지 않았지만 생성할 수 있는 파라체인 블록 수. 여기서는 3 으로 설정해줍니다. 3 의 의미는 확정되지 않은 블록을 최대 3개 까지 생성할 수 있다는 의미입니다.

    BLOCK_PROCESSING_VELOCITY : 하나의 릴레이 체인 블록에 생성할 수 있는 파라체인 블록 수. 여기서는 1 로 설정해줍니다. 1 의 의미는 릴레이 체인 블록에 anchoring 할 수 있는 파라체인 블록이 최대 2 개라는 의미입니다.

  • cumulus_pallet_parachain_system 설정

    impl cumulus_pallet_parachain_system::Config for Runtime {
      ...
      type CheckAssociatedRelayNumber = RelayNumberMonotonicallyIncreases;
      type ConsensusHook = ConsensusHook;
    }

    CheckAssociatedRelayNumber : 릴레이 체인 블록 정책입니다. 여기서는 RelayNumberMonotonicallyIncreases 로 설정해줍니다. 해당 타입의 의미는 파라체인이 바라보는 릴레이 체인 블록이 전 블록이 바롸봤던 릴레이 체인 블록 넘버와 같거나 커야함을 의미합니다.

    ConsensusHook : 여기서는 위에서 정의했던 ConsensusHook 으로 설정해줍니다.

  • pallet_aura 설정

impl pallet_aura::Config for Runtime {
    ...
    type AllowMultipleBlocksPerSlot = ConstBool<true>;
    type SlotDuration = ConstU64<6_000>;
}

// impl_runtime_apis!

impl sp_consensus_aura::AuraApi<Block, AuraId> for Runtime {
        fn slot_duration() -> sp_consensus_aura::SlotDuration {
            sp_consensus_aura::SlotDuration::from_millis(6_000)
        }

        ...
}

AllowMultipleBlocksPerSlot : 하나의 slot 에 여러 개의 블록 허용 여부를 나타냅니다. 여기서는 true 로 변경해줍니다.

SlotDuration : 한 슬롯의 기간을 의미. 여기서는 6_000 으로 설정하여 한 슬롯의 기간이 6초임을 나타내줍니다.

  • Cargo.toml 에 cumulus_primitives_aura 추가

    // impl_runtime_apis!
    
    impl cumulus_primitives_aura::AuraUnincludedSegmentApi<Block> for Runtime {
      fn can_build_upon(
          included_hash: <Block as BlockT>::Hash,
          slot: cumulus_primitives_aura::Slot,
      ) -> bool {
          ConsensusHook::can_build_upon(included_hash, slot)
      }
    }
  • Maximum_Block_Weight 를 2 초로 증가시키기

    pub const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(
      WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2),
      cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64,
    );
  • pallet_timestamp 의 MINIMUM_PERIOD 을 0 으로 설정

    impl pallet_timestamp::Config for Runtime {
      ...
      type MinimumPeriod = ConstU64<0>;
    }

Phase 2 - 파라체인 노드 업데이트

  • infra_parachain/src/service.rs 파일에서 basic_aura 를 lookahead_aura 로 교체합니다. Node 의 param 부분에 정의되어있는 authoring_duration 을 500 에서 Duration::from_millis(1500) 으로 변경해줍니다. 그 후 basic_aura::run 에서 aura::run 으로 변경해줍니다.

  • infra_parachain/src/command.rs 로 가서 커맨드에 맞는 start_* 로 변경해줍니다(e.g start_asset_hub_lookahead_node)

use cumulus_client_consensus_aura::collators::lookahead::{self as aura, Params as AuraParams};

let params = AuraParams {
    ... 
    authoring_duration: Duration::from_millis(1500),
};

aura::run(params).await;

참고

PreviousXCM을 이용하여 토큰 전송하기Next테스트

Last updated 11 months ago

Asynchronous Backing Wiki