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);
})
});
콘솔 로그 출력
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();
})
});
'신기술분석 > 블록체인' 카테고리의 다른 글
nodeguardians (0) | 2024.08.31 |
---|---|
메타마스크 연동 가능 블록체인 List (0) | 2024.08.31 |
ICP 실습 #3 (1) | 2023.10.21 |
ICP 실습 #1 (1) | 2023.10.21 |
우분투 Geth 설치 하기 (1) | 2022.06.12 |
댓글