github.com/algorand/go-algorand-sdk@v1.24.0/examples/gen-addresses/main.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/algorand/go-algorand-sdk/client/kmd"
    10  	"github.com/algorand/go-algorand-sdk/client/v2/algod"
    11  	"github.com/algorand/go-algorand-sdk/crypto"
    12  	"github.com/algorand/go-algorand-sdk/future"
    13  	"github.com/algorand/go-algorand-sdk/types"
    14  )
    15  
    16  // CHANGE ME
    17  const (
    18  	exampleWalletName     = "unencrypted-default-wallet"
    19  	exampleWalletPassword = ""
    20  	exampleWalletDriver   = kmd.DefaultWalletDriver
    21  )
    22  
    23  var (
    24  	kmdAddress = "http://localhost:4002"
    25  	kmdToken   = strings.Repeat("a", 64)
    26  
    27  	algodAddress = "http://localhost:4001"
    28  	algodToken   = strings.Repeat("a", 64)
    29  )
    30  
    31  func main() {
    32  	// Create a kmd client
    33  	kmdClient, err := kmd.MakeClient(kmdAddress, kmdToken)
    34  	if err != nil {
    35  		fmt.Printf("failed to make kmd client: %s\n", err)
    36  		return
    37  	}
    38  	fmt.Println("Made a kmd client")
    39  
    40  	// Create an algod client
    41  	algodClient, err := algod.MakeClient(algodAddress, algodToken)
    42  	if err != nil {
    43  		fmt.Printf("failed to make algod client: %s\n", err)
    44  		return
    45  	}
    46  
    47  	// Print algod status
    48  	nodeStatus, err := algodClient.Status().Do(context.Background())
    49  	if err != nil {
    50  		fmt.Printf("error getting algod status: %s\n", err)
    51  		return
    52  	}
    53  	fmt.Printf("algod last round: %d\n", nodeStatus.LastRound)
    54  
    55  	// List existing wallets, and check if our example wallet already exists
    56  	resp0, err := kmdClient.ListWallets()
    57  	if err != nil {
    58  		fmt.Printf("error listing wallets: %s\n", err)
    59  		return
    60  	}
    61  	fmt.Printf("Got %d wallet(s):\n", len(resp0.Wallets))
    62  	var exampleExists bool
    63  	var exampleWalletID string
    64  	for _, wallet := range resp0.Wallets {
    65  		fmt.Printf("ID: %s\tName: %s\n", wallet.ID, wallet.Name)
    66  		if wallet.Name == exampleWalletName {
    67  			exampleWalletID = wallet.ID
    68  			exampleExists = true
    69  		}
    70  	}
    71  
    72  	// Create the example wallet, if it doesn't already exist
    73  	if !exampleExists {
    74  		resp1, err := kmdClient.CreateWallet(exampleWalletName, exampleWalletPassword, exampleWalletDriver, types.MasterDerivationKey{})
    75  		if err != nil {
    76  			fmt.Printf("error creating wallet: %s\n", err)
    77  			return
    78  		}
    79  		exampleWalletID = resp1.Wallet.ID
    80  		fmt.Printf("Created wallet '%s' with ID: %s\n", resp1.Wallet.Name, exampleWalletID)
    81  	}
    82  
    83  	// Get a wallet handle
    84  	resp2, err := kmdClient.InitWalletHandle(exampleWalletID, exampleWalletPassword)
    85  	if err != nil {
    86  		fmt.Printf("Error initializing wallet: %s\n", err)
    87  		return
    88  	}
    89  
    90  	// Extract the wallet handle
    91  	exampleWalletHandleToken := resp2.WalletHandleToken
    92  
    93  	// Generate some addresses in the wallet
    94  	fmt.Println("Generating 10 addresses")
    95  	var addresses []string
    96  	for i := 0; i < 10; i++ {
    97  		resp3, err := kmdClient.GenerateKey(exampleWalletHandleToken)
    98  		if err != nil {
    99  			fmt.Printf("Error generating key: %s\n", err)
   100  			return
   101  		}
   102  		fmt.Printf("Generated address %s\n", resp3.Address)
   103  		addresses = append(addresses, resp3.Address)
   104  	}
   105  
   106  	// Extract the private key of the first address
   107  	fmt.Printf("Extracting private key for %s\n", addresses[0])
   108  	resp4, err := kmdClient.ExportKey(exampleWalletHandleToken, exampleWalletPassword, addresses[0])
   109  	if err != nil {
   110  		fmt.Printf("Error extracting secret key: %s\n", err)
   111  		return
   112  	}
   113  	privateKey := resp4.PrivateKey
   114  
   115  	// Get the suggested transaction parameters
   116  	txParams, err := algodClient.SuggestedParams().Do(context.Background())
   117  	if err != nil {
   118  		fmt.Printf("error getting suggested tx params: %s\n", err)
   119  		return
   120  	}
   121  
   122  	tx, err := future.MakePaymentTxn(addresses[0], addresses[1], 100, nil, "", txParams)
   123  	if err != nil {
   124  		fmt.Printf("Error creating transaction: %s\n", err)
   125  		return
   126  	}
   127  	fmt.Printf("Made unsigned transaction: %+v\n", tx)
   128  	fmt.Println("Signing transaction with go-algo-sdk library function (not kmd)")
   129  
   130  	txid, stx, err := crypto.SignTransaction(privateKey, tx)
   131  	if err != nil {
   132  		fmt.Printf("Failed to sign transaction: %s\n", err)
   133  		return
   134  	}
   135  
   136  	fmt.Printf("Made signed transaction with TxID %s: %x\n", txid, stx)
   137  
   138  	// Sign the same transaction with kmd
   139  	fmt.Println("Signing same transaction with kmd")
   140  	resp5, err := kmdClient.SignTransaction(exampleWalletHandleToken, exampleWalletPassword, tx)
   141  	if err != nil {
   142  		fmt.Printf("Failed to sign transaction with kmd: %s\n", err)
   143  		return
   144  	}
   145  
   146  	fmt.Printf("kmd made signed transaction with bytes: %x\n", resp5.SignedTransaction)
   147  	if bytes.Equal(resp5.SignedTransaction, stx) {
   148  		fmt.Println("signed transactions match!")
   149  	} else {
   150  		fmt.Println("signed transactions don't match!")
   151  	}
   152  }