Skip to content

Commit

Permalink
Unified Create and Script logic via ChargeableTransaction (#706)
Browse files Browse the repository at this point in the history
* Versioned `GasCosts`

* Versioned `ConsensusParameters`ю
Reduced default `MAX_SIZE` to be 110kb.
Reduced default `MAX_CONTRACT_SIZE` to be 100kb.

* Updated CHANGELOG.md

* Versioned `FeeParameters`

* Versioned `PredicateParameters`, `ScriptParameters`, `ContractParameters`,

* Versioned `TxParameters`

* Updated CHANGELOG.md

* Make CI happy

* Reshuffled fields `Script` and `Create` transactions to unify part used by all chargeable transactions

* Updated CHANGELOG.md

* Unified `Create` and `Script` logic via `ChargeableTransaction`

* Updated CHANGELOG.md

* Update fuel-tx/src/transaction/id.rs

Co-authored-by: Hannes Karppila <hannes.karppila@gmail.com>

---------

Co-authored-by: Hannes Karppila <hannes.karppila@gmail.com>
  • Loading branch information
xgreenx and Dentosal authored Mar 26, 2024
1 parent 999b03f commit ac31acf
Show file tree
Hide file tree
Showing 20 changed files with 668 additions and 740 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).

#### Breaking

- [#706](https://github.com/FuelLabs/fuel-vm/pull/706): Unified `Create` and `Script` logic via `ChargeableTransaction`. The change is breaking because affects JSON serialization and deserialization. Now `Script` and `Create` transactions have `body` fields that include unique transactions.
- [#703](https://github.com/FuelLabs/fuel-vm/pull/703): Reshuffled fields `Script` and `Create` transactions to unify part used by all chargeable transactions. It breaks the serialization and deserialization and requires adoption on the SDK side.
- [#708](https://github.com/FuelLabs/fuel-vm/pull/708): Hidden `Default` params under the "test-helper" feature to avoid accidental use in production code. It is a huge breaking change for any code that has used them before in production, and instead, it should be fetched from the network. In the case of tests simply use the "test-helper" feature in your `[dev-dependencies]` section.
- [#702](https://github.com/FuelLabs/fuel-vm/pull/702): Wrapped `FeeParameters`, `PredicateParameters`, `TxParameters`, `ScriptParameters` and `ContractParameters` into an enum to support versioning.
Expand Down
10 changes: 10 additions & 0 deletions fuel-derive/src/deserialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ fn deserialize_struct(s: &mut synstructure::Structure) -> TokenStream2 {
quote! {}
};

let mut s = s.clone();

let variant: &mut synstructure::VariantInfo = &mut s.variants_mut()[0];
variant.filter(|binding| !should_skip_field_binding(binding));

s.gen_impl(quote! {
gen impl ::fuel_types::canonical::Deserialize for @Self {
fn decode_static<I: ::fuel_types::canonical::Input + ?Sized>(buffer: &mut I) -> ::core::result::Result<Self, ::fuel_types::canonical::Error> {
Expand Down Expand Up @@ -138,6 +143,11 @@ fn deserialize_enum(s: &synstructure::Structure) -> TokenStream2 {
}
};

let mut s = s.clone();
s.variants_mut().iter_mut().for_each(|v| {
v.filter(|binding| !should_skip_field_binding(binding));
});

s.gen_impl(quote! {
gen impl ::fuel_types::canonical::Deserialize for @Self {
fn decode_static<I: ::fuel_types::canonical::Input + ?Sized>(buffer: &mut I) -> ::core::result::Result<Self, ::fuel_types::canonical::Error> {
Expand Down
76 changes: 27 additions & 49 deletions fuel-derive/src/serialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,37 +8,28 @@ use crate::attribute::{

fn serialize_struct(s: &synstructure::Structure) -> TokenStream2 {
let attrs = StructAttrs::parse(s);
let mut s = s.clone();

assert_eq!(s.variants().len(), 1, "structs must have one variant");

let variant: &synstructure::VariantInfo = &s.variants()[0];
let variant: &mut synstructure::VariantInfo = &mut s.variants_mut()[0];
variant.filter(|binding| !should_skip_field_binding(binding));

let encode_static = variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
::fuel_types::canonical::Serialize::encode_static(#binding, buffer)?;
}
quote! {
::fuel_types::canonical::Serialize::encode_static(#binding, buffer)?;
}
});

let encode_dynamic = variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
::fuel_types::canonical::Serialize::encode_dynamic(#binding, buffer)?;
}
quote! {
::fuel_types::canonical::Serialize::encode_dynamic(#binding, buffer)?;
}
});

let size_static_code = variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_static());
}
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_static());
}
});

Expand All @@ -50,12 +41,8 @@ fn serialize_struct(s: &synstructure::Structure) -> TokenStream2 {
let size_static_code = quote! { #initial_size match self { #size_static_code}; size };

let size_dynamic_code = variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_dynamic());
}
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_dynamic());
}
});
let size_dynamic_code =
Expand Down Expand Up @@ -104,16 +91,19 @@ fn serialize_struct(s: &synstructure::Structure) -> TokenStream2 {

fn serialize_enum(s: &synstructure::Structure) -> TokenStream2 {
assert!(!s.variants().is_empty(), "got invalid empty enum");
let mut s = s.clone();
let mut next_discriminant = quote! { { 0u64 } };

s.variants_mut().iter_mut().for_each(|v| {
v.filter(|binding| !should_skip_field_binding(binding));
});

let encode_static = s.variants().iter().map(|v| {
let pat = v.pat();

let encode_static_iter = v.bindings().iter().map(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
::fuel_types::canonical::Serialize::encode_static(#binding, buffer)?;
}
quote! {
::fuel_types::canonical::Serialize::encode_static(#binding, buffer)?;
}
});

Expand All @@ -138,12 +128,8 @@ fn serialize_enum(s: &synstructure::Structure) -> TokenStream2 {
});
let encode_dynamic = s.variants().iter().map(|v| {
let encode_dynamic_iter = v.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
::fuel_types::canonical::Serialize::encode_dynamic(#binding, buffer)?;
}
quote! {
::fuel_types::canonical::Serialize::encode_dynamic(#binding, buffer)?;
}
});
quote! {
Expand All @@ -156,12 +142,8 @@ fn serialize_enum(s: &synstructure::Structure) -> TokenStream2 {
.iter()
.map(|variant| {
variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_static());
}
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_static());
}
})
})
Expand All @@ -177,12 +159,8 @@ fn serialize_enum(s: &synstructure::Structure) -> TokenStream2 {
.iter()
.map(|variant| {
variant.each(|binding| {
if should_skip_field_binding(binding) {
quote! {}
} else {
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_dynamic());
}
quote! {
size = ::fuel_types::canonical::add_sizes(size, #binding.size_dynamic());
}
})
})
Expand Down
24 changes: 16 additions & 8 deletions fuel-tx/src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ use crate::{
WitnessLimit,
},
policies::Policies,
transaction::{
CreateBody,
ScriptBody,
},
};
use alloc::{
collections::BTreeMap,
Expand Down Expand Up @@ -116,14 +120,16 @@ pub struct TransactionBuilder<Tx> {
impl TransactionBuilder<Script> {
pub fn script(script: Vec<u8>, script_data: Vec<u8>) -> Self {
let tx = Script {
script_gas_limit: Default::default(),
script,
script_data,
body: ScriptBody {
script_gas_limit: Default::default(),
receipts_root: Default::default(),
script,
script_data,
},
policies: Policies::new().with_max_fee(0),
inputs: Default::default(),
outputs: Default::default(),
witnesses: Default::default(),
receipts_root: Default::default(),
metadata: None,
};
Self::with_tx(tx)
Expand All @@ -139,10 +145,12 @@ impl TransactionBuilder<Create> {
// sort the storage slots before initializing the builder
storage_slots.sort();
let mut tx = Create {
bytecode_length: Default::default(),
bytecode_witness_index: Default::default(),
salt,
storage_slots,
body: CreateBody {
bytecode_length: Default::default(),
bytecode_witness_index: Default::default(),
salt,
storage_slots,
},
policies: Policies::new().with_max_fee(0),
inputs: Default::default(),
outputs: Default::default(),
Expand Down
1 change: 1 addition & 0 deletions fuel-tx/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ pub use transaction::{
};

pub use transaction::{
PrepareSign,
Signable,
UniqueIdentifier,
};
Expand Down
Loading

0 comments on commit ac31acf

Please sign in to comment.