本文将探讨新的计算预算指令“ setLoadedAccountsDataSizeLimit ”,并帮助开发人员了解如何在生产中使用它。正确使用 setLoadedAccountsDataSizeLimit 有可能大幅减少许多高性能应用程序中使用的 CU 数量。
为什么要引入 setLoadedAccountsDataSizeLimit?
主要目标是使拥有低 CU 应用程序(例如钱包、嵌入式钱包提供商等)的开发人员能够通过减少其请求的加载帐户数据大小来提高其交易优先级。此优先级机制与新的计算预算规则相一致,该规则有利于优化数据使用的交易,这可能会影响 CU(计算单位)成本。
在添加此指令之前,交易默认加载最多 64MB 的账户数据,导致内存消耗巨大,每 32KB 收取 8 个 CU。这种低效的默认设置将额外花费 16K CU,最终降低交易优先级(计算为 (reward_to_leader)/total_CU)并增加成本。LoadedAccountsDataSizeLimit 指令通过允许开发人员(尤其是在 DeFi 等计算敏感型应用程序中)明确指定较小的数据大小限制来解决此问题。通过仅请求必要数量的账户数据而不是完整的 64MB 默认值,交易可以减少其 CU 消耗,提高其处理优先级,并可能在新的计算预算规则下实现更好的成本效率。
谁应该关注
这种优化对于处理代币转移和其他低 CU 操作的钱包提供商和嵌入式钱包解决方案(如 Phantom、Solflare、Backpack 和 Privy)尤其有价值。虽然账户数据使用量最少的一般用户可能不受影响,但实施 setLoadedAccountsDataSizeLimit 可以提高交易优先级而不影响费用。做市商和 MEV 机器人运营商也可以从最小化账户数据大小中受益,以提高每个区块内的交易优先级,使其成为简单操作和高性能应用程序的有用功能。
整合使用 setLoadedAccountsDataSizeLimit 可以显著减少 CU。
在 Node.js 中计算数据指令
以下是一段代码片段,演示了如何使用 Node.js实现新指令(在 GitHub 上查看):
import { getSetLoadedAccountsDataSizeLimitInstruction } from "@solana-program/compute-budget";
import {
appendTransactionMessageInstruction,
createTransactionMessage,
pipe,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
} from "@solana/web3.js";
const transactionMessage = pipe(
createTransactionMessage({ version: 0 }),
m => setTransactionMessageFeePayerSigner(feePayerSigner, m),
m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),
m => appendTransactionMessageInstruction(
getSetLoadedAccountsDataSizeLimitInstruction({
accountDataSizeLimit: 32 * 1024, // 32KB limit
}),
m,
),
);
性能改进
通过设置setLoadedAccountsDataSizeLimit,开发人员可以请求降低其交易中帐户数据大小的默认限制。例如,默认数据限制为 64MB 是标准的,但根据公式“16K - 实际加载的帐户大小”,降低此限制(例如降低至 32KB)可以减少 CU 使用量。计算预算限制可改善 Solana 的区块处理。
假设代币转移的表现示例
下面您将看到一个假设场景,该场景通过示例令牌传输展示了正确使用 setLoadedAccountsDataSizeLimit 可能带来的实际性能改进:
- 1 个签名
- 3 个写锁(签名者,发件人地址,收件人地址)
- 5 个账户(签名者、发件人地址、收件人地址、代币程序、计算预算程序)
- 请求的计算预算限制为 8000 个 CU
- 支付优先费:每 CU 1.25 lamports
我们进一步假设:
- 该Token程序指令消耗6000CU
- 2 条计算预算指令总共消耗 300 CU,实际执行成本 = 6000 + 300 = 6,300 CU
- 所有帐户占用空间小于10M字节
以下列出可能发生的情况:
Metric | Without Instruction | With 10M Limit |
---|---|---|
Loaded Account Data Size Limit | 64M | 10M |
Data Size Cost Calculation | 64M * (8/32K) | 10M * (8/32K) |
Data Size Cost (CUs) | 16,000 | 2,500 |
Reward to Leader Calculation | (1 5000 + 1.25 8000)/2 | (1 5000 + 1.25 8000)/2 |
Reward to Leader (lamports) | 7,500 | 7,500 |
Transaction Cost Formula | 1720 + 3300 + 8000 + 16000 | 1720 + 3300 + 8000 + 2500 |
Transaction Cost (CUs) | 25,471 | 11,971 |
Priority Score | 0.30 | 0.63 |
如果交易明确请求足够的字节来加载账户,优先级将增加一倍以上。
结束语
新的计算预算指令为开发人员提供了一种通过设置帐户数据大小限制来控制交易优先级的方法。虽然这是可选的,但它对于在拥挤环境中需要高优先级处理的低 CU 应用程序非常有用。
沟通和示例应针对高数据应用程序的开发人员,展示利用计算预算的最佳实践,包括 Solana 2.0 增强处理框架内的潜在成本差异和优先优势。
原文:https://www.anza.xyz/blog/cu-optimization-with-setloadedaccountsdatasizelimit
版权属于:区块链中文技术社区 / 转载原创者
本文链接:https://bcskill.com/index.php/archives/2259.html
相关技术文章仅限于相关区块链底层技术研究,禁止用于非法用途,后果自负!本站严格遵守一切相关法律政策!