# Взаимодействие с нодой
Вы можете взаимодействоваь с API-методами Assets и Addresses.
# Assets API
Вы можете получить информацию о:
- Распределении баланса активов.
- Балансе активов по адресу.
- Балансе актива по адресу.
- Об активе.
- Наличии NFT-токенах по адресу.
# Распределение баланса активов
Endpoint: GET /assets/{assetId}/distribution/{height}/limit/{limit}
package com.example;
// Необходимые импорты.
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.regex.*;
public class AssetBalanceDistribution {
public static void main(String[] args) throws Exception {
// Укажите ID актива.
String assetId = "УКАЖИТЕ ID АКТИВА";
// Укажите максимальное количество возвращаяемых записей.
int limit = 100;
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Получение высоты последнего блока.
URL heightUrl = new URL(nodeUrl + "/blocks/height");
HttpURLConnection heightCon = (HttpURLConnection) heightUrl.openConnection();
Scanner heightScanner = new Scanner(new InputStreamReader(heightCon.getInputStream()));
String heightResp = heightScanner.nextLine();
heightScanner.close();
int height = Integer.parseInt(heightResp.replaceAll("\\D", "")) - 1;
// Создание URL-ссылки для получения данных о распределении баланса активов.
String url = nodeUrl + "/assets/" + assetId + "/distribution/" + height + "/limit/" + limit;
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
// Анализ полученных данных.
Scanner scanner = new Scanner(new InputStreamReader(con.getInputStream()));
Pattern entry = Pattern.compile("\"([1-9A-HJ-NP-Za-km-z]{30,})\":(\\d+)");
// Вывод результатов.
System.out.println("––––––––––––––––––––––––––––––––––––––");
System.out.println("Распределение баланса активов (адрес: количество актива):");
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
Matcher matcher = entry.matcher(line);
while (matcher.find()) {
String address = matcher.group(1);
long balanceLamports = Long.parseLong(matcher.group(2));
double balanceInWaves = balanceLamports / 100.0;
System.out.printf("%s: %.2f\n", address, balanceInWaves);
}
if (line.contains("\"hasNext\":true")) {
Matcher lastItem = Pattern.compile("\"lastItem\":\"(.*?)\"").matcher(line);
if (lastItem.find()) {
System.out.printf("\nДоступно больше страниц. Последний элемент: %s\n", lastItem.group(1));
}
}
}
scanner.close();
}
}
# Баланс активов по адресу
Endpoint: GET /assets/balance/{address}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class AllAssetBalancesForAddress {
public static void main(String[] args) throws Exception {
// Укажите ID актива.
String address = "УКАЖИТЕ ID АКТИВА";
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-ссылки.
URL url = new URL(nodeUrl + "/assets/balance/" + address);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> resp = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<Map<String, Object>>() {}
);
List<Map<String,Object>> balances = (List<Map<String,Object>>) resp.get("balances");
// Вывод результатов.
System.out.println("––––––––––––––––––––––––––––––––––––––");
System.out.println("Баланс активов по адресу: " + address);
for (Map<String,Object> b : balances) {
String assetId = (String) b.get("assetId");
long raw = ((Number) b.get("balance")).longValue();
double formatted = raw / 1e2;
System.out.printf("ID актива: %s, Баланс: %.2f\n", assetId, formatted);
}
}
}
# Баланс актива по адресу
Endpoint: GET /assets/balance/{address}/{assetId}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class BalanceOfSpecificAsset {
public static void main(String[] args) throws Exception {
// Укажите адрес аккаунта.
String address = "УКАЖИТЕ АДРЕС";
// Укажите ID актива.
String assetId = "УКАЖИТЕ ID АКТИВА";
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/assets/balance/" + address + "/" + assetId);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление и форматирование данных.
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> resp = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<Map<String,Object>>() {}
);
long raw = ((Number)resp.get("balance")).longValue();
double formatted = raw / 1e2;
// Вывод результатов.
System.out.println("––––––––––––––––––––––––––––––––––––––");
System.out.printf(
"Баланс актива %s по адресу %s: %.2f\n",
resp.get("assetId"), resp.get("address"), formatted
);
}
}
# Детали актива
Endpoint: GET /assets/details/{assetId}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class AssetDetails {
public static void main(String[] args) throws Exception {
// Укажите ID актива.
String assetId = "УКАЖИТЕ ID АКТИВА";
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/assets/details/" + assetId);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> d = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<Map<String,Object>>() {}
);
// Вывод результатов.
System.out.println("––––––––––––––––––––––––––––––––––––––");
System.out.printf("Наименование: %s%Описание: %s%Десятичных знаков: %d%Перевыпускаемость: %b%Адрес создателя: %s%n",
d.get("name"), d.get("description"), ((Number)d.get("decimals")).intValue(), d.get("reissuable"), d.get("issuer")
);
}
}
# Наличие NFT-токенов по адресу
Endpoint: GET /assets/nft/{address}/limit/{limit}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class NFTsByAddress {
public static void main(String[] args) throws Exception {
// Укажите адрес аккаунта.
String address = "УКАЖИТЕ АДРЕС";
// Укажите максимальное количество возвращаяемых записей.
int limit = 100;
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/assets/nft/" + address + "/limit/" + limit);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
List<Map<String,Object>> nfts = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<List<Map<String,Object>>>() {}
);
// Вывод результатов.
System.out.println("––––––––––––––––––––––––––––––––––––––");
System.out.println("NFTs по адресу: " + address);
for (Map<String,Object> nft : nfts) {
// Результаты будут выведен при наличии NFT по указанному адресу.
System.out.printf("ID: %s | Наименование: %s | Описание: %s | Количество: %d%n",
nft.get("assetId"), nft.get("name"), nft.get("description"), ((Number)nft.get("quantity")).intValue());
}
}
}
# Addresses API
Вы можете получить информацию о:
- Всех адресах в кошельке ноды.
- Диапазоне адресов.
- Балансе WAVES по адресу.
- Балансе WAVES с подтверждениями.
- Детальной информации о балансе.
- Балансе нескольких адресов.
- Записях данных аккаунта по адресу.
- Записях данных по ключу.
- Метаданных скрипта аккаунта.
# Все адреса в кошельке ноды
Endpoint: GET /addresses
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class GetAllNodeWalletAddresses {
public static void main(String[] args) throws Exception {
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/addresses");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
List<String> addresses = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<List<String>>() {}
);
// Вывод результатов.
System.out.println("Node Wallet Addresses:");
addresses.forEach(addr -> System.out.println(addr));
}
}
# Диапазон адресов
Endpoint: GET /addresses/seq/{from}/{to}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class GetAddressRange {
public static void main(String[] args) throws Exception {
// Индекс кошелька.
int from = 0, to = 4;
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/addresses/seq/" + from + "/" + to);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
List<String> addresses = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<List<String>>() {}
);
// Вывод результатов.
System.out.printf("Адреса от %d до %d:\n", from, to);
addresses.forEach(System.out::println);
}
}
# Баланс WAVES по адресу
Endpoint: GET /addresses/balance/{address}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class WavesBalance {
public static void main(String[] args) throws Exception {
// Укажите адрес аккаунта.
String address = "УКАЖИТЕ АДРЕС";
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/addresses/balance/" + address);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> resp = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<Map<String,Object>>() {}
);
long raw = ((Number)resp.get("balance")).longValue();
// Вывод результатов.
System.out.printf("Баланс адреса %s: %.8f WAVES\n", address, raw / 1e8);
}
}
# Баланс WAVES с подтверждениями
Endpoint: GET /addresses/balance/{address}/{confirmations}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class WavesBalanceWithConfirmations {
public static void main(String[] args) throws Exception {
// Укажите адрес аккаунта.
String address = "УКАЖИТЕ АДРЕС";
// Укажите количество подтверждений.
int confirmations = 2;
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/addresses/balance/" + address + "/" + confirmations);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> resp = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<Map<String,Object>>() {}
);
long raw = ((Number)resp.get("balance")).longValue();
// Вывод результатов.
System.out.printf("Баланс адреса %s (>= %d количество подтверждений): %.8f WAVES\n", address, confirmations, raw / 1e8);
}
}
# Детальная информация о балансе
Endpoint: GET /addresses/balance/details/{address}
Обратите внимание: Метод показывает доступные, регулярные, генерирующие и эффективные остатки на счету аккаунта.
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class DetailedBalanceInfo {
public static void main(String[] args) throws Exception {
// Укажите адрес аккаунта.
String address = "УКАЖИТЕ АДРЕС";
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/addresses/balance/details/" + address);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> info = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<Map<String,Object>>() {}
);
// Вывод результатов.
System.out.printf("Регулярный: %.8f WAVES%n", ((Number)info.get("regular")).doubleValue()/1e8);
System.out.printf("Доступный: %.8f WAVES%n", ((Number)info.get("available")).doubleValue()/1e8);
System.out.printf("Генерирующий: %.8f WAVES%n", ((Number)info.get("generating")).doubleValue()/1e8);
System.out.printf("Эффективный: %.8f WAVES%n", ((Number)info.get("effective")).doubleValue()/1e8);
}
}
# Баланс нескольких адресов
Endpoint: POST /addresses/balance
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class BalancesForMultipleAddresses {
public static void main(String[] args) throws Exception {
// Укажите адреса аккаунтов.
List<String> addresses = List.of(
"УКАЖИТЕ ПЕРВЫЙ АДРЕС",
"УКАЖИТЕ ВТОРОЙ АДРЕС"
// ...
);
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/addresses/balance"
* - Testnet: "https://nodes-testnet.wavesnodes.com/addresses/balance"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/addresses/balance"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com/addresses/balance";
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
byte[] body = mapper.writeValueAsBytes(Map.of("addresses", addresses));
// Создание URL-адреса запроса.
HttpURLConnection con = (HttpURLConnection) new URL(nodeUrl).openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
try (OutputStream os = con.getOutputStream()) {
os.write(body);
}
// Сопоставление полученных данных.
List<Map<String, Object>> results = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<List<Map<String, Object>>>() {}
);
// Вывод результатов.
for (int i = 0; i < addresses.size(); i++) {
Map<String, Object> balanceEntry = results.get(i);
double balance = ((Number) balanceEntry.get("balance")).doubleValue() / 1e8;
System.out.printf("%s: %.8f WAVES%n", addresses.get(i), balance);
}
}
}
# Записях данных аккаунта по адресу
Endpoint: GET /addresses/data/{address}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class AccountDataEntries {
public static void main(String[] args) throws Exception {
// Укажите адрес аккаунта.
String address = "УКАЖИТЕ АДРЕС";
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/addresses/data/" + address);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
List<Map<String,Object>> entries = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<List<Map<String,Object>>>() {}
);
// Вывод результатов.
entries.forEach(e -> System.out.printf("%s (%s): %s%n", e.get("key"), e.get("type"), e.get("value")));
}
}
# Записи данных по ключу
Endpoint: GET /addresses/data/{address}/{key}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class DataEntryByKey {
public static void main(String[] args) throws Exception {
// Укажите адрес аккаунта.
String address = "УКАЖИТЕ АДРЕС";
// Укажите ключ аккаунта.
String key = "УКАЖИТЕ КЛЮЧ АККАУНТА";
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/addresses/data/" + address + "/" + key);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> entry = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<Map<String,Object>>() {}
);
// Вывод результатов.
System.out.printf("%s (%s): %s%n", entry.get("key"), entry.get("type"), entry.get("value"));
}
}
# Метаданные скрипта аккаунта
Endpoint: GET /addresses/scriptInfo/{address}
package com.example;
// Необходимые импорты.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ScriptInfo {
public static void main(String[] args) throws Exception {
// Укажите адрес аккаунта.
String address = "УКАЖИТЕ АДРЕС";
/*
* Укажите сеть:
* - Mainnet: "https://nodes.wavesnodes.com/"
* - Testnet: "https://nodes-testnet.wavesnodes.com/"
* - Stagenet: "https://nodes-stagenet.wavesnodes.com/"
*/
String nodeUrl = "https://nodes-testnet.wavesnodes.com";
// Создание URL-адреса запроса.
URL url = new URL(nodeUrl + "/addresses/scriptInfo/" + address);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Сопоставление полученных данных.
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> info = mapper.readValue(
new InputStreamReader(con.getInputStream()),
new TypeReference<Map<String,Object>>() {}
);
// Вывод результатов.
System.out.printf("Установлен скрипт: %b%n", info.get("script") != null);
if (info.get("script") != null) {
System.out.printf("Сложность скрипта: %d%nДополнительная комиссия: %d%n", ((Number)info.get("complexity")).intValue(), ((Number)info.get("extraFee")).intValue());
}
}
}