跳转到内容

Creating and Managing Accounts

此内容尚不支持你的语言。

Kaptos supports three account patterns you should know when building production apps:

  • Legacy Ed25519 account (Ed25519Account / Account.generate() default)
  • SingleKey account (SingleKeyAccount) using unified auth keys
  • MultiKey account (MultiKeyAccount) for threshold-style signing

The default Account.generate() path creates a legacy Ed25519 account.

val legacy = Account.generate()
val explicitLegacy = Account.generate(
scheme = SigningSchemeInput.Ed25519,
legacy = true,
)

You can also derive a legacy account from an existing Ed25519 private key:

val legacyFromPrivateKey =
Account.fromPrivateKey(
privateKey = Ed25519PrivateKey("0x...")
)

Use SingleKeyAccount when you want unified authentication and key agility.

val ed25519Single = SingleKeyAccount.generate(scheme = SigningSchemeInput.Ed25519)
val secp256k1Single = SingleKeyAccount.generate(scheme = SigningSchemeInput.Secp256k1)

You can also request a single-key account via Account.generate(...):

val singleViaAccount = Account.generate(
scheme = SigningSchemeInput.Ed25519,
legacy = false,
)

To derive from existing private keys:

val ed25519SingleFromPrivateKey =
SingleKeyAccount(
privateKey = Ed25519PrivateKey("0x...")
)
val secp256k1SingleFromPrivateKey =
SingleKeyAccount(
privateKey = Secp256k1PrivateKey(HexInput.fromString("0x..."))
)

MultiKeyAccount lets you define a threshold signing identity from multiple public keys.

val signerA = SingleKeyAccount.generate(scheme = SigningSchemeInput.Ed25519)
val signerB = SingleKeyAccount.generate(scheme = SigningSchemeInput.Secp256k1)
val signerC = SingleKeyAccount.generate(scheme = SigningSchemeInput.Ed25519)
val multiKeyAccount =
MultiKeyAccount.fromPublicKeysAndSigners(
publicKeys = listOf(signerA.publicKey, signerB.publicKey, signerC.publicKey),
signaturesRequired = 2,
signers = listOf(signerA, signerC),
)

In the current API, signers.size must match signaturesRequired.

Because MultiKeyAccount extends Account, it can sign transactions like other account types:

val txn =
aptos.buildSimpleTransaction(sender = multiKeyAccount.accountAddress) {
function = "0x1::coin::transfer"
typeArgs("0x1::aptos_coin::AptosCoin")
args(Account.generate().accountAddress, 1_000_000UL)
}
val pending = aptos.signAndSubmitTransaction(signer = multiKeyAccount, transaction = txn).expect("Failed to submit transaction")

Generating an account only creates local credentials. The address is not usable on-chain until funded/created.

aptos
.fundAccount(accountAddress = legacy.accountAddress, amount = 100_000_000L)
.expect("Failed to fund account")

On testnet, you can also mint using the faucet page.