Keypairs & Wallets

Bagaimana cara membuat sebuah Keypair baru

Banyak action-action yang dapat anda ambil dari beragam Solana libaries memerlukan sebuah Keypair atau Wallet. Jika anda terhubung dengan sebuah wallet, anda tidak perlu khawatir. Namun, jika anda memerlukan sebuah keypair, and perlu meng-generatenya.

Press </> button to view full source
let keypair = Keypair.generate();
keypair = Keypair()
let wallet = Keypair::new();
solana-keygen new

Bagaimana cara me-restore sebuah Keypair dari sebuah secret

Jika anda sudah mempunyai sebuah secret, anda dapat mendapatkan Keypair dari sebuah secret untuk mentest dApp anda.

  1. Dari Bytes
Press </> button to view full source
const keypair = Keypair.fromSecretKey(
  Uint8Array.from([
    174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56,
    222, 53, 138, 189, 224, 216, 117, 173, 10, 149, 53, 45, 73, 251, 237, 246,
    15, 185, 186, 82, 177, 240, 148, 69, 241, 227, 167, 80, 141, 89, 240, 121,
    121, 35, 172, 247, 68, 251, 226, 218, 48, 63, 176, 109, 168, 89, 238, 135,
  ])
);
secret_key= [
        174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56, 222, 53, 138,
        189, 224, 216, 117, 173, 10, 149, 53, 45, 73, 251, 237, 246, 15, 185, 186, 82, 177, 240,
        148, 69, 241, 227, 167, 80, 141, 89, 240, 121, 121, 35, 172, 247, 68, 251, 226, 218, 48,
        63, 176, 109, 168, 89, 238, 135,
    ]
    
keypair = Keypair.from_secret_key(bytes(secret_key))
let secret_key: [u8; 64] = [
    174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56, 222, 53, 138,
    189, 224, 216, 117, 173, 10, 149, 53, 45, 73, 251, 237, 246, 15, 185, 186, 82, 177, 240,
    148, 69, 241, 227, 167, 80, 141, 89, 240, 121, 121, 35, 172, 247, 68, 251, 226, 218, 48,
    63, 176, 109, 168, 89, 238, 135,
];

let wallet = Keypair::from_bytes(&secret_key)?;
# input your secret into the Keypath listed under solana config get
  1. Dari Base58 String
Press </> button to view full source
const keypair = Keypair.fromSecretKey(
  bs58.decode(
    "5MaiiCavjCmn9Hs1o3eznqDEhRwxo7pXiAYez7keQUviUkauRiTMD8DrESdrNjN8zd9mTmVhRvBJeg5vhyvgrAhG"
  )
);
b58_string = "5MaiiCavjCmn9Hs1o3eznqDEhRwxo7pXiAYez7keQUviUkauRiTMD8DrESdrNjN8zd9mTmVhRvBJeg5vhyvgrAhG"
keypair = Keypair.from_secret_key(base58.b58decode(b58_string))
let wallet = Keypair::from_base58_string(
    "5MaiiCavjCmn9Hs1o3eznqDEhRwxo7pXiAYez7keQUviUkauRiTMD8DrESdrNjN8zd9mTmVhRvBJeg5vhyvgrAhG",
);

Bagaimana cara menverifikasi sebuah Keypair

Jika anda diberikan sebuah keypair, anda dapat menverifikasi apakah secret sesuai dengan public key yang diberikan.

Press </> button to view full source
const publicKey = new PublicKey("24PNhTaNtomHhoy3fTRaMhAFCRj4uHqhZEEoWrKDbR5p");
const keypair = Keypair.fromSecretKey(
  Uint8Array.from([
    174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56,
    222, 53, 138, 189, 224, 216, 117, 173, 10, 149, 53, 45, 73, 251, 237, 246,
    15, 185, 186, 82, 177, 240, 148, 69, 241, 227, 167, 80, 141, 89, 240, 121,
    121, 35, 172, 247, 68, 251, 226, 218, 48, 63, 176, 109, 168, 89, 238, 135,
  ])
);
console.log(keypair.publicKey.toBase58() === publicKey.toBase58());
// true
public_key = PublicKey("24PNhTaNtomHhoy3fTRaMhAFCRj4uHqhZEEoWrKDbR5p")

