MỚI: Helius mua lại Light Protocol
Cách giám sát pool thanh khoản Raydium
Blog/Phát triển

Cách giám sát pool thanh khoản Raydium

Kỹ sư Trải nghiệm Nhà phát triểnAnam Ansari trên XAnam Ansari trên LinkedIn
Đọc trong 7 phút
Mục lục

    Trong tài chính truyền thống, người mua và người bán cung cấp thanh khoản cho một tài sản thông qua thị trường tập trung. Tài chính phi tập trung (DeFi) sử dụng pool thanh khoản để thay thế. Pool thanh khoản là các hợp đồng thông minh cho phép người dùng mua và bán tiền mã hóa trên các sàn giao dịch phi tập trung và nền tảng DeFi khác. Bằng cách giám sát pool thanh khoản, bạn có thể theo dõi hiệu suất của một tài sản cụ thể và đưa ra quyết định sáng suốt về thời điểm mua, bán hoặc hoán đổi. Việc giám sát quá trình tạo pool thanh khoản mới cũng có thể giúp bạn khám phá các token mới ra mắt.

    Bài viết này sẽ giới thiệu hai cách giám sát pool thanh khoản: webhook và WebSocket. Chúng ta cũng sẽ tìm hiểu cách thiết lập webhook và WebSocket để lắng nghe các sự kiện diễn ra trong pool thanh khoản. Trước khi tìm hiểu cách nền tảng hoạt động, bạn cần có Helius API Key. Bạn có thể dễ dàng lấy khóa này qua Bảng điều khiển Helius. Đăng ký bằng tài khoản GitHub, Solana Wallet hoặc Google, rồi chuyển đến phần API Keys ở thanh bên trái.

    Qua webhook

    Để xây dựng bằng webhook, chúng ta cần thực hiện ba bước chính. Đầu tiên, chúng ta sẽ thiết lập một Cloudflare Worker. Tiếp theo, chúng ta sẽ thiết lập một webhook Helius và thêm URL của Cloudflare Worker. Webhook sẽ kích hoạt worker mỗi khi phát hiện một giao dịch trong pool thanh khoản. Cuối cùng, chúng ta sẽ chỉnh sửa mã của worker để xử lý thông báo này và ghi lại phản hồi.

    Thiết lập Cloudflare Worker

    Chúng ta sẽ thiết lập một worker được webhook kích hoạt. Chúng ta sẽ thêm mã vào worker để xử lý tín hiệu kích hoạt nhận được từ webhook. Cloudflare Workers cho phép triển khai mã serverless. Đăng nhập hoặc đăng ký trên trang web của Cloudflare, rồi chọn Workers & Pages trong bảng bên trái của trang chính.

    ‍Nhấp vào nút Create application.

    ‍Tiếp theo, nhấp vào Create Worker.

    ‍Bây giờ, nhấp vào Deploy.

    ‍Worker đã được triển khai thành công. Hãy sao chép liên kết của worker vì liên kết này sẽ được dùng để thiết lập webhook.

    Thiết lập webhook

    Chúng ta sẽ giám sát Raydium, AMM đầu tiên được xây dựng trên Solana tận dụng sổ lệnh giới hạn trung tâm hoàn toàn phi tập trung. Sổ lệnh giới hạn trung tâm là phương thức khớp lệnh kiểu sàn giao dịch phổ biến trên thị trường cổ phiếu, khớp tất cả lệnh mua và bán theo mức độ ưu tiên về giá và thời gian. Sổ lệnh giới hạn trung tâm phi tập trung (CLOB) là hệ thống giao dịch hoạt động trên một mạng lưới node phân tán thay vì một thực thể trung tâm. 

    Chúng ta sẽ tạo một webhook bằng Helius. Webhook cho phép bạn lắng nghe các sự kiện on-chain và kích hoạt những hành động cụ thể khi các sự kiện này xảy ra. Chúng ta sẽ cấu hình webhook để lắng nghe các loại giao dịch cụ thể trong một pool thanh khoản Raydium nhất định. Helius hiện hỗ trợ các loại giao dịch sau cho Raydium: 

    Mã
    "RAYDIUM": [
       "WITHDRAW_LIQUIDITY"
       "ADD_LIQUIDITY"
       "CREATE_POOL"
       "SWAP"
     ]

    Bạn có thể tạo webhook bằng Bảng điều khiển Helius hoặc tài liệu tham chiếu API. Để tạo webhook qua Bảng điều khiển, hãy chuyển đến phần Webhooks trong bảng bên trái và nhấp vào New Webhook.

    Sau đó, cấu hình webhook bằng cách cung cấp các thông tin như:

    1. Mạng: Mainnet/Devnet
    2. Loại webhook: Để nhận dữ liệu mong muốn, hãy chọn loại webhook Enhanced, Raw hoặc Discord. Nếu muốn dữ liệu dễ đọc, hãy chọn Enhanced; chúng ta sẽ chọn loại này. Nếu chọn Discord, bạn phải cung cấp Webhook URL, sau đó bot sẽ định dạng và gửi thông báo trực tiếp. Để được hướng dẫn, hãy tham khảo bài viết này để tìm hiểu cách thiết lập webhook cho Discord Bot. Nếu chọn Raw, lưu ý rằng bạn sẽ không thể chỉ định loại giao dịch.
    3. Loại giao dịch: Chọn các loại giao dịch hiển thị trong hình bên dưới*.* Bạn có thể xem các loại giao dịch khác được một Program hỗ trợ tại đây. 
    4. Webhook URL: Thêm URL của worker mà chúng ta đã thiết lập trên Cloudflare (nếu đã chọn Discord, bạn cần cung cấp Webhook URL cho bot)
    5. Header xác thực: Nhập header xác thực để truyền vào các yêu cầu POST dành cho webhook. Lưu ý rằng đây là trường không bắt buộc.
    6. Địa chỉ account: Địa chỉ AMM Program của Raydium là: 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8. Bạn cũng có thể thêm nhiều địa chỉ account nếu cần. Ngoài ra, bạn có thể thêm địa chỉ tài sản của mình để giám sát chúng. 

    Sau khi bạn nhấp vào Confirm, webhook sẽ thông báo cho Cloudflare Worker.

    Bước tiếp theo là viết mã phù hợp để xử lý thông báo.

    Xử lý thông báo webhook trong Worker

    Chúng ta cần cài đặt Wrangler CLI để thêm mã vào worker, qua đó worker có thể xử lý dữ liệu chính xác khi được kích hoạt.

    Đăng nhập vào tài khoản Cloudflare để cho phép Wrangler triển khai các script của bạn lên Cloudflare.

    Mở dấu nhắc lệnh/terminal và nhập lệnh sau:

    Mã
    wrangler login

    Khi Wrangler tự động mở trình duyệt để hiển thị màn hình chấp thuận của Cloudflare, hãy nhấp vào nút Allow. Thao tác này sẽ gửi một API Token đến Wrangler.‍

    Khởi tạo một dự án mới từ Worker đã tạo qua Bảng điều khiển Cloudflare:

    Mã
    wrangler init --from-dash <worker-name>

    Kiểm tra phần Metrics để tìm tên của worker:

    ‍Lệnh trên sẽ tạo một thư mục chứa cấu hình và mã của worker. Tiếp theo, thay thế mã trong tệp src/index.js bằng mã được cung cấp bên dưới. Đừng quên thêm API key của bạn. Chúng tôi khuyên bạn áp dụng các phương pháp tốt nhất sau để bảo mật API key.

    Bây giờ, chúng ta sẽ sử dụng mã sau trong worker:

    Mã
    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 });
        }
    }

    ‍Trong đoạn mã này, chúng ta chỉ ghi lại phần mô tả của thông báo. Các thông báo phản hồi có định dạng giao dịch đã phân tích. Điều quan trọng cần lưu ý là dữ liệu tài chính như thông tin giá không được cung cấp. Bạn có thể sử dụng các nền tảng như Jupiter và Birdeye để lấy thông tin tài chính.‍

    Triển khai dự án lên mạng lưới toàn cầu của Cloudflare:

    Mã
    wrangler publish

    Sau khi mã được phát hành thành công, hãy kiểm tra log.

    Quay lại trang web Cloudflare và chuyển đến phần Logs:

    ‍Nhấp vào nút Begin Log Stream.

    ‍Bạn có thể xem dữ liệu đã ghi trong "message" bằng cách mở rộng bất kỳ log nào đã nhận.

    Qua WebSocket

    WebSocket là giao thức truyền thông cho phép trao đổi dữ liệu theo thời gian thực giữa client và server. Cách này khác với các phương thức truyền thống, trong đó client gửi yêu cầu và chờ server phản hồi. Với WebSocket, kết nối vẫn được duy trì để trao đổi dữ liệu liên tục. Chúng ta sẽ sử dụng WebSocket để giám sát pool thanh khoản Raydium.

    Để đạt tốc độ phản hồi nhanh hơn trong dự án, chúng ta sẽ sử dụng phương thức geyser-enhanced transactionSubscribe, hiện được cung cấp dưới dạng tính năng beta. Lưu ý rằng phương thức này chỉ dành cho các gói Business hoặc Professional. Geyser Enhanced WebSocket nhanh hơn các phương thức RPC WebSocket tiêu chuẩn. Để bắt đầu, hãy tạo một dự án JavaScript cơ bản và một thư mục mới có tên websocket-test. Sau đó, chúng ta cần tạo tệp package.json.

    Mã
    {
        "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"
        }
    }
    

    Tạo một thư mục có tên src và thêm tệp index.js.

    Sao chép và dán đoạn mã sau vào tệp, thay <your-api-key> bằng Helius API Key của bạn. 

    Mã
    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();

    Chúng ta đã thêm Địa chỉ AMM Program của Raydium 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 vào tham số mảng accountInclude của yêu cầu. Bạn có thể thêm các tham số phù hợp để nhận dữ liệu cần thiết. 

    Đoạn mã kết nối với WebSocket và ghi toàn bộ phản hồi vào console. WebSocket sẽ đóng sau khoảng ~5 phút không hoạt động. Để ngăn điều này, logic kết nối lại được thêm vào trình xử lý onClose. 

    Chạy lệnh này trong dấu nhắc lệnh/terminal: 

    Mã
    npm install && npm start

    Bạn sẽ bắt đầu thấy các log như sau xuất hiện trong console:

    Kết luận

    Vậy là xong! Việc thiết lập webhook để giám sát pool thanh khoản rất đơn giản. Ngoài ra, bạn có thể sử dụng phương thức WebSocket geyser-enhanced để có tốc độ phản hồi nhanh hơn. Sau khi hoàn tất thiết lập, bạn có thể xây dựng một frontend phù hợp để hiển thị dữ liệu. Bạn có thể sử dụng node chuyên dụng với plugin Geyser RPC để có kết nối riêng với tốc độ nhanh hơn. Nếu gặp bất kỳ vấn đề nào hoặc cần hỗ trợ, đừng ngần ngại liên hệ với chúng tôi trên Discord!

    Hãy nhập địa chỉ email của bạn bên dưới để không bỏ lỡ bất kỳ thông tin cập nhật nào về những điểm mới trên Solana. Bạn đã sẵn sàng tìm hiểu sâu hơn? Khám phá các bài viết mới nhất trên blog Helius và tiếp tục hành trình Solana ngay hôm nay.

    Tài nguyên

    ‍

    Đăng ký nhận tin từ Helius

    Luôn cập nhật những thông tin mới nhất về phát triển Solana và nhận thông báo khi chúng tôi đăng bài

    Hình ảnh phóng to