You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本选择器中显示的所有地址均不匹配,现咨询两个问题:

  1. 导致地址不一致的原因是什么?
  2. 如何确保通过代码生成的助记词和地址与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:22:03