本节介绍 @ocap/wallet 包背后的基本概念。你将了解什么是钱包对象、其结构、创建它的不同方式,以及它与去中心化身份 (DID) 的关键关系。
钱包对象不仅仅是密钥对的容器;它是一个功能强大、自成一体的实用工具,用于执行与 DID 相关的所有必要加密操作。它封装了密钥、DID 类型信息以及根据其类型定义的规则对数据进行签名、验证和哈希的方法。
钱包对象
WalletObject 是该库的核心部分。它包含了管理数字身份所需的所有信息和功能。每个钱包都由以下关键属性组成:
- type
DIDType(required) — 一个定义钱包加密算法和编码格式的对象。 - secretKey
string | Buffer— 私钥。这是签名操作所必需的。请妥善保管,确保安全。 - publicKey
string | Buffer(required) — 公钥,从密钥派生。它用于验证签名。 - address
string(required) — 与钱包关联的去中心化身份标识符 (DID) 字符串,从公钥派生。
理解钱包类型
钱包的行为完全由其 type 决定,该 type 是来自 @arcblock/did 包的 DIDType 对象。此类型对象指定要使用的加密算法和格式。
DIDType 由四个主要部分组成:
| 属性 | 描述 |
|---|---|
| role | 定义 DID 的用途(例如,账户、应用、节点)。 |
| pk | 要使用的公钥算法(例如,ED25519、ETHEREUM)。 |
| hash | 要使用的哈希算法(例如,SHA3、KECCAK)。 |
| address | 最终 DID 字符串的编码格式(例如,BASE58、BASE16)。 |
该库为常见配置提供了方便的快捷方式,例如 'default'(用于 ArcBlock DID)和 'ethereum'。
你还可以为特定用例定义自定义钱包类型,例如创建应用 DID:
Wallet Type Configuration
const { WalletType } = require('@ocap/wallet');
const { types } = require('@ocap/mcrypto');
const appWalletType = WalletType({
role: types.RoleType.ROLE_APPLICATION,
pk: types.KeyType.ED25519,
hash: types.HashType.SHA3,
address: types.EncodingType.BASE58,
});
// 现在你可以使用此类型来创建新钱包
// const wallet = fromRandom(appWalletType);创建钱包
你可以通过多种方式实例化钱包,具体取决于你拥有的信息。下图说明了一般过程:

以下是主要的工厂函数:
fromRandom
这是创建全新钱包的最简单方法。它会生成一个新的随机密钥,并派生出相应的公钥和地址。
const { fromRandom } = require('@ocap/wallet');
// 使用默认的 ArcBlock 类型创建一个新钱包
const wallet = fromRandom();
console.log('新钱包地址:', wallet.address);
console.log('密钥:', wallet.secretKey);fromSecretKey
当你已有密钥时,使用此函数来恢复钱包。这是加载现有身份最常用的方法。
const { fromSecretKey } = require('@ocap/wallet');
const sk = '0xD67C071...'; // 你已有的密钥
const wallet = fromSecretKey(sk);
console.log('恢复的钱包地址:', wallet.address);fromPublicKey
如果你只有一个公钥,你可以创建一个“只读”钱包。这个钱包可以用来验证签名和派生地址,但因为它缺少密钥,所以不能用来签署消息。
const { fromPublicKey } = require('@ocap/wallet');
const pk = '0xE4852B7...'; // 一个已有的公钥
const wallet = fromPublicKey(pk);
console.log('从 PK 得到的地址:', wallet.address);
// wallet.sign('message'); // 这会抛出一个错误fromAddress
仅从 DID 地址创建钱包对于解析嵌入在地址字符串中的类型信息很有用。这种类型的钱包功能非常有限,不能签名或验证数据。
const { fromAddress } = require('@ocap/wallet');
const did = 'zNKtCNqYWLYWYW3gWRA1vnRykfCBZYHZvzKr';
const wallet = fromAddress(did);
// 你可以检查从地址派生的类型信息
console.log('钱包类型:', wallet.type);fromJSON
此函数允许你从之前使用 wallet.toJSON() 方法创建的序列化 JSON 对象中重建钱包。这对于存储和检索钱包非常理想。
const { fromRandom, fromJSON } = require('@ocap/wallet');
// 1. 创建一个钱包并将其序列化
const originalWallet = fromRandom();
const serialized = originalWallet.toJSON();
// 2. 稍后,从 JSON 对象中恢复它
const restoredWallet = fromJSON(serialized);
console.log('成功恢复:', originalWallet.address === restoredWallet.address);与 DID 的关系
钱包对象和去中心化身份 (DID) 有着内在的联系:
- 钱包是 DID 的控制者。 钱包内的密钥是所有权的证明,授予持有者代表该 DID 执行操作的能力。
wallet.address就是 DID。 它是可以与他人共享的公共标识符。wallet.type定义了 DID 的属性。 它决定了 DID 是如何构建的,以及它在密码学上应该如何表现。
从本质上讲,@ocap/wallet 库提供了创建、管理和使用由 @arcblock/did 规范定义的身份的实用工具。
了解了这些核心概念后,你现在可以浏览 API 参考 以获取有关所有可用方法及其参数的详细信息。