From 22994f3845aceb055a21f9c5985dde87fa5f72aa Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Wed, 13 Dec 2023 14:11:50 +0200 Subject: [PATCH] Broadcast wallet transactions in chunks --- cmd/kaspawallet/send.go | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/cmd/kaspawallet/send.go b/cmd/kaspawallet/send.go index 0ac8f78ab6..f513304463 100644 --- a/cmd/kaspawallet/send.go +++ b/cmd/kaspawallet/send.go @@ -75,23 +75,29 @@ func send(conf *sendConfig) error { signedTransactions[i] = signedTransaction } - if len(signedTransactions) > 1 { - fmt.Printf("Broadcasting %d transactions\n", len(signedTransactions)) - } - + fmt.Printf("Broadcasting %d transaction(s)\n", len(signedTransactions)) // Since we waited for user input when getting the password, which could take unbound amount of time - // create a new context for broadcast, to reset the timeout. broadcastCtx, broadcastCancel := context.WithTimeout(context.Background(), daemonTimeout) defer broadcastCancel() - response, err := daemonClient.Broadcast(broadcastCtx, &pb.BroadcastRequest{Transactions: signedTransactions}) - if err != nil { - return err - } - fmt.Println("Transactions were sent successfully") - fmt.Println("Transaction ID(s): ") - for _, txID := range response.TxIDs { - fmt.Printf("\t%s\n", txID) + const chunkSize = 100 // To avoid sending a message bigger than the gRPC max message size, we split it to chunks + for offset := 0; offset < len(signedTransactions); offset += chunkSize { + end := len(signedTransactions) + if offset+chunkSize <= len(signedTransactions) { + end = offset + chunkSize + } + + chunk := signedTransactions[offset:end] + response, err := daemonClient.Broadcast(broadcastCtx, &pb.BroadcastRequest{Transactions: chunk}) + if err != nil { + return err + } + fmt.Printf("Broadcasted %d transaction(s) (broadcasted %.2f%% of the transactions so far)\n", len(chunk), 100*float64(end)/float64(len(signedTransactions))) + fmt.Println("Broadcasted Transaction ID(s): ") + for _, txID := range response.TxIDs { + fmt.Printf("\t%s\n", txID) + } } if conf.Verbose {