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)
要验证 Solana 公钥可能是钱包地址,您应该像您正在做的那样使用isOnCurve()和PublicKey构造函数。
抛出的错误是有道理的。如果地址不是公钥,则不应将其实例化。
也许 @solana/web3.js 可能有另一个原生函数来负责将来为您验证钱包地址。
| 归档时间: |
|
| 查看次数: |
10206 次 |
| 最近记录: |