Skip to content

Commit

Permalink
increased preflight instruction fee padding to 3 million (#1127)
Browse files Browse the repository at this point in the history
  • Loading branch information
sreuland authored Dec 12, 2023
1 parent 7e0334d commit 514406e
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 5 deletions.
14 changes: 11 additions & 3 deletions cmd/soroban-rpc/internal/test/simulate_transaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,19 @@ func TestSimulateTransactionSucceeds(t *testing.T) {
ReadBytes: 0,
WriteBytes: 7048,
},
ResourceFee: 113910,
// the resulting fee is derived from the compute factors and a default padding is applied to instructions by preflight
// for test purposes, the most deterministic way to assert the resulting fee is expected value in test scope, is to capture
// the resulting fee from current preflight output and re-plug it in here, rather than try to re-implement the cost-model algo
// in the test.
ResourceFee: 135910,
}

// First, decode and compare the transaction data so we get a decent diff if it fails.
var transactionData xdr.SorobanTransactionData
err := xdr.SafeUnmarshalBase64(result.TransactionData, &transactionData)
assert.NoError(t, err)
assert.Equal(t, expectedTransactionData.Resources.Footprint, transactionData.Resources.Footprint)
assert.InDelta(t, uint32(expectedTransactionData.Resources.Instructions), uint32(transactionData.Resources.Instructions), 200000)
assert.InDelta(t, uint32(expectedTransactionData.Resources.Instructions), uint32(transactionData.Resources.Instructions), 3200000)
assert.InDelta(t, uint32(expectedTransactionData.Resources.ReadBytes), uint32(transactionData.Resources.ReadBytes), 10)
assert.InDelta(t, uint32(expectedTransactionData.Resources.WriteBytes), uint32(transactionData.Resources.WriteBytes), 300)
assert.InDelta(t, int64(expectedTransactionData.ResourceFee), int64(transactionData.ResourceFee), 3000)
Expand Down Expand Up @@ -1122,7 +1126,11 @@ func TestSimulateSystemEvent(t *testing.T) {
require.NoError(t, err)

assert.InDelta(t, 7464, uint32(transactionData.Resources.ReadBytes), 200)
assert.InDelta(t, 80980, int64(transactionData.ResourceFee), 5000)
// the resulting fee is derived from compute factors and a default padding is applied to instructions by preflight
// for test purposes, the most deterministic way to assert the resulting fee is expected value in test scope, is to capture
// the resulting fee from current preflight output and re-plug it in here, rather than try to re-implement the cost-model algo
// in the test.
assert.InDelta(t, 100980, int64(transactionData.ResourceFee), 5000)
assert.InDelta(t, 104, uint32(transactionData.Resources.WriteBytes), 15)
require.GreaterOrEqual(t, len(response.Events), 3)
}
4 changes: 2 additions & 2 deletions cmd/soroban-rpc/lib/preflight/src/fees.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,12 +138,12 @@ fn calculate_host_function_soroban_resources(
.map(|c| c.encoded_new_value.as_ref().map_or(0, Vec::len) as u32)
.sum();

// Add a 20% leeway with a minimum of 1 million instructions
// Add a 20% leeway with a minimum of 3 million instructions
let budget_instructions = budget
.get_cpu_insns_consumed()
.context("cannot get instructions consumed")?;
let instructions = max(
budget_instructions + 1000000,
budget_instructions + 3000000,
budget_instructions * 120 / 100,
);
Ok(SorobanResources {
Expand Down

0 comments on commit 514406e

Please sign in to comment.