waves_logo Docs
  • Обзор
    Обзор
  • Практические руководства
    • Получение данных из блокчейна
      Получение данных из блокчейна
    • Создание и отправка транзакций
      Создание и отправка транзакций
    • Токенизация
      Токенизация
    • Распространение токена (airdrop)
      Распространение токена (airdrop)
    • Прием платежей
      Прием платежей
    • Обмен токенов
      Обмен токенов
    • Простое голосование
      Простое голосование
    • Список как аргумент
      Список как аргумент
    Практические руководства
  • Смарт-контракты Waves
    Смарт-контракты Waves
  • dApp
    • Создание и запуск dApp
      Создание и запуск dApp
    dApp
  • Cмарт-аккаунт
    • Создание смарт-аккаунта
      Создание смарт-аккаунта
    • [en] Creating and deploying a script manually
      [en] Creating and deploying a script manually
    • [en] Video tutorials
      [en] Video tutorials
    Cмарт-аккаунт
  • Cмарт-ассет
    Cмарт-ассет
  • Инструменты разработчика
    • Waves IDE
      Waves IDE
    • Расширение для VS Code
      Расширение для VS Code
    • Surfboard
      Surfboard
    • Ride REPL
      Ride REPL
    Инструменты разработчика
  • Signer ◆
    Signer ◆
  • Waves API
    • Data Service API
      Data Service API
    • Node REST API 🡥
      Node REST API 🡥
    • Node gRPC Server 🡥
      Node gRPC Server 🡥
    • Blockchain Updates 🡥
      Blockchain Updates 🡥
    Waves API
  • Клиентские библиотеки
    • Waves C#
      • Установка SDK
        Установка SDK
      • Запуск кода
        • Отправка транзакций
          Отправка транзакций
        • Использование криптографических утилит
          Использование криптографических утилит
        • Взаимодействие с нодой
          Взаимодействие с нодой
        • Развертывание смарт-контрактов
          Развертывание смарт-контрактов
        Запуск кода
      Waves C#
    • Gowaves
      • Установка SDK
        Установка SDK
      • Запуск кода
        • Отправка транзакций
          Отправка транзакций
        • Использование криптографических утилит
          Использование криптографических утилит
        • Взаимодействие с нодой
          Взаимодействие с нодой
        • Развертывание смарт-контрактов
          Развертывание смарт-контрактов
        Запуск кода
      Gowaves
    • WavesJ
      • Установка SDK
        Установка SDK
      WavesJ
    • Ts-lib-crypto
      • Установка SDK
        Установка SDK
      Ts-lib-crypto
    • Waves-PHP
      • Установка SDK
        Установка SDK
      Waves-PHP
    • Waves-python
      • Установка SDK
        Установка SDK
      Waves-python
    • Waves-rust
      • Установка SDK
        Установка SDK
      Waves-rust
    Клиентские библиотеки
      • English
      • Русский
      On this page
        • Assets API
        • Addresses API
      waves_logo Docs

          # Взаимодействие с нодой

          Вы можете взаимодействоваь с API-методами Assets и Addresses.

          # Assets API

          Вы можете получить информацию о:

          • Распределении баланса активов.
          • Балансе активов по адресу.
          • Балансе актива по адресу.
          • Об активе.
          • Наличии NFT-токенах по адресу.

          # Распределение баланса активов

          Endpoint: GET /assets/{assetId}/distribution/{height}/limit/{limit}

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"math"
          	"net/http"
          )
          
          // JSON-структура данных endpoint'а.
          type AssetDistribution struct {
          	Items    map[string]uint64 `json:"items"`
          	LastItem string            `json:"lastItem"`
          	HasNext  bool              `json:"hasNext"`
          }
          
          // Текущая высота блокчейна.
          type BlockHeight struct {
          	Height int `json:"height"`
          }
          
          // Метаданные актива: десятичные числа.
          type AssetInfo struct {
          	Decimals byte `json:"decimals"`
          }
          
          func main() {
          	// 1. Установка ID актива и лимита.
          	assetId := "УКАЖИТЕ ID АКТИВА"
          	limit := 100
          
          	/* 2. Указание URL-адреса ноды для необходимой сети:
          	- Mainnet: "https://nodes.wavesnodes.com"
          	- Testnet: "https://nodes-testnet.wavesnodes.com"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com"
          	*/
          	baseURL := "https://nodes-testnet.wavesnodes.com"
          
          	// 3. Получение информации о высоте последнего блока.
          	heightResp, err := http.Get(baseURL + "/blocks/height")
          	if err != nil {
          		log.Fatalf("Ошибка при получении высоты последнего блока: %v", err)
          	}
          	defer heightResp.Body.Close()
          
          	if heightResp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(heightResp.Body)
          		log.Fatalf("Ошибка при получении высоты блокчейна: %s - %s", heightResp.Status, string(body))
          	}
          
          	var bh BlockHeight
          	if err := json.NewDecoder(heightResp.Body).Decode(&bh); err != nil {
          		log.Fatalf("Ошибка при декодировании данных высоты блока: %v", err)
          	}
          	stableHeight := bh.Height - 1
          
          	// 4. Получение десятичных дробей активов.
          	infoResp, err := http.Get(baseURL + "/assets/details/" + assetId)
          	if err != nil {
          		log.Fatalf("Ошибка при получении информации об ассете: %v", err)
          	}
          	defer infoResp.Body.Close()
          
          	if infoResp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(infoResp.Body)
          		log.Fatalf("Ошибка при получении информации об ассете: %s - %s", infoResp.Status, string(body))
          	}
          
          	var assetInfo AssetInfo
          	if err := json.NewDecoder(infoResp.Body).Decode(&assetInfo); err != nil {
          		log.Fatalf("Ошибка при парсинге данных: %v", err)
          	}
          
          	// 5. Создание URL-адреса endpoint'а.
          	url := fmt.Sprintf("%s/assets/%s/distribution/%d/limit/%d", baseURL, assetId, stableHeight, limit)
          
          	// 6. Выполнение HTTP GET-запроса.
          	resp, err := http.Get(url)
          	if err != nil {
          		log.Fatalf("Ошибка при создании запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		log.Fatalf("Ошибка HTTP: %s - %s", resp.Status, string(body))
          	}
          
          	// 7. Расшифровка JSON-данных.
          	var dist AssetDistribution
          	if err := json.NewDecoder(resp.Body).Decode(&dist); err != nil {
          		log.Fatalf("Ошибка при парсинге JSON-данных: %v", err)
          	}
          
          	// 8. Вывод результата.
          	fmt.Println("––––––––––––––––––––––––––––––––––––––")
          	fmt.Println("Распределение активов (адрес: количество):")
          	divisor := math.Pow10(int(assetInfo.Decimals))
          	for addr, bal := range dist.Items {
          		fmt.Printf("%s: %.2f\n", addr, float64(bal)/divisor)
          	}
          	if dist.HasNext {
          		fmt.Printf("\nДоступно больше страниц. Последний элемент: %s\n", dist.LastItem)
          	}
          }
          

          # Баланс активов по адресу

          Endpoint: GET /assets/balance/{address}

          package main
          
          import (
          	"context"
          	"fmt"
          	"log"
          	"net/http"
          	"time"
          
          	"github.com/wavesplatform/gowaves/pkg/client"
          	"github.com/wavesplatform/gowaves/pkg/proto"
          )
          
          func getAssetsBalance() {
          	const (
          		/*
                  Укажите сеть:
                  - Mainnet: `proto.MainNetScheme`
                  - Testnet: `proto.TestNetScheme`
                  - Stagenet: `proto.StageNetScheme`
                  */
          		network = proto.MainNetScheme
          		// Укажите адрес аккаунта.
          		address = "УКАЖИТЕ АДРЕС АККАУНТА"
          	)
          
          	// Шаг 1: Создание клиента ноды.
          	nodeClient, err := client.NewClient(client.Options{
          		/*
          		Укажите сеть:
          		- Mainnet: "https://nodes.wavesnodes.com/"
          		- Testnet: "https://nodes-testnet.wavesnodes.com/"
          		- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          		*/
          		BaseUrl: "https://nodes.wavesnodes.com/",
          		Client:  &http.Client{Timeout: 10 * time.Second},
          		ChainID: network,
          	})
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка клиента: %v", err)
          	}
          
          	// Шаг 2: Преобразование адресной строки в объект.
          	addr, err := proto.NewAddressFromString(address)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка преобразования: %v", err)
          	}
          
          	// Шаг 3: Получение данные о балансе активов по адресу.
          	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
          	defer cancel()
          
          	// Вывод ошибки при её нахождении.
          	res, _, err := nodeClient.Assets.BalanceByAddress(ctx, addr)
          	if err != nil {
          		log.Fatalf("Ошибка получения данных: %v", err)
          	}
          
          	// Шаг 4: Вывод результатов
          	for _, asset := range res.Balances {
          		info := asset.IssueTransaction
          		fmt.Println("––––––––––––––––––––––––––––––––")
          		fmt.Println("ID актива:", asset.AssetId.String())
          		fmt.Println("Наименование:", info.Name)
          		fmt.Println("Описание:", info.Description)
          		fmt.Println("Количество:", float64(asset.Balance)/float64(pow10(info.Decimals)))
          		fmt.Println("Перевыпускаемость актива:", info.Reissuable)
          		fmt.Println("Публичный ключ аккаунта:", info.SenderPK.String())
          	}
          }
          
          // Вычисление степени 10^n.
          func pow10(n byte) int64 {
          	res := int64(1)
          	for i := byte(0); i < n; i++ {
          		res *= 10
          	}
          	return res
          }
          
          // Запуск функции.
          func main() {
          	getAssetsBalance()
          }
          

          # Баланс актива по адресу

          Endpoint: GET /assets/balance/{address}/{assetId}

          package main
          
          // Необходимые импорты.
          import (
          	"context"
          	"fmt"
          	"log"
          	"net/http"
          	"time"
          
          	"github.com/wavesplatform/gowaves/pkg/client"
          	"github.com/wavesplatform/gowaves/pkg/proto"
          	"github.com/wavesplatform/gowaves/pkg/crypto"
          )
          
          func getAssetBalance() {
          	const (
          		/*
                  Укажите сеть:
                  - Mainnet: `proto.MainNetScheme`
                  - Testnet: `proto.TestNetScheme`
                  - Stagenet: `proto.StageNetScheme`
                  */
          		network    = proto.TestNetScheme
          		address    = "УКАЖИТЕ АДРЕС АККАУНТА"
          		assetIDStr = "УКАЖИТЕ ID АССЕТА"
          	)
          
          	// Шаг 1: Создание клиента ноды.
          	nodeClient, err := client.NewClient(client.Options{
          		/*
          		Укажите сеть:
          		- Mainnet: "https://nodes.wavesnodes.com/"
          		- Testnet: "https://nodes-testnet.wavesnodes.com/"
          		- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          		*/
          		BaseUrl: "https://nodes-testnet.wavesnodes.com/",
          		Client:  &http.Client{Timeout: 10 * time.Second},
          		ChainID: network,
          	})
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка метода: %v", err)
          	}
          
          	// Шаг 2: Преобраование адресной строки в объект.
          	addr, err := proto.NewAddressFromString(address)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка метода: %v", err)
          	}
          
          	// Шаг 3: Получение ID актива из строки base58.
          	assetID, err := crypto.NewDigestFromBase58(assetIDStr)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка метода: %v", err)
          	}
          
          	// Шаг 4: Получение баланса для указанного адреса и ID актива.
          	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
          	defer cancel()
          
          	res, _, err := nodeClient.Assets.BalanceByAddressAndAsset(ctx, addr, assetID)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка метода: %v", err)
          	}
          
          	// Шаг 5: Получение информации о десятичных числах актива.
          	info, _, err := nodeClient.Assets.Details(ctx, assetID)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка получения данных об активе: %v", err)
          	}
          
          	// Шаг 6: Форматирование баланса с десятичными дробями. Пример: 923 → 9,23.
          	divisor := 1.0
          	for i := uint64(0); i < info.Decimals; i++ {
          		divisor *= 10
          	}
          
          	// Шаг 7: Вывод результата.
          	fmt.Printf("Баланс актива: %.2f\n", float64(res.Balance)/divisor)
          }
          
          // Запуск функции.
          func main() {
          	getAssetBalance()
          }
          

          # Детали актива

          Endpoint: GET /assets/details/{assetId}

          package main
          
          // Необходимые импорты.
          import (
          	"context"
          	"fmt"
          	"log"
          	"net/http"
          	"time"
          	"github.com/wavesplatform/gowaves/pkg/client"
          	"github.com/wavesplatform/gowaves/pkg/proto"
          	"github.com/wavesplatform/gowaves/pkg/crypto"
          )
          
          func getAssetDetails() {
          	const (
          		/*
                  Укажите сеть:
                  - Mainnet: `proto.MainNetScheme`
                  - Testnet: `proto.TestNetScheme`
                  - Stagenet: `proto.StageNetScheme`
                  */
          		network    = proto.TestNetScheme
          		assetIDStr = "УКАЖИТЕ ID АССЕТА"
          	)
          
          	// Шаг 1: Создание клиента ноды.
          	nodeClient, err := client.NewClient(client.Options{
          		/*
          		Укажите сеть:
          		- Mainnet: "https://nodes.wavesnodes.com/"
          		- Testnet: "https://nodes-testnet.wavesnodes.com/"
          		- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          		*/
          		BaseUrl: "https://nodes-testnet.wavesnodes.com/",
          		Client:  &http.Client{Timeout: 10 * time.Second},
          		ChainID: network,
          	})
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка создания клиента: %v", err)
          	}
          
          	// Шаг 2: Парсинг ID актива.
          	assetID, err := crypto.NewDigestFromBase58(assetIDStr)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка метода: %v", err)
          	}
          
          	// Шаг 3: Получение сведений об активе.
          	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
          	defer cancel()
          	res, _, err := nodeClient.Assets.Details(ctx, assetID)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка метода: %v", err)
          	}
          
          	// Шаг 4: Форматирование и вывод результатов.
          	fmt.Println("Детали ассета:")
          	fmt.Printf("Наименование: %s\n", res.Name)
          	fmt.Printf("Описание: %s\n", res.Description)
          	fmt.Printf("Десятичные знаки: %d\n", res.Decimals)
          	fmt.Printf("Всего выпущено: %.2f\n", float64(res.Quantity)/100)
          	fmt.Printf("Перевыпускаемость ассета: %v\n", res.Reissuable)
          	fmt.Printf("Создатель: %s\n", res.Issuer)
          }
          
          // Запуск функции.
          func main() {
          	getAssetDetails()
          }
          

          # Наличие NFT-токенов по адресу

          Endpoint: GET /assets/nft/{address}/limit/{limit}

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          	"time"
          )
          
          // Структура данных NFT.
          type NftAsset struct {
          	ID          string `json:"assetId"`
          	Name        string `json:"name"`
          	Description string `json:"description"`
          	Quantity    int    `json:"quantity"`
          	Decimals    int    `json:"decimals"`
          	Reissuable  bool   `json:"reissuable"`
          	Ticker      string `json:"ticker"`
          }
          
          func getNFTs() {
          	const (
          		/*
          		Укажите сеть:
          		- Mainnet: "https://nodes.wavesnodes.com/"
          		- Testnet: "https://nodes-testnet.wavesnodes.com/"
          		- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          		*/
          		nodeURL = "https://nodes-testnet.wavesnodes.com"
          		address = "УКАЖИТЕ АДРЕС АККАУНТА"
          		limit   = 100
          	)
          
          	// Шаг 1: Создание URL-запроса.
          	url := fmt.Sprintf("%s/assets/nft/%s/limit/%d", nodeURL, address, limit)
          
          	// Шаг 2: Создание HTTP-клиента.
          	client := &http.Client{Timeout: 10 * time.Second}
          
          	// Шаг 3: Выполнение GET-запроса.
          	resp, err := client.Get(url)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	// Вывод ошибки при её нахождении.
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	// Шаг 4: Парсинг JSON-данных.
          	var nfts []NftAsset
          	// Вывод ошибки при её нахождении.
          	if err := json.NewDecoder(resp.Body).Decode(&nfts); err != nil {
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Шаг 5: Вывод результатов.
          	if len(nfts) == 0 {
          		fmt.Println("Не найдно NFT по данному адресу")
          		return
          	}
          
          	fmt.Println("NFT по данному адресу:")
          	for i, nft := range nfts {
          		fmt.Printf("%d. ID: %s | Наименование: %s | Описание: %s\n", i+1, nft.ID, nft.Name, nft.Description)
          	}
          }
          
          // Запуск функции.
          func main() {
          	getNFTs()
          }
          

          # Addresses API

          Вы можете получить информацию о:

          • Всех адресах в кошельке ноды.
          • Диапазоне адресов.
          • Балансе WAVES по адресу.
          • Балансе WAVES с подтверждениями.
          • Детальной информации о балансе.
          • Балансе нескольких адресов.
          • Записях данных аккаунта по адресу.
          • Записях данных по ключу.
          • Скрипте аккаунта.
          • Метаданных скрипта аккаунта.

          # Все адреса в кошельке ноды

          Endpoint: GET /addresses

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          	"time"
          )
          
          func main() {
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com"
          
          	// Шаг 1: Создание URL-запроса.
          	url := nodeURL + "/addresses"
          
          	// Шаг 2: Создание HTTP-клиента.
          	client := &http.Client{Timeout: 10 * time.Second}
          
          	// Шаг 3: Выполнение GET-запроса.
          	resp, err := client.Get(url)
          	if err != nil {
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	// Шаг 4: Парсинг данных.
          	var addresses []string
          	// Вывод ошибки при её нахождении.
          	if err := json.NewDecoder(resp.Body).Decode(&addresses); err != nil {
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Шаг 5: Вывод результатов.
          	fmt.Println("Адреса кошельков ноды:")
          	for i, addr := range addresses {
          		fmt.Printf("%d. %s\n", i+1, addr)
          	}
          }
          

          # Диапазон адресов

          Endpoint: GET /addresses/seq/{from}/{to}

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          	"time"
          )
          
          func main() {
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com"
          
          	// Стартовый индекс кошелька ноды.
          	const from int = 0 
          
          	// Последний индекс кошелька ноды.
          	const to int = 4
          
          	// Шаг 1: Создание URL-запроса.
          	url := fmt.Sprintf("%s/addresses/seq/%d/%d", nodeURL, from, to)
          
          	// Шаг 2: Создание HTTP-клиента.
          	client := &http.Client{Timeout: 10 * time.Second}
          
          	// Шаг 3: Выполнение GET-запроса.
          	resp, err := client.Get(url)
          	if err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	// Шаг 4: Парсинг данных.
          	var addresses []string
          	if err := json.NewDecoder(resp.Body).Decode(&addresses); err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Шаг 5: Вывод результатов.
          	fmt.Printf("Адреса кошельков ноды с индексом от %d до %d:\n", from, to)
          	for i, addr := range addresses {
          		fmt.Printf("%d. %s\n", from+i+1, addr)
          	}
          }
          

          # Баланс WAVES по адресу

          Endpoint: GET /addresses/balance/{address}

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          	"time"
          )
          
          // Структура данных endpoint'а. 
          type BalanceResponse struct {
          	Address string `json:"address"`
          	Balance int64  `json:"balance"`
          }
          
          func main() {
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com"
          
          	// Укажите адрес аккаунта.
          	const address string = "УКАЖИТЕ АДРЕС АККАУНТА"
          
          	// Шаг 1: Создание URL-запроса.
          	url := fmt.Sprintf("%s/addresses/balance/%s", nodeURL, address)
          
          	// Шаг 2: Создание HTTP-клиента.
          	client := &http.Client{Timeout: 10 * time.Second}
          
          	// Шаг 3: Выполнение GET-запроса.
          	resp, err := client.Get(url)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	// Шаг 4: Парсинг данных.
          	var balanceRes BalanceResponse
          	if err := json.NewDecoder(resp.Body).Decode(&balanceRes); err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Шаг 5: Вывод результатов (WAVES в степени 10^8).
          	fmt.Printf("Баланс по адресу %s: %.8f WAVES\n", balanceRes.Address, float64(balanceRes.Balance)/1e8)
          }
          

          # Баланс WAVES с подтверждениями

          Endpoint: GET /addresses/balance/{address}/{confirmations}

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          	"time"
          )
          
          // Структура данных endpoint'а. 
          type BalanceResponse struct {
          	Address string `json:"address"`
          	Balance int64  `json:"balance"`
          }
          
          func main() {
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com"
          
          	// Укажите адрес аккаунта.
          	const address string = "УКАЖИТЕ АДРЕС АККАУНТА"
          	
          	// Укажите количество подтверждений.
          	const confirmations int = 2
          
          	// Шаг 1: Создание URL-запроса.
          	url := fmt.Sprintf("%s/addresses/balance/%s/%d", nodeURL, address, confirmations)
          
          	// Шаг 2: Создание HTTP-клиента.
          	client := &http.Client{Timeout: 10 * time.Second}
          
          	// Шаг 3: Выполнение GET-запроса.
          	resp, err := client.Get(url)
          	// Вывод ошибки при её нахождении.
          	if err != nil {
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	// Шаг 4: Парсинг данных.
          	var balanceRes BalanceResponse
          	// Вывод ошибки при её нахождении.
          	if err := json.NewDecoder(resp.Body).Decode(&balanceRes); err != nil {
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Шаг 5: Вывод результатов (WAVES в степени 10^8).
          	fmt.Printf("Баланс по адресу %s (≥ %d подтверждений): %.8f WAVES\n", balanceRes.Address, confirmations, float64(balanceRes.Balance)/1e8)
          }
          

          # Детальная информация о балансе

          Endpoint: GET /addresses/balance/details/{address}

          Обратите внимание: Метод показывает доступные, регулярные, генерирующие и эффективные остатки на счету аккаунта.

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          	"time"
          )
          
          // Структура данных endpoint'а.
          type BalanceDetails struct {
          	Address     string `json:"address"`
          	Regular     int64  `json:"regular"`
          	Generating  int64  `json:"generating"`
          	Available   int64  `json:"available"`
          	Effective   int64  `json:"effective"`
          }
          
          func main() {
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com"
          
          	// Укажите адрес аккаунта.
          	const address string = "УКАЖИТЕ АДРЕС АККАУНТА"
          
          	// Шаг 1: Создание URL-запроса.
          	url := fmt.Sprintf("%s/addresses/balance/details/%s", nodeURL, address)
          
          	// Шаг 2: Создание HTTP-клиента.
          	client := &http.Client{Timeout: 10 * time.Second}
          
          	// Шаг 3: Выполнение GET-запроса.
          	resp, err := client.Get(url)
          	if err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	// Шаг 4: Парсинг данных.
          	var details BalanceDetails
          	if err := json.NewDecoder(resp.Body).Decode(&details); err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Шаг 5: Вывод результатов (WAVES в степени 10^8).
          	fmt.Printf("Детали балансов %s:\n", details.Address)
          	fmt.Printf("Регулярный: %.8f WAVES\n", float64(details.Regular)/1e8)
          	fmt.Printf("Доступный:  %.8f WAVES\n", float64(details.Available)/1e8)
          	fmt.Printf("Генерирующий: %.8f WAVES\n", float64(details.Generating)/1e8)
          	fmt.Printf("Эффективный:  %.8f WAVES\n", float64(details.Effective)/1e8)
          }
          

          # Баланс нескольких адресов

          Endpoint: POST /addresses/balance

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          	"time"
          	"bytes"
          )
          
          // Структура тела POST-запроса.
          type AddressRequest struct {
          	Addresses []string `json:"addresses"`
          }
          
          // Структура данных баланса.
          type AddressBalance struct {
          	Balance int64 `json:"balance"`
          }
          
          func main() {
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com/addresses/balance"
          
          	// Укажите адреса аккаунтов.
          	addresses := []string{
          		"УКАЖИТЕ АДРЕС ПЕРВОГО АККАУНТА",
          		"УКАЖИТЕ АДРЕС ВТОРОГО АККАУНТА",
          		// ...
          	}
          
          	// Шаг 1: Создание JSON-запроса.
          	bodyData, err := json.Marshal(AddressRequest{Addresses: addresses})
          	if err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Ошибка метода: %v", err)
          	}
          
          	// Шаг 2: Создание HTTP-клиента и POST-запроса.
          	client := &http.Client{Timeout: 10 * time.Second}
          	req, err := http.NewRequest("POST", nodeURL, io.NopCloser(bytes.NewReader(bodyData)))
          	if err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Ошибка создания запроса: %v", err)
          	}
          	req.Header.Set("Content-Type", "application/json")
          
          	// Шаг 3: Выполнение запроса.
          	resp, err := client.Do(req)
          	if err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	// Шаг 4: Парсинг данных.
          	var results []AddressBalance
          	if err := json.NewDecoder(resp.Body).Decode(&results); err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Шаг 5: Вывод данных о балансе каждого аккаунта в WAVES.
          	for i, item := range results {
          		// Вывод ошибки при её нахождении.
          		fmt.Printf("%s: %.8f WAVES\n", addresses[i], float64(item.Balance)/1e8)
          	}
          }
          

          # Записях данных аккаунта по адресу

          Endpoint: GET /addresses/data/{address}

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          	"time"
          )
          
          // Структура записи данных типа «ключ-значение».
          type DataEntry struct {
          	Key   string      `json:"key"`
          	Type  string      `json:"type"`
          	Value interface{} `json:"value"`
          }
          
          func main() {
          	// Укажите адрес аккаунта.
          	const address = "УКАЖИТЕ АДРЕС АККАУНТА"
          
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com/addresses/data/" + address
          
          	// Шаг 1: Создание HTTP-клиента и GET-запроса.
          	client := &http.Client{Timeout: 10 * time.Second}
          	resp, err := client.Get(nodeURL)
          	if err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	// Шаг 2: Декодирование JSON-данных.
          	var entries []DataEntry
          	if err := json.NewDecoder(resp.Body).Decode(&entries); err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Шаг 3: Вывод записей данных аккаунта.
          	for _, entry := range entries {
          		fmt.Printf("%s (%s): %v\n", entry.Key, entry.Type, entry.Value)
          	}
          }
          

          # Записи данных по ключу

          Endpoint: GET /addresses/data/{address}/{key}

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          )
          
          // Структура данных записи аккаунта.
          type DataEntry struct {
          	Key   string      `json:"key"`
          	Type  string      `json:"type"`
          	Value interface{} `json:"value"`
          }
          
          func main() {
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com"
          
          	// Укажите адрес аккаунта.
          	address := "УКАЖИТЕ АДРЕС АККАУНТА"
          
          	// Укажите ключ аккаунта.
          	key := "УКАЖИТЕ КЛЮЧ АККАУНТА"
          
          	url := fmt.Sprintf("%s/addresses/data/%s/%s", nodeURL, address, key)
          
          	resp, err := http.Get(url)
          	if err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	var entry DataEntry
          	if err := json.NewDecoder(resp.Body).Decode(&entry); err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Вывод результатов.
          	fmt.Printf("Ключ: %s\nТип: %s\nЗначение: %v\n", entry.Key, entry.Type, entry.Value)
          }
          

          # Информация о скрипте аккаунта

          Endpoint: GET /addresses/scriptInfo/{address}

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          )
          
          // Структура скрипта аккаунта.
          type ScriptInfo struct {
          	Script string `json:"script"`
          	Complexity int `json:"complexity"`
          	ExtraFee   int `json:"extraFee"`
          }
          
          func main() {
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com"
          
          	// Укажите адрес аккаунта.
          	address := "УКАЖИТЕ АДРЕС АККАУНТА"
          
          	url := fmt.Sprintf("%s/addresses/scriptInfo/%s", nodeURL, address)
          
          	resp, err := http.Get(url)
          	if err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	var info ScriptInfo
          	if err := json.NewDecoder(resp.Body).Decode(&info); err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Вывод результатов.
          	fmt.Printf("Скрипт:\n%s\nСложность скрипта: %d\nКомиссия: %d\n", info.Script, info.Complexity, info.ExtraFee)
          }
          

          # Метаданные скрипта аккаунта

          Endpoint: GET /addresses/scriptInfo/{address}/meta

          package main
          
          // Необходимые импорты.
          import (
          	"encoding/json"
          	"fmt"
          	"io"
          	"log"
          	"net/http"
          )
          
          // Структура метаднных скрипта аккаунта.
          type ScriptMeta struct {
          	Version       int      `json:"version"`
          	CallableFunc  []string `json:"callableFunc"`
          	VerifierFunc  string   `json:"verifierFunc"`
          }
          
          func main() {
          	/*
          	Укажите сеть:
          	- Mainnet: "https://nodes.wavesnodes.com/"
          	- Testnet: "https://nodes-testnet.wavesnodes.com/"
          	- Stagenet: "https://nodes-stagenet.wavesnodes.com/"
          	*/
          	const nodeURL = "https://nodes-testnet.wavesnodes.com"
          
          	// Укажите адрес аккаунта.
          	address := "УКАЖИТЕ АДРЕС АККАУНТА"
          
          	url := fmt.Sprintf("%s/addresses/scriptInfo/%s/meta", nodeURL, address)
          
          	resp, err := http.Get(url)
          	if err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Ошибка выполнения запроса: %v", err)
          	}
          	defer resp.Body.Close()
          
          	if resp.StatusCode != http.StatusOK {
          		body, _ := io.ReadAll(resp.Body)
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Статус %s: %s", resp.Status, string(body))
          	}
          
          	var meta ScriptMeta
          	if err := json.NewDecoder(resp.Body).Decode(&meta); err != nil {
          		// Вывод ошибки при её нахождении.
          		log.Fatalf("Не удалось выполнить декодирование: %v", err)
          	}
          
          	// Вывод результатов.
          	fmt.Printf("Версия: %d\nVerifier: %s\nВызываемые функции: %v\n", meta.Version, meta.VerifierFunc, meta.CallableFunc)
          }
          
          Использование криптографических утилит
          Развертывание смарт-контрактов
          Использование криптографических утилит
          Развертывание смарт-контрактов