GonkaAi + openClaw

Что такое Gonka?

Представь, что люди перестали «майнить» криптовалюту просто ради самой валюты, а вместо этого включили свои мощные видеокарты (GPU) и стали выполнять полезную работу: обслуживать запросы к нейросетям — отвечать на запросы, генерировать текст, делать поиск по базе знаний и т.д. Именно такую идею реализует Gonka: это сеть, которая собирает свободные GPU-ресурсы и платит их владельцам нативной монетой GNK за реальную вычислительную работу (вместо бессмысленного «расчёта»).

Что они предлагают — два простых сценария

Для владельцев серверов (хостов). Если у вас есть сервер с GPU, вы можете подключить его к сети и получать GNK за то, что машина выполняет инференс (то есть «прогоняет» запросы к моделям). Это похоже на аренду вычислительных мощностей, только оплата идёт в токене сети и распределяется автоматически. Такой сценарий подходит тем, кто хочет монетизировать простои оборудования.

Для пользователей — дешёвое API. Если вы разработчик или просто хотите быстро получать ответы от нейросети, Gonka даёт API, через которое можно посылать запросы и платить в GNK. Главная простая выгода — очень низкая цена инференса сейчас (о расчёте ниже). Для разработчиков это выглядит как дешёвая «облачная нейросеть», с поддержкой стандартных опций интеграции (позволяет вызывать внешние инструменты/плагины — то, что обычно называют «tool calling»).Те, кто пользуются этим сценарием, просто направляют запросы в сеть и получают ответы — сеть сама перенаправляет их на свободные GPU-ноды.

Какие модели поддерживаются?

Сеть сейчас запущена с одной основной моделью для инференса — Qwen3-235B. Это средненькая модель с хорошим знанием языков и способностью следовать инструкциям. Команда говорит, что поддержка более крупных/других моделей — в планах, так что Qwen3-235B — это стартовый, временный выбор для запуска сети.

Уже сейчас можно настроить openClaw на использование Qwen3-235B. Результаты не выдающиеся, но это получается почти бесплатно!

Но, конечно, все ждут когда в сети появятся новые более продвинутые модели 

Сколько стоит инференс?

Цены в сети планируются динамические: для каждой модели сеть в реальном времени пересчитывает цену в зависимости от загрузки — если модель загружена, цена растёт, если пусто — падает. Это делается автоматически по блокам. Внутри сети основная ончейн-единица называется ngonka (это самая мелкая единица); для человека иногда показывают gonka, где 1 gonka = 1 000 000 000 ngonka. Также в протоколе есть техническая нижняя граница цены — не опускается ниже 1 (самой мелкой единицы).
Но по факту, сейчас, на раннем этапе развития проекта - цена фиксированная и равна 1 ngonka за 1 токен.

Если брать цену 1 ngonka за 1 токен миллион токенов будет стоить  0.001 GNK. Если сейчас 1 GNK примерно равен 1 USD (данные площадок отслеживания курсов), то стоимость миллиона токенов будет ≈ 0.001 USD. Это почти бесплатно!!!

Важное замечание: нет гарантий, что цена останется такой низкой. Динамическая модель ценообразования и рыночная торгуемость GNK могут повысить стоимость — сейчас она очень-очень низкая, но это может измениться.

Ограничения: allowlist / whiteList 

Сейчас идёт ранний этап развития сети Gonka, и разработчики ввели временные меры: они принимают запросы не от всех нод, а только от 7 ограниченных адресов.

Но это не означает, что inference / API закрыт и ими нельзя пользоваться. Это лишь означает что нужно хитрым способом прокидывать запросы через одну из нод, находящихся в белом списке. Как именно это делать - будет рассказано ниже.

Как положить GNK на свой кошелёк

Для платы за запросы к LLM нужны GNK. Как же их достать если офифильного листинга GNK не было (да, официального листинга монеты ещё не было!)

Ещё раз предупрежу вас, что вокруг Gonka появляется всё больше и больше мошенников. И GNK торгуемая на сети Solana - это скам!

Призываю вас самим потратить время на изучение вопроса, чтобы не потерять деньги. Ниже расскажу о способах известных мне:

Сейчас многие участники сообщества обменивают GNK через внебиржевые (OTC) сделки и OTC-рынки.

Я лично меняю  USDT на GNK и обратно на этой бирже: https://hex.exchange (да, это реферальная ссылка, и я получу небольшую денюжку если вы перейдёте по ней и что-то поменяете). Советую выставлять лимитные ордера, если вы готовы подождать - так комиссия биржи будет минимальной.

