# Взаимодействие с нодой
Вы можете взаимодействоваь с 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)
}