zkLogin:用 Web2 习惯玩转 Sui 链的零知识登录指南

·

zkLogin 通过零知识证明技术,让你在 无需保存助记词 的前提下,使用 Google、Facebook、Twitch 等 OAuth 账号发送 Sui 链交易,且不会暴露 Web2 身份与链上地址的关联。

核心亮点速览

👉 这里是一份无品牌依赖的极简上手示例,带你 3 分钟集成 zkLogin 登录


一分钟理解 zkLogin 工作流程

  1. 钱包在本地生成 临时密钥对(Ed25519)
  2. 用户打开 OAuth 页面登录,授权完成后网页拿到 id_token
  3. id_token + 用户盐 → 计算 zkLogin 地址
  4. id_token、公钥、盐、随机数发到 零知识证明服务 拿到 ZKProof
  5. 用临时私钥签名交易 → 本地组装 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 步流程

  1. 拉取镜像

    docker pull mysten/zklogin:prover
    docker pull mysten/zklogin:prover-fe
  2. 下载证明密钥 (网络与文件名对应表)

    • 主网:zkLogin-main.zkey
    • 开发网:zkLogin-test.zkey

      wget -O - https://raw.githubusercontent.com/sui-foundation/zklogin-ceremony-contributions/main/download-main-zkey.sh | bash
  3. 本地运行服务

    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 关键词自然嵌入)


结语

zkLogin 把零知识、OAuth 与 Sui 链能力浓缩成一个“即插即用”的原语,让 Web3 初学者也能 像登录社交账号一样丝滑地玩转链上世界。无论你要打造极简钱包、大规模空投工具,还是给 GameFi 赋能,zkLogin 都提供了 安全、隐私、低摩擦 的完整方案。现在就开始实验,用自己的 Google / Facebook 账号在 Sui 上发送第一笔交易吧!