Покупать или нет GNK в инвестиционных целях, в надежде на то что это будет новый биткоин, который взлетит x1000 - лично ваше решение, я тут не буду ничего советовать. Может взлететь (идея лежащая в основе Gonka очень здравая), а может и быть обвал, как в большинстве проектов после листинга.

Хотя я всё-таки посоветую. Вложить $1-$10, в общем, те деньги, которые вам не страшно потерять. Даже если цена GNK упадёт до нуля... вы почти ничего не потеряете. А если она вырастет x1000, то это будет очень приятный бонус.

Как пользоваться Gonka API уже сейчас, не дожидаясь отмены Allowlist

Для начала вам нужен GNK кошелёк

GNK базируется на сети Cosmos. И вы можете сделать получить GONKA адрес воспользовавшись, каким-нибудь Cosmos - кошельком, например Keplr. Но так делать не нужно!

А адресом созданным в Keplr, Gonka API работать не будет! Нужно создавать кошелёк GNK через консольную утилиту inferenced.

1. Итак, заходим на официальный Github репозиторий проекта, в раздел релизы: https://github.com/gonka-ai/gonka/releases

Скачиваем inferenced для своей операционной системы

2. Запускаем:

./inferenced create-client vasya123 --node-address http://node2.gonka.ai:8000

Здесь мы указываем произвольное имя аккаунта: vasya123, и в качестве адреса нода - один из нодов из разрешённого списка! Это ключевой момент!
В ответ получаем фразу из слов, которая нужна для полного доступа к кошельку. Фразу сохраняем, и никому не говорим! Она понадобится при восстановлении доступа к кошельку.
Возможно в процессе создания ключа у вас попросят пароль для защиты вашего локального файла с ключами. Тут зависит от степени вашей тревожности и от количество денег, которые вы планируете там хранить. Если вы будете переводить 1-10 GNK, которых при такой низкой цене хватит очень надолго, то можно не париться, и создать ключ без пароля (вместо ввода пароля сразу жмём Enter).

3. Дальше нам нужно в явном виде извлечь приватный ключ. Приватный ключ - опасная вещь, он даёт полный доступ к вашему аккаунту. Для api запросов нужен именно он.

 ./inferenced keys export $ACCOUNT_NAME --unarmored-hex --unsafe

 В ответ получаем приватный ключ, который нам нужен для API запросов

Пример кода на Python

Это самая главная часть статьи, и то ради чего я всё-таки решил написать статью. Я провозился с API Gonka несколько дней, и уже даже отчаялся. Но в итоге всё заработало, и я решил поделиться своими наработками. 

GonkaAI использует свою библиотеку, она не openaAI-совместимая, но очень похожая.

Ещё там нужен отдельный клиент, шифрующий запрос.

Здесь я посылаю запрос на node2.gonka.ai, и использую его адрес кошелька 'gonka1dkl4mah5erqggvhqkpc8j3qs5tyuetgdy552cp' - это как раз один из адресов из разрешённого списка

 

from typing import Any, Callable, List, Optional, Tuple, Set

import httpx

from openai import OpenAI, DefaultHttpxClient

import secp256k1
import hashlib
import bech32

from gonka_openai import GonkaOpenAI

NODE_URL = "http://node2.gonka.ai:8000"
GONKA_CHAIN_ID = "gonka-mainnet"

def makeRequest(request_msg):

    # Create a custom HTTP client for the OpenAI client

    http_client = gonka_http_client( 
        private_key=self.private_key,
        http_client=None,
        transfer_address='gonka1dkl4mah5erqggvhqkpc8j3qs5tyuetgdy552cp'
    )

    gonka_client =  GonkaOpenAI(
        api_key="mock-api-key",
        gonka_private_key=self.private_key,
        source_url=NODE_URL
    )

    response = gonka_client.chat.completions.create(
        model="Qwen/Qwen3-235B-A22B-Instruct-2507-FP8",
        messages=[
            {"role": "user", "content": full_request}
        ]
    )
    generated_response = response.choices[0].message.content
    return generated_response

