如何使用 web3js 验证 Solana 钱包地址?

Car*_*ega 8 typescript web3js solana

我正在尝试验证从用户那里获得的输入文本是否是有效的 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')
  }
}
Run Code Online (Sandbox Code Playgroud)

但是当我传递 let pubkey = new PublicKey(address)一个与 solana 地址不相似的字符串时,它会抛出异常Error: Invalid public key input (PublikKey 需要一个 PublicKeyInitData: number | string | Buffer | Uint8Array | number[] | PublicKeyData

这就是为什么我必须将其放入 try-catch 块中。

还有其他(更好)的方法来实现这一目标吗?看起来很丑...

小智 6

PublicKey.isOnCurve()仅当地址位于ed25519 curve生成的地址上时才返回 true Keypair,对于偏离曲线的地址(例如派生地址)返回 false,PublicKey.findProgramAddress()尽管它们可以是有效的公钥。

const owner = new PublicKey("DS2tt4BX7YwCw7yrDNwbAdnYrxjeCPeGJbHmZEYC8RTb");
console.log(PublicKey.isOnCurve(owner.toBytes())); // true
console.log(PublicKey.isOnCurve(owner.toString())); // true

const ownerPda = PublicKey.findProgramAddressSync(
    [owner.toBuffer()],
    new PublicKey("worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth"),
)[0];
console.log(PublicKey.isOnCurve(ownerPda.toString())); // false

console.log(PublicKey.isOnCurve([owner, 18])); // false

const RAY_MINT = new PublicKey("4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R");
console.log(PublicKey.isOnCurve(new PublicKey(RAY_MINT))); // true

console.log(PublicKey.isOnCurve("fasddfasevase")); // throws error
Run Code Online (Sandbox Code Playgroud)


Jac*_*ech 4

要验证 Solana 公钥可能是钱包地址,您应该像您正在做的那样使用isOnCurve()PublicKey构造函数。

抛出的错误是有道理的。如果地址不是公钥,则不应将其实例化。

也许 @solana/web3.js 可能有另一个原生函数来负责将来为您验证钱包地址。