BIP-32 derivation
BIP-32 child key derivation lets you derive multiple public keys (and therefore multiple blockchain addresses) from a single MPC keyshare without running keygen again. The example uses deriveChildPublicKey with path "m" (the root) for its primary address — but you can use any valid BIP-32 path like "m/44'/60'/0'/0/0" for standard HD wallet paths.
For the SDK contract see BIP-32 (Kotlin) and BIP-32 (Swift).
How the example derives addresses
- Android
- iOS / macOS
private suspend fun extractPublicKey(keyType: KeyType, keyshare: ByteArray): ByteArray =
when (keyType) {
KeyType.ECDSA -> SilentShard.ECDSA.deriveChildPublicKey(keyshare, "m").getOrThrow()
KeyType.EdDSA -> SilentShard.EdDSA.getKeysharePublicKey(keyshare).getOrThrow()
}
private func extractPublicKeyFromKeyshare(_ keyType: KeyType, keyshare: Data)
async throws -> Data {
switch keyType {
case .ecdsa:
return try await SilentShard.ECDSA
.deriveChildPublicKey(keyshare, derivationPath: "m").get()
case .eddsa:
return try await SilentShard.EdDSA.getKeysharePublicKey(keyshare).get()
}
}
ECDSA keys support BIP-32 derivation (deriveChildPublicKey). EdDSA keys use getKeysharePublicKey directly — the Ed25519 curve doesn't support the standard BIP-32 derivation scheme.
The returned public key bytes are then passed to AddressUtils.deriveAddress in the app layer, which handles the chain-specific encoding (Ethereum keccak-256 + checksum, Solana base58).