v0.42.0
Version v0.42.0
Changed
Breaking
-
#629: Charge the user for VM initialization.
-
#628: Renamed
transaction::CheckError
totransaction::ValidityError
.
Created a newchecked_transaction::CheckError
that combinesValidityError
andPredicateVerificationFailed
errors into one. It allows the return of the
PredicateVerificationFailed
to the end user instead of losing the reason why predicate verification failed. -
#625: Use
ArithmeticError
only for arithmetic operations, and introduce new errors likeBalanceOverflow
for others. Whenever an error is internally caused by a type conversion tousize
, so that an overflowing value wouldn't map to a valid index anyway, return the missing item error instead. -
#623:
Added support for transaction policies. TheScript
andCreate
transactions received a new field,policies
. Policies allow the addition
of some limits to the transaction to protect the user or specify some details regarding execution.
This change makes theGasPrice
andMaturity
fields optional, allowing to save space in the future.
Also, this will enable us to support multidimensional prices later.
GasLimit
was renamed toScriptGasLimit
.Along with this change, we introduced two new policies:
WitnessLimit
- allows the limitation of the maximum size of witnesses in bytes for the contract. Because of the changes in the gas calculation model(the blockchain also charges the user for the witness data), the user should protect himself from the block producer or third parties blowing up witness data and draining the user's funds.MaxFee
- allows the upper bound for the maximum fee that users agree to pay for the transaction.
This change brings the following modification to the gas model:
- The
ScriptGasLimit
only limits script execution. Previously, theScriptGasLimit
also limited the predicate execution time, instead predicate gas is now directly included intomin_fee
. So, it is not possible to use theScriptGasLimit
for transaction cost limitations. A newMaxFee
policy is a way to do that. TheGasLimit
field was removed from theCreate
transaction because it only relates to the script execution (which theCreate
transaction doesn't have). - The blockchain charges the user for the size of witness data (before it was free). There is no separate price for the storage, so it uses gas to charge the user. This change affects
min_gas
andmin_fee
calculation. - A new policy called
WitnessLimit
also impacts themax_gas
andmax_fee
calculation in addition toScriptGasLimit
(in the case ofCreate
transaction onlyWitnessLimit
affects themax_gas
andmax_fee
). - The minimal gas also charges the user for transaction ID calculation.
The change has the following modification to the transaction layout:
- The
Create
transaction doesn't have theScriptGasLimit
field anymore. Because theCreate
transaction doesn't have any script to execute - The
Create
andScript
transactions don't have explicitmaturity
andgas_price
fields. Instead, these fields can be set via a newpolicies
field. - The
Create
andScript
transactions have a newpolicies
field with a unique canonical serialization and deserialization for optimal space consumption.
Other breaking changes caused by the change:
- Each transaction requires setting the
GasPrice
policy. - Previously,
ScriptGasLimit
should be less than theMAX_GAS_PER_TX
constant. After removing this field from theCreate
transaction, it is impossible to require it. Instead, it requires thatmax_gas <= MAX_GAS_PER_TX
for any transaction. Consequently, anyScript
transaction that usesMAX_GAS_PER_TX
as aScriptGasLimit
will always fail because of a new rule. Setting the estimated gas usage instead solves the problem. - If the
max_fee > policies.max_fee
, then transaction will be rejected. - If the
witnessses_size > policies.witness_limit
, then transaction will be rejected. - GTF opcode changed its hardcoded constants for fields. It should be updated according to the values from the specification on the Sway side.
-
#633: Limit receipt count to
u16::MAX
. -
#634: Charge for storage per new byte written. Write opcodes now return the number of new storage slots created, instead of just a boolean on whether the value existed before.
Fixed
- #627: Added removal of obsolete SMT nodes along the path during
update
anddelete
operations.
What's Changed
- Support transaction policies by @xgreenx in #623
- Remove SMT nodes along the path during
update
by @xgreenx in #627 - Limit ReceiptsCtx to u16::MAX receipts by @Dentosal in #633
- Charge the user for VM initialization by @xgreenx in #629
- Return
PredicateVerificationFailed
error to the user by @xgreenx in #628 - Split ArithmeticError into more granular errors by @Dentosal in #625
- Charge for new storage bytes by @Dentosal in #634
- Release v0.42.0 by @xgreenx in #635
Full Changelog: v0.41.0...v0.42.0