keys = [
        174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56, 222, 53, 138,
        189, 224, 216, 117, 173, 10, 149, 53, 45, 73, 251, 237, 246, 15, 185, 186, 82, 177, 240,
        148, 69, 241, 227, 167, 80, 141, 89, 240, 121, 121, 35, 172, 247, 68, 251, 226, 218, 48,
        63, 176, 109, 168, 89, 238, 135,
    ]
keypair = Keypair.from_secret_key(bytes(keys))

print(keypair.public_key.to_base58() == public_key.to_base58())
# True
solana-keygen verify <PUBKEY> prompt://

Bagaimana cara untuk check jika sebuah public key telah terhubung dengan sebuah private key

Dalam beberapa kasus khusus (contohnya sebuah Program Derived Address), public key mungkin tidak mempunyai sebuah private key yang terhubung. Anda dapat check hal ini dengan melihat apakah public key terdapat dalam kurva ed25519. Hanya public key yang terdapat dalam kurva yang bisa dikontrol oleh user dengan menggunakan wallet.

Press </> button to view full source
const key = new PublicKey("5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY");
console.log(PublicKey.isOnCurve(key.toBytes()));
key = PublicKey('5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY')
print(is_on_curve(key))
let pubkey = Pubkey::from_str("5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY").unwrap();
println!("{:?}", pubkey.is_on_curve())

Bagaimana cara membuat mnemonic phrase

Jika anda akan membuat sebuah wallet, anda perlu untuk membuat sebuah mnemonic phrase sehingga user dapat menyimpannya sebagai sebuah backup.

Press </> button to view full source
const mnemonic = bip39.generateMnemonic();
mnemo = Mnemonic("english")
words = mnemo.generate(strength=256)
solana-keygen new

Bagaimana cara restore sebuah Keypair dari sebuah mnemonic phrase

Banyak ektension-extension wallet menggunakan mnemonics untuk memrepresentasikan secret key-secret key mereka. Anda dapat menkonversikan mnemonic ke Keypairs untuk local testing.

  1. BIP39 - membuat sebuah single wallet
Press </> button to view full source
const mnemonic =
  "pill tomorrow foster begin walnut borrow virtual kick shift mutual shoe scatter";
const seed = bip39.mnemonicToSeedSync(mnemonic, ""); // (mnemonic, password)
const keypair = Keypair.fromSeed(seed.slice(0, 32));
mnemo = Mnemonic("english")
seed = mnemo.to_seed("pill tomorrow foster begin walnut borrow virtual kick shift mutual shoe scatter")
keypair = Keypair.from_secret_key(seed)
solana-keygen recover
  1. BIP44 (multiple wallets, also known HD wallets)

You can make multiple wallets from a single seed - also known as 'Hierarchical Deterministic wallets' or HD wallets:

Press </> button to view full source
const mnemonic =
  "neither lonely flavor argue grass remind eye tag avocado spot unusual intact";
const seed = bip39.mnemonicToSeedSync(mnemonic, ""); // (mnemonic, password)
for (let i = 0; i < 10; i++) {
  const path = `m/44'/501'/${i}'/0'`;
  const keypair = Keypair.fromSeed(derivePath(path, seed.toString("hex")).key);
  console.log(`${path} => ${keypair.publicKey.toBase58()}`);
}
solana-keygen recover 'prompt:?key=0/0'

Bagaimana cara membuat sebuah vanity address

Vanity publickeys, atau custom address adalah keys yang dimulai dengan character spesifik. Sebagai contoh, jika seseorang ingin publickey dimulai dengan "elv1s", atau mungkin juga "cook". Ini dapat membantu orang lain untuk mengingat siapa yang mempunyai key itu, membuat key lebih mudah untuk diidentifikasi.

Catatan: Semakin banyak character di dalam vanity address anda, semakin lama prosesnya.

::: peringatan Anda harus menggunakan CLI untuk task ini. Python dan TypeScript hanyalah contoh untuk ilustrasi saja dan lebih lambat dibandingkan dengan CLI.

:::

Press </> button to view full source
let keypair = Keypair.generate();
while (!keypair.publicKey.toBase58().startsWith("elv1s")) {
  keypair = Keypair.generate();
}
keypair = Keypair()
while(str(keypair.public_key)[:5]!="elv1s") :
    keypair = Keypair()
solana-keygen grind --starts-with e1v1s:1

Bagaimana cara untuk sign dan menverifikasi messages dalam wallet

Fungsi utama dari sebuah keypair adalah untuk sign messages dan mengaktifkan verifikasi dari signature. Verifikasi signature menyakinkan recipient bahwa data telah disign oleh pemilik dengan spesifik private key.

