TonConnectUI生成的V4钱包地址与Tonkeeper不匹配问题咨询
Ton钱包V4地址生成不一致问题排查与兼容方案
问题背景
我依据TonConnect的API文档,通过以下代码创建V4版本的Ton钱包地址:
import crypto from "@ton/crypto"; import {toUserFriendlyAddress} from "@tonconnect/ui"; import ton from "@ton/ton"; export async function makeV4Address(mnemonics) { const workchain = 0; // Usually you need a workchain 0 const keyPair = await crypto.mnemonicToPrivateKey(mnemonics); const wallet = ton.WalletContractV4.create({ workchain, publicKey: keyPair.publicKey }); console.log(wallet); const rawFormat = `${workchain}:${wallet.publicKey.toString("hex")}`; return toUserFriendlyAddress(rawFormat); } //const mnemonics = await crypto.mnemonicNew(); // Hardcoded word list for testing - do not use this address const mnemonics = ` circle sword pet letter door woman sure cage milk uniform eyebrow quit response kitchen learn dumb march peanut climb deposit claw system plastic ship`.trim().split(/\r?\n/) console.log("Mnemonics are:", mnemonics.join(" ")); const address = await makeV4Address(mnemonics); console.log("Created address", address);
生成的地址为:UQClm0SeSxKQ5WSAw3xjT8skrzAsQrWoFET50KvGfoZ-tY-h
但该地址与Tonkeeper版本选择器中显示的所有地址均不匹配,现咨询两个问题:
- 导致地址不一致的原因是什么?
- 如何确保通过代码生成的助记词和地址与Ton钱包兼容?
问题解答
1. 地址不一致的原因
代码核心错误在于直接用钱包公钥拼接生成地址,而非使用钱包合约的实际部署地址。
Ton的V4钱包地址是由钱包合约的初始化参数(工作链ID、公钥)经过合约逻辑计算得出的部署地址,并非简单的工作链ID:公钥格式。你代码中构造rawFormat的逻辑完全错误,公钥只是生成钱包合约的参数之一,最终地址需要通过合约实例的address属性获取,而非直接用公钥构造。
2. 确保与Ton钱包兼容的修正方案
修改代码,正确获取钱包合约的部署地址后再转换为用户友好格式:
import crypto from "@ton/crypto"; import {toUserFriendlyAddress} from "@tonconnect/ui"; import ton from "@ton/ton"; export async function makeV4Address(mnemonics) { const workchain = 0; const keyPair = await crypto.mnemonicToPrivateKey(mnemonics); // 创建V4钱包合约实例 const wallet = ton.WalletContractV4.create({ workchain, publicKey: keyPair.publicKey }); // 获取合约的实际部署地址(这是正确的钱包地址) const contractAddress = wallet.address; // 转换为用户友好格式 return toUserFriendlyAddress(contractAddress.toString()); } // 测试代码 const mnemonics = ` circle sword pet letter door woman sure cage milk uniform eyebrow quit response kitchen learn dumb march peanut climb deposit claw system plastic ship`.trim().split(/\r?\n/) console.log("Mnemonics are:", mnemonics.join(" ")); const address = await makeV4Address(mnemonics); console.log("Created address", address);
修正后生成的地址会和Tonkeeper等官方钱包基于同一助记词生成的V4地址完全一致,需注意以下要点:
- 必须通过
WalletContractV4.create()返回实例的address属性获取正确地址 - 转换用户友好地址时,可直接传入
Address类型实例或其字符串形式(toUserFriendlyAddress均支持) - 确保使用
@ton/ton、@ton/crypto的最新稳定版,避免版本差异导致的计算偏差
内容的提问来源于stack exchange,提问作者Mikko Ohtamaa
相关产品推荐
相关产品推荐

