체인링크와 ArcGIS

이전 게시물에서 ArcGIS JSAPI와 함께 사용할 dapp app을 생성하는 방법에 대해 이야기했습니다. 그 경우 우리는 기능 서비스의 편집을 추적하기 위해 스마트 계약을 배포했습니다. 이는 스마트 계약으로 할 수 있는 일의 표면을 간신히 긁는 것입니다. 스마트 계약 작업의 한계는 외부 데이터에 액세스할 수 없다는 것입니다. 배포된 블록체인 네트워크와 분리되어 작동합니다. 이 문제를 해결하기 위해 oracle 을 사용할 수 있습니다.

아마도 가장 인기 있는 오라클은 Chainlink 입니다. Chainlink는 하이브리드 스마트 계약을 작성할 수 있는 분산 네트워크를 제공합니다. 스마트 계약은 오라클에 외부 데이터를 요청한 다음 그 결과를 계약에 다시 제공하도록 요청할 수 있습니다. 이것은 거의 모든 일을 하고, 가격 데이터를 가져오고, 사용자 정보를 확인하고, 날씨를 확인하고, 외부 센서에 액세스하고, 이름을 지정하고, 할 수 있습니다!

로컬 Chainlink 노드 설정에 대한 자세한 내용은 다루지 않겠습니다. docs 단계에 대해 자세히 설명합니다. 또한 설정에 대한 다음 동영상을 추천합니다.
  • Setup a Chainlink Node on the GCP
  • Building and Using External Adapters
  • Ultimate Customization with External Adapters

  • 커스텀 API



    Chainlink 노드가 실행되고 나면 무언가를 수행하는 자체 외부 API를 구축할 수 있습니다. 지오펜스 API를 구현하고 싶었습니다. 몇 달 안에 내IoTeX Pebble를 얻을 때 구현하고 싶은 것을 생각하고 있었습니다. 내 간단한 API는 위도와 경도를 사용하고 기능 서비스를 확인하여 좌표가 다각형 집합에 있는지 확인합니다. 상당히 간단하면서도 실용적인 사용 사례입니다. ArcGIS API for JavaScript with Node 사용에 대한 자세한 내용은 이전 블로그 게시물을 참조할 수 있지만 Python 또는 다른 언어로 API를 작성할 수도 있습니다.

    import adapter from '@chainlink/external-adapter';
    const { Requester, Validator } = adapter;
    import "cross-fetch/dist/node-polyfill.js";
    import "abort-controller/polyfill.js";
    
    import esriConfig from "@arcgis/core/config.js";
    import FeatureLayer from '@arcgis/core/layers/FeatureLayer.js';
    import Point from '@arcgis/core/geometry/Point.js';
    
    esriConfig.request.useIdentity = false;
    
    const itemId = 'd373ca438b7a40ac80733458236d02be';
    
    const layer = new FeatureLayer({
      portalItem: {
        id: itemId
      }
    });
    
    // Define custom parameters to be used by the adapter.
    const customParams = {
      lat: ['y', 'lat', 'latitude'],
      lon: ['x', 'lon', 'longitude']
    }
    
    export const createRequest = async(input, callback) => {
      // The Validator helps you validate the Chainlink request data
      const validator = new Validator(callback, input, customParams)
      const jobRunID = validator.validated.id
      const latitude = Number(validator.validated.data.lat);
      const longitude = Number(validator.validated.data.lon);
    
      await layer.load();
      const q = {
        returnGeometry: true,
        where: '1=1'
      };
      const { features } = await layer.queryFeatures(q);
      const point = new Point({ latitude, longitude });
    
      const isValid = features.some((feature) => {
        return feature.geometry.contains(point);
      });
    
      const response = {
        jobRunID,
        data: {
          result: isValid
        },
        status: 200
      };
    
      callback(response.status, Requester.success(jobRunID, response));
    }
    


    여기서 멋진 기능은 Validator 를 사용하여 lat , y , latitude 와 같이 매개변수에 대체 이름을 사용할 수 있다는 것입니다. 요청과 함께 요점을 보내고 결과가 있는지 확인할 수도 있지만 API 내에서 일부 작업을 수행하는 방법을 보여주고 싶었습니다.

    내 사용자 지정 API를 설정하면 내 Chainlink 노드에 an external adapter using a bridge으로 추가할 수 있습니다. 브리지가 있으면 브리지 서비스를 사용할 새 작업을 추가하고 노드의 다른 사용자에게 노출할 수 있습니다.

    스마트 계약



    remix.ethereum을 사용하여 내 Chainlink 작업을 사용하기 위한 스마트 계약을 작성할 수 있습니다. 저는 기본example shown here 계약을 기반으로 했습니다. 내 오라클 계약 주소와 내 사용자 지정 작업의 해당 작업 ID로 스마트 계약을 제공합니다.

    pragma solidity ^0.6.0;
    
    import "@chainlink/contracts/src/v0.6/ChainlinkClient.sol";
    
    contract GeoFence is ChainlinkClient {
        address private oracle;
        bytes32 private jobId;
        uint256 private fee;
    
        bool public result;
        constructor() public {
            setPublicChainlinkToken();
            // my testnet oracle contract address
            oracle = 0x316eF679Ed7b5F5Dbe9e10bC426f0D1DE15Dbfc0;
            jobId = "a10807bdfaf54a3e9969b0cd4741ba65";
            fee = 0.1 * 10 ** 18; // (Varies by network and job)
        }
    
        /**
         * Initial request
         */
        function requestGeoFence(string memory _lat, string memory _lon) public {
            Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfillGeoFence.selector);
            req.add("lat", _lat);
            req.add("lon", _lon);
            sendChainlinkRequestTo(oracle, req, fee);
        }
    
        /**
         * Callback function
         */
        function fulfillGeoFence(bytes32 _requestId, bool _result) public recordChainlinkFulfillment(_requestId) {
            result = _result;
        }
    }
    


    계약은 _lat_lon를 사용하여 이에 대한 Chainlink 요청을 작성합니다.

    완료되면 트랜잭션을 내 노드에 제출할 수 있습니다. 거짓말이 아닙니다. 트랜잭션을 위해 노드를 통해 이 요청을 보내는 것이 가장 빠른 작업은 아닙니다. 여기에서 내 계약의 이벤트가 유용할 수 있으므로 결과가 준비되면 들을 수 있습니다. 하지만 그럴 때 리믹스에서 내 결과를 확인하여 내 지오펜스에서 내 좌표를 확인할 수 있습니다!

    이 단계를 더 자세히 보고 싶다면 아래 동영상을 확인하세요!

    좋은 웹페이지 즐겨찾기