Untuk melakukan itu, kita perlu import TweetNaClopen in new window crypto library.

Press </> button to view full source
const message = "The quick brown fox jumps over the lazy dog";
const messageBytes = decodeUTF8(message);

const signature = nacl.sign.detached(messageBytes, keypair.secretKey);
const result = nacl.sign.detached.verify(
  messageBytes,
  signature,
  keypair.publicKey.toBytes()
);

console.log(result);
message = "The quick brown fox jumps over the lazy dog"
message_bytes = bytes(message,'utf8')
signed_message = keypair.sign(message_bytes)

verify_sign = VerifyKey(
    pubkey_bytes
).verify(
    smessage=message_bytes,  
    signature=signed_message.signature
)

Bagaimana cara mengkoneksi ke sebuah wallet

Solana wallet-adapteropen in new window libraries mempermudah untuk mengatur koneksi wallet di client-side.

React

Run command berikut untuk menginstall dependencies yang diperlukan:

yarn add @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-base @solana/wallet-adapter-wallets

React wallet-adapter libraries mengijinkan kita untuk mempertahankan dan mengakses states koneksi wallet melalui hooks dan Context providers bernama, useWallet, WalletProvider, useConnection, dan ConnectionProvider. React App harus di-wrap dengan WalletProvider dan ConnectionProvider.

Sebagai tambahan, kita dapat memperingatkan user untuk terhubung dengan menggunakan useWalletModal untuk mengganti visibility dari connection modal dan men-wrap App dengan WalletModalProvider dari @solana/wallet-adapter-react-ui. Connection modal akan menghandle arus koneksi untuk kita, jadi kita cukup untuk listen kapan sebuah wallet terkoneksi. Kita dapat mengetahui sebuah wallet terkoneksi ketika useWallet response menjadi non-null di property wallet. Sebaliknya, jika property tersebut null, kita tahu bahwa wallet itu tidak terkoneksi.

Press </> button to view full source
const { wallet } = useWallet();
const { setVisible } = useWalletModal();

const onRequestConnectWallet = () => {
  setVisible(true);
};

// Prompt the user to connect their wallet
if (!wallet) {
  return <button onClick={onRequestConnectWallet}>Connect Wallet</button>;
}

// Displays the connected wallet address
return (
  <main>
    <p>Wallet successfully connected!</p>
    <p>{wallet.publicKey.toBase58()}</p>
  </main>
);

Vue

Run command dibawah ini untuk menginstall dependencies yang diperlukan:

npm install solana-wallets-vue @solana/wallet-adapter-wallets

Solana Wallets Vueopen in new window plugin mengijinkan kita untuk menginisiasi sebuah wallet store dan membuat sebuah global property $wallet baru yang dapat diakses di dalam beragam compenent. Semua property dan method yang didapat dari useWallet() dapat dilihat di siniopen in new window. Kita juga mengimport dan menrender WalletMultiButton component agar user dapat memilih wallet yang terkoneksi dengannya.

Press </> button to view full source
<script setup>
import { WalletMultiButton } from "solana-wallets-vue";
</script>

<template>
  <wallet-multi-button></wallet-multi-button>
</template>

Svelte

Run command berikut ini untuk menginstall dependencies yang dibutuhkan:

npm install @svelte-on-solana/wallet-adapter-core @svelte-on-solana/wallet-adapter-ui @solana/wallet-adapter-base @solana/wallet-adapter-wallets @solana/web3.js

Svelte Wallet Adapteropen in new window package dapat menambahkan sebuah Svelte Store($walletStore) yang dapat diakses oleh semua JS, TS dan/atau Svelte files di dalam sebuah project yang telah dikerjakan dengan Svelte Template atau SvelteKit. Menggunakan repo reference iniopen in new window anda dapat mengunakan adapter untuk SSR atau SPA. UI package mempunyai sebuah <WalletMultiButton /> component untuk membantu user untuk memilih wallet yang terkoneksi dengannya.

Press </> button to view full source
<script>
  import { walletStore } from "@svelte-on-solana/wallet-adapter-core";
  import { WalletMultiButton } from "@svelte-on-solana/wallet-adapter-ui";
</script>

{#if $walletStore?.connected} Wallet with public key {$walletStore.publicKey}
successfully connected! {:else}
<WalletMultiButton />
{/if}
Last Updated: 9/20/2022, 1:22:28 AM