자습서: OpenZeppelin Defender에서 자동 작업 시작하기

이 자습서에서는 Defender Autotasks를 소개합니다.

자동 작업이란 무엇입니까?



Autotask는 일정에 따라 또는 일부 조건 집합에 의해 트리거되는 약간의 Javascript 코드를 실행할 수 있는 Defender를 통해 사용할 수 있는 환경입니다. documentation의 첫 번째 섹션에서 자동 작업에 대한 개요와 다른 Defender 구성 요소와의 관계를 확인하세요.

Behind the Scenes of the Autotask environment

자동 작업 예:
  • Pause Guardian Security Automation
  • Balance Maintenance Automation

  • Hello World 자동 작업 만들기



    이 연습에서는 Defender Autotask 설정과 관련된 움직이는 부분에 대한 실습 소개를 제공합니다.

    설정



    생성할 Autotask는 Relayer을 사용하여 ethers.js JSON-RPC 호출을 만듭니다.

    새 릴레이어 만들기
    왼쪽에서 릴레이를 선택한 다음 릴레이 생성을 선택합니다. Relayer에 이름을 지정하고 네트워크에 대해 Goerli를 선택합니다.

    Hello World - (웹 인터페이스 사용)



    Defender에서 각 주요 구성 요소는 화면 왼쪽에 나열됩니다.

    자동 작업 -> 새 자동 작업을 선택합니다.

    Autotask에 이름을 지정하고 Autotask의 끝점으로 전송된 요청을 통해 트리거될 수 있도록 Webhook을 선택합니다.

    Autotask가 공급자로 연결하고 Ethers.js를 사용하여 네트워크 쿼리를 만들 수 있도록 방금 생성한 Relayer를 선택합니다.

    Autotask는 handler를 내보내야 하는 약간의 서버리스 코드입니다. 핸들러는 Autotask가 트리거될 때마다 호출되는 것입니다.

    Autotask에 다음 코드를 제공하십시오.

    const { KeyValueStoreClient } = require('defender-kvstore-client')
    const ethers = require('ethers')
    const {
      DefenderRelaySigner,
      DefenderRelayProvider,
    } = require('defender-relay-client/lib/ethers')
    
    async function handler(event) {
      const store = new KeyValueStoreClient(event)
      const provider = new DefenderRelayProvider(event)
      const {userName} = event.request.body;
      const block = await provider.getBlockNumber();
      const lastRunBlockNumber = await store.get('lastRunBlockNumber')
      let msg = (lastRunBlockNumber) ? `This Autotask was last triggered on block ${lastRunBlockNumber}` : 'This is the first time this Autotask has been triggered'
    
      await store.put('lastRunBlockNumber', block.toString())
    
      return `Hello ${userName}! Current block: ${block}. ${msg}`;
    }
    
    module.exports = {
      handler,
    }
    
    
    
    


    Key-value data store package을 사용하면 서로 다른 Autotask 실행 간에 데이터 저장소를 유지할 수 있습니다.

    다음 화면에서 Webhook URI를 복사합니다.

    Postman(또는 유사)을 열고 새 POST 요청을 생성합니다. Autotask의 끝점을 붙여넣습니다. 본문 탭에서 다음을 raw/JSON으로 보냅니다.

    {
        "name": "Satoshi"
    }
    


    요청을 실행하십시오! 본문 결과에 인사말이 표시됩니다.

    Autotask를 성공적으로 만들고 트리거한 것을 축하합니다! 다음으로 웹 인터페이스가 아닌 클라이언트 패키지를 사용하여 Autotask를 만듭니다.

    Hello World - (defender-autotask-client 사용)



    Defender 클라이언트 패키지를 사용하면 선호하는 코드 편집기를 사용하여 API를 통해 다양한 Defender 구성 요소를 만들고 관리할 수 있습니다.

    새 폴더를 만들고 초기화합니다package.json.

    $ mkdir autotasks && cd autotasks && yarn init -y
    


    Defender Autotask Client 및 필요한 npm 패키지를 설치합니다.

    $ yarn add defender-autotask-client defender-relay-client defender-kvstore-client dotenv
    

    defender-client 패키지를 사용하면 자동 작업과 함께 전체 CRUD 기능을 사용할 수 있습니다.

    환경 변수를 저장할 gitignored 파일을 만듭니다.

    $ touch .env
    


    이 파일에서 Defender Team API 키와 암호를 제공합니다.

    API_KEY=
    API_SECRET=
    


    Autotask 코드용 새 파일index.js을 만듭니다.

    $ mkdir autotasks && touch autotasks/index.js
    


    클라이언트 패키지를 사용할 때 Defender는 Autotask 코드가 index.js 파일에 있을 것으로 예상합니다.
    index.js 에서 이전과 동일한 Autotask 코드를 제공합니다.

    릴레이어의 ID를 가져옵니다.

    Autotask는 Relayer ID를 지정하여 연결된 Relayer를 알고 있습니다.

    웹 UI를 사용하면 Relayer를 선택하기만 하면 됩니다. defender-client 패키지를 사용하면 해당 ID를 사용하여 Relayer를 지정해야 합니다.
    defender-relay-client 패키지를 사용하면 간단한 쿼리를 실행하여 Defender 계정과 연결된 모든 릴레이어를 나열할 수 있습니다.

    $ mkdir scripts && touch scripts/getRelayerId.js
    


    다음 코드를 추가하고 스크립트를 실행합니다.

    const { RelayClient } = require('defender-relay-client');
    
    async function run() {
      const { API_KEY: apiKey, API_SECRET: apiSecret } = process.env;
      const relayClient = new RelayClient({ apiKey, apiSecret });
      console.log(await relayClient.list());
    }
    
    run().catch((error) => {
      console.error(error);
      process.exitCode = 1;
    });
    


    Autotask를 연결하려는 Relayer의 값relayerId을 복사합니다. Autotask 생성 스크립트에서 이 값을 제공합니다.

    다음으로 코드를 배포할 스크립트를 만듭니다.

    $ mkdir scripts && touch scripts/createAutotask.js
    


    다음 코드를 추가합니다.

    const { AutotaskClient } = require('defender-autotask-client')
    
    async function main() {
      require('dotenv').config()
      const credentials = {
        apiKey: process.env.API_KEY,
        apiSecret: process.env.API_SECRET,
      }
      const autotaskClient = new AutotaskClient(credentials)
    
      const params = {
        name: 'Hello World 2',
        encodedZippedCode: await autotaskClient.getEncodedZippedCodeFromFolder(
          './autotasks'
        ),
        trigger: {
          type: 'webhook',
        },
        paused: false,
        relayerId: '3f12191a-26a3-44ca-a3c9-ab7b57a97b8e',
      }
    
      const createdAutotask = await autotaskClient.create(params)
      console.log('Created Autotask with ID: ', createdAutotask.autotaskId)
    
    }
    
    if (require.main === module) {
      main()
        .then(() => process.exit(0))
        .catch((error) => {
          console.error(error)
          process.exit(1)
        })
    }
    

    node scripts/createAutotask.js로 실행

    Defender를 열고 Autotasks 대시보드를 새로 고칩니다. 이 Autotask의 webhook을 복사하여 Postman에 제공하고 이전과 같이 Autotask를 트리거합니다.

    Autotask는 동일한 키-값 저장소를 사용하기 때문에 이전에 UI를 통해 생성된 Autotask에서 저장된 값을 볼 수 있습니다.

    Defender Autotasks의 세계로 첫 발을 내딛은 것을 축하합니다!

    좋은 웹페이지 즐겨찾기