-
Notifications
You must be signed in to change notification settings - Fork 30
Expand file tree
/
Copy pathStellar-contract-config-setting.x
More file actions
238 lines (214 loc) · 8.74 KB
/
Stellar-contract-config-setting.x
File metadata and controls
238 lines (214 loc) · 8.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
%#include "xdr/Stellar-types.h"
namespace stellar {
// General “Soroban execution lane” settings
struct ConfigSettingContractExecutionLanesV0
{
// maximum number of Soroban transactions per ledger
uint32 ledgerMaxTxCount;
};
// "Compute" settings for contracts (instructions and memory).
struct ConfigSettingContractComputeV0
{
// Maximum instructions per ledger
int64 ledgerMaxInstructions;
// Maximum instructions per transaction
int64 txMaxInstructions;
// Cost of 10000 instructions
int64 feeRatePerInstructionsIncrement;
// Memory limit per transaction. Unlike instructions, there is no fee
// for memory, just the limit.
uint32 txMemoryLimit;
};
// Ledger access settings for contracts.
struct ConfigSettingContractLedgerCostV0
{
// Maximum number of ledger entry read operations per ledger
uint32 ledgerMaxReadLedgerEntries;
// Maximum number of bytes that can be read per ledger
uint32 ledgerMaxReadBytes;
// Maximum number of ledger entry write operations per ledger
uint32 ledgerMaxWriteLedgerEntries;
// Maximum number of bytes that can be written per ledger
uint32 ledgerMaxWriteBytes;
// Maximum number of ledger entry read operations per transaction
uint32 txMaxReadLedgerEntries;
// Maximum number of bytes that can be read per transaction
uint32 txMaxReadBytes;
// Maximum number of ledger entry write operations per transaction
uint32 txMaxWriteLedgerEntries;
// Maximum number of bytes that can be written per transaction
uint32 txMaxWriteBytes;
int64 feeReadLedgerEntry; // Fee per ledger entry read
int64 feeWriteLedgerEntry; // Fee per ledger entry write
int64 feeRead1KB; // Fee for reading 1KB
int64 feeWrite1KB; // Fee for writing 1KB
// Bucket list fees grow slowly up to that size
int64 bucketListSizeBytes;
// Fee rate in stroops when the bucket list is empty
int64 bucketListFeeRateLow;
// Fee rate in stroops when the bucket list reached bucketListSizeBytes
int64 bucketListFeeRateHigh;
// Rate multiplier for any additional data past the first bucketListSizeBytes
uint32 bucketListGrowthFactor;
};
// Historical data (pushed to core archives) settings for contracts.
struct ConfigSettingContractHistoricalDataV0
{
int64 feeHistorical1KB; // Fee for storing 1KB in archives
};
// Meta data (pushed to downstream systems) settings for contracts.
struct ConfigSettingContractMetaDataV0
{
// Maximum size of extended meta data produced by a transaction
uint32 txMaxExtendedMetaDataSizeBytes;
// Fee for generating 1KB of extended meta data
int64 feeExtendedMetaData1KB;
};
// Bandwidth related data settings for contracts
struct ConfigSettingContractBandwidthV0
{
// Maximum size in bytes to propagate per ledger
uint32 ledgerMaxPropagateSizeBytes;
// Maximum size in bytes for a transaction
uint32 txMaxSizeBytes;
// Fee for propagating 1KB of data
int64 feePropagateData1KB;
};
enum ContractCostType {
// Cost of running 1 wasm instruction
WasmInsnExec = 0,
// Cost of growing wasm linear memory by 1 page
WasmMemAlloc = 1,
// Cost of allocating a chuck of host memory (in bytes)
HostMemAlloc = 2,
// Cost of copying a chuck of bytes into a pre-allocated host memory
HostMemCpy = 3,
// Cost of comparing two slices of host memory
HostMemCmp = 4,
// Cost of a host function invocation, not including the actual work done by the function
InvokeHostFunction = 5,
// Cost of visiting a host object from the host object storage
// Only thing to make sure is the guest can't visitObject repeatly without incurring some charges elsewhere.
VisitObject = 6,
// Tracks a single Val (RawVal or primative Object like U64) <=> ScVal
// conversion cost. Most of these Val counterparts in ScVal (except e.g.
// Symbol) consumes a single int64 and therefore is a constant overhead.
ValXdrConv = 7,
// Cost of serializing an xdr object to bytes
ValSer = 8,
// Cost of deserializing an xdr object from bytes
ValDeser = 9,
// Cost of computing the sha256 hash from bytes
ComputeSha256Hash = 10,
// Cost of computing the ed25519 pubkey from bytes
ComputeEd25519PubKey = 11,
// Cost of accessing an entry in a Map.
MapEntry = 12,
// Cost of accessing an entry in a Vec
VecEntry = 13,
// Cost of guarding a frame, which involves pushing and poping a frame and capturing a rollback point.
GuardFrame = 14,
// Cost of verifying ed25519 signature of a payload.
VerifyEd25519Sig = 15,
// Cost of reading a slice of vm linear memory
VmMemRead = 16,
// Cost of writing to a slice of vm linear memory
VmMemWrite = 17,
// Cost of instantiation a VM from wasm bytes code.
VmInstantiation = 18,
// Cost of instantiation a VM from a cached state.
VmCachedInstantiation = 19,
// Roundtrip cost of invoking a VM function from the host.
InvokeVmFunction = 20,
// Cost of charging a value to the budgeting system.
ChargeBudget = 21,
// Cost of computing a keccak256 hash from bytes.
ComputeKeccak256Hash = 22,
// Cost of computing an ECDSA secp256k1 pubkey from bytes.
ComputeEcdsaSecp256k1Key = 23,
// Cost of computing an ECDSA secp256k1 signature from bytes.
ComputeEcdsaSecp256k1Sig = 24,
// Cost of recovering an ECDSA secp256k1 key from a signature.
RecoverEcdsaSecp256k1Key = 25,
// Cost of int256 addition (`+`) and subtraction (`-`) operations
Int256AddSub = 26,
// Cost of int256 multiplication (`*`) operation
Int256Mul = 27,
// Cost of int256 division (`/`) operation
Int256Div = 28,
// Cost of int256 power (`exp`) operation
Int256Pow = 29,
// Cost of int256 shift (`shl`, `shr`) operation
Int256Shift = 30
};
struct ContractCostParamEntry {
// use `ext` to add more terms (e.g. higher order polynomials) in the future
ExtensionPoint ext;
int64 constTerm;
int64 linearTerm;
};
struct StateExpirationSettings {
uint32 maxEntryExpiration;
uint32 minTempEntryExpiration;
uint32 minPersistentEntryExpiration;
uint32 autoBumpLedgers;
// rent_fee = wfee_rate_average / rent_rate_denominator_for_type
int64 persistentRentRateDenominator;
int64 tempRentRateDenominator;
// max number of entries that emit expiration meta in a single ledger
uint32 maxEntriesToExpire;
// Number of snapshots to use when calculating average BucketList size
uint32 bucketListSizeWindowSampleSize;
// Maximum number of bytes that we scan for eviction per ledger
uint64 evictionScanSize;
};
// limits the ContractCostParams size to 20kB
const CONTRACT_COST_COUNT_LIMIT = 1024;
typedef ContractCostParamEntry ContractCostParams<CONTRACT_COST_COUNT_LIMIT>;
// Identifiers of all the network settings.
enum ConfigSettingID
{
CONFIG_SETTING_CONTRACT_MAX_SIZE_BYTES = 0,
CONFIG_SETTING_CONTRACT_COMPUTE_V0 = 1,
CONFIG_SETTING_CONTRACT_LEDGER_COST_V0 = 2,
CONFIG_SETTING_CONTRACT_HISTORICAL_DATA_V0 = 3,
CONFIG_SETTING_CONTRACT_META_DATA_V0 = 4,
CONFIG_SETTING_CONTRACT_BANDWIDTH_V0 = 5,
CONFIG_SETTING_CONTRACT_COST_PARAMS_CPU_INSTRUCTIONS = 6,
CONFIG_SETTING_CONTRACT_COST_PARAMS_MEMORY_BYTES = 7,
CONFIG_SETTING_CONTRACT_DATA_KEY_SIZE_BYTES = 8,
CONFIG_SETTING_CONTRACT_DATA_ENTRY_SIZE_BYTES = 9,
CONFIG_SETTING_STATE_EXPIRATION = 10,
CONFIG_SETTING_CONTRACT_EXECUTION_LANES = 11,
CONFIG_SETTING_BUCKETLIST_SIZE_WINDOW = 12
};
union ConfigSettingEntry switch (ConfigSettingID configSettingID)
{
case CONFIG_SETTING_CONTRACT_MAX_SIZE_BYTES:
uint32 contractMaxSizeBytes;
case CONFIG_SETTING_CONTRACT_COMPUTE_V0:
ConfigSettingContractComputeV0 contractCompute;
case CONFIG_SETTING_CONTRACT_LEDGER_COST_V0:
ConfigSettingContractLedgerCostV0 contractLedgerCost;
case CONFIG_SETTING_CONTRACT_HISTORICAL_DATA_V0:
ConfigSettingContractHistoricalDataV0 contractHistoricalData;
case CONFIG_SETTING_CONTRACT_META_DATA_V0:
ConfigSettingContractMetaDataV0 contractMetaData;
case CONFIG_SETTING_CONTRACT_BANDWIDTH_V0:
ConfigSettingContractBandwidthV0 contractBandwidth;
case CONFIG_SETTING_CONTRACT_COST_PARAMS_CPU_INSTRUCTIONS:
ContractCostParams contractCostParamsCpuInsns;
case CONFIG_SETTING_CONTRACT_COST_PARAMS_MEMORY_BYTES:
ContractCostParams contractCostParamsMemBytes;
case CONFIG_SETTING_CONTRACT_DATA_KEY_SIZE_BYTES:
uint32 contractDataKeySizeBytes;
case CONFIG_SETTING_CONTRACT_DATA_ENTRY_SIZE_BYTES:
uint32 contractDataEntrySizeBytes;
case CONFIG_SETTING_STATE_EXPIRATION:
StateExpirationSettings stateExpirationSettings;
case CONFIG_SETTING_CONTRACT_EXECUTION_LANES:
ConfigSettingContractExecutionLanesV0 contractExecutionLanes;
case CONFIG_SETTING_BUCKETLIST_SIZE_WINDOW:
uint64 bucketListSizeWindow<>;
};
}