NodeJS에서 인터넷 컴퓨터 캐니스터 스마트 계약 호출



사진 제공: 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!"가 출력됩니다. 🥳.

    capture-d%E2%80%99e%CC%81cran-2022-04-22-a%CC%80-08.37.54.png


    결론



    NodeJS에서 캐니스터를 호출하는 것은 특히 관리 목적이 있는 작업을 구현하는 데 정말 편리합니다. 후속 블로그 게시물에서 사용자 캐니스터에 코드를 업데이트하고 설치하기 위해 이 솔루션을 어떻게 개선했는지 공유할 것입니다. 결국, 나는 여전히 테스트가 필요합니다 Papyrs 😉.

    무한과 그 너머로
    다윗


    더 많은 모험을 원하시면 저를 팔로우하세요

    좋은 웹페이지 즐겨찾기