zkLogin 通过零知识证明技术,让你在 无需保存助记词 的前提下,使用 Google、Facebook、Twitch 等 OAuth 账号发送 Sui 链交易,且不会暴露 Web2 身份与链上地址的关联。
核心亮点速览
- 极低门槛:第一次使用 Sui 只需要 30 秒完成 OAuth 登录即可发送交易,告别助记词
- 自带双因素安全:既要拥有当前 OAuth 登录态,也要拿到 用户盐 才能动用资金
- 全链路隐私:链上无法把 Sui 地址和
sub直接挂钩,零知识证明阻断了公开追踪 - 原生可组合:与多重签名、赞助交易、Keyless Wallet 等 Sui 基元无缝衔接
- 对外开放:可直接接入 官方证明服务,也可用自建 Docker 节点
👉 这里是一份无品牌依赖的极简上手示例,带你 3 分钟集成 zkLogin 登录
一分钟理解 zkLogin 工作流程
- 钱包在本地生成 临时密钥对(Ed25519)
- 用户打开 OAuth 页面登录,授权完成后网页拿到
id_token - 用
id_token+ 用户盐 → 计算 zkLogin 地址 - 将
id_token、公钥、盐、随机数发到 零知识证明服务 拿到 ZKProof - 用临时私钥签名交易 → 本地组装 zkLogin 签名 → 广播到 Sui 链上即可完成交易
如何快速集成到前端
SDK:@mysten/zklogin(npm 安装即可)
1. 安装与初始化
npm install @mysten/zklogin # 正式版
# npm install @mysten/zklogin@experimental # 尝鲜版2. 一键生成登录 URL
import { generateNonce, generateRandomness } from '@mysten/zklogin';
const maxEpoch = epoch + 2; // 2 epoch ≈ 24 小时
const ephemeral = new Ed25519Keypair();
const nonce = generateNonce(ephemeral.getPublicKey(), maxEpoch, generateRandomness());
const loginURL =
`https://accounts.google.com/o/oauth2/v2/auth?` +
new URLSearchParams({
client_id: '$CLIENT_ID',
redirect_uri: '$REDIRECT_URL',
response_type: 'id_token',
scope: 'openid',
nonce,
}).toString();3. 解码 JWT
const jwt = url.searchParams.get('id_token')!;
const decodedJwt = jwt_decode<JwtPayload>(jwt);
// 得到 iss / sub / aud 等字段4. 拉取用户盐(示例:官方盐服务)
curl -X POST https://salt.api.mystenlabs.com/get_salt \
-H 'Content-Type: application/json' \
-d '{"token":"$JWT_TOKEN"}'5. 计算 zkLogin 地址
import { jwtToAddress } from '@mysten/zklogin';
const address = jwtToAddress(jwt, salt); // 0x...三种业务模式下的安全差异
| 模式 | 用户盐存放方 | 安全性结论 |
|---|---|---|
| 客户端本地输入 | 用户口袋 | 绝对自托管,丢失 |
| 浏览器本地存储 | IndexedDB/Keychain | 体验最好,需设计换设备迁移提示 |
| 后端盐服务 | 应用服务器 | 适合体验型产品,需二次风控(邮箱验证码、2FA) |
👉 想权衡安全与体验?一文读懂自建盐服务器的 PRD 与风控策略
FAQ:开发者最关心的问题
Q1:OAuth 账号被盗,资金会瞬间蒸发吗?
A:不会。zkLogin 的双因素机制决定了攻击者 必须再拿到用户盐 才能动钱。两者都失守的联合概率极低。
Q2:每换一个浏览器就换地址?
A:不会。只要 iss+sub+aud+user_salt 没变化,同一账号始终回到同一地址。哪怕你此时在手机端登录也指向同一地址。
Q3:支持哪些 OAuth 提供商?现在就能用?
A:主网已开放 Google、Facebook、Twitch;Apple、Slack、Kakao 尚需协议升级。其余提供商(如 WeChat、Microsoft 等)正在进行兼容性审计。
Q4:生成 ZK 证明巨慢占 CPU?
A:官方提供了 服务端托管证明,直接 POST /v1 即可,100 ms 返回;也可以本地跑 Docker 镜像(16 vCPU + 16 G RAM 推荐)。
Q5:移动端体验会有坑吗?
A:不会。zkLogin 作为 Sui 原生基元,任何钱包或 dApp 都可在 iOS / Android / PWA 中直接串接 OAuth 登录流程,无需额外授权。
Q6:能不能把 zkLogin 与传统私钥地址合并在多重签名里互为备份?
A:可以,这恰恰是 Sui 多重签名的高级玩法:把 zkLogin 签名当做一个 1-of-N 的“社交登录门限”,私钥做紧急恢复即可。
自建零知识证明服务的 3 步流程
拉取镜像
docker pull mysten/zklogin:prover docker pull mysten/zklogin:prover-fe下载证明密钥 (网络与文件名对应表)
- 主网:
zkLogin-main.zkey 开发网:
zkLogin-test.zkeywget -O - https://raw.githubusercontent.com/sui-foundation/zklogin-ceremony-contributions/main/download-main-zkey.sh | bash
- 主网:
本地运行服务
docker run --rm -p 8080:8080 \ -e ZKEY=/app/zkLogin-main.zkey \ -e WITNESS_BINARIES=/app/binaries \ -v $(pwd)/zkLogin-main.zkey:/app/zkLogin-main.zkey \ mysten/zklogin:prover
术语表(SEO 关键词自然嵌入)
- OAuth 提供商 (OP):在
iss字段标识,是身份源头(如 Google) - 依赖方 (RP):即开发者钱包 / dApp,由
aud字段标记 - 主题标识符 (sub):在用户登录时由 OP 签发,永不重复
- JWK:OP 公开的 RSA 公钥,用于本地校验 JWT 签名
- 零知识证明 (Zero-Knowledge Proof):让验证者确信 OAuth 登录真实,却不暴露
sub等隐私字段 - 用户盐 (user_salt):拼接到 Poseidon 哈希里,斩断 Web2 → 链上身份映射
- 临时密钥对 (eph_sk, eph_pk):管理会话范围,超期自动失效
结语
zkLogin 把零知识、OAuth 与 Sui 链能力浓缩成一个“即插即用”的原语,让 Web3 初学者也能 像登录社交账号一样丝滑地玩转链上世界。无论你要打造极简钱包、大规模空投工具,还是给 GameFi 赋能,zkLogin 都提供了 安全、隐私、低摩擦 的完整方案。现在就开始实验,用自己的 Google / Facebook 账号在 Sui 上发送第一笔交易吧!