
在开发过程中,我们有时会遇到这样一种情况:某个函数(例如,在NEAR区块链交互场景中的signMessage)在运行时确实被执行了,其调用日志也清晰可见,但在代码库中却难以直接找到其显式的调用点。例如,在以下stake函数中,尽管我们知道signMessage在交易发送时被调用,但其在stake函数或其内部调用的任何函数中都没有直接体现:
async stake(amount: number): Promise<void> {
await this.runSetupIfNeeded();
typecheck(amount, typeof 1);
this.log('Validating stake request.');
let nearWallet = await this.fbks.getVaultAccountAsset("" + this.vaultAccountId, this.assetId);
let nearInWallet = nearWallet.available;
if (Number.parseFloat(nearInWallet) < amount) {
throw new Error(`Vault account ${this.vaultAccountId} has ${nearInWallet} NEAR, but requested to stake ${amount}.`);
}
this.log('Validated.');
this.log('Note - stake,unstake and withdraw will print data including reciepts for transaction, make sure to save it for future reference.', 'WRN');
(this.config.signer as NEARFireblocksSigner).setNote(`NEAR Staking - Staking ${amount} NEAR`);
// @ts-ignore - required because deposit_and_stake is generated at runtime.
let response = await this.contract.deposit_and_stake({
args: {},
amount: parseNearAmount("" + amount)
});
this.log(`Staked ${amount} NEAR to ${this.contractName}.`);
}此外,当我们需要从stake函数返回一个特定的交易ID(txId)时,由于signMessage的间接调用特性,我们可能无法直接从现有流程中获取此值。这种现象通常指向了对第三方库内部机制的理解不足。
signMessage之所以难以直接追踪,是因为它是一个抽象方法。在near-api-js库中,Signer类定义了一个抽象的signMessage方法。我们自定义的NEARFireblocksSigner类继承了Signer并提供了signMessage的具体实现。这意味着,signMessage的调用不是由我们直接在业务逻辑代码中显式触发,而是由near-api-js库在执行其核心操作(如发送交易)时,通过多层内部调用间接触发的。
为了彻底理解signMessage的调用路径,我们需要深入near-api-js库的内部,追踪从合约方法调用到签名操作的完整流程:
通过这个调用链路,我们可以清晰地看到,signMessage的调用是深藏于near-api-js库内部的交易处理流程中,而非我们直接在业务代码中调用的。
在上述的near-api-js标准交易发送流程中,stake函数及其调用的deposit_and_stake方法,默认情况下并不会直接返回txId(交易ID)。signMessage方法本身主要负责签名操作,其返回值通常是签名后的数据,而不是最终的交易ID。交易ID是在交易被发送到区块链并确认后才生成的。
如果您的应用需要获取txId,您将需要:
理解第三方库的内部工作机制对于调试和扩展应用程序至关重要。当遇到函数调用难以追踪的情况时,请考虑以下几点:
通过上述分析,希望能帮助您更好地理解和处理TypeScript项目中复杂的第三方库集成场景,尤其是在追踪间接调用和管理特定返回值方面。
以上就是深度解析:TypeScript中抽象方法与第三方库的间接调用追踪的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号