신규: Helius가 Light Protocol을 인수했습니다
Raydium 유동성 풀을 모니터링하는 방법
블로그/개발

Raydium 유동성 풀을 모니터링하는 방법

개발자 경험 엔지니어X의 Anam AnsariLinkedIn의 Anam Ansari
읽는 데 7분
목차

    전통 금융에서는 구매자와 판매자가 중앙화된 시장을 통해 자산에 유동성을 제공합니다. 탈중앙화 금융(DeFi)은 대신 유동성 풀을 사용합니다. 유동성 풀은 사용자가 탈중앙화 거래소와 기타 DeFi 플랫폼에서 암호화폐를 사고팔 수 있게 하는 스마트 컨트랙트입니다. 유동성 풀을 모니터링하면 특정 자산의 성과를 추적하고 매수, 매도 또는 스왑 시점을 합리적으로 결정할 수 있습니다. 새 유동성 풀의 생성을 모니터링하면 최근 출시된 토큰도 발견할 수 있습니다.

    이 글에서는 유동성 풀을 모니터링하는 두 가지 방법인 webhook과 WebSocket을 설명합니다. 유동성 풀에서 발생하는 이벤트를 수신하도록 webhook과 WebSocket을 설정하는 방법도 알아봅니다. 플랫폼 작동 방식을 살펴보기 전에 Helius API 키가 필요합니다. Helius Dashboard에서 간단히 발급받을 수 있습니다. GitHub, Solana Wallet 또는 Google 계정으로 가입한 후 왼쪽 사이드바의 API Keys 섹션으로 이동하세요.

    Webhook을 통한 모니터링

    webhook을 사용하려면 크게 세 단계를 따라야 합니다. 먼저 Cloudflare Worker를 설정합니다. 다음으로 Helius webhook을 설정하고 Cloudflare Worker의 URL을 추가합니다. 유동성 풀의 트랜잭션이 감지될 때마다 webhook이 Worker를 트리거합니다. 마지막으로 알림을 처리하고 응답을 기록하도록 Worker 코드를 수정합니다.

    Cloudflare Worker 설정

    webhook이 트리거하는 Worker를 설정합니다. webhook에서 받은 트리거를 처리하는 코드를 Worker에 추가합니다. Cloudflare Workers를 사용하면 서버리스 코드를 배포할 수 있습니다. Cloudflare 웹사이트에 로그인하거나 가입한 후 메인 페이지 왼쪽 패널에서 Workers & Pages를 선택하세요.

    ‍Create application 버튼을 클릭하세요.

    ‍다음으로 Create Worker를 클릭하세요.

    ‍이제 Deploy를 클릭하세요.

    ‍Worker가 성공적으로 배포되었습니다. webhook 설정에 사용할 Worker 링크를 복사하세요.

    Webhook 설정

    완전히 탈중앙화된 중앙 지정가 주문장을 활용하도록 Solana에 구축된 최초의 AMM인 Raydium을 모니터링합니다. 중앙 지정가 주문장은 주식 시장에서 일반적으로 사용하는 거래소 방식의 체결 방법으로, 가격과 시간 우선순위에 따라 모든 매수 및 매도 주문을 매칭합니다. 탈중앙화 중앙 지정가 주문장(CLOB)은 중앙 기관이 아닌 분산된 노드 네트워크에서 작동하는 거래 시스템입니다. 

    Helius를 사용해 webhook을 생성합니다. webhook을 사용하면 온체인 이벤트를 수신하고 해당 이벤트가 발생할 때 특정 작업을 트리거할 수 있습니다. 지정된 Raydium 유동성 풀에서 특정 트랜잭션 유형을 수신하도록 webhook을 구성합니다. 현재 Helius는 Raydium에 대해 다음 트랜잭션 유형을 지원합니다. 

    코드
    "RAYDIUM": [
       "WITHDRAW_LIQUIDITY"
       "ADD_LIQUIDITY"
       "CREATE_POOL"
       "SWAP"
     ]

    Helius Dashboard 또는 API 레퍼런스를 사용해 webhook을 생성할 수 있습니다. Dashboard에서 생성하려면 왼쪽 패널의 Webhooks 섹션으로 이동한 후 New Webhook을 클릭하세요.

    그런 다음 다음과 같은 세부 정보를 입력해 webhook을 구성하세요.

    1. 네트워크: Mainnet/Devnet
    2. Webhook 유형: 원하는 데이터를 받으려면 Enhanced, Raw 또는 Discord webhook 유형 중 하나를 선택하세요. 사람이 읽을 수 있는 데이터를 원한다면 Enhanced를 선택하면 됩니다. 여기서는 Enhanced를 선택하겠습니다. Discord를 사용하려면 Webhook URL을 제출해야 하며, 봇이 알림 형식을 지정해 직접 전송합니다. Discord Bot용 webhook 설정 방법은 이 글을 참고하세요. Raw를 선택하면 트랜잭션 유형을 지정할 수 없습니다.
    3. 트랜잭션 유형: 아래 이미지에 표시된 트랜잭션 유형을 선택하세요*.* 프로그램에서 지원하는 다른 트랜잭션 유형은 여기에서 확인할 수 있습니다. 
    4. Webhook URL: Cloudflare에서 설정한 Worker의 URL을 추가하세요(Discord를 선택했다면 봇의 Webhook URL을 입력해야 합니다).
    5. 인증 헤더: webhook의 POST 요청에 전달할 인증 헤더를 입력하세요. 이 항목은 선택 사항입니다.
    6. 계정 주소: Raydium의 AMM 프로그램 주소는 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8입니다. 필요한 경우 계정 주소를 두 개 이상 추가할 수도 있습니다. 모니터링할 자산의 주소도 포함할 수 있습니다. 

    **Confirm,**을 클릭하면 webhook이 Cloudflare Worker에 알림을 보냅니다.

    다음 단계는 알림을 처리할 적절한 코드를 작성하는 것입니다.

    Worker에서 Webhook 알림 처리

    Worker가 트리거될 때 데이터를 올바르게 처리할 수 있도록 코드를 추가하려면 Wrangler CLI를 설치해야 합니다.

    Wrangler가 스크립트를 Cloudflare에 배포할 수 있도록 Cloudflare 계정에 로그인하세요.

    명령 프롬프트 또는 터미널을 열고 다음을 입력하세요.

    코드
    wrangler login

    Wrangler가 브라우저에서 Cloudflare 동의 화면을 자동으로 열면 Allow 버튼을 클릭하세요. 그러면 API 토큰이 Wrangler로 전송됩니다.‍

    Cloudflare Dashboard에서 생성한 Worker를 기반으로 새 프로젝트를 초기화하세요.

    코드
    wrangler init --from-dash <worker-name>

    Worker 이름을 확인하려면 Metrics 섹션을 살펴보세요.

    ‍위 명령은 Worker의 구성과 코드가 포함된 폴더를 생성합니다. 다음으로 src/index.js 파일의 코드를 아래 제공된 코드로 교체하세요. API 키를 반드시 추가해야 합니다. API 키를 숨기려면 다음 권장 사항을 따르는 것이 좋습니다.

    이제 Worker에서 다음 코드를 사용하겠습니다.

    코드
    const HELIUS_API_KEY = API_KEY;
    const HELIUS_RPC_URL = `https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}`;
    
    addEventListener('fetch', event => {
        event.respondWith(handleRequest(event.request))
    })
    
    async function handleRequest(request) {
        if (request.method === 'POST') {
            const requestBody = await request.json();
            console.log(requestBody[0].description);
    
            return new Response('Logged POST request body.', { status: 200 });
        } else {
            return new Response('Method not allowed.', { status: 405 });
        }
    }

    ‍이 코드에서는 알림의 설명만 기록합니다. 응답 알림은 파싱된 트랜잭션 형식을 사용합니다. 가격 정보와 같은 금융 데이터는 제공되지 않는다는 점에 유의하세요. 금융 정보는 Jupiter나 Birdeye 같은 플랫폼에서 얻을 수 있습니다.‍

    프로젝트를 Cloudflare의 글로벌 네트워크에 배포하세요.

    코드
    wrangler publish

    코드가 성공적으로 게시되면 로그를 확인해 보겠습니다.

    Cloudflare 웹사이트로 돌아가 Logs 섹션으로 이동하세요.

    ‍Begin Log Stream 버튼을 클릭하세요.

    ‍수신한 로그를 펼치면 "message" 아래에서 기록된 데이터를 확인할 수 있습니다.

    WebSocket을 통한 모니터링

    WebSocket은 클라이언트와 서버가 실시간으로 데이터를 교환할 수 있게 하는 통신 프로토콜입니다. 클라이언트가 요청을 보내고 서버의 응답을 기다리는 기존 방식과는 다릅니다. WebSocket에서는 연결이 열린 상태로 유지되며 데이터가 지속적으로 교환됩니다. WebSocket을 사용해 Raydium 유동성 풀을 모니터링하겠습니다.

    프로젝트에서 더 빠른 응답 속도를 구현하기 위해 베타 기능으로 제공되는 Geyser 강화 transactionSubscribe 메서드를 사용하겠습니다. 이 메서드는 Business 또는 Professional 플랜에서만 사용할 수 있습니다. Geyser Enhanced WebSocket은 표준 RPC WebSocket 메서드보다 빠릅니다. 시작하려면 기본 JavaScript 프로젝트를 만들고 websocket-test라는 새 폴더를 생성하세요. 그런 다음 package.json 파일을 만들어야 합니다.

    코드
    {
        "name": "websocket-test",
        "version": "1.0.0",
        "description": "",
        "main": "index.js",
        "scripts": {
            "test": "echo \"Error: no test specified\" && exit 1",
            "start": "ts-node src/index.js"
        },
        "keywords": [],
        "author": "",
        "license": "ISC",
        "devDependencies": {
            "@types/bn.js": "^5.1.0",
            "ts-node": "^10.7.0",
            "typescript": "^4.6.3"
        },
        "dependencies": {
            "@solana/web3.js": "^1.41.3",
            "dotenv": "^16.0.0"
        }
    }
    

    src라는 폴더를 만들고 index.js 파일을 추가하세요.

    다음 코드를 파일에 복사하여 붙여넣고 <your-api-key>를 본인의 Helius API 키로 교체하세요. 

    코드
    const WebSocket = require('ws');
    
    // Function to send a request to the WebSocket server
    function sendRequest(ws) {
        const request = {
            jsonrpc: "2.0",
            id: 420,
            method: "transactionSubscribe",
            params: [{
                    failed: false,
                    accountInclude: ["675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"]
                },
                {
                    commitment: "processed",
                    encoding: "base64",
                    transactionDetails: "full",
                    showRewards: true,
                    maxSupportedTransactionVersion: 0
                }
            ]
        };
        ws.send(JSON.stringify(request));
    }
    
    function websocketHandler() {
        // Create a WebSocket connection
        let ws = new WebSocket('wss://atlas-mainnet.helius-rpc.com?api-key=<your-api-key>');
    
        // Define WebSocket event handlers
    
        ws.on('open', function open() {
            console.log('WebSocket is open');
            sendRequest(ws); // Send a request once the WebSocket is open
        });
    
        ws.on('message', function incoming(data) {
            const messageStr = data.toString('utf8');
            console.log('Received:', messageStr);
        });
    
        ws.on('error', function error(err) {
            console.error('WebSocket error:', err);
        });
    
        ws.on('close', function close() {
            console.log('WebSocket is closed');
            // connection closed, discard old websocket and create a new one in 5s
            ws = null
            setTimeout(startWebsocket, 5000)
        });
    }
    
    websocketHandler();

    요청의 accountInclude 배열 매개변수에 Raydium의 AMM 프로그램 주소 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8를 추가했습니다. 필요한 데이터를 받으려면 적절한 매개변수를 추가할 수 있습니다. 

    이 코드는 WebSocket에 연결하고 전체 응답을 콘솔에 기록합니다. 약 ~5분 동안 활동이 없으면 WebSocket 연결이 종료됩니다. 이를 방지하기 위해 onClose 핸들러에 재연결 로직을 추가했습니다. 

    명령 프롬프트 또는 터미널에서 다음 명령을 실행하세요. 

    코드
    npm install && npm start

    콘솔에 다음과 같은 로그가 표시되기 시작합니다.

    마무리

    이것으로 끝입니다! 유동성 풀을 모니터링하는 webhook 설정은 간단합니다. 더 빠른 응답 속도가 필요하다면 Geyser 강화 WebSocket 메서드를 사용할 수도 있습니다. 설정을 완료한 후에는 데이터를 표시할 적절한 프런트엔드를 구축할 수 있습니다. 더 빠른 전용 연결이 필요하면 Geyser RPC 플러그인이 설치된 전용 노드를 사용할 수 있습니다. 문제가 발생하거나 도움이 필요하면 언제든 Discord로 문의하세요!

    아래에 이메일 주소를 입력해 Solana의 새로운 소식을 놓치지 마세요. 더 자세히 알아볼 준비가 되셨나요? 지금 Helius 블로그의 최신 글을 살펴보고 Solana 여정을 계속하세요.

    자료

    ‍

    Helius 구독하기

    최신 Solana 개발 소식을 확인하고 새 게시물 알림을 받아보세요

    확대 이미지