Locking and Unlocking

Icon Link锁定和解锁

我们可以对Wallet 实例执行的操作取决于我们是否能够访问钱包的私钥。

为了区分是否知道其私钥的Wallet 实例和不知道其私钥的实例,我们分别使用WalletUnlocked WalletLocked 类型。

Icon Link钱包状态

WalletUnlocked 类型表示已知私钥并存储在内存中的钱包。为了执行涉及签署消息或交易 的操作,钱包必须是WalletUnlocked 类型。

WalletLocked 类型表示私钥_不_已知或存储在内存中的钱包。相反,WalletLocked 仅知道其公共地址。WalletLocked 不能用于签署交易,但仍然可以执行一整套有用的操作,包括列出交易、资产查询余额等。

请注意,WalletUnlocked 类型实现了WalletLocked 类型上可用的大多数方法。换句话说,WalletUnlocked 可以被认为是对WalletLocked 的一个薄包装,通过私钥提供更大的访问权限。

Icon Link基本示例

// #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);

Icon Link可选提供程序

您可以选择在Wallet构造函数上不传递提供程序参数:

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/);

Icon Link状态转换

通过提供私钥,可以解锁WalletLocked 实例:

// #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);

可以使用lock方法将WalletUnlocked 实例锁定:

const newlyLockedWallet = unlockedWallet.lock();

大多数创建或生成新钱包的钱包构造函数都在WalletUnlocked 类型上提供。考虑在处理新私钥后使用lock方法将钱包锁定,以减少钱包私钥存储在内存中的范围。

Icon Link设计指南

在设计接受钱包作为输入的API时,我们应该仔细考虑所需的访问权限。API开发人员应尽量减少对WalletUnlocked 的使用,以确保私钥的存储时间不会超过必要的时间,从而减少下游库和应用程序中的攻击和漏洞的风险。