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
  • 시작하기 전에
  • 튜토리얼 목표
  • 관리 계정 식별하기
  • 계정에 이름 설정하기
  • Root 출처를 사용하여 호출 디스패치하기
  • 다음 단계로 넘어가기
  1. 인프라블록체인
  2. 배우기
  3. Substrate
  4. 튜토리얼
  5. 애플리케이션 로직 구축

함수 호출의 출처 지정하기

함수 호출의 출처로 사용할 계정을 지정하는 방법을 보여줍니다.

런타임에 팔렛 추가하기에서 pallet_nicks의 함수를 Substrate 노드 템플릿 런타임에 추가했습니다.

Nicks 팔렛은 블록체인 사용자가 자신이 소유한 계정에 대한 닉네임을 예약하기 위해 예치금을 지불할 수 있도록 합니다. 다음과 같은 함수를 구현합니다:

  • set_name 함수는 계정 소유자가 이름을 설정할 수 있도록 합니다. 단, 이미 예약된 이름이 아닌 경우에만 가능합니다.

  • clear_name 함수는 계정 소유자가 계정과 연결된 이름을 제거하고 예치금을 반환할 수 있도록 합니다.

  • kill_name 함수는 예치금을 반환하지 않고 다른 당사자의 계정 이름을 강제로 제거할 수 있도록 합니다.

  • force_name 함수는 예치금을 요구하지 않고 다른 당사자의 계정 이름을 설정할 수 있도록 합니다.

이 튜토리얼에서는 이러한 함수를 다른 출처 계정을 사용하여 호출하는 방법과 다른 출처 계정을 사용하여 함수를 호출하는 것이 왜 중요한지에 대해 설명합니다.

시작하기 전에

시작하기 전에 다음을 확인하세요:

  • Rust와 Rust 툴체인을 설치하여 Substrate 개발 환경을 구성했습니다.

  • Substrate 노드 템플릿을 로컬에 설치했습니다.

  • Substrate 프론트엔드 템플릿을 로컬에 설치했습니다.

  • 런타임에 팔렛 추가하기 튜토리얼을 완료하고 nicks 팔렛이 포함된 런타임을 성공적으로 컴파일했습니다.

  • 소프트웨어 개발과 명령 줄 인터페이스 사용에 대해 일반적으로 알고 있습니다.

튜토리얼 목표

이 튜토리얼을 완료함으로써 다음 목표를 달성할 수 있습니다:

  • 호출을 실행할 권한이 있는 계정을 사용하여 set_name 함수를 호출합니다.

  • 호출을 실행할 권한이 있는 계정을 사용하여 clear_name 함수를 호출합니다.

  • 호출을 실행할 수 없는 계정을 사용하여 force_name 함수를 호출합니다.

  • 관리 권한이 없는 출처를 사용하여 kill_name 함수를 호출합니다.

  • Root 출처 계정을 사용하여 kill_name 함수를 호출합니다.

  • 다른 출처 계정을 사용하여 함수를 호출하는 것이 실패 또는 성공적인 결과로 이어질 수 있는지 확인합니다.

관리 계정 식별하기

런타임에 팔렛 추가하기에서 nicks 팔렛의 Config 트레이트는 여러 유형을 선언합니다. 이 튜토리얼에서는 ForceOrigin 유형에 초점을 맞춥니다. ForceOrigin 유형은 특정 작업을 수행할 수 있는 계정을 지정하는 데 사용됩니다. 이 팔렛의 경우, ForceOrigin 유형은 다른 계정의 이름을 설정하거나 제거할 수 있는 계정을 지정합니다. 일반적으로 관리 권한을 가진 계정(예: 루트 슈퍼유저 계정)만 다른 계정을 대신하여 작업을 수행할 수 있습니다. Nicks 팔렛의 경우, 계정 소유자 또는 Root 계정만 예약된 닉네임을 설정하거나 제거할 수 있습니다. 이 Root 계정은 nicks 팔렛 관리자로 구성할 때 구현(impl) 블록에서 FRAME System Root 출처를 식별할 때 구성했습니다. 예를 들면:

type ForceOrigin = frame_system::EnsureRoot<AccountId>;

노드 템플릿의 개발용 체인 스펙에서 Sudo 팔렛은 Alice 계정을 FRAME 시스템 Root 출처로 사용하도록 구성되어 있습니다. 이 구성으로 인해 기본적으로 Alice 계정만 ForceOrigin 유형을 필요로 하는 함수를 호출할 수 있습니다.

