{"content":{"title":"Sui 区块链详解：多签名交易与 zkLogin 完全解析","body":"# 前言\r\n\r\n随着区块链技术的快速发展，安全性、灵活性和去中心化验证成为了核心需求。由于钱包复杂性导致的新用户入门障碍是区块链中一个长期存在的问题，而zkLogin是其简单的解决方案。通过使用前沿的密码学和技术，zkLogin既优雅又复杂。Sui 区块链作为下一代高性能公链，凭借其创新性的技术栈和强大的工具生态，提供了多签名交易（MultiSig）和基于零知识证明的身份认证（zkLogin）功能。这篇文章将以完整详细的视角，解析这两大功能的概念、工作原理、开发过程及应用场景。\r\n\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/12/K6HegXXt675ae2cf79dec.png)\r\n\r\n---\r\n# Move 共学活动：快速上手 Move 开发\r\n为了帮助更多开发者快速了解和掌握 Move 编程语言，**Move 共学**活动由 **HOH 社区**、**HackQuest**、**OpenBuild**、**KeyMap** 联合发起。该活动旨在为新手小白提供一个良好的学习平台，带领大家一步步熟悉 Move 语言，并了解如何将其应用到 Web3 开发中。\r\n\r\n通过与 Move 领域的专业导师们合作，参与者可以快速掌握 Move 语言的基础知识，逐步向更复杂的应用开发进阶。无论是区块链初学者，还是有一定开发经验的工程师，都能从中获益。\r\n\r\n**资源链接：**\r\n- [sui官方文档🚪](https://docs.sui.io/)：获取关于 Sui 链的详细文档，包括开发指南、API 参考等。\r\n- [move学习B站视频🚪](https://www.bilibili.com/video/BV1BMD8Y2EfE/)：通过 B 站的视频教程，跟随导师学习 Move 编程语言的基础与进阶。\r\n- [letsmove仓库🚪](https://github.com/move-cn/letsmove)：这是一个 Move 学习资源的 GitHub 仓库，包含了各种示例代码和教程，帮助开发者掌握 Move 语言。\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/12/hTtY8mF7675ad5aed970c.png)\r\n\r\n---\r\n\r\n# 一、什么是 zkLogin？\r\n\r\nzkLogin 是 Sui 区块链中一项创新功能，它基于 **零知识证明（Zero-Knowledge Proof）** 实现去中心化的身份认证。通过 zkLogin，用户可以使用已有的身份认证系统（如 Google、Apple 或 Facebook 的账号），而无需泄露敏感信息，即可验证其身份并访问区块链资源。\r\n\r\n\r\n## 1.1 zkLogin 的核心概念\r\n\r\nzkLogin 的实现基于 JWT（JSON Web Token）和零知识技术，其工作流程如下：\r\n\r\n1. **用户身份认证**： 用户通过传统的身份认证系统（如 Google 账号）获取 JWT 令牌。\r\n2. **JWT 签名解析**： 区块链节点验证 JWT 的签名，确保其由合法的身份提供方（如 Google）颁发。\r\n3. **零知识验证**： 使用零知识证明技术，在不泄露用户完整信息的情况下，验证用户对某些声明（如“我是某个账户的持有者”）的真实性。\r\n4. **计算唯一地址**： 基于 JWT 的内容和用户提供的盐值，生成一个 zkLogin 地址，作为区块链上的身份标识。\r\n\r\nzkLogin 的独特优势在于：\r\n\r\n* **保护隐私**：用户无需暴露完整的身份信息，降低被追踪或泄露的风险。\r\n* **兼容性强**：支持主流的身份认证系统，降低用户进入 Web3 世界的门槛。\r\n* **去中心化**：验证过程由区块链节点完成，无需依赖第三方。\r\n\r\n***\r\n\r\n## 1.2 zkLogin 的主要功能\r\n\r\nzkLogin 提供了一套丰富的工具函数，方便开发者在去中心化应用中集成身份认证功能。这些工具的主要功能包括：\r\n\r\n* **解析 zkLogin 签名**：将序列化后的 zkLogin 签名解析为可用的数据结构。\r\n* **生成 zkLogin 签名**：根据用户的输入和种子值生成 zkLogin 签名。\r\n* **计算 zkLogin 地址**：基于 JWT 内容或用户提供的盐值，生成 zkLogin 地址，作为链上的身份标识。\r\n\r\n\r\n[zklogin视频学习🚪](https://www.youtube.com/watch?v=Jk4mq5IOUYc)\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/12/zcb8dbca675adff42a4ef.png)\r\n\r\n\r\n以下是每个功能的详细用法：\r\n\r\n### 1.2.1 解析 zkLogin 签名\r\n\r\n开发者可以使用 `parseZkLoginSignature` 函数，将序列化后的 zkLogin 签名解析为可读的对象。这对于调试和签名验证非常重要。\r\n\r\n```typescript\r\nimport { parseZkLoginSignature } from '@mysten/sui/zklogin';\r\n\r\nconst serializedSignature = 'BQNNMTY4NjAxMzAyO...'; // 示例序列化签名\r\nconst parsedSignature = await parseZkLoginSignature(serializedSignature);\r\n\r\nconsole.log(parsedSignature);\r\n```\r\n\r\n**输出示例**：\r\n\r\n```json\r\n{\r\n  \"claimName\": \"email\",\r\n  \"claimValue\": \"user@example.com\",\r\n  \"iss\": \"https://accounts.google.com\",\r\n  \"aud\": \"https://your-app.com\",\r\n  \"userSalt\": \"123456789\"\r\n}\r\n```\r\n\r\n***\r\n\r\n### 1.2.2 生成 zkLogin 签名\r\n\r\n`getZkLoginSignature` 函数允许开发者根据输入数据生成一个 zkLogin 签名。以下是一个简单的用法示例：\r\n\r\n```typescript\r\nimport { getZkLoginSignature } from '@mysten/sui/zklogin';\r\n\r\nconst inputs = {\r\n  claimName: \"email\",\r\n  claimValue: \"user@example.com\",\r\n  iss: \"https://accounts.google.com\",\r\n  aud: \"https://your-app.com\"\r\n};\r\nconst userSignature = \"base64EncodedSignature\";\r\nconst maxEpoch = \"1689012302\"; // 到期时间\r\n\r\nconst serializedSignature = await getZkLoginSignature({\r\n  inputs,\r\n  maxEpoch,\r\n  userSignature\r\n});\r\n\r\nconsole.log(serializedSignature);\r\n```\r\n\r\n***\r\n\r\n### 1.2.3 计算 zkLogin 地址\r\n\r\n生成 zkLogin 地址的方式有多种，具体取决于用户提供的数据。例如，可以基于种子值计算：\r\n\r\n```typescript\r\nimport { computeZkLoginAddressFromSeed } from '@mysten/sui/zklogin';\r\n\r\nconst userSalt = 0n; // 用户提供的盐值\r\nconst identityProvider = 'https://accounts.google.com'; // 身份认证系统\r\n\r\nconst address = computeZkLoginAddressFromSeed(userSalt, identityProvider);\r\n\r\nconsole.log(address); // 输出唯一的 zkLogin 地址\r\n```\r\n\r\n或者，可以直接基于 JWT 内容和解析后的数据生成地址：\r\n\r\n```typescript\r\nimport { computeZkLoginAddress } from '@mysten/sui/zklogin';\r\n\r\nconst address = computeZkLoginAddress({\r\n  claimName: \"email\",\r\n  claimValue: \"user@example.com\",\r\n  iss: \"https://accounts.google.com\",\r\n  aud: \"https://your-app.com\",\r\n  userSalt: BigInt(123456789)\r\n});\r\n\r\nconsole.log(address);\r\n```\r\n\r\n***\r\n\r\n# 二、多签名（MultiSig）交易\r\n\r\n## 2.1 多签名的基本概念\r\n\r\n多签名是一种重要的安全机制，它要求多个密钥的签名满足一定的权重阈值，才能执行某项操作。其核心特点包括：\r\n\r\n1. **提升安全性**：单一密钥泄露不会导致账户被盗。\r\n2. **灵活性**：支持团队协作和联合管理，例如企业账户。\r\n3. **兼容 zkLogin**：多签名功能与 zkLogin 无缝集成，可增强账户的恢复能力。\r\n\r\n## 2.2 Sui 区块链的多签名支持\r\n\r\nSui 提供了 `MultiSigPublicKey` 和 `MultiSigSigner` 两个核心类，用于实现多签名操作。这些类允许开发者轻松创建多签名账户、生成多签名交易，并验证签名。\r\n\r\n***\r\n\r\n### 2.2.1 创建多签名账户\r\n\r\n开发者可以通过 `MultiSigPublicKey.fromPublicKeys` 方法，创建一个多签名账户。以下是一个完整的示例：\r\n\r\n```typescript\r\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\r\nimport { MultiSigPublicKey } from '@mysten/sui/multisig';\r\n\r\n// 创建密钥对\r\nconst kp1 = new Ed25519Keypair();\r\nconst kp2 = new Ed25519Keypair();\r\nconst kp3 = new Ed25519Keypair();\r\n\r\n// 创建多签名公钥\r\nconst multiSigPublicKey = MultiSigPublicKey.fromPublicKeys({\r\n  threshold: 2, // 最小签名权重\r\n  publicKeys: [\r\n    { publicKey: kp1.getPublicKey(), weight: 1 },\r\n    { publicKey: kp2.getPublicKey(), weight: 1 },\r\n    { publicKey: kp3.getPublicKey(), weight: 2 }\r\n  ]\r\n});\r\n\r\n// 生成多签名账户地址\r\nconst multisigAddress = multiSigPublicKey.toSuiAddress();\r\nconsole.log(multisigAddress);\r\n```\r\n\r\n***\r\n\r\n### 2.2.2 合并签名\r\n\r\n在多签名交易中，需要收集足够的签名，才能通过验证。以下是合并签名的示例：\r\n\r\n```typescript\r\nconst message = new TextEncoder().encode(\"hello world\");\r\n\r\n// 使用密钥对签名\r\nconst signature1 = (await kp1.signPersonalMessage(message)).signature;\r\nconst signature2 = (await kp2.signPersonalMessage(message)).signature;\r\n\r\n// 合并签名\r\nconst combinedSignature = multiSigPublicKey.combinePartialSignatures([signature1, signature2]);\r\n\r\n// 验证签名\r\nconst isValid = await multiSigPublicKey.verifyPersonalMessage(message, combinedSignature);\r\nconsole.log(isValid); // true\r\n```\r\n\r\n***\r\n\r\n### 2.2.3 多签名与 zkLogin 集成\r\n\r\nzkLogin 可以作为多签名账户的一部分，允许用户使用传统身份认证方式登录，同时保留区块链密钥作为备用方案。这种设计既提升了安全性，又增强了账户的可恢复性。\r\n\r\n***\r\n\r\n# 三、应用场景与优势\r\n\r\n## 3.1 zkLogin 的应用场景\r\n\r\n* **去中心化身份认证**：支持用户以隐私保护的方式登录 dApp。\r\n* **Web2 到 Web3 的桥梁**：降低用户进入区块链生态的门槛。\r\n* **跨平台验证**：支持多种身份认证系统（Google、Apple、Facebook）。\r\n\r\n## 3.2 多签名的应用场景\r\n\r\n* **企业资金管理**：联合授权，提高资金安全性。\r\n* **家庭共管账户**：实现多方共同管理资产。\r\n* **高价值资产保护**：通过多签名机制减少盗窃风险。\r\n\r\n***\r\n\r\n# 总结\r\n\r\nSui 区块链通过 zkLogin 和多签名功能，为去中心化应用提供了安全性、灵活性和兼容性兼备的解决方案。无论是个人用户还是企业开发者，都能从中受益，构建更加可靠的区块链应用。如果你正在探索 Web3 的新机会，Sui 的 zkLogin 和多签名功能值得深入研究和使用！"},"author":{"user":"https://learnblockchain.cn/people/17384","address":"0xbdd3203FeD7bC268DC76BFF731E78C73f76053C1"},"history":"bafkreigjvubcsrsruu7j5oauzmkjnzlta65wqd7s63fhsomf4ga2ewy2yi","timestamp":1734010059,"version":1}