본문 바로가기
  • 인공지능
  • 블록체인
  • 정보보안
신기술분석/블록체인

ICP 실습 #2

by nathan03 2023. 10. 23.
반응형

ICP 개발 환경 구성 

1. Quick Start - 캐니스터 호출 
      - 콘솔 호출 
      - 콘솔 호출 (메시지 변경)
2. DFX 노드 상호 작용
3. 캐니스터 특징
4. 쿼리
5. 업데이트 
6. 데이터 타입 
      - 신규 프로젝트 구성 
      - Blob
      - Bool 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인 
       - Empty 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인
        - Float 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인   

        - Func 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인 
         - int 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인 
         - nat
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인   
          - null 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인 
          - opt 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인
          - text
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인 
          - vec
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인 
          - record
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인
         - variant 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인 
         - principal 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인
         - reserved
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인 
         - service 
         1) 코드분석 
         2) CanidUI 확인 
         3) DFX 확인

7. 내장 API 
balance 
version 
id
data certificate
Counter
Controller
print 
time 

# Quick Start - 캐니스터 호출

# set_massage 호출
npm run canister_call_set_message

# get_message 호출
npm run canister_call_get_message

# 콘솔 호출 - 메세지 변경
함수 매핑 확인 : package.json 파일, canister_call_get/set_message 내역 확인

코드확인 

메세지 변경 : package.json 파일에 set_message의 인자를 변경(”Hello Azle!!!)

콘솔 메세지 변경 확인

DFX : Candid UI - 확인

변경 내역 확인 : 위 콘솔에서 변경된 메세지를 확인


메세지 변경

메세지 확인

# DFX 노드 상호작용
캐니스터 호출 및 확인

# setter 명령어
# {    명령어    }{캐니스터명} {  함수명  }{    파라메터    }
dfx canister call hello_world setMessage '("dfx canister")'

Candid UI 확인

캐니스터 특징

  • ICP 어플리케이션, 스마트컨트랙트 역할
  • WASM 모듈
  • 4G 힙 메모리, 64G 로컬 저장 메모리
  • HTTP 호출, 쿼리 / 업데이트

쿼리

캐니스터의 기능을 공개적으로 노출하는 읽기 전용 메서드입니다.
※ 특징
     1. $query; 키워드를 사용합니다.
     2. 읽기 전용
     3. 단일노드에서 실행 - 합의 진행 안함
     4. 100ms 지연시간
     5. 4G 힙메모리 제한
     6. 초당 32000 쿼리

import { $query } from 'azle';

$query;
export function getString(): string {
    return 'This is a query method!';
}

업데이트

캐니스터의 상태변경을 위한 메소드입니다.
※ 특징
  1. $update; 키워드를 사용합니다.
  2. 읽기 - 쓰기
  3. 합의를 위한 여러 노드에서 실행
  4. 2~5초 지연시간
  5. 4G 힙메모리 제한
  6. 48G 메모리 제한
  7. 초당 900 업데이트

import { nat64, $update } from 'azle';

let counter = 0n;

$update;
export function increment(): nat64 {
    return counter++;
}

 

데이터 타입

신규 프로젝트 구성

작업 폴더에서 신규 프로젝트 생성 명령어 실행

npx azle new {project}

실행 결과

프로젝트 폴더내 페키지 인스톨 실행

npm install azle

실행 결과

프로젝트내 dfx 설치

npm run dfx_install

실행 결과

기존 quick 테스트에서 사용했던 dfx를 초기화해야 합니다.

dfx start --clean

실행 결과

정상적인 시작이 확인되었다면, ctrl + c 를 입력해 canister를 중지 시킵니다.

실행 결과

정상적인 replica canister를 시작합니다.

실행 결과

위 박스내 URL 확인

코드 작업 완료후, 로컬 canister에 지속적 배포합니다.

npm run canister_deploy_local


실행 결과


위 박스내 URL 확인

Blob

변경할수 없는 바이트 배열(시퀀스 데이터타입), 멀티미디어 데이터를 다룰때 주로 사용.

index.ts 하기 코드로 수정

import { blob, Canister, query } from 'azle';

export default Canister({
    
    getBlob: query([], blob, () => {
        return Uint8Array.from([68, 73, 68, 76, 0, 0]);
    }),
});


실행 결과

위 url 결과확인

canister에 직접 호출을 위한 package.json수정

"get_blob": "dfx canister call types getBlob",
"print_blob": "dfx canister call types printBlob"


실행가능 명령어 npm run 으로 반영 확인

실행 결과

canister 직접 호출 실행

npm run get_blob

dfx로 호출 실행

dfx canister call types getBlob

실행 결과


Bool

Bool 타입 지원

1. 코드분석

index.ts 파일 해당 코드 분석, 코드 수정

import { bool, Canister, query } from 'azle';

