CREATE AN ACCOUNT
Before we get started with working with Kuknos in code, consider going through the following
examples using the Kuknos Laboratory. The lab allows you create accounts, fund accounts on the Kuknos test network, build transactions, run any operation, and inspect responses from Horizon via the Endpoint Explorer.
The first thing you’ll need to do anything on the Kuknos network is an account. Accounts hold all
your money inside Kuknos and allow you to send and receive payments—in fact, pretty much
everything in Kuknos is in some way tied to an account.
Every Kuknos account has a public key and a secret seed. Kuknos uses public key
cryptography to ensure that every transaction is secure. The public key is always safe to
share—other people need it to identify your account and verify that you authorized a transaction.
The seed, however, is private information that proves you own your account. You should never share
the seed with anyone. It’s kind of like the combination to a lock—anyone who knows the combination
can open the lock. In the same way, anyone who knows your account’s seed can control your account.
If you’re familiar with public key cryptography, you might be wondering how the seed differs from a
private key. The seed is actually the single secret piece of data that is used to generate both the
public and private key for your account. Kuknos’s tools use the seed instead of the private key
for convenience: To have full access to an account, you only need to provide a seed instead of both
a public key and a private key.
Because the seed must be kept secret, the first step in creating an account is creating your own
seed and key—when you finally create the account, you’ll send only the public key to a Kuknos
server. You can generate the seed and key with the following command:
// create a completely new and unique pair of keys
// see more about KeyPair objects: https://stellar.github.io/js-stellar-sdk/Keypair.html
const pair = StellarSdk.Keypair.random();
pair.secret();
// SAV76USXIJOBMEQXPANUOQM6F5LIOTLPDIDVRJBFFE2MDJXG24TAPUU7
pair.publicKey();
// GCFXHS4GXL6BVUCXBWXGTITROWLVYXQKQLF4YH5O5JT3YZXCYPAFBJZB
import org.stellar.sdk.KeyPair;
KeyPair pair = KeyPair.random();
System.out.println(new String(pair.getSecretSeed()));
// SAV76USXIJOBMEQXPANUOQM6F5LIOTLPDIDVRJBFFE2MDJXG24TAPUU7
System.out.println(pair.getAccountId());
// GCFXHS4GXL6BVUCXBWXGTITROWLVYXQKQLF4YH5O5JT3YZXCYPAFBJZB
package main
import (
"log"
"github.com/stellar/go/keypair"
)
func main() {
pair, err := keypair.Random()
if err != nil {
log.Fatal(err)
}
log.Println(pair.Seed())
// SAV76USXIJOBMEQXPANUOQM6F5LIOTLPDIDVRJBFFE2MDJXG24TAPUU7
log.Println(pair.Address())
// GCFXHS4GXL6BVUCXBWXGTITROWLVYXQKQLF4YH5O5JT3YZXCYPAFBJZB
}
# stellar-sdk >= 2.0.0 required
# create a completely new and unique pair of keys
from stellar_sdk.keypair import Keypair
pair = Keypair.random()
print(f"Secret: {pair.secret}")
# Secret: SCMDRX7A7OVRPAGXLUVRNIYTWBLCS54OV7UH2TF5URSG4B4JQMUADCYU
print(f"Public Key: {pair.public_key}")
# Public Key: GAG7SXULMNWCW6LX42JKZOZRA2JJXQT23LYY32OXA6XECUQG7RZTQJHO
Now that you have a seed and public key, you can create an account. In order to prevent people from
making a huge number of unnecessary accounts, each account must have a minimum balance of 1 paymon
(paymons are the built-in currency of the Kuknos network). Since you don’t yet have any paymons,
though, you can’t pay for an account. In the real world, you’ll usually pay an exchange that sells
paymons in order to create a new account. On Kuknos’s test network, however, you can ask
Friendbot, our friendly robot with a very fat wallet, to create an account for you.
To create a test account, send Friendbot the public key you created. It’ll create and fund a new
account using that public key as the account ID.
(async function main() {
try {
const response = await fetch(
`https://friendbot.stellar.org?addr=${encodeURIComponent(pair.publicKey())}`
);
const responseJSON = await response.json();
console.log("SUCCESS! You have a new account :)\n", responseJSON);
} catch (e) {
console.error("ERROR!", e);
}
})()
import java.net.*;
import java.io.*;
import java.util.*;
String friendbotUrl = String.format(
"https://friendbot.stellar.org/?addr=%s",
pair.getAccountId());
InputStream response = new URL(friendbotUrl).openStream();
String body = new Scanner(response, "UTF-8").useDelimiter("\\A").next();
System.out.println("SUCCESS! You have a new account :)\n" + body);
package main
import (
"net/http"
"io/ioutil"
"log"
"fmt"
)
func main() {
// pair is the pair that was generated from previous example, or create a pair based on
// existing keys.
address := pair.Address()
resp, err := http.Get("https://friendbot.stellar.org/?addr=" + address)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
}
# The SDK does not have tools for creating test accounts, so you'll have to
# make your own HTTP request.
# if you're trying this on Python, install the `requests` library.
import requests
public_key = "GD4NB2FLQAN5JO7PKPGZJMNBDYQXVSNVC7DEIZMOL5WSNSBLEBUTEF5Q"
response = requests.get(f"https://friendbot.stellar.org?addr={public_key}")
if response.status_code == 200:
print(f"SUCCESS! You have a new account :)\n{response.text}")
else:
print(f"ERROR! Response: \n{response.text}")
Now for the last step: Getting the account’s details and checking its balance. Accounts can carry
multiple balances—one for each type of currency they hold.
const server = new StellarSdk.Server("https://horizon-testnet.stellar.org");
// the JS SDK uses promises for most actions, such as retrieving an account
const account = await server.loadAccount(pair.publicKey());
console.log("Balances for account: " + pair.publicKey());
account.balances.forEach(function(balance) {
console.log("Type:", balance.asset_type, ", Balance:", balance.balance);
});
import org.stellar.sdk.Server;
import org.stellar.sdk.responses.AccountResponse;
Server server = new Server("https://horizon-testnet.stellar.org");
AccountResponse account = server.accounts().account(pair);
System.out.println("Balances for account " + pair.getAccountId());
for (AccountResponse.Balance balance : account.getBalances()) {
System.out.println(String.format(
"Type: %s, Code: %s, Balance: %s",
balance.getAssetType(),
balance.getAssetCode(),
balance.getBalance()));
}
package main
import (
"fmt"
"log"
"github.com/stellar/go/clients/horizon"
)
func main() {
account, err := horizon.DefaultTestNetClient.LoadAccount(pair.Address())
if err != nil {
log.Fatal(err)
}
fmt.Println("Balances for account:", pair.Address())
for _, balance := range account.Balances {
log.Println(balance)
}
}
from stellar_sdk.server import Server
server = Server("https://horizon-testnet.stellar.org")
public_key = "GD4NB2FLQAN5JO7PKPGZJMNBDYQXVSNVC7DEIZMOL5WSNSBLEBUTEF5Q"
account = server.accounts().account_id(public_key).call()
for balance in account['balances']:
print(f"Type: {balance['asset_type']}, Balance: {balance['balance']}")
Now that you’ve got an account, you can start sending and receiving payments.
[۱]: A private key is still used to encrypt data and sign transactions. When you create a KeyPair
object using a seed, the private key is immediately generated and stored internally.
[۲]: Other features of Kuknos, like trust lines, require higher minimum balances.