무지개곰
article thumbnail
반응형

목차

Defender란?

Autotask란?

사용 방법

Autotask에 module 추가

github

 


Defender란?

Defender는 relayer와 autotask 등 다양한 기능을 제공하여 개발자들이 스마트 계약을 운영하고 보호하기 위한 종합적인 플랫폼입니다. 이를 통하여 스마트 계약의 트랜잭션 송신과 처리를 관리하고, 트랜잭션 수수료를 최적화하여 네트워크 복잡성을 해결하여 사용자가 원활하게 스마트 계약 트랜잭션을 처리할 수 있습니다.

 


Autotask란?

Autotask는 자동화된 작업 실행을 지원하는 도구입니다. Autotask를 사용하면 정기적으로 실행되는 작업, 이벤트 기반 작업, 등을 자동으로 처리할 수 있습니다. Schedule, Webhook, Sentinel 3가지의 작동방식이 있으며 각각 순서대로 일정에 따라 실행하는 방법, HTTP POST 요청으로 실행하는 방법, 이벤트 감지를 통하여 실행하는 방법이 있습니다. 그중 이번 글에서는 Webhook을 이용하는 방법을 알아보겠습니다.


사용방법

페이지 이용

Relayer 생성

relayer 생성
relayer의 이름과 사용할 network 설정


Autotask 생성

autotask 생성

Autotask를 생성하기 위하여 createAutotask를 눌러줍니다.

autotask 설정

다음과 같은 창에서 생성할 Autotask의 이름을 지정하고 trigger를 정하게 됩니다. Schedule의 경우 Autotask의 업무를 일정에 따라 실행시킬 수 있습니다. 이번 글에서는 Webhook을 사용하는 방법을 알아보도록 하겠습니다. 따라서 Webhook을 클릭하고 연결할 relayer 즉 autotask를 실행할 때 gas비용을 지불할 relayer를 선택합니다.

실행할 코드 작성 및 생성

마지막으로 Autotask가 실행될 때 실행시킬 코드를 작성하고 create버튼을 눌러줍니다. 위의 예시는 단순히 to에 지정된 address로 100 wei를 전송하는 code입니다.


Script를 이용

script를 이용하기 위해서 우선 Team API Key를 발급받아야 합니다. 이 API Key를 통하여 누가 Relayer 혹은 Autotask를 생성하는지 확인하기에 Team API Key를 먼저 발급받아야 합니다. 발급 방법은 아래와 같습니다.

Team API Key 발급

Openzeppelin의 Defender 사이트 우측에 메뉴버튼을 누르면 위와 같은 창이 뜹니다. Team API Keys를 선택하여 들어가신 후 API Key를 발급받습니다.

Relayer 생성

Relayer를 생성하기 위한 script는 아래와 같습니다. run이라는 메서드를 생성하고 앞서 발급받은 Team API Key를 이용하여 relayClient를 생성합니다. 그리고 RequestParams에 relayer의 이름과 사용할 network를 입력하고 relayClient의 메서드인 creat를 생성합니다.

WriteFileSync를 이용하여 생성한 relay의 정보를 json 파일로 저장을 하고 생성한 relayer의 API Key를 env 파일에 작성하는 코드를 추가합니다.

이렇게 생성한 js 파일을 'node 파일명'명령어를 통하여 실행시켜 relayer를 생성합니다. 

const { RelayClient } = require("defender-relay-client");
const { appendFileSync, writeFileSync } = require("fs");

async function run() {
  require("dotenv").config();
  const apiKey = process.env.TEAM_API_KEY;
  const apiSecret = process.env.TEAM_API_SECRET_KEY;
  const relayClient = new RelayClient({ apiKey, apiSecret });

  // create relay using defender client
  const requestParams = {
    name: "testRelayCreate",
    network: "mumbai",
    minBalance: BigInt(1e17).toString(),
  };
  const relayer = await relayClient.create(requestParams);

  // store relayer info in file - ID is all you need if sending tx via autotask
  writeFileSync(
    "relay.json",
    JSON.stringify(
      {
        relayer,
      },
      null,
      2
    )
  );
  console.log("Relayer ID: ", relayer.relayerId);

  // create and save the api key to .env - needed for sending tx directly
  const { apiKey: relayerKey, secretKey: relayerSecret } =
    await relayClient.createKey(relayer.relayerId);
  appendFileSync(
    ".env",
    `\nREACT_APP_RELAYER_API_KEY=${relayerKey}\nREACT_APP_RELAYER_API_SECRET=${relayerSecret}`
  );
}

run().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

Autotask 생성

main함수를 생성하고 Team API Key를 이용하여 client를 생성하고 client를 통하여 Autotask를 생성합니다. create의 매개변수로 name은 autotask의 이름, encodedZippedCode는 Autotask가 실행할 코드, relayerId는 연결할 relayer, trigger는 실행 방식이 포함됩니다. relayer와 마찬가지로 script로 생성 후 얻게 되는 API Key를 env 파일에 추가하는 코드를 작성합니다.

