# gRPC

Доступ к gRPC-блокчейн-узлам через единую точку входа. Аутентификация и маршрутизация сети передаются в gRPC metadata, поэтому одно соединение достаёт до любой gRPC-сети.

`grpc.vilna.io:443`
gRPC через TLS
Tron
metadata `x-api-key`

## Подключение 

```
grpc.vilna.io:443
```

TLS обязателен. Аутентификация и идентификация сети передаются через gRPC metadata:

| Ключ metadata | Значение |
|  --- | --- |
| `x-api-key` | Ваш RPC-ключ |
| `x-chain-id` | Идентификатор маршрутизации RPC или алиас (для Tron - `tron:mainnet` или `tron`) |


Для Tron используйте CAIP-2 ID или алиас из [таблицы сетей](/ru/apis/networks#table): например, `tron:728126428` или `tron` для Mainnet и `tron:3448148188` или `tron-testnet` для Nile. Также поддерживаются `tron:mainnet` и `tron:testnet`. Solana использует [JSON-RPC](/ru/apis/rpc/json-rpc).

Всегда указывайте порт
Указывайте порт `:443` явно. Некоторые клиенты (включая `grpcurl`) не подставляют порт по умолчанию и завершаются с ошибкой `missing port in address`, если его не задать.

## Tron 

Vilna прозрачно передаёт gRPC-запросы узлу Tron. Доступные методы зависят от узла. Для примеров `grpcurl` ниже нужна gRPC reflection на узле; если она недоступна, передайте `grpcurl` официальные [Tron protobuf-описания](https://github.com/tronprotocol/protocol) через `-import-path` и `-proto`.

Текущий блок

GetNowBlock2

protocol.Wallet

```bash
grpcurl \
  -H "x-api-key: your-api-key" \
  -H "x-chain-id: tron:mainnet" \
  -d '{}' \
  grpc.vilna.io:443 \
  protocol.Wallet/GetNowBlock2
```

Проверка подключения

TotalTransaction

protocol.Wallet

```bash
grpcurl \
  -H "x-api-key: your-api-key" \
  -H "x-chain-id: tron:mainnet" \
  grpc.vilna.io:443 \
  protocol.Wallet/TotalTransaction
```

Блок по номеру

GetBlockByNum2

protocol.Wallet

```bash
grpcurl \
  -H "x-api-key: your-api-key" \
  -H "x-chain-id: tron:mainnet" \
  -d '{"num":70000000}' \
  grpc.vilna.io:443 \
  protocol.Wallet/GetBlockByNum2
```

`grpcurl` не установлен? Тот же вызов выполняется из Docker:

```bash
docker run --rm fullstorydev/grpcurl \
  -H "x-api-key: your-api-key" \
  -H "x-chain-id: tron:mainnet" \
  -d '{}' \
  grpc.vilna.io:443 \
  protocol.Wallet/GetNowBlock2
```

### Доступные сервисы

Стандартные gRPC-сервисы Tron включают:

| Сервис | Описание |
|  --- | --- |
| `protocol.Wallet` | Операции с блокчейн-аккаунтами, транзакциями и блоками |
| `protocol.WalletSolidity` | Read-only запросы к подтверждённым блокам |
| `protocol.Database` | Низкоуровневый доступ к данным сети |


Полный список методов - в [документации протокола Tron](https://developers.tron.network/reference).

## Обработка ошибок 

При неизвестном результате отправки транзакции следуйте [порядку проверки перед повтором](/ru/apis/rpc#retries).

Ошибки аутентификации возвращаются как нативные gRPC-статусы:

| Ситуация | gRPC-статус |
|  --- | --- |
| Отсутствующий, неоднозначный или невалидный API-ключ | `UNAUTHENTICATED` |
| Неподходящий тип ключа или недостаточно прав | `PERMISSION_DENIED` |
| Сервис проверки доступа недоступен | `UNAVAILABLE` |


Отказы при маршрутизации и проксировании могут приходить на уровне HTTP без нативного `grpc-status`:

| Ситуация | HTTP-статус |
|  --- | --- |
| Отсутствует `x-chain-id` | `400` |
| Неизвестная сеть или сеть без gRPC-маршрута | `404` |
| Превышен лимит частоты запросов | `429` |
| Сбой соединения, недоступность узла или таймаут | `502`, `503` или `504` |


Клиент может преобразовать такой HTTP-отказ в gRPC-ошибку. Не полагайтесь на `NOT_FOUND` или `INVALID_ARGUMENT` для ошибок маршрутизации. Ошибки, возвращённые самим узлом, сохраняют его нативный gRPC-статус. См. [Ошибки](/ru/apis/errors).