如何使用 web3js 验证 Solana 钱包地址?
How can I validate a Solana wallet address with web3js?
我正在尝试验证我从用户那里获得的输入文本是否是有效的 Solana 地址。
根据 web3.js 文档,.isOnCurve() 方法的作用是:
https://solana-labs.github.io/solana-web3.js/classes/PublicKey.html#isOnCurve
我已经设法让它与这段代码一起工作:
import {PublicKey} from '@solana/web3.js'
function validateSolAddress(address:string){
try {
let pubkey = new PublicKey(address)
let isSolana = PublicKey.isOnCurve(pubkey.toBuffer())
return isSolana
} catch (error) {
return false
}
}
function modalSubmit(modal: any){
const firstResponse = modal.getTextInputValue(walletQuestFields.modal.componentsList[0].id)
let isSolAddress = validateSolAddress(firstResponse)
if (isSolAddress) {
console.log('The address is valid')
}else{
console.log('The address is NOT valid')
}
}
但是当我传递 let pubkey = new PublicKey(address)
一个与 solana 地址不相似的字符串时,它会抛出异常 Error: Invalid public key input
(PublikKey 期望 PublicKeyInitData: number | string | Buffer | Uint8Array | number[] | PublicKeyData
)
这就是为什么我必须将它放入 try-catch 块中的原因。
有没有其他(更好)的方法来实现这个目标?长得丑...
要验证 Solana public 密钥可能是钱包地址,您应该像现在一样使用 isOnCurve()
和 PublicKey
构造函数。
抛出的错误是有道理的。如果地址不是 public 键,它应该不能被实例化。
也许@solana/web3.js 可能会有另一个原生功能,它会在将来为您验证钱包地址。
我正在尝试做同样的事情(验证 solana 钱包地址)并为我工作。
isOnCurve return 如果 public 密钥具有有效格式,则为真,但我认为这不足以验证钱包地址,因为我测试了一些 public 密钥devnet 和 mainnet-beta 以及永远 return true(不关心环境)除非我使用了无效的密钥。
这是一个来自devnet的public密钥,你可以用这个来测试:
8B9wLUXGFQQJ6VpzhDMpmHxByAvQBXhwSsZUwjLz971x
我的代码如下:
var connection = new web3.Connection(
web3.clusterApiUrl('devote'),
'confirmed',
);
const publicKey = new web3.PublicKey("8B9wLUXGFQQJ6VpzhDMpmHxByAvQBXhwSsZUwjLz971x");
console.log(await web3.PublicKey.isOnCurve(publicKey))
应该打印 true
isOnCurve
期望 publicKey 参数采用 Uint8Array
格式。所以你必须做 publicKey.toBytes()
来获取 publicKey 的字节数组表示。
const validateSolanaAddress = async (addr: string) => {
let publicKey: PublicKey;
try {
publicKey = new PublicKey(addr);
return await PublicKey.isOnCurve(publicKey.toBytes());
} catch (err) {
return false;
}
};
您不必仅使用连接来验证钱包地址。一个最小的工作示例应该是这样的:
import { PublicKey } from '@solana/web3.js'
const address = new PublicKey("8B9wLUXGFQQJ6VpzhDMpmHxByAvQBXhwSsZUwjLz971x");
console.log(PublicKey.isOnCurve(address));
我正在尝试验证我从用户那里获得的输入文本是否是有效的 Solana 地址。
根据 web3.js 文档,.isOnCurve() 方法的作用是:
https://solana-labs.github.io/solana-web3.js/classes/PublicKey.html#isOnCurve
我已经设法让它与这段代码一起工作:
import {PublicKey} from '@solana/web3.js'
function validateSolAddress(address:string){
try {
let pubkey = new PublicKey(address)
let isSolana = PublicKey.isOnCurve(pubkey.toBuffer())
return isSolana
} catch (error) {
return false
}
}
function modalSubmit(modal: any){
const firstResponse = modal.getTextInputValue(walletQuestFields.modal.componentsList[0].id)
let isSolAddress = validateSolAddress(firstResponse)
if (isSolAddress) {
console.log('The address is valid')
}else{
console.log('The address is NOT valid')
}
}
但是当我传递 let pubkey = new PublicKey(address)
一个与 solana 地址不相似的字符串时,它会抛出异常 Error: Invalid public key input
(PublikKey 期望 PublicKeyInitData: number | string | Buffer | Uint8Array | number[] | PublicKeyData
)
这就是为什么我必须将它放入 try-catch 块中的原因。
有没有其他(更好)的方法来实现这个目标?长得丑...
要验证 Solana public 密钥可能是钱包地址,您应该像现在一样使用 isOnCurve()
和 PublicKey
构造函数。
抛出的错误是有道理的。如果地址不是 public 键,它应该不能被实例化。
也许@solana/web3.js 可能会有另一个原生功能,它会在将来为您验证钱包地址。
我正在尝试做同样的事情(验证 solana 钱包地址)并为我工作。
isOnCurve return 如果 public 密钥具有有效格式,则为真,但我认为这不足以验证钱包地址,因为我测试了一些 public 密钥devnet 和 mainnet-beta 以及永远 return true(不关心环境)除非我使用了无效的密钥。
这是一个来自devnet的public密钥,你可以用这个来测试:
8B9wLUXGFQQJ6VpzhDMpmHxByAvQBXhwSsZUwjLz971x
我的代码如下:
var connection = new web3.Connection(
web3.clusterApiUrl('devote'),
'confirmed',
);
const publicKey = new web3.PublicKey("8B9wLUXGFQQJ6VpzhDMpmHxByAvQBXhwSsZUwjLz971x");
console.log(await web3.PublicKey.isOnCurve(publicKey))
应该打印 true
isOnCurve
期望 publicKey 参数采用 Uint8Array
格式。所以你必须做 publicKey.toBytes()
来获取 publicKey 的字节数组表示。
const validateSolanaAddress = async (addr: string) => {
let publicKey: PublicKey;
try {
publicKey = new PublicKey(addr);
return await PublicKey.isOnCurve(publicKey.toBytes());
} catch (err) {
return false;
}
};
您不必仅使用连接来验证钱包地址。一个最小的工作示例应该是这样的:
import { PublicKey } from '@solana/web3.js'
const address = new PublicKey("8B9wLUXGFQQJ6VpzhDMpmHxByAvQBXhwSsZUwjLz971x");
console.log(PublicKey.isOnCurve(address));