锁定和解锁
我们可以对 Wallet
实例执行的操作类型取决于我们是否可以访问钱包的私钥。
为了区分已知私钥的Wallet
实例和未知私钥的实例,我们分别使用WalletUnlocked
和WalletLocked
类型。
钱包状态
WalletUnlocked
表示一个钱包,其私钥是已知的并且存储在内存中。必须使用WalletUnlocked
类型的钱包才能执行涉及签名消息或交易的操作。
WalletLocked
类型表示私钥未知或未存储在内存中的钱包。相反,WalletLocked
只知道它的公共地址。 WalletLocked
无法用于签名交易,但仍然可以执行一系列有用的操作,如列出交易、资产、查询余额等。
请注意,WalletUnlocked
类型实现了WalletLocked
类型上的大多数方法。换句话说,WalletUnlocked
可以视为WalletLocked
的薄包装器,通过其私钥提供更大的访问权限。
基本示例
ts
// #import { Wallet, WalletLocked, WalletUnlocked };
// We can use the `generate` to create a new unlocked wallet.
const myWallet: WalletUnlocked = Wallet.generate({ provider });
// or use an Address to create a wallet
const someWallet: WalletLocked = Wallet.fromAddress(myWallet.address, provider);
可选的 Provider
在构建 Wallet
时,你可以选择不传递provider参数:
ts
// #context import { Wallet, WalletUnlocked } from 'fuels';
// You can create a wallet, without a provider
let unlockedWallet: WalletUnlocked = Wallet.generate();
unlockedWallet = Wallet.fromPrivateKey(unlockedWallet.privateKey);
// All non-provider dependent methods are available
unlockedWallet.lock();
// All provider dependent methods will throw
await expect(() => unlockedWallet.getCoins()).rejects.toThrow(/Provider not set/);
转换状态
WalletLocked
实例可以通过提供私钥来解锁:
ts
// #import { Wallet, WalletLocked, WalletUnlocked };
// Lock an existing wallet
const lockedWallet: WalletLocked = Wallet.fromAddress(myWallet.address, provider);
// Unlock an existing wallet
const unlockedWallet: WalletUnlocked = lockedWallet.unlock(PRIVATE_KEY);
WalletUnlocked
实例可以使用lock
方法锁定:
ts
const newlyLockedWallet = unlockedWallet.lock();
大多数创建或生成新钱包的 Wallet 构造函数都位于WalletUnlocked
类型上。在处理完新的私钥后,考虑使用lock
方法锁定钱包,以减少私钥在内存中存储的时间和范围。
设计指南
当设计接受钱包作为输入的API时,我们需要仔细考虑所需的访问级别。API开发者应尽量减少使用WalletUnlocked
,以确保私钥在内存中存储的时间尽可能短,从而减少下游库和应用程序的安全风险区域。