export default Canister({
    getBool: query([], bool, () => {
        return true;
    }),
});

package.json 파일 매칭 커멘더 추가

"get_bool": "dfx canister call types getBool”
npm run canister_deploy_local

2. CanidUI 확인

새로고침 실행, 쿼리 실행

3. DFX 확인

dfx canister call types getBool


Empty

객체가 비어있음을 표현, 비교적 사용이 적음

2. CanidUI 확인

3. DFX 확인

  • npm 실행
npm run get_empty
dfx canister call types getEmpty

Float

float32, float64 두가지의 실수형 데이터 타입

1. 코드분석

import { Canister, float64, query } from 'azle';

export default Canister({
		getFloat32: query([], float32, () => {
        return Math.PI;
    }),

    getFloat64: query([], float64, () => {
        return Math.E;
    }),
});

package.json 추가, 수정

"get_float32": "dfx canister call types getFloat32",
"get_float64": "dfx canister call types getFloat64"

빌드 및 배포

npm run canister_deploy_local

2. CanidUI 확인

새로고침, 확인

Func

azle 콜백함수 처리, 함수 포인

1. 코드분석

import { Canister, Func, Principal, query, text } from 'azle';

const BasicFunc = Func([text], text, 'query');

export default Canister({
		getBasicFunc: query([], BasicFunc, () => {
        return [
            Principal.fromText('rrkah-fqaaa-aaaaa-aaaaq-cai'),
            'getBasicFunc'
        ];
    }),
});

2. CanidUI 확인

새로고침, 확인

3. DFX 확인

dfx canister call types getBasicFunc


int

정수형 데이터 타입, int(bigint 표현식), int8, int16, int32, int64

1. 코드분석

import { Canister, int, int64, query } from 'azle';

export default Canister({
    getInt: query([], int, () => {
        return 170_141_183_460_469_231_731_687_303_715_884_105_727n;
    }),
		getInt64: query([], int64, () => {
        return 9_223_372_036_854_775_807n;
    }),
});

package.json 추가, 수정

"get_int": "dfx canister call types getInt",
"get_int64": "dfx canister call types getInt64",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getInt
dfx canister call types getInt64

nat

바이트형 정수, nat, nat8, nat16, nat32, nat64

1. 코드분석

import { Canister, nat, query } from 'azle';

export default Canister({
    getNat: query([], nat, () => {
        return 340_282_366_920_938_463_463_374_607_431_768_211_455n;
    }),
		getNat64: query([], nat64, () => {
        return 18_446_744_073_709_551_615n;
    }),
});

package.json 추가, 수정

"get_nat": "dfx canister call types getNat",
"get_nat64": "dfx canister call types getNat64",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getNat
dfx canister call types getNat64

null

canister NULL 표

1. 코드분석

import { Canister, Null, query } from 'azle';

export default Canister({
    getNull: query([], Null, () => {
        return null;
    }),
});

package.json 추가, 수정

"get_null": "dfx canister call types getNull",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getNull

opt

Opt<T> 옵션 타입, T의 모든값과 null값을 포함, Rust의 Some, None 치환
opt bool, opt nat, opt int

1. 코드분석

import { bool, Canister, None, Opt, query, Some } from 'azle';

export default Canister({
    getOptSome: query([], Opt(bool), () => {
        return Some(true); // equivalent to { Some: true }
    }),
});

package.json 추가, 수정

"get_optSome": "dfx canister call types getOptSome",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getOptSome

text

문자열 데이터 타입

1. 코드분석

import { Canister, query, text } from 'azle';

export default Canister({
    getString: query([], text, () => {
        return 'Hello world!';
    }),
});

package.json 추가, 수정

"get_string": "dfx canister call types getString",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getString

vec

배열유형의 데이터 타입

1. 코드분석

import { Canister, int32, Vec, query } from 'azle';

export default Canister({
    getNumbers: query([], Vec(int32), () => {
        return [0, 1, 2, 3];
    }),
});

package.json 추가, 수정

"get_numbers": "dfx canister call types getNumbers",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getNumbers

record

스트럭쳐 형태의 데이터 타입으로, key-value 형식의 객체 타입.

1. 코드분석

import { Canister, Principal, query, Record, text } from 'azle';

const User = Record({
    id: Principal,
    username: text
});

export default Canister({
    getUser: query([], User, () => {
        return {
            id: Principal.fromUint8Array(Uint8Array.from([0])),
            username: 'lastmjs'
        };
    }),
});

package.json 추가, 수정

"get_user": "dfx canister call types getUser",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getUser

variant

객체를 구성하는 여러 데이터 타입을 가지는 구조체형 데이터 타입, 인라인 레코드

1. 코드분석

import { Canister, Null, query, Variant } from 'azle';

const Emotion = Variant({
    Happy: Null,
    Indifferent: Null,
    Sad: Null
});

