随着区块链技术的快速发展,安全性、灵活性和去中心化验证成为了核心需求。Sui区块链作为下一代高性能公链,凭借其创新性的技术栈和强大的工具生态,提供了多签名交易(MultiSig)和基于零知识证明的身份认证(zkLogin)功能。这篇文章将以完整详细的视角,解析这两大功能的概念、工作原理、开发
随着区块链技术的快速发展,安全性、灵活性和去中心化验证成为了核心需求。由于钱包复杂性导致的新用户入门障碍是区块链中一个长期存在的问题,而zkLogin是其简单的解决方案。通过使用前沿的密码学和技术,zkLogin既优雅又复杂。Sui 区块链作为下一代高性能公链,凭借其创新性的技术栈和强大的工具生态,提供了多签名交易(MultiSig)和基于零知识证明的身份认证(zkLogin)功能。这篇文章将以完整详细的视角,解析这两大功能的概念、工作原理、开发过程及应用场景。

为了帮助更多开发者快速了解和掌握 Move 编程语言,Move 共学活动由 HOH 社区、HackQuest、OpenBuild、KeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉 Move 语言,并了解如何将其应用到 Web3 开发中。
通过与 Move 领域的专业导师们合作,参与者可以快速掌握 Move 语言的基础知识,逐步向更复杂的应用开发进阶。无论是区块链初学者,还是有一定开发经验的工程师,都能从中获益。
资源链接:

zkLogin 是 Sui 区块链中一项创新功能,它基于 零知识证明(Zero-Knowledge Proof) 实现去中心化的身份认证。通过 zkLogin,用户可以使用已有的身份认证系统(如 Google、Apple 或 Facebook 的账号),而无需泄露敏感信息,即可验证其身份并访问区块链资源。
zkLogin 的实现基于 JWT(JSON Web Token)和零知识技术,其工作流程如下:
zkLogin 的独特优势在于:
zkLogin 提供了一套丰富的工具函数,方便开发者在去中心化应用中集成身份认证功能。这些工具的主要功能包括:
以下是每个功能的详细用法:
开发者可以使用 parseZkLoginSignature 函数,将序列化后的 zkLogin 签名解析为可读的对象。这对于调试和签名验证非常重要。
import { parseZkLoginSignature } from '@mysten/sui/zklogin';
const serializedSignature = 'BQNNMTY4NjAxMzAyO...'; // 示例序列化签名
const parsedSignature = await parseZkLoginSignature(serializedSignature);
console.log(parsedSignature);
输出示例:
{
"claimName": "email",
"claimValue": "user@example.com",
"iss": "https://accounts.google.com",
"aud": "https://your-app.com",
"userSalt": "123456789"
}
getZkLoginSignature 函数允许开发者根据输入数据生成一个 zkLogin 签名。以下是一个简单的用法示例:
import { getZkLoginSignature } from '@mysten/sui/zklogin';
const inputs = {
claimName: "email",
claimValue: "user@example.com",
iss: "https://accounts.google.com",
aud: "https://your-app.com"
};
const userSignature = "base64EncodedSignature";
const maxEpoch = "1689012302"; // 到期时间
const serializedSignature = await getZkLoginSignature({
inputs,
maxEpoch,
userSignature
});
console.log(serializedSignature);
生成 zkLogin 地址的方式有多种,具体取决于用户提供的数据。例如,可以基于种子值计算:
import { computeZkLoginAddressFromSeed } from '@mysten/sui/zklogin';
const userSalt = 0n; // 用户提供的盐值
const identityProvider = 'https://accounts.google.com'; // 身份认证系统
const address = computeZkLoginAddressFromSeed(userSalt, identityProvider);
console.log(address); // 输出唯一的 zkLogin 地址
或者,可以直接基于 JWT 内容和解析后的数据生成地址:
import { computeZkLoginAddress } from '@mysten/sui/zklogin';
const address = computeZkLoginAddress({
claimName: "email",
claimValue: "user@example.com",
iss: "https://accounts.google.com",
aud: "https://your-app.com",
userSalt: BigInt(123456789)
});
console.log(address);
多签名是一种重要的安全机制,它要求多个密钥的签名满足一定的权重阈值,才能执行某项操作。其核心特点包括:
Sui 提供了 MultiSigPublicKey 和 MultiSigSigner 两个核心类,用于实现多签名操作。这些类允许开发者轻松创建多签名账户、生成多签名交易,并验证签名。
开发者可以通过 MultiSigPublicKey.fromPublicKeys 方法,创建一个多签名账户。以下是一个完整的示例:
import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
import { MultiSigPublicKey } from '@mysten/sui/multisig';
// 创建密钥对
const kp1 = new Ed25519Keypair();
const kp2 = new Ed25519Keypair();
const kp3 = new Ed25519Keypair();
// 创建多签名公钥
const multiSigPublicKey = MultiSigPublicKey.fromPublicKeys({
threshold: 2, // 最小签名权重
publicKeys: [
{ publicKey: kp1.getPublicKey(), weight: 1 },
{ publicKey: kp2.getPublicKey(), weight: 1 },
{ publicKey: kp3.getPublicKey(), weight: 2 }
]
});
// 生成多签名账户地址
const multisigAddress = multiSigPublicKey.toSuiAddress();
console.log(multisigAddress);
在多签名交易中,需要收集足够的签名,才能通过验证。以下是合并签名的示例:
const message = new TextEncoder().encode("hello world");
// 使用密钥对签名
const signature1 = (await kp1.signPersonalMessage(message)).signature;
const signature2 = (await kp2.signPersonalMessage(message)).signature;
// 合并签名
const combinedSignature = multiSigPublicKey.combinePartialSignatures([signature1, signature2]);
// 验证签名
const isValid = await multiSigPublicKey.verifyPersonalMessage(message, combinedSignature);
console.log(isValid); // true
zkLogin 可以作为多签名账户的一部分,允许用户使用传统身份认证方式登录,同时保留区块链密钥作为备用方案。这种设计既提升了安全性,又增强了账户的可恢复性。
Sui 区块链通过 zkLogin 和多签名功能,为去中心化应用提供了安全性、灵活性和兼容性兼备的解决方案。无论是个人用户还是企业开发者,都能从中受益,构建更加可靠的区块链应用。如果你正在探索 Web3 的新机会,Sui 的 zkLogin 和多签名功能值得深入研究和使用!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!