# Отправка транзакций
Убедитесь в выполнении требований для отправки транзакций.
# Требования
- Кошелёк: Создайте кошелёк с помощью Keeper Wallet или WX Network.
Примечание: Сохраните сид-фразу кошелька для отправки транзакций.
- Токены: Получите токены WAVES для оплаты комиссии каждой транзакции:
- Для сети Mainnet: Приобретите 0.001 WAVES через доступные способы пополнения кошелька.
- Для сети Testnet: Приобретите 0.001 WAVES через Faucet.
- Для сети Stagenet: Приобретите 0.001 WAVES через Faucet.
# Руководство
Выполните шаги инструкции для необходимого типа транзакции:
- Issue.
- Reissue.
- Burn.
- Transfer.
- Mass Transfer.
- Exchange.
- Lease.
- Lease Cancel.
- Create Alias.
- Data.
- Set Script.
- Set Asset Script.
- Update Asset Info.
- Invoke Script.
- Sponsor Fee.
# Issue
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Опционально. Укажите скрипт ассета. rideScript := ` {-# STDLIB_VERSION 6 #-} {-# CONTENT_TYPE EXPRESSION #-} {-# SCRIPT_TYPE ASSET #-} func trueReturner () = { true } trueReturner() ` // Компиляция Ride-скрипта. compiledScript, errList := compiler.Compile(rideScript, true, true) if errList != nil && len(errList) > 0 { // Поиск ошибок на этапе компиляции. panic(fmt.Sprintf("Ошибка компиляции скрипта: %v", errList)) } // Создание Issue-транзакцию. createTx := proto.NewUnsignedIssueWithProofs( 2, // Версия транзакции. senderPublicKey, // Публичный ключ отправителя. "НАИМЕНОВАНИЕ_ТОКЕНА", // Наименование. "ОПИСАНИЕ_ТОКЕНА", // Описание. uint64(9876543210), // Количество. byte(2), // Знаков после запятой. true, // Флаг, указывающий на возможность повторного выпуска актива. compiledScript, // Скрипт ассета или `nil`. currentTime, // Временная метка. 100000000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Reissue
Обратите внимание: Вы можете перевевыпустить только ассет, созданный вами с флагом перевыпускаемости (reissue) со значением
true
.
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите ID перевыпускаемого актива. assetID, err := crypto.NewDigestFromBase58("УКАЖИТЕ ID АКТИВА") if err != nil { panic(err) } // Build a Reissue Еransaction. createTx := proto.NewUnsignedReissueWithSig( senderPublicKey, // Публичный ключ отправителя транзакции. assetID, // ID актива. 100, // Новое количество токена в наименьшей единице. Например, `100` для 1. true, // Новое значение флага перевыпускаемости актива. currentTime, // Текущее время. 100000000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Burn
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите ID сжигаемого ассета. assetID, err := crypto.NewDigestFromBase58("УКАЖИТЕ ID АССЕТА") if err != nil { panic(err) } // Создание Burn-транзакции. createTx := proto.NewUnsignedBurnWithSig( senderPublicKey, // Публичный ключ отправителя транзакции. assetID, // ID актива. 100, // Количество токена в наименьшей единице. Например, `100` для 1. currentTime, // Текущее время. 1000000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Transfer
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите адрес получателя. recipientAddr, err := proto.NewAddressFromString("УКАЖИТЕ АДРЕС ПОЛУЧАТЕЛЯ") if err != nil { panic(err) } recipient := proto.NewRecipientFromAddress(recipientAddr) /* Укажите ассет для трансфера: - Введите "WAVES" для транзакции в нативном WAVES-токене. - Или введите ID ассета. */ amountAsset, err := proto.NewOptionalAssetFromString("WAVES") if err != nil { panic(err) } // Укажите WAVES в качестве актива для уплаты комиссии. feeAsset, err := proto.NewOptionalAssetFromString("WAVES") if err != nil { panic(err) } // Добавьте приложение. attachment := []byte("ВВЕДИТЕ СООБЩЕНИЕ ПРИЛОЖЕНИЯ") // Создайте Transfer-транзакцию. createTx := proto.NewUnsignedTransferWithSig( senderPublicKey, // Публичный ключ отправителя транзакции. *amountAsset, // Количество актива. *feeAsset, // Актив для уплаты комиссии транзакции. currentTime, // Текущее время. 200000000, // Сумма трансфера в наименьшей единице. Например, `100000000` для 1 токена. 100000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. recipient, // Адрес получателя. attachment, // Сообщение приложения. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Mass Transfer
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите адрес первого получателя. addr1, err := proto.NewAddressFromString("УКАЖИТЕ АДРЕС ПЕРВОГО ПОЛУЧАТЕЛЯ") if err != nil { panic(err) } // Укажите адрес второго получателя. addr2, err := proto.NewAddressFromString("УКАЖИТЕ АДРЕС ВТОРОГО ПОЛУЧАТЕЛЯ") if err != nil { panic(err) } // Укажите адрес третьего получателя. addr3, err := proto.NewAddressFromString("УКАЖИТЕ АДРЕС ТРЕЬЕГО ПОЛУЧАТЕЛЯ") if err != nil { panic(err) } // Форматирование адресов получателей. recipient1 := proto.NewRecipientFromAddress(addr1) recipient2 := proto.NewRecipientFromAddress(addr2) recipient3 := proto.NewRecipientFromAddress(addr3) /* Укажите ассет для трансфера: - Введите "WAVES" для транзакции в нативном WAVES-токене. - Или введите ID ассета. */ asset, err := proto.NewOptionalAssetFromString("WAVES") if err != nil { panic(err) } // Укажите сумму трансфера для каждого из получателей. transfers := []proto.MassTransferEntry{ {Recipient: recipient1, Amount: 100000}, {Recipient: recipient2, Amount: 100000}, {Recipient: recipient3, Amount: 100000}, } // Добавьте приложение. attachment := []byte("ВВЕДИТЕ СООБЩЕНИЕ ПРИЛОЖЕНИЯ") // Создайте транзакцию Mass Transfer. createTx := proto.NewUnsignedMassTransferWithProofs( 1, // Версия транзакции. senderPublicKey, // Публичный ключ отправителя. *asset, // Актив для перевода. transfers, // Список получателей и сумм трансферов. 300000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. currentTime, // Текущее время. attachment, // Приложенное сообщение. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Exchange
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите ID актива, подлежащего обмену. amountAsset, err := proto.NewOptionalAssetFromString("УКАЖИТЕ ID АКТИВА") if err != nil { panic(err) } // Укажите стоимость актива. priceAsset, err := proto.NewOptionalAssetFromString("") if err != nil { panic(err) } // Время истечения срока действия ордера. expiration := currentTime + 100*1000 // Создайте ордер на покупку. buyOrder := proto.NewUnsignedOrderV1( senderPublicKey, // Публичный ключ отправителя. senderPublicKey, // Публичный ключ матчера (`senderPublicKey` указан в качестве примера). *amountAsset, // Актив для покупки. *priceAsset, // Актив, используемый для оплаты: WAVES. proto.Buy, // Тип ордера: покупка. 100, // Цена в `priceAsset` за `amountAsset`, в наименьшей единице. 100, // Общая сумма оредера, в наименьшей единице. currentTime, // Временная метка ордера. expiration, // Время истечения срока действия ордера. 1000000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. ) err = buyOrder.Sign(proto.TestNetScheme, senderPrivateKey) if err != nil { panic(err) } // Создайте ордер на продажу. sellOrder := proto.NewUnsignedOrderV1( senderPublicKey, // Публичный ключ отправителя. senderPublicKey, // Публичный ключ матчера (`senderPublicKey` указан в качестве примера). *amountAsset, // Актив для продажи. *priceAsset, // Получаемый актив. proto.Sell, // Тип ордера: продажа. 100, // Цена. Должна соответствовать ордеру на покупку. 100, // Сумма для продажи. currentTime, // Время создания ордера. expiration, // Время истечения срока действия ордера. 1000000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. ) err = sellOrder.Sign(proto.TestNetScheme, senderPrivateKey) if err != nil { panic(err) } // Укажите параметры транзакции обмена. price := sellOrder.Price // Цена обоих заказов должна совпадать. amount := uint64(456) // Сумма обмена. buyMatcherFee := uint64(789) // Комиссия матчера на покупку. sellMatcherFee := uint64(987) // Комиссия матчера на продажу. fee := uint64(3000000) // Комиссия сети за отправку транзакции. // Создайте Exchange-транзакцию. createTx := proto.NewUnsignedExchangeWithSig( buyOrder, // Ордер на покупку. sellOrder, // Ордер на продажу. price, // Согласованная цена ордера. amount, // Сумма обмениваемого актива. buyMatcherFee, // Комиссия матчера на покупку. sellMatcherFee, // Комиссия матчера на продажу. fee, // Комиссия транзакции. currentTime, // Временная метка. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(proto.TestNetScheme, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(ctx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(ctx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Lease
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите адрес получателя лизинга. recipientAddr, err := proto.NewAddressFromString("УКАЖИТЕ АДРЕС ПОЛУЧАТЕЛЯ") if err != nil { panic(err) } recipient := proto.NewRecipientFromAddress(recipientAddr) // Укажите сумму лизинга. leaseAmount := uint64(1234567890) // Укажите комиссию за транзакцию. leaseFee := uint64(100000) // Рекомендуемая минимальная комиссия за Lease-транзакцию. // Создайте Lease-транзакцию. createTx := proto.NewUnsignedLeaseWithSig( senderPublicKey, // Публичный ключ отправителя транзакции. recipient, // Получатель актива. leaseAmount, // Сумма лизинга. leaseFee, // Комиссия за транзакцию. currentTime, // Текущее время. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Lease Cancel
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите ID Lease-транзакции, которую требуется отменить. leaseID, err := crypto.NewDigestFromBase58("УКАЖИТЕ ID LEASE-ТРАНЗАКЦИИ") if err != nil { panic(err) } // Укажите комиссию за транзакцию. cancelFee := uint64(100000) // Минимальная комиссия за транзакцию. // Создайте транзакцию Lease Cancel. createTx := proto.NewUnsignedLeaseCancelWithSig( senderPublicKey, // Публичный ключ отправителя транзакции. leaseID, // ID Lease-транзакции. cancelFee, // Комиссия за транзакцию. currentTime, // Текущее время. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Create Alias
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "strconv" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Создание псевдонима с помощью текущего времени. alias := proto.NewAlias(network, strconv.FormatUint(currentTime, 10)) // Создайте транзакцию Create Alias. createTx := proto.NewUnsignedCreateAliasWithProofs( 3, // Версия транзакции. senderPublicKey, // Публичный ключ отправителя. *alias, // Псевдоним. 100000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. currentTime) // Текущее время в миллисекундах. // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Data
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/mr-tron/base58/base58" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Создайте Data-транзакцию. createTx := proto.NewUnsignedDataWithProofs( 1, // Версия транзакции. senderPublicKey, // Публичный ключ отправителя. 100000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. currentTime, // Текущее время. ) // Декодирование бинарного значения, необходимого для транзакции. decoded, err := base58.Decode("4JMP6WwpP78EVYZzG9CKQKDUTPUdvMCYGKVNn4G3VdHmW5mZKNXbvHvuvA8Nj6p39k8htY9VkM6uSf5ombFzETJq") // Пример значения. if err != nil { panic(err) } // Добавление записей данных. entries := []proto.DataEntry{ &proto.IntegerDataEntry{Key: "int-val", Value: 1234567890}, &proto.BooleanDataEntry{Key: "bool-val", Value: true}, &proto.BinaryDataEntry{Key: "bin-val", Value: decoded }, &proto.StringDataEntry{Key: "string-val", Value: "some string"}, } // Обработка записей данных. for _, entry := range entries { err := createTx.AppendEntry(entry) if err != nil { panic(err) } } // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Set Script
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" "github.com/wavesplatform/gowaves/pkg/ride/compiler" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите Ride-скрипта вашего аккаунта. rideScript := ` {-# STDLIB_VERSION 8 #-} {-# CONTENT_TYPE DAPP #-} {-# SCRIPT_TYPE ACCOUNT #-} @Callable(i) func checkStorageUntouchedByAlias(accountAlias: String) = { let alias = Alias(accountAlias) let res = if isDataStorageUntouched(alias) then { unit } else { throw("Data storage is not untouched by alias") } ([], res) } ` // Компиляция Ride-скрипта. compiledScript, errList := compiler.Compile(rideScript, true, true) // `true` для DApp и `true` для типа `ACCOUNT`. if errList != nil && len(errList) > 0 { // Поиск ошибок на этапе компиляции. panic(fmt.Sprintf("Ошибка компиляции скрипта: %v", errList)) } // Создайте транзакцию Set Script. setScriptFee := uint64(1400000) createTx := proto.NewUnsignedSetScriptWithProofs( 1, // Версия транзакции. senderPublicKey, // Публичный ключ отправителя. compiledScript, // Скомпилированный скрипт или `nil` для удаления скрипта аккаунта. setScriptFee, // Комиссия за транзакцию. currentTime, // Текущее время. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Set Asset Script
О транзакции Set Asset Script.
Обратите внимание: Вы можете установить скрипт актива только для тех активов, которые были выпущены с установленным Ride-скриптом.
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" "github.com/wavesplatform/gowaves/pkg/ride/compiler" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите ID актива. assetID, err := crypto.NewDigestFromBase58("УКАЖИТЕ ID АКТИВА") if err != nil { panic(err) } // Укажите Ride-скрипт ассета. rideScript := ` {-# STDLIB_VERSION 8 #-} {-# CONTENT_TYPE EXPRESSION #-} {-# SCRIPT_TYPE ASSET #-} true ` // Компиляция Ride-скрипта. compiledScript, errList := compiler.Compile(rideScript, false, true) if errList != nil && len(errList) > 0 { panic(fmt.Sprintf("Ошибка компиляции скрипта: %v", errList)) } // Создайте транзакцию Set Asset Script. createTx := proto.NewUnsignedSetAssetScriptWithProofs( 1, // Версия транзакции. senderPublicKey, // Публичный ключ отправителя. assetID, // ID актива. compiledScript, // Скомпилированный Ride-скрипт. 99600000, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. currentTime, // Текущее время. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Update Asset Info
О транзакции Update Asset Info.
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите ID ассета. assetID, err := crypto.NewDigestFromBase58("УКАЖИТЕ ID АССЕТА") if err != nil { panic(err) } // Укажите опциональный актив для оплаты комиссии. Используйте `WAVES` или введите ID ассета. feeAsset, err := proto.NewOptionalAssetFromString("WAVES") if err != nil { panic(err) } // Создайте транзакцию Update Asset Info. createTx := proto.NewUnsignedUpdateAssetInfoWithProofs( 1, // Версия транзакции. assetID, // ID ассета. senderPublicKey // Публичный ключ отправителя транзакции. "UpdatedName", // Новое наименование ассета. "UpdatedDescription", // Новое описание ассета. currentTime, // Временная метка. *feeAsset, // Ассет для оплаты комиссия транзакции. 100000, // Сумма комиссии. ) // Подпись транзакции приватным ключом отправителя. err = createTx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextcreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextcreateTx, createTx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", createTx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. createTxInfo, _, err := nodeClient.Transactions.Info(contextcreateTx, *createTx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", createTxInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Invoke Script
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "encoding/json" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите адрес dApp-приложения. address := "УКАЖИТЕ АДРЕС DAPP-ПРИЛОЖЕНИЯ" // Укажите параметры вызова скрипта. functionCallJSON := `{"function":"bar","args":[{"type":"boolean","value":true}]}` // Укажите платежные детали. paymentsJSON := `[{"amount":67890,"assetId":null}]` // Укажите ID актива для оплаты комиссии за транзакцию. feeAssetID := "УКАЖИТЕ ID АССЕТА" fee := uint64(1000) // Сумма комиссии. // Форматирование адреса dApp-приложения. recipientAddr, err := proto.NewAddressFromString(address) if err != nil { panic(err) } recipient := proto.NewRecipientFromAddress(recipientAddr) // Парсинг вызываемой функции. var fc proto.FunctionCall err = json.Unmarshal([]byte(functionCallJSON), &fc) if err != nil { panic(err) } // Парсинг прикреплённых платежей. var sps proto.ScriptPayments err = json.Unmarshal([]byte(paymentsJSON), &sps) if err != nil { panic(err) } // Парсинг данных актива для оплаты комиссии. feeAsset, err := proto.NewOptionalAssetFromString(feeAssetID) if err != nil { panic(err) } // Создайте транзакцию Invoke Script. var tx *proto.InvokeScriptWithProofs tx = proto.NewUnsignedInvokeScriptWithProofs( 1, // Версия транзакции. senderPublicKey, // Публичный ключ отправителя. recipient, // Адрес dApp-приложения. fc, // Парсированные функции для вызова. sps, // Парсированные прикреплённые платежи. *feeAsset, // Актива для оплаты комиссии. fee, // Сумма комиссии. currentTime // Текущее время. ) // Подпись транзакции приватным ключом отправителя. err = tx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextCreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextCreateTx, tx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", tx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. txInfo, _, err := nodeClient.Transactions.Info(contextCreateTx, *tx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", txInfo) }
- Установите необходимые зависимости:
go mod tidy
- Запустите приложение:
go run waves.go
# Sponsor Fee
В директории проекта:
- Замените содержимое файла
waves.go
следующим блоком кода:package main // Необходимые импорты. import ( "bytes" "context" "encoding/binary" "fmt" "net/http" "time" "github.com/wavesplatform/gowaves/pkg/client" "github.com/wavesplatform/gowaves/pkg/crypto" "github.com/wavesplatform/gowaves/pkg/proto" ) func main() { /* Укажите сеть: - Mainnet: `proto.MainNetScheme` - Testnet: `proto.TestNetScheme` - Stagenet: `proto.StageNetScheme` */ const network = proto.TestNetScheme 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{}, ChainID: network, }) // Вывод ошибки при её нахождении. if err != nil { panic(err) } // Укажите параметры кошелька. const ( accountNumber = 0 // Порядковый номер кошелька. 0 по умолчанию. // Укажите сид-фразу вашего кошелька. seedPhrase = "УКАЖИТЕ СИД-ФРАЗУ" ) // Преобразование сид-фразы в необходимый формат. accountNumConcatSeedPhrase := bytes.Join([][]byte{ binary.BigEndian.AppendUint32(nil, accountNumber), []byte(seedPhrase), }, nil) // Получение деталей сид-фразы. accountSeed, err := crypto.SecureHash(accountNumConcatSeedPhrase) if err != nil { panic(err) } // Генерация пары приватного и публичного ключей из сид-фразы. senderPrivateKey, senderPublicKey, err := crypto.GenerateKeyPair(accountSeed.Bytes()) if err != nil { panic(err) } // Текущее время в миллисекундах. currentTime := uint64(time.Now().UnixMilli()) // Укажите ID спонсорского актива. assetID := "УКАЖИТЕ ID СПОНСОРСКОГО АКТИВА" assetDigest, _ := crypto.NewDigestFromBase58(assetID) // Создайте Sponsorship-транзакцию. tx := proto.NewUnsignedSponsorshipWithProofs( 1, // Версия транзакции. senderPublicKey, // Публичный ключ отправителя. assetDigest, // Актив транзакции. 100, // Вознаграждение за спонсирование актива. 1234567890, // Комиссия в WAVES в наименьшей единице. Например, `100000000` для 1 токена. currentTime // Текущее время. ) // Подпись транзакции приватным ключом отправителя. err = tx.Sign(network, senderPrivateKey) if err != nil { panic(err) } // Контекст для отмены выполнения запроса по таймауту. contextCreateTx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Отправка транзакции на ноду. _, err = nodeClient.Transactions.Broadcast(contextCreateTx, tx) if err != nil { panic(err) } // Вывод сообщения об успешности отправки транзакции. fmt.Printf("Транзакция %q успешно отправлена\n", tx.ID.String()) // Задержка времени для ожидания появления транзакции в блокчейне. time.Sleep(5 * time.Second) // Получение информации о транзакции от ноды. txInfo, _, err := nodeClient.Transactions.Info(contextCreateTx, *tx.ID) if err != nil { panic(err) } // Вывод информации о транзакции. fmt.Printf("Информация о транзакции: %+v\n", txInfo) }
- Установите необходимые зависимости:
go mod tidy
- Run the application
go mod run waves.go