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 }