Releases: FuelLabs/fuel-vm
v0.34.0
Release v0.34.0
This release contains fixes for critical issues that we found before the audit. Mainly, these changes pertain to the Sparse Merkle Tree (SMT) and related code. The SMT API was extended to provide more flexibility and to allow users to select the most appropriate method their performance needs. Where possible, sequential SMT updates were replaced with constructors that take in a complete data set.
Added
-
#476: The
fuel_vm::Call
supportsFrom<[u8; Self::LEN]>
andInto<[u8; Self::LEN]>
. -
#484: The
sparse::in_memory::MerkleTree
got new methodsfrom_set
,root_from_set
, andnodes_from_set
methods. These methods allow a more optimal way to build and calculate the SMT when you know all leaves. TheContract::initial_state_root
is much faster now (by ~15 times).
Removed
- #478: The
CheckedMemRange
is replaced by theMemoryRange
.
Changed
-
#477: The
PanicReason::UnknownPanicReason
is0x00
. ThePanicReason
now implementsFrom<u8>
instead ofTryFrom<u8>
and can't return an error anymore. -
#478: The
memcopy
method is updated and returnsMemoryWriteOverlap
instead ofMemoryOverflow
.
Fixed
-
#482: This PR address a security issue where updates to a Sparse Merkle Tree could deliberately overwrite existing leaves by setting the leaf key to the hash of an existing leaf or node. This is done by removing the insertion of the leaf using the leaf key.
-
#484: Fixed bug with not-working
CreateMetadata
.
Breaking
-
#473: CFS and CFSI were not validating
that the new$sp
value isn't below$ssp
, allowing write access to non-owned
memory. This is now fixed, and attempting to set an incorrect$sp
value panics. -
#485: This PR addresses a security
issue where the user may manipulate the structure of the Sparse Merkle Tree.
SMT expects hashed storage key wrapped into aMerkleTreeKey
structure.
The change is breaking because it changes thestate_root
generated by the SMT
and may change theContractId
if theCreate
transaction has non-emptyStoargeSlot
s.
All changes:
- Disallow setting $sp < $ssp using CFS and CFSI instructions by @Dentosal in #473
- MemoryRange rework by @Dentosal in #478
- Return the previous behavior of the data length GTF by @xgreenx in #481
- chore: optimize smt common prefix count by @bvrooman in #475
- refactor: SMT path iter uses leaf key by @bvrooman in #482
- Added a test to show a problem with leaf overriding by @xgreenx in #469
- Minor readibility improvements by @Dentosal in #476
- feat: SMT update set by @bvrooman in #467
- Added more detailed descriptions to README files by @xgreenx in #487
- Use a new
sparse::MerkleTree::from_set
function to calculate state root by @xgreenx in #484 - Changed the API of the
SparseMerkleTree
to acceptMerkleStorageKey
by @xgreenx in #485 - PanicReason rework by @Dentosal in #477
- Use nightly rustfmt with
.rustfmt.toml
fromfuel-core
by @xgreenx in #489 - Bump version to
0.34.0
and finilized the CHANGELOG.md by @xgreenx in #488 - dev-deps on local crate must use path by @Voxelot in #490
Full Changelog: v0.33.0...v0.34.0
v0.31.2
v0.33.0
Release v0.33.0
The release contains a lot of breaking changes.
Most of them are audit blockers and affect the protocol itself.
Starting this release we plan to maintain the changelog file and describe all minor and major changes that make sense.
Added
Breaking
-
#386: The coin and message inputs
got a new field -predicate_gas_used
. So it breaks the constructor API
of these inputs.The value of this field is zero for non-predicate inputs, but for the
predicates, it indicates the exact amount of gas used by the predicate
to execute. If after the execution of the predicate remaining gas is not
zero, then the predicate execution failed.This field is malleable but will be used by the VM, and each predicate
should be estimated before performing the verification logic.
TheTransaction
,Create
, andScript
types implement the
EstimatePredicates
for these purposes./// Provides predicate estimation functionality for the transaction. pub trait EstimatePredicates: Sized { /// Estimates predicates of the transaction. fn estimate_predicates(&mut self, params: &ConsensusParameters, gas_costs: &GasCosts) -> Result<(), CheckError>; }
During the creation of the
Input
, the best strategy is to use a default
value like0
and call theestimate_predicates
method to actualize
thepredicate_gas_used
after. -
#454: VM native array-backed types
Address
,AssetId
,ContractId
,Bytes4
,Bytes8
,Bytes20
,Bytes32
,
Nonce
,MessageId
,Salt
now use more compact representation instead of
hex-encoded string when serialized using serde format that sets
is_human_readable
to false. -
#456: Added a new type -
ChainId
to represent the identifier of the chain.
It is a wrapper around theu64
, so anyu64
can be converted into this type via.into()
orChainId::new(...)
. -
#459 Require witness index to be specified when adding an unsigned coin to a transaction.
This allows for better reuse of witness data when using the transaction builder and helper methods to make transactions compact. -
#462: Adds a
cache
parameter toInput::check
andInput::check_signature
.
This is used to avoid redundant signature recovery when multiple inputs share the same witness index.
Changed
- #458: Automatically sort storage slots for creation transactions.
Breaking
-
#386: Several methods of the
TransactionFee
are renamedtotal
->max_fee
andbytes
->min_fee
. TheTransactionFee::min_fee
take into account the gas used by predicates. -
#450: The Merkle root of a contract's code is now calculated by partitioning the code into chunks of 16 KiB, instead of 8 bytes. If the last leaf is does not a full 16 KiB, it is padded with
0
up to the nearest multiple of 8 bytes. This affects theContractId
andPredicateId
calculations, breaking all code that used hardcoded values. -
#456: The basic methods
UniqueIdentifier::id
,Signable::sign_inputs
,
andInput::predicate_owner
useChainId
instead of theConsensusParameters
.
It is a less strict requirement than before because you can getChainId
fromConsensusParameters.chain_id
, and it makes the API cleaner.
It affects all downstream functions that use listed methods. -
#463: Moves verification that the
Output::ContractCreated
output contains validcontract_id
andstate_root
(the values from theOutput
match with calculated
values from the bytecode, storage slots, and salt) fromfuel-vm
tofuel-tx
.
It means the end-user will receive this error earlier on the SDK side beforedry_run
instead of after.
Fixed
Breaking
-
#457: Transactions got one more validity rule:
EachScript
orCreate
transaction requires at least one input coin or message to be spendable.
It may break code/tests that previously didn't set any spendable inputs.
Note:Message
with non-emptydata
field is not spendable. -
#458: The storage slots with the same key inside the
Create
transaction are forbidden.
All changes:
- Add empty changelog file by @xgreenx in #455
- Added a new type
ChainId
and re-used it for signing of transactions by @xgreenx in #456 - Sort storage slots on create transactions automatically by @Voxelot in #458
- Do not hex-format primitives when format doesn't require it by @Dentosal in #454
- Predicate Estimation VM part by @xgreenx in #460
- Reuse witnesses for identical secrets when building transactions by @Voxelot in #459
- Inputs have at least one spendable coin or message by @xgreenx in #457
- feat: Update contract leaf size by @bvrooman in #450
- Signature caching during validation by @Voxelot in #462
- Moved the check of the
contract_id
andstate_root
fromfuel-vm
tofuel-tx
by @xgreenx in #463 - Minor improvements during integration with
fuel-core
by @xgreenx in #465 - Bump version to
0.33.0
by @xgreenx in #466
Full Changelog: v0.32.0...v0.33.0
v0.32.0
A new release adds support for wide math operations that should decrease the size of the contracts.
Breaking
- Renamed
InstructionResult
intoPanicInstruction
- #444
What's Changed
- Add wide math operations by @Dentosal in #424
- Do not panic when shifting by more than u32::MAX bits by @Dentosal in #433
- Allow empty range in the checked memory by @xgreenx in #436
- Modify "with" functions for consensus parameters by @mitch-fuel in #446
- Fix to_bytes for numeric types by @Voxelot in #447
- Addressing minor issues by @xgreenx in #444
- Bump the version to the
0.32.0
by @xgreenx in #449
Full Changelog: v0.31.0...v0.32.0
v0.31.1
v0.31.0
v0.26.3
v0.26.2
v0.30.0
What's Changed
- Missed to use
BlockHeight
in theblock_hash
by @xgreenx in #412 - Chain ID included in transaction ID's and predicate owners by @Voxelot in #406
- Truncate large binary arrays when debug logging by @Voxelot in #413
- Add rest of the ALU test cases by @Dentosal in #414
- Add tests for cb, bhsh and bhei instructions by @Dentosal in #418
- Ownership test of a validly-positioned zero-length range should succeed by @Dentosal in #416
- Add convenience API for getting transaction ID without ConsensusParameters by @Voxelot in #419
- bump to 0.30.0 in support of chain id by @Voxelot in #420
Full Changelog: v0.29.0...v0.30.0
v0.29.0
What's Changed
- Upgrade runners by @Voxelot in #401
- Make SMO instruction take data ptr as an argument by @Dentosal in #404
- Make verification for binary merkle tree public by @xgreenx in #405
- Upgrade criterion to 0.4 by @Dentosal in #408
- chore: Refactor BMT proof data tests to use encoded value by @bvrooman in #409
- Make SMO charge from contract balance in internal context by @Dentosal in #407
- Added
BlockHeight
type and unified the code to use it everywhere by @xgreenx in #410 - 0.29.0 release prep by @Voxelot in #411
Full Changelog: v0.28.1...v0.29.0