衍生钱包索拉纳
轻量级加载包 @aptos-labs/wallet-adapter-反应 使功能能够使用 Solana 钱包作为原生 Aptos 钱包
索拉纳钱包如何使用钱包适配器??
当用户使用所支持的索拉纳钱包连接到dApp时,适配器会计算用户的可衍生摘要账户(DAA)地址并转换索拉纳账户,以遵循Aptos钱包标准接口. 这确保了开发者和终端用户与钱包的无缝互动.
DAA 地址的计算使用 authenticationFunction 编辑 accountIdentity,两者在本包中定义:
authenticationFunction:这是一个存在于链上并用于验证EVM账户签名的函数. 该函数存在于0x1::solana_derivable_account::authenticateaccountIdentity:这是用于验证EVM账户签名的链上认证功能中使用的账户的身份. EVM DAA账户身份格式为:${originWalletPublicKey}${domain}
如何把索拉纳的钱包纳入我的DApp?
钱包适配器跟随 索拉纳钱包标准 以发现钱包. 目前,已测试和支持跨链账户的钱包有:
| 阿普托斯·德文内 | Aptos 测试网 | 阿普托斯主网 | |
|---|---|---|---|
| 幽灵 | ✅ | ✅ | ✅ |
| 索夫莱尔 | ✅ | ✅ | ✅ |
| 后包装 | ✅ | ✅ | ✅ |
| OKX 单曲 | ✅ | ✅ | ✅ |
使用量
说明: 编程器硬件钱包目前不支持索拉纳衍生出Aptos账户所需的脱链信件签名. 这是莱德格索拉纳应用的已知限制. 用户应当使用软件钱包(Phantom,Solflare等)而无需硬件设备连接.
备选案文1:自动钱包检测(建议用于dApps)
在用户连接其索拉纳钱包的 dApp 构建时使用此方法 .
- 安装软件包
npm install @aptos-labs/wallet-adapter-react @aptos-labs/derived-wallet-solana
- 设置自动检测
import { AptosWalletAdapterProvider, Network } from "@aptos-labs/wallet-adapter-react";
import { setupAutomaticSolanaWalletDerivation } from "@aptos-labs/derived-wallet-solana";
setupAutomaticSolanaWalletDerivation({ defaultNetwork: Network.TESTNET });
// ...
<AptosWalletAdapterProvider
dappConfig={{
network: Network.TESTNET,
}}
>
{children}
</AptosWalletAdapterProvider>
备选方案2:程序签名(用于节点/脚本)
在服务器侧签名或脚本中使用此方法, 您可以直接访问 Solana keypair .
npm install @aptos-labs/derived-wallet-solana
import { Keypair } from "@solana/web3.js";
import { SolanaDerivedAccount } from "@aptos-labs/derived-wallet-solana";
import { Aptos, AptosConfig, Network } from "@aptos-labs/ts-sdk";
// Create or load a Solana keypair
const solanaKeypair = Keypair.generate();
// Create the derived account
const account = new SolanaDerivedAccount({
solanaKeypair,
domain: "my-dapp.com",
});
// Get the derived Aptos address
console.log("Aptos address:", account.accountAddress.toString());
// Sign and submit a transaction
const aptos = new Aptos(new AptosConfig({ network: Network.TESTNET }));
const transaction = await aptos.transaction.build.simple({
sender: account.accountAddress,
data: {
function: "0x1::aptos_account::transfer",
functionArguments: [recipientAddress, 100],
},
}),
const response = await aptos.signAndSubmitTransaction({
signer: account,
transaction
});
console.log("Transaction hash:", response.hash);
提交交易(与收费人)
在大多数情况下,允许用户将索拉纳账户的交易提交到Aptos链,需要使用赞助商交易. 这是因为索拉纳账户可能没有APT支付汽油费用. 因此,DApp应考虑维持一个赞助人账户来赞助交易.
import React from "react";
import { useWallet } from "@aptos-labs/wallet-adapter-react";
import {
Aptos,
AptosConfig,
Network,
Ed25519PrivateKey,
PrivateKey,
PrivateKeyVariants,
Account,
} from "@aptos-labs/ts-sdk";
// Initialize an Aptos client
const config = new AptosConfig({ network: Network.TESTNET });
const aptos = new Aptos(config);
// Generate a sponsor account or use an existing account
const privateKey = new Ed25519PrivateKey(
PrivateKey.formatPrivateKey("0x123", PrivateKeyVariants.Ed25519),
);
const sponsor = Account.fromPrivateKey({ privateKey });
const SignAndSubmit = () => {
const { account, signTransaction } = useWallet();
const onSignAndSubmitTransaction = async () => {
if (!account) {
throw new Error(
"Account is not connected and unable to sign transaction",
);
}
try {
// Build the transaction
const rawTransaction = await aptos.transaction.build.simple({
data: {
function: "0x1::aptos_account::transfer",
functionArguments: [account.address.toString(), 1],
},
sender: account.address,
withFeePayer: true,
});
// Send it to the wallet to sign
const walletSignedTransaction = await signTransaction({
transactionOrPayload: rawTransaction,
});
// Sponsor account signs the transaction to pay for the gas fees
const sponsorAuthenticator = aptos.transaction.signAsFeePayer({
signer: sponsor,
transaction: rawTransaction,
});
// Submit the transaction to chain
const txnSubmitted = await aptosClient(network).transaction.submit.simple(
{
transaction: rawTransaction,
senderAuthenticator: walletSignedTransaction.authenticator,
feePayerAuthenticator: sponsorAuthenticator,
},
);
// if you want to wait for transaction
await aptos.waitForTransaction({ transactionHash: txnSubmitted.hash });
} catch (error) {
console.error(error);
}
};
return (
<button onClick={onSignAndSubmitTransaction}>
Sign and submit transaction
</button>
);
};
export default SignAndSubmit;
考虑因素
- 由于来源钱包最有可能没有与Aptos集成,所以在钱包中无法使用模拟.
- 软件包保留了原产地钱包,因此开发人员应该能够通过:
import { useWallet } from "@aptos-labs/wallet-adapter-react";
const { isSolanaDerivedWallet } = useWallet();
if (isSolanaDerivedWallet(wallet)) {
const publicKey = wallet.solanaWallet.publicKey;
}
资源
- X-Chain 账户调整器 Demo App
- AIP-113 衍生账户摘要
- AIP-121 x-链 DAA 使用 Sign-in-With-Solana 认证