이렇게 생성한 js 파일을 'node 파일명'명령어를 통하여 실행시켜 autotask를 생성합니다.

const { AutotaskClient } = require("defender-autotask-client");
const { readFileSync, appendFileSync } = require("fs");

async function main() {
  require("dotenv").config();
  const {
    relayer: { relayerId },
  } = JSON.parse(readFileSync("./relay.json"));
  const apiKey = process.env.TEAM_API_KEY;
  const apiSecret = process.env.TEAM_API_SECRET_KEY;
  const client = new AutotaskClient({ apiKey, apiSecret });
  const { autotaskId } = await client.create({
    name: "testAutotasks",
    encodedZippedCode: await client.getEncodedZippedCodeFromFolder(
      "./autotasks/relay"
    ),
    relayerId: relayerId,
    trigger: {
      type: "webhook",
    },
    paused: false,
  });
  console.log("Autotask created with ID ", autotaskId);
  appendFileSync(".env", `\nAUTOTASK_ID="${autotaskId}"`, function (err) {
    if (err) throw err;
  });
}

if (require.main === module) {
  main()
    .then(() => process.exit(0))
    .catch((error) => {
      console.error(error);
      process.exit(1);
    });
}

 


Webhook 사용하여 요청 보내기

    const Result = await fetch(webhookURI, {
      method: "POST",
      body: JSON.stringify(실행에 필요한 내용),
      headers: { "Content-Type": "application/json" },
    });

위의 코드처럼 webhookURI에 생성한 Autotask의 Webhook URI를 입력해 줍니다. body는 json 형식으로 Autotask에 작성된 작업을 수행할 때 필요한 data를 작성합니다.


Autotask에 module 추가

Autotask에 실행하고 싶은 코드를 작성하다 보면 module을 추가해야 하는 경우가 있습니다. 하지만 단순히 Autotask에 require문을 작성한다고 해서 인식하지 않습니다. 이럴 때 rollup을 이용하여 해결할 수 있습니다.

rollup 사용하기

rollup을 하기 위하여 우선 rollup을 설치합니다.

npm i rollup

그 후 rollup 실행은 아래의 명령어를 사용하여야 합니다.

npx rollup -c

혹은 package.json파일에 script를 작성하여 실행할 수 있습니다.

 "scripts": {
    "build": "rollup -c",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

실행할 내용은 root folder에 rollup.config.js파일을 생성하여 아래와 같이 작성합니다.

import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import json from '@rollup/plugin-json';
import builtins from 'builtin-modules';

export default {
  input: 'autotasks/relay/index.js',
  output: {
    file: 'build/relay/index.js',
    format: 'cjs',
    exports: 'auto',
  },
  plugins: [
    resolve({ preferBuiltins: true }),
    commonjs(),
    json({ compact: true }),
  ],
  external: [
    ...builtins,
    'ethers',
    'web3',
    'axios',
    /^defender-relay-client(\/.*)?$/,
  ],
};

resolve : Rollup의 플러그인으로, 외부 종속성을 해결하는 데 사용됩니다. preferBuiltins 옵션은 내장모듈을 우선적으로 해결하는 데 사용됩니다.

commonjs : Rollup의 플러그인으로 CommonJS모듈을 ES모듈로 변환하는 데 사용됩니다.

json : Rollup의 플러그인으로 JSON 파일을 가져와서 javascript 객체로 변환하는 데 사용됩니다. compact 옵션은 결과로 생성되는 JSON 객체가 최소화되도록 합니다.

typescript : Rollup의 플러그인으로, Typescript파일을 컴파일하는 데 사용됩니다.

external : 번들에 포함되지 않아야 하는 외부 종속성 목록을 지정합니다. builtins는 Node.js에 내장된 모듈 목록입니다.

input : 번들에 포함시킬 파일 경로를 입력합니다.

output : file은 번들된 코드의 출력 파일 경로를 지정합니다. format은 번들된 코드의 익스포트 방식을 지정합니다. cjs는 CommonJS 형식을 의미합니다. exports는 번들된 코드의 익스포트 방식을 지정합니다. auto로 설정되어 있으면 Rollup이 자동으로 적절한 익스포트 형식을 선택합니다.

 

위의 방식으로 생성된 번들 코드를 복사하여 Autotask의 실행할 코드에 붙여 넣어주면 됩니다.


예시 github

https://github.com/rainbow96bear/OpenzeppelinGaslessTxTest

 

GitHub - rainbow96bear/OpenzeppelinGaslessTxTest

Contribute to rainbow96bear/OpenzeppelinGaslessTxTest development by creating an account on GitHub.

github.com

 

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!