Alice 계정 이외의 계정으로 kill_name 또는 force_name을 호출하려고 하면 호출이 실행되지 않습니다.

계정에 이름 설정하기

호출의 출처가 작업에 어떤 영향을 미치는지 보여주기 위해 다른 계정의 계정 이름을 설정하고 강제로 제거해 보겠습니다. 이 데모를 위해 다음을 확인하세요:

  • 개발 모드에서 실행 중인 노드 템플릿: ./target/release/node-template --dev

  • 실행 중인 프론트엔드 템플릿이 로컬 노드에 연결되어 있는지 확인하세요: yarn start

  • 브라우저가 로컬 웹 서버에 연결되어 있는지 확인하세요: http://localhost:8000/

  1. 프론트엔드 템플릿에서 활성 계정을 Alice에서 Bob으로 변경하세요.

  2. 팔렛 인터랙터에서 Extrinsic를 선택한 상태에서 다음을 수행하세요:

    • nicks 팔렛을 선택하세요.

    • setName 함수를 선택하세요.

    • 계정에 대한 이름을 입력하세요.

    • 이 트랜잭션을 Bob이 서명한 상태로 제출하기 위해 Signed를 클릭하세요.

    Bob은 이 계정의 소유자이므로 트랜잭션이 성공합니다. 계정 소유자인 Bob은 서명된 트랜잭션으로 clearName 함수를 실행하여 계정의 닉네임을 제거할 수도 있습니다.

  3. Extrinsic를 선택한 상태에서 다음을 수행하세요:

    • nicks 팔렛을 선택하세요.

    • clearName 함수를 선택하세요.

    • 이 트랜잭션을 Bob이 서명한 상태로 제출하기 위해 Signed를 클릭하세요.

    Bob은 이 계정의 소유자이므로 트랜잭션이 성공합니다. Bob이 다른 계정의 닉네임을 설정하거나 제거하려면 ForceOrigin을 사용하여 forceName 또는 killName 함수를 호출해야 합니다.

  4. Extrinsic를 선택한 상태에서 다음을 수행하세요:

    • nicks 팔렛을 선택하세요.

    • forceName 함수를 선택하세요.

    • 대상으로 Charlie의 계정 주소를 복사하여 붙여넣으세요.

    • 계정에 대한 이름을 입력하세요.

    • 이 트랜잭션을 Bob이 서명한 상태로 제출하기 위해 Signed를 클릭하세요.

    이 트랜잭션을 Bob의 계정으로 서명했기 때문에 함수는 Root 출처 대신 Signed 출처를 사용하여 디스패치됩니다. 이 경우, 함수 호출 자체는 성공합니다. 그러나 이름 예약을 완료할 수 없으며 BadOrigin 오류가 발생합니다.

    이벤트에서 볼 수 있듯이, 이 트랜잭션은 트랜잭션 제출을 위한 수수료로 Bob의 계정에서 인출되었지만, Root 출처가 트랜잭션을 제출하지 않았기 때문에 상태 변경이 없습니다. 상태 변경 실패는 또한 verify-first-write-last 원칙을 보여주며, 디스크에 성공적인 작업만 커밋되도록 데이터베이스 읽기와 쓰기를 보장합니다.

Root 출처를 사용하여 호출 디스패치하기

Sudo 팔렛을 사용하면 Root 출처를 사용하여 호출을 디스패치할 수 있습니다. Nick 팔렛에서는 ForceOrigin 구성에 따라 Root 출처를 사용하여 forceName 및 killName 함수를 호출해야 합니다. 프론트엔드 템플릿에서 Root 출처를 사용하여 호출을 디스패치하려면 SUDO를 클릭하세요.

