我们可以对Wallet
实例执行的操作取决于我们是否能够访问钱包的私钥。
为了区分是否知道其私钥的Wallet
实例和不知道其私钥的实例,我们分别使用WalletUnlocked
和WalletLocked
类型。
WalletUnlocked
类型表示已知私钥并存储在内存中的钱包。为了执行涉及签署消息或交易 的操作,钱包必须是WalletUnlocked
类型。
WalletLocked
类型表示私钥_不_已知或存储在内存中的钱包。相反,WalletLocked
仅知道其公共地址。WalletLocked
不能用于签署交易,但仍然可以执行一整套有用的操作,包括列出交易、资产查询余额等。
请注意,WalletUnlocked
类型实现了WalletLocked
类型上可用的大多数方法。换句话说,WalletUnlocked
可以被认为是对WalletLocked
的一个薄包装,通过私钥提供更大的访问权限。
// #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);
您可以选择在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/);
通过提供私钥,可以解锁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
方法将钱包锁定,以减少钱包私钥存储在内存中的范围。
在设计接受钱包作为输入的API时,我们应该仔细考虑所需的访问权限。API开发人员应尽量减少对WalletUnlocked
的使用,以确保私钥的存储时间不会超过必要的时间,从而减少下游库和应用程序中的攻击和漏洞的风险。