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. Substrate
  4. 배우기
  5. 프레임

SCALE 인코딩

Previous상태 전이와 스토리지Next트랜잭션, Weight 및 수수료

Last updated 1 year ago

Substrate은 네트워크를 통해 데이터를 보내고 받는 방식을 최적화하기 위해 가벼우면서도 효율적인 인코딩 및 디코딩 프로그램을 사용합니다. 데이터를 직렬화하고 역직렬화하는 프로그램은 SCALE 코덱이라고 하며, SCALE은 simple concatenated aggregate little-endian의 약자입니다.

SCALE 코덱은 런타임과 외부 노드 간의 통신에 있어서 중요한 구성 요소입니다.

이는 Substrate 과 같은 자원 제한적인 실행 환경에서 데이터의 고성능 및 복사 없는 인코딩 및 디코딩을 위해 설계되었습니다.

SCALE 코덱은 자체적으로 설명하지 않습니다. 디코딩 컨텍스트가 인코딩된 데이터에 대한 모든 유형 지식을 가지고 있다고 가정합니다. Parity에서 유지 관리하는 프론트엔드 라이브러리는 RPC와 런타임 간의 상호작용을 인코딩하고 디코딩하기 위해 SCALE 코덱의 Rust 구현인 크레이트를 사용합니다.

SCALE 코덱은 Substrate 및 블록체인 시스템에 유리합니다. 그 이유는 다음과 같습니다:

  • 와 같은 일반적인 직렬화 프레임워크에 비해 가볍습니다. 이러한 프레임워크는 바이너리 파일의 크기를 부풀릴 수 있는 상당한 보일러플레이트를 추가합니다.

  • Rust libstd를 사용하지 않으므로 Substrate 런타임과 같이 Wasm으로 컴파일되는 no_std 환경과 호환됩니다.

  • #[derive(Encode, Decode)]를 사용하여 새로운 유형에 대한 코덱 로직을 파생시키기 위해 Rust에서 큰 지원을 받도록 구축되었습니다.

Substrate에서 기존의 Rust 코덱 라이브러리를 재사용하는 대신 인코딩 스키마를 정의하는 것이 중요합니다. 이는 Substrate 블록체인 간의 상호 운용성을 지원하려는 다른 플랫폼 및 언어에서 이 코덱을 다시 구현해야 하기 때문입니다.

다음 표는 Parity SCALE 코덱의 Rust 구현이 다른 유형을 어떻게 인코딩하는지를 보여줍니다.

다양한 유형의 SCALE 코덱 예시

유형
설명
SCALE 디코딩 값
SCALE 인코딩 값

고정폭 정수

기본 정수는 고정폭 리틀 엔디언(LE) 형식을 사용하여 인코딩됩니다.

부호 있는 8비트 정수 69

0x45

부호 없는 16비트 정수 42

0x2a00

부호 없는 32비트 정수 16777215

0xffffff00

콤팩트/일반 정수

"콤팩트" 또는 일반 정수 인코딩은 큰 정수(2**536까지)를 인코딩하는 데 충분하며, 대부분의 값에 대해 고정폭 버전보다 효율적입니다. (단, 1바이트 값의 경우 고정폭 정수가 항상 더 좋습니다.)

부호 없는 정수 0

0x00

부호 없는 정수 1

0x04

부호 없는 정수 42

0xa8

부호 없는 정수 69

0x1501

부호 없는 정수 65535

0xfeff0300

BigInt(100000000000000)

0x0b00407a10f35a

부울

부울 값은 단일 바이트의 가장 낮은 자릿수를 사용하여 인코딩됩니다.

false

0x00

true

0x01

결과

결과는 특정 작업이 성공했는지 또는 실패했는지를 나타내는 일반적으로 사용되는 enum입니다.

Ok(42)

0x002a

Err(false)

0x0100

옵션

특정 유형의 하나 또는 제로 값입니다.

Some

0x01 뒤에 인코딩된 값

None

0x00 뒤에 인코딩된 값

벡터 (리스트, 시리즈, 세트)

동일한 유형의 값의 컬렉션이 인코딩되며, 각 항목의 인코딩이 차례로 연결된 "콤팩트" 인코딩으로 시작됩니다.

부호 없는 16비트 정수의 벡터: [4, 8, 15, 16, 23, 42]

0x18040008000f00100017002a00

문자열

문자열은 유효한 UTF8 시퀀스를 포함하는 바이트(Vec<u8>)의 벡터입니다.

튜플

각각 다른 유형을 가진 고정 크기의 값의 시리즈입니다. 이는 각 인코딩된 값의 연결로 간단히 구성됩니다.

콤팩트 부호 없는 정수와 부울의 튜플: (3, false)

0x0c00

구조체

구조체의 경우 값은 이름이 지정되지만 인코딩에는 무관합니다(이름은 무시됩니다 - 순서만 중요합니다). 모든 컨테이너는 요소를 연속적으로 저장합니다. 요소의 순서는 고정되어 있지 않으며, 컨테이너에 따라 다르며 디코딩 시에 의존할 수 없습니다. 이는 암시적으로 특정 순서를 강제하는 지정된 구조체로 바이트 배열을 디코딩한 다음 다시 인코딩하면 원래 디코딩된 원본과 다른 바이트 배열이 될 수 있다는 것을 의미합니다.

항상 바이트 요소가 오름차순으로 있는 SortedVecAsc<u8> 구조체: SortedVecAsc::from([3, 5, 2, 8])

[3, 2, 5, 8]

enum (태그-유니온)

고정된 수의 변형으로, 각각 상호 배타적이고 추가적인 값 또는 값의 시리즈를 나타낼 수 있습니다. 값이 있는 변형을 식별하는 첫 번째 바이트로 인코딩됩니다. 추가적인 바이트는 변형이 함께하는 데이터를 인코딩하는 데 사용됩니다. 따라서 256개 이상의 변형은 지원되지 않습니다.

Int(42)와 Bool(true)인 enum IntOrBool { Int(u8), Bool(bool),}

0x002a와 0x0101

SCALE 코덱은 다른 언어에서도 구현되어 있습니다. 예를 들어:

Python:

Golang:

C:

C++:

JavaScript:

TypeScript: , ,

AssemblyScript:

Haskell:

Java:

Ruby:

WebAssembly 런타임
parity-scale-codec
serde
polkascan/py-scale-codec
itering/scale.go
MatthewDarnell/cScale
soramitsu/scale-codec-cpp
polkadot-js/api
parity-scale-codec-ts
scale-ts
soramitsu/scale-codec-js-library
LimeChain/as-scale-codec
airalab/hs-web3
emeraldpay/polkaj
wuminzhe/scale_rb