Solana指令解析-compute budget
什么是compute budget?
- compute budget称为计算预算,是 Solana 区块链中用于管理计算资源的概念。该程序负责管理计算资源的分配和价格设置,以确保 Solana 网络上的计算任务得到适当的资源配额和报酬。
- compute budget定义了用户或智能合约可以使用的计算资源的限额,包括计算单位数(compute units)和内存分配。每个计算单位代表一定量的 CPU 时间和其他计算资源。计算单位的数量和价格是由网络中的 Compute Budget 程序管理和设置的。
ComputeBudgetProgramID
:ComputeBudget111111111111111111111111111111
compute budget 指令汇总
指令 | 值 | 说明 |
---|---|---|
RequestUnits | 0 | 创建一个关联代币账户 |
RequestHeapFrame | 1 | 请求堆栈帧 |
SetComputeUnitLimit | 2 | 设置计算单位限制 |
SetComputeUnitPrice | 3 | 设置计算单位价格 |
源码地址:github.com/blocto/solana-go-sdk/program/compute_budget
1.RequestUnits
用于向计算预算程序请求计算资源单位,不涉及任何账户。
1.1源码
type RequestUnitsParam struct {
Units uint32
AdditionalFee uint32
}
// RequestUnits ...
func RequestUnits(param RequestUnitsParam) types.Instruction {
data, err := borsh.Serialize(struct {
Instruction Instruction
Units uint32
AdditionalFee uint32
}{
Instruction: InstructionRequestUnits,
Units: param.Units,
AdditionalFee: param.AdditionalFee,
})
if err != nil {
panic(err)
}
return types.Instruction{
ProgramID: common.ComputeBudgetProgramID,
Accounts: []types.AccountMeta{},
Data: data,
}
}
1.2指令参数
Units
: 表示请求的计算单位数量,即希望分配的计算资源量。AdditionalFee
: 表示请求计算资源时额外的费用,可能用于支付网络使用或其他费用。在某些情况下,除了请求的计算资源外,还可能需要支付一定的附加费用。
2.RequestHeapFrame
用于向计算预算程序请求堆栈帧资源,不涉及任何账户。
2.1源码
type RequestHeapFrameParam struct {
Bytes uint32
}
// RequestHeapFrame ...
func RequestHeapFrame(param RequestHeapFrameParam) types.Instruction {
data, err := borsh.Serialize(struct {
Instruction Instruction
Bytes uint32
}{
Instruction: InstructionRequestHeapFrame,
Bytes: param.Bytes,
})
if err != nil {
panic(err)
}
return types.Instruction{
ProgramID: common.ComputeBudgetProgramID,
Accounts: []types.AccountMeta{},
Data: data,
}
}
2.2指令参数
Bytes
表示请求的堆栈帧大小(以字节为单位)。调用此指令将会为程序分配堆栈帧,以便在程序执行期间存储局部变量和临时数据。
3.SetComputeUnitLimit
用于设置计算预算程序中的计算资源上限,不涉及任何账户。
3.1源代码
type SetComputeUnitLimitParam struct {
Units uint32
}
// SetComputeUnitLimit set a specific compute unit limit that the transaction is allowed to consume.
func SetComputeUnitLimit(param SetComputeUnitLimitParam) types.Instruction {
data, err := borsh.Serialize(struct {
Instruction Instruction
Units uint32
}{
Instruction: InstructionSetComputeUnitLimit,
Units: param.Units,
})
if err != nil {
panic(err)
}
return types.Instruction{
ProgramID: common.ComputeBudgetProgramID,
Accounts: []types.AccountMeta{},
Data: data,
}
}
3.2指令参数
- Units
表示要设置的计算单元限制值。调用此指令将会设置交易允许消耗的最大计算单元数目。
4.SetComputeUnitPrice
用于设置计算预算程序中的计算资源价格,不涉及任何账户。
4.1源码
type SetComputeUnitPriceParam struct {
MicroLamports uint64
}
// SetComputeUnitPrice set a compute unit price in "micro-lamports" to pay a higher transaction
// fee for higher transaction prioritization.
func SetComputeUnitPrice(param SetComputeUnitPriceParam) types.Instruction {
data, err := borsh.Serialize(struct {
Instruction Instruction
MicroLamports uint64
}{
Instruction: InstructionSetComputeUnitPrice,
MicroLamports: param.MicroLamports,
})
if err != nil {
panic(err)
}
return types.Instruction{
ProgramID: common.ComputeBudgetProgramID,
Accounts: []types.AccountMeta{},
Data: data,
}
}
4.1指令参数
MicroLamports
表示以 “lamport” 为单位的计算单元价格。调用此指令将会设置交易中每个计算单元的价格,以便为更高的交易优先级支付更高的交易费用。