能否从地址或签名反向解析公钥?Aptos是否有类似Solana的方案?
从地址/签名反向解析公钥:Solana vs Aptos方案对比
核心问题解答
1. Solana的实现逻辑
Solana的账户地址本质就是公钥的Base58编码形式,因此可直接通过SDK将地址解码为对应公钥实例,示例代码如下:
const Web3 = require('@solana/web3.js') const pk = new Web3.PublicKey('HBL3WxvMBivZwwMFvMXXcX3haa13FJdscB8CTsZsuzXX') console.log('pk=====', pk.toString())
这段代码的作用是把Base58格式的地址解码为PublicKey对象,该对象直接对应公钥本身,toString()会返回原始的Base58地址(即公钥的编码形式)。
2. Aptos的对应方案
Aptos的逻辑与Solana存在差异,分两种场景处理:
场景一:从地址获取公钥
Aptos的账户地址并非公钥的直接编码,而是认证密钥(Auth Key)的前16字节(认证密钥由公钥哈希生成,属于单向过程),因此无法直接从地址反向推导公钥。但可通过Aptos SDK或节点API查询链上账户数据,获取该地址对应的当前公钥:
使用Aptos TypeScript SDK的示例代码:
import { Aptos, AptosConfig, Network } from "@aptos-labs/ts-sdk"; // 初始化SDK const config = new AptosConfig({ network: Network.TESTNET }); const aptos = new Aptos(config); // 替换为目标地址 const accountAddress = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; // 查询账户信息并获取公钥 async function getPublicKeyFromAddress() { const account = await aptos.getAccountInfo({ accountAddress }); // account.public_key字段为当前公钥(Hex格式) console.log("公钥:", account.public_key); } getPublicKeyFromAddress();
场景二:从签名获取公钥
Aptos的交易签名可用于查询完整交易详情,交易中包含发送者地址,再通过上述地址查公钥的方式获取;另外,也可利用Ed25519签名特性,结合签名与对应交易原始数据直接恢复公钥:
使用SDK从交易签名获取公钥的示例:
import { Aptos, AptosConfig, Network } from "@aptos-labs/ts-sdk"; const config = new AptosConfig({ network: Network.TESTNET }); const aptos = new Aptos(config); // 替换为目标交易签名 const transactionSignature = "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; async function getPublicKeyFromSignature() { const transaction = await aptos.getTransactionByHash({ transactionHash: transactionSignature }); // 获取发送者地址 const senderAddress = transaction.sender; // 通过地址查询公钥 const account = await aptos.getAccountInfo({ accountAddress: senderAddress }); console.log("发送者公钥:", account.public_key); } getPublicKeyFromSignature();
内容的提问来源于stack exchange,提问作者liucan
相关产品推荐
相关产品推荐