이 데모를 위해 다음을 확인하세요:

  • 개발 모드에서 실행 중인 노드 템플릿: ./target/release/node-template --dev

  • 실행 중인 프론트엔드 템플릿이 로컬 노드에 연결되어 있는지 확인하세요: yarn start

  • 브라우저가 로컬 웹 서버에 연결되어 있는지 확인하세요: http://localhost:8000/

  1. 활성 계정을 Alice로 변경하세요.

    관리 계정 식별하기에서 언급한 대로, 개발 모드에서 체인을 실행할 때 Root 출처와 연결된 계정은 Alice입니다.

  2. 팔렛 인터랙터에서 Extrinsic를 선택한 상태에서 다음을 수행하세요:

    • nicks 팔렛을 선택하세요.

    • forceName 함수를 선택하세요.

    • 대상으로 Charlie의 계정 주소를 복사하여 붙여넣으세요.

    • 계정에 대한 이름을 입력하세요.

    • 이 트랜잭션을 Root 출처를 사용하여 제출하기 위해 SUDO를 클릭하세요.

  3. Extrinsic를 선택한 상태에서 다음을 수행하세요:

    • nicks 팔렛을 선택하세요.

    • killName 함수를 선택하세요.

    • 대상으로 Bob의 계정 주소를 복사하여 붙여넣으세요.

    • 이 트랜잭션을 Root 출처를 사용하여 제출하기 위해 SUDO를 클릭하세요.

    이 경우, Sudo 팔렛은 Root 출처가 호출을 디스패치했음을 네트워크 참가자에게 알리기 위해 Sudid 이벤트를 발생시킵니다.

    이 디스패치 오류에는 두 가지 메타데이터가 포함됩니다:

    • 오류가 발생한 팔렛을 나타내는 index 번호입니다.

    • 해당 팔렛의 Error enum에서 발생한 오류를 나타내는 error 번호입니다.

    index 번호는 construct_runtime! 매크로 내에서 팔렛의 위치에 해당합니다. construct_runtime! 매크로의 첫 번째 팔렛은 0의 인덱스 번호를 가집니다.

    이 예에서 index는 6(일곱 번째 팔렛)이고 error는 2입니다(세 번째 오류).

    construct_runtime!(
     pub enum Runtime where
       Block = Block,
       NodeBlock = opaque::Block,
       UncheckedExtrinsic = UncheckedExtrinsic
     {
       System: frame_system,                                        // index 0
       RandomnessCollectiveFlip: pallet_randomness_collective_flip, // index 1
       Timestamp: pallet_timestamp,                                 // index 2
       Aura: pallet_aura,                                           // index 3
       Grandpa: pallet_grandpa,                                     // index 4
       Balances: pallet_balances,                                   // index 5
       Nicks: pallet_nicks,                                         // index 6
     }

    index 값에 관계없이 error 값 2는 Nicks 팔렛의 Unnamed 오류에 해당합니다. 이는 Bob이 닉네임을 예약하지 않았거나 이전에 이름 예약을 제거한 경우에 기대할 수 있는 오류입니다.

    Alice가 현재 이름이 예약된 모든 계정에 대해 killName 함수를 호출할 수 있는지 확인할 수 있습니다.

  4. Extrinsic를 선택한 상태에서 다음을 수행하세요:

    • nicks 팔렛을 선택하세요.

    • killName 함수를 선택하세요.

    • 대상으로 Charlie의 계정 주소를 복사하여 붙여넣으세요.

    • 이 트랜잭션을 Root 출처를 사용하여 제출하기 위해 SUDO를 클릭하세요.

다음 단계로 넘어가기

이 튜토리얼에서는 트랜잭션을 제출하는 데 사용되는 계정을 지정하기 위해 Root 및 Signed 출처를 사용하는 방법을 소개하고, 다른 출처 계정을 사용하여 함수를 호출하는 결과를 보여주었습니다. Substrate 개발에 대해 더 알아보기 위해 다음 튜토리얼을 참고할 수 있습니다.

튜토리얼 외에도 다음 리소스를 탐색하여 더 많은 정보를 얻을 수 있습니다.

  • 특권 호출과 출처는 기본적인 원시(raw) 출처 유형과 사용자 정의 출처를 생성하는 방법에 대해 자세히 설명합니다.

  • 이벤트와 오류는 런타임에서 이벤트와 오류를 발생시키는 방법을 설명합니다.

  • FRAME 팔렛은 가장 일반적으로 사용되는 미리 정의된 FRAME 팔렛에 대한 개요를 제공합니다.

Previous사용자 정의 팔레트 게시Next사용자 정의 팔레트에서 매크로 사용하기

Last updated 1 year ago

BadOrigin 오류
SUDO를 사용하여 트랜잭션 제출
killName 함수 제출 시 오류 발생
성공적인 killName 트랜잭션 제출