const Reaction = Variant({
    Fire: Null,
    ThumbsUp: Null,
    Emotion: Emotion
});

export default Canister({
    getReaction: query([], Reaction, () => {
        return {
            Fire: null
        };
    }),
		printReaction: query([Reaction], Reaction, (reaction) => {
        console.log(typeof reaction);
        return reaction;
    }),
});

package.json 추가, 수정

"get_reaction": "dfx canister call types getReaction",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getReaction

principal

canister와 상호작용을 위한 객체 데이터 타입

1. 코드분석

import { Canister, Principal, query } from 'azle';

export default Canister({
    getPrincipal: query([], Principal, () => {
        return Principal.fromText('rrkah-fqaaa-aaaaa-aaaaq-cai');
    }),
});

package.json 추가, 수정

"get_prinCipal": "dfx canister call types getPrincipal",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getPrincipal


reserved

값이 예약된 유형, 주로 인수 예약, 권장하진 않음

1. 코드분석

import { Canister, query, reserved } from 'azle';

export default Canister({
    getReserved: query([], reserved, () => {
        return 'anything';
    }),
});

package.json 추가, 수정

"get_reserved": "dfx canister call types getReserved",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getReserved

service

전체서비스에 대한 참조를 전달하는 인터페이스 역할을 하는 객체

1. 코드분석

import { bool, Canister, ic, Principal, query, text, update } from 'azle';

const SomeCanister = Canister({
    query1: query([], bool),
    update1: update([], text)
});

export default Canister({
    getService: query([], SomeCanister, () => {
        return SomeCanister(Principal.fromText('aaaaa-aa'));
    }),
    callService: update([SomeCanister], text, (service) => {
        return ic.call(service.update1);
    })
});

package.json 추가, 수정

"get_service": "dfx canister call types getService",
"call_Service": "dfx canister call types callService",

2. CanidUI 확인

3. DFX 확인

dfx canister call types getService
dfx canister call types callService

내장 API

balance

cycle balance 조회 
cycle : 리소스(메모리, 연산, 저장 및 네트웍) 소비 측정 단위, 128bit
import { Canister, ic, nat64, query } from 'azle';

export default Canister({
    // returns the amount of cycles available in the canister
    canisterBalance: query([], nat64, () => {
        return ic.canisterBalance();
    }),
		
		canisterBalance128: query([], nat, () => {
        return ic.canisterBalance128();
    })
});

version

import { Canister, ic, nat64, query } from 'azle';

export default Canister({
    // returns the canister's version number
    canisterVersion: query([], nat64, () => {
        return ic.canisterVersion();
    })
});

id

import { Canister, ic, Principal, query } from 'azle';

export default Canister({
    // returns this canister's id
    id: query([], Principal, () => {
        return ic.id();
    })
});

data certificate

정기적으로 사용되는 시스템 인증 데이터 32byte를 핸들링
데이터 인증서 반환, 인증서가 없으면 null 반환
import { blob, Canister, ic, Opt, query } from 'azle';

export default Canister({
    dataCertificate: query([], Opt(blob), () => {
        return ic.dataCertificate();
    })

		dataCertificateNull: update([], Opt(blob), () => {
        return ic.dataCertificate();
    }),
		
		setCertifiedData: update([blob], Void, (data) => {
        ic.setCertifiedData(data);
    }),
});

Counter

instructionCounter : 캐니스터의 최종 실행 명령수 반환
performanceCounter : WebAssembly 실행 명령수 반환
import { Canister, ic, nat64, query } from 'azle';

export default Canister({
    instructionCounter: query([], nat64, () => {
        return ic.instructionCounter();
    }),
		performanceCounter: query([], nat64, () => {
        return ic.performanceCounter(0);
    }),
});

Controller

관리자 역할의 캐니스터들을 제어하는 권한을 가진 캐니스터를 지칭
import { bool, Canister, ic, Principal, query } from 'azle';

export default Canister({
    isController: query([Principal], bool, (principal) => {
        return ic.isController(principal);
    })
});

print

콘솔 로그 출력
import { bool, Canister, ic, query, text } from 'azle';

export default Canister({
    // prints a message through the local replica's output
    print: query([text], bool, (message) => {
        ic.print(message);

        return true;
    })
});

time

unix 타임 출력, 1697451000.000000000
import { Canister, ic, nat64, query } from 'azle';

export default Canister({
    // returns the current timestamp
    time: query([], nat64, () => {
        return ic.time();
    })
});
반응형

'신기술분석 > 블록체인' 카테고리의 다른 글

ICP 실습 #3  (1) 2023.10.21
ICP 실습 #1  (1) 2023.10.21
우분투 Geth 설치 하기  (1) 2022.06.12
Pinata IPFS 서비스  (0) 2022.06.12
오픈 재플린  (0) 2022.06.05

댓글