如何使用 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));