如何生成新的密钥对对于使用Solana库执行各种操作,许多操作都需要一个密钥对或钱包。如果你正在连接到一个钱包,那么你不必担心。然而,如果你需要一个密钥对,你会需要生成一个。import{Keypair}from"@solana/web3.js";(async()=>{
<!--StartFragment-->
对于使用Solana库执行各种操作,许多操作都需要一个密钥对或钱包。如果你正在连接到一个钱包,那么你不必担心。然而,如果你需要一个密钥对,你会需要生成一个。
<!--EndFragment-->
import { Keypair } from "@solana/web3.js";
(async () => {
let keypair = Keypair.generate();
})();
<!--StartFragment-->
如果你已经有了密钥,你可以通过这个密钥获取密钥对,以测试你的dApp。
<!--EndFragment-->
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,
])
);
<!--StartFragment-->
<!--EndFragment-->
const keypair = Keypair.fromSecretKey(
bs58.decode(
"5MaiiCavjCmn9Hs1o3eznqDEhRwxo7pXiAYez7keQUviUkauRiTMD8DrESdrNjN8zd9mTmVhRvBJeg5vhyvgrAhG"
)
);
<!--StartFragment-->
如果你有了个密钥对,你可以验证密钥对的私钥是否与给定的公钥匹配。
<!--EndFragment-->
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
<!--StartFragment-->
在某些特殊情况下(例如,派生自程序的地址(PDA)),公钥可能没有关联的私钥。你可以通过查看公钥是否位于ed25519曲线上来检查这一点。只有位于曲线上的公钥才可以由具有钱包的用户控制。
<!--EndFragment-->
const key = new PublicKey("5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY");
console.log(PublicKey.isOnCurve(key.toBytes()));
<!--StartFragment-->
如果你正在创建一个钱包,你需要生成一个助记词,以便用户可以将其保存为备份。
<!--EndFragment-->
const mnemonic = bip39.generateMnemonic();
<!--StartFragment-->
许多钱包扩展使用助记词来表示其密钥。你可以将助记词转换为密钥对以进行本地测试。
<!--EndFragment-->
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));
<!--StartFragment-->
你可以从一个单一种子生成多个钱包,也被称为“分层确定性钱包”或HD钱包。
<!--EndFragment-->
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()}`);
}
<!--StartFragment-->
自定义公钥或地址(Vanity Address)是以特定字符开头的密钥。例如,一个人可能希望公钥以 "elv1s" 或 "cook" 开头,这样可以帮助他人记住密钥所属的人,使密钥更容易识别。
注意: 自定义地址中字符的数量越多,生成时间将会更长。
::: 警告 在此任务中,您应该使用命令行界面(CLI)。Python和TypeScript的示例仅用于说明,速度比CLI慢得多。
<!--EndFragment-->
let keypair = Keypair.generate();
while (!keypair.publicKey.toBase58().startsWith("elv1s")) {
keypair = Keypair.generate();
}
<!--StartFragment-->
密钥对的主要功能是对消息进行签名并验证签名的有效性。通过验证签名,接收方可以确保数据是由特定私钥的所有者签名的。
为此,我们将导入[TweetNaClopen in new window]密码库,并按照以下步骤进行操作:
<!--EndFragment-->
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);
<!--StartFragment-->
Solana的[钱包适配器open in new window]库使客户端管理钱包连接变得简单。
运行以下命令来安装所需的依赖项:
<!--EndFragment-->
yarn add @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-base @solana/wallet-adapter-wallets
<!--StartFragment-->
React的钱包适配器库允许我们通过钩子和上下文提供程序来持久化和访问钱包连接状态,主要包括useWallet、WalletProvider
、useConnection和ConnectionProvider
。WalletProvider
和ConnectionProvider
必须包装React应用程。
此外,我们可以使用useWalletModal
来提示用户进行连接,通过切换连接模态框的可见性,并将应用程序包装在@solana/wallet-adapter-react-ui
中的WalletModalProvider
中。连接模态框将处理连接流程,因此我们只需监听钱包连接的状态。当useWallet
的响应具有非空的wallet
属性时,我们知道钱包已连接。反之,如果该属性为空,我们知道钱包已断开连接。
<!--EndFragment-->
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>
);
<!--StartFragment-->
运行以下命令来安装所需的依赖项:
<!--EndFragment-->
npm install solana-wallets-vue @solana/wallet-adapter-wallets
<!--StartFragment-->
[Solana的Vue钱包open in new window]插件允许我们初始化钱包存储,并创建一个名为$wallet
的全局属性,可以在任何组件中访问。你可以在[此处open in new window]查看可以从useWallet()
获取的所有属性和方法。我们还导入并渲染WalletMultiButton组件,以允许用户选择钱包并连接到它。
<!--EndFragment-->
<script setup>
import { WalletMultiButton } from "solana-wallets-vue";
</script>
<template>
<wallet-multi-button></wallet-multi-button>
</template>
<!--StartFragment-->
运行以下命令来安装所需的依赖项:
<!--EndFragment--> <!--StartFragment-->
[Svelte Wallet Adapteropen in new window]包允许我们在使用Svelte模板或SvelteKit创建的项目中,在所有JS、TS或/和Svelte文件之间添加一个可访问的Svelte Store($walletStore
)。使用 [此处open in new window] 的存储库引用,您可以在SSR或SPA中使用适配器。UI包含一个<WalletMultiButton />
组件,允许用户选择一个钱包并连接到它。
<!--EndFragment-->
<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}
相关工具: 1.Solana市值管理机器人 2.Solana批量归集 3.[Solana靓号钱包生成]https://docs.gtokentool.com/solana/solana-liang-hao-qian-bao-sheng-cheng-jiao-cheng) 4.Solana批量生成钱包地址
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!