def gonka_address(private_key_hex: str) -> str:
    """
    Get the Cosmos address from a private key.
    
    Args:
        private_key_hex: The private key in hex format (with or without 0x prefix)
        
    Returns:
        The Cosmos address
    """
    # Remove 0x prefix if present
    private_key_clean = private_key_hex[2:] if private_key_hex.startswith('0x') else private_key_hex
    
    # Convert hex string to bytes
    private_key_bytes = bytes.fromhex(private_key_clean)
    
    # Create private key object
    privkey = secp256k1.PrivateKey(private_key_bytes)
    
    # Get the public key (33 bytes compressed format)
    pubkey = privkey.pubkey.serialize(compressed=True)
    
    # Create SHA256 hash of the public key
    sha = hashlib.sha256(pubkey).digest()
    
    # Take RIPEMD160 hash of the SHA256 hash
    ripemd = hashlib.new('ripemd160')
    ripemd.update(sha)
    address_bytes = ripemd.digest()
    
    # Convert to 5-bit words for bech32 encoding
    five_bit_words = bech32.convertbits(address_bytes, 8, 5)
    if five_bit_words is None:
        raise ValueError("Error converting address bytes to 5-bit words")
    
    # Get the prefix from the chain id (e.g., 'gonka' from 'gonka-testnet-1')
    prefix = GONKA_CHAIN_ID.split('-')[0]
    
    # Encode with bech32
    address = bech32.bech32_encode(prefix, five_bit_words)
    
    return address


def gonka_http_client(
    private_key: str,
    address: Optional[str] = None,
    http_client: Optional[httpx.Client] = None,
    transfer_address: Optional[str] = None,
) -> httpx.Client:
    """
    Create a custom HTTP client for OpenAI that signs requests with your private key.
    
    Args:
        private_key: ECDSA private key for signing requests
        address: Optional Cosmos address to use instead of deriving from private key
        http_client: Optional base HTTP client
        transfer_address: Optional transfer address for signing requests
        
    Returns:
        A custom HTTP client compatible with the OpenAI client
        
    Raises:
        ValueError: If private key is not provided or if no valid transfer address is available
    """
    
    # Use provided private key or fail
    if not private_key:
        raise ValueError("Private key is required")
    
    # Use the provided client or create a new DefaultHttpxClient
    client = http_client or DefaultHttpxClient()
    
    # Derive address if not provided
    resolved_address = address or gonka_address(private_key)
    print(f"VT:Resolved addr={resolved_address}")
    
    # Use provided transfer address or get it from a random endpoint
    resolved_transfer_address = transfer_address
    if not resolved_transfer_address:
        endpoint = gonka_base_url()
        resolved_transfer_address = endpoint.address

    print(f"VT:Resolved transfer addr={resolved_transfer_address}")
    
    # Validate that we have a transfer address
    if not resolved_transfer_address:
        raise ValueError("Transfer address is required and must be provided either directly or through an endpoint")
    
    # Wrap the send method to add headers
    original_send = client.send
    
    def wrapped_send(request, *args, **kwargs):
        request_id = random.randint(1000, 9999)
        #logger.debug(f"[REQ-{request_id}] {request.method} {request.url}")
        print(f"[REQ-{request_id}] {request.method} {request.url}")
        
        # Initialize headers if not provided
        if request.headers is None:
            request.headers = {}
        
        # Generate unique and accurate timestamp in nanoseconds
        timestamp = hybrid_timestamp_ns()
        
        # Add X-Requester-Address header
        request.headers['X-Requester-Address'] = resolved_address
        
        # Add X-Timestamp header
        request.headers['X-Timestamp'] = str(timestamp)
        
        # Sign the request with timestamp and transfer address
        signature = gonka_signature(
            request.content, 
            private_key, 
            timestamp, 
            resolved_transfer_address
        )
        request.headers['Authorization'] = signature

        response = original_send(request, *args, **kwargs)
        return response
    
    # Replace the client's send method with the wrapped version
    client.send = wrapped_send
    
    return client

Заключение

Да, в данной статье много о чём не упоминается. Например о том, что есть уже сторонние проекты, которые принимают оплату фиатом по банковским картам и выдают gonkaAi inference через openAI-совместимый API. Это удобно, но это не чистая Gonka.

Вообще, проект выглядит настолько заманчивым, что уже вокруг тестовой версии вырастает очень много сторонних проектов.

Скорее всего уже через пару месяцев эта статья безнадёжно устареет. Но если она хоть кому-то помогла сэкономить драгоценное время - и на том спасибо.

P.S. Если я в чём-то не прав, или вы можете что-то объяснить лучше - пишите комменты!

 

Поиск