NodeJS에서 인터넷 컴퓨터 캐니스터 스마트 계약 호출
14936 단어 tutorialjavascriptnodeweb3
사진 제공: Greg Rakozy on Unsplash
저는 지난 몇 개월 동안 100% 체인에 있는 오픈 소스, 프라이버시 우선, 분산형 블로깅 플랫폼Papyrs을 개발했습니다. 이 새로운 웹 편집기가 마침내 테스트할 준비가 되었습니다. 다시 블로그 게시물을 작성할 수 있습니다 😁.
이 새로운 web3 플랫폼은 DFINITY's 인터넷 컴퓨터를 사용합니다. 등록된 각 사용자는 두 개의 스마트 계약을 받기 때문에 이러한 캐니스터를 관리하는 스크립트를 개발하는 것이 특히 유용했습니다. 나머지cycles를 쿼리하거나 코드를 업데이트합니다.
프론트엔드 개발자로서 그 어떤 스크립팅 언어보다 NodeJS에 익숙합니다. 그래서 이 엔진을 사용하여 도구를 구현했습니다.
시작하기
greet(name: Text)
에 의해 생성된 기본dfx new <PROJECT\_NAME>
쿼리 함수를 호출하는 것이 흥미로운 예일 수 있습니다.actor {
public func greet(name : Text) : async Text {
return "Hello, " # name # "!";
};
};
이것이 바로 다음 장에서 NodeJS에서 이 특정 함수를 쿼리하는 스크립트(이를 호출하겠습니다
hello.mjs
)를 구현하는 이유입니다.try {
// TODO: implement query function
const result = await query();
console.log(`Result of canister call: ${result}`);
} catch (err) {
console.error(`Error while querying.`, err);
}
참고: 이 게시물을 단계별로 수행하려면
dfx new helloworld
로 새 샘플 프로젝트를 초기화할 수 있습니다.생성되면 디렉토리를 전환하고
cd helloworld
로컬 시뮬레이션 네트워크dfx start --background
를 시작하고 프로젝트dfx deploy
를 배포합니다.ECMAScript 모듈
다른 방법이 있을 수 있지만 NodeJS LTS 및
@dfinity/agent
라이브러리를 .mjs
스크립트와 함께 사용하는 것, 즉 일반적인 .js
스크립트가 아닌 경우에만 사용할 수 있었습니다.그렇기 때문에
candid
빌드 명령에 의해 생성된 dfx
JavaScript 파일인 did
파일도 실제로 ECMAScript 모듈로 변환되어야 합니다.기본적으로
cp helloworld.did.js hellowrold.did.mjs
이미 그게 전부입니다.언젠가는 자동 생성된 파일도 모듈로 자동 생성될 수 있지만 저는 그것에 대해 기능 요청을 열지 않았음을 인정해야 합니다.
내 프로젝트에서는 물론 NodeJS 스크립트로도 복사를 자동화했습니다(🤪). 유용할 수 있는 경우 코드 스니펫은 다음과 같습니다.
import {readFileSync, writeFileSync} from 'fs';
const copyJsToMjs = () => {
const srcFolder = './src/declarations/helloworld';
const buffer = readFileSync(`${srcFolder}/helloworld.did.js`);
writeFileSync(`${srcFolder}/helloworld.did.mjs`, buffer.toString('utf-8'));
};
try {
copyJsToMjs();
console.log(`IC types copied!`);
} catch (err) {
console.error(`Error while copying the types.`, err);
}
스크립트 "Hello World"
NodeJS v18은 fetch command 의 실험적 기본 지원을 도입합니다. LTS 버전의 경우 node-fetch이 필요합니다.
npm i node-fetch -D
템플릿에서 제공하는 것보다 더 이상 종속성을 설치할 필요가 없습니다.
agent-js을 사용하여 IC(인터넷 컴퓨터)를 쿼리합니다.
candid
인터페이스에 대한 액터를 생성하고 함수 greet('world')
를 효과적으로 호출합니다.const query = async () => {
const actor = await actorIC();
return actor.greet('world');
}
액터의 초기화는 기본 템플릿에서 제공하는 프런트엔드 코드와 매우 유사합니다. 그러나 NodeJS 컨텍스트에서 IC를 쿼리하는 데 필요한 두 가지 중요한 차이점이 있습니다.
host
를 제공해야 합니다.node-fetch
는 네트워크 요청을 실행하는 방법을 제공하는 데 필요합니다agent-js
.import fetch from "node-fetch";
import pkgAgent from '@dfinity/agent';
const {HttpAgent, Actor} = pkgAgent;
import {idlFactory} from './src/declarations/helloworld/helloworld.did.mjs';
export const actorIC = async () => {
// TODO: implement actor initialization
const canisterId = actorCanisterIdLocal();
const host = 'http://localhost:8000/'; // Mainnet: 'https://ic0.app'
const agent = new HttpAgent({fetch, host});
// Local only
await agent.fetchRootKey();
return Actor.createActor(idlFactory, {
agent,
canisterId
});
};
마지막으로 캐니스터 ID를 검색할 수 있습니다. 물론 그 값을 하드코딩할 수도 있지만 정보를 동적으로 읽는 것이 편리하다는 것을 알았습니다.
import {readFileSync} from "fs";
import pkgPrincipal from '@dfinity/principal';
const {Principal} = pkgPrincipal;
const actorCanisterIdLocal = () => {
const buffer = readFileSync('./.dfx/local/canister_ids.json');
const {helloworld} = JSON.parse(buffer.toString('utf-8'));
return Principal.fromText(helloworld.local);
};
const actorCanisterIdMainnet = () => {
const buffer = readFileSync('./canister_ids.json');
const {helloworld} = JSON.parse(buffer.toString('utf-8'));
return Principal.fromText(helloworld.ic);
};
스크립트가 구현됩니다. 터미널에서 실행하면 예상 결과 "Hello, world!"가 출력됩니다. 🥳.
결론
NodeJS에서 캐니스터를 호출하는 것은 특히 관리 목적이 있는 작업을 구현하는 데 정말 편리합니다. 후속 블로그 게시물에서 사용자 캐니스터에 코드를 업데이트하고 설치하기 위해 이 솔루션을 어떻게 개선했는지 공유할 것입니다. 결국, 나는 여전히 테스트가 필요합니다 Papyrs 😉.
무한과 그 너머로
다윗
더 많은 모험을 원하시면 저를 팔로우하세요
Reference
이 문제에 관하여(NodeJS에서 인터넷 컴퓨터 캐니스터 스마트 계약 호출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/daviddalbusco/call-internet-computer-canister-smart-contracts-in-nodejs-1dge텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)