Skip to content

Commit

Permalink
Malleable Blocks Part 2 (#186)
Browse files Browse the repository at this point in the history
addresses feedback from #180
  • Loading branch information
Voxelot committed Mar 2, 2022
1 parent eb2fde8 commit 10a47d0
Show file tree
Hide file tree
Showing 13 changed files with 263 additions and 182 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 20 additions & 14 deletions fuel-client/tests/blocks.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use chrono::{TimeZone, Utc};
use fuel_core::database::Database;
use fuel_core::model::fuel_block::FuelBlockHeaders;
use fuel_core::model::fuel_block::FuelBlockHeader;
use fuel_core::{
model::fuel_block::FuelBlockLight,
model::fuel_block::FuelBlockDb,
schema::scalars::HexString256,
service::{Config, FuelService},
};
Expand All @@ -14,10 +14,10 @@ use itertools::{rev, Itertools};
#[tokio::test]
async fn block() {
// setup test data in the node
let block = FuelBlockLight::default();
let block = FuelBlockDb::default();
let id = block.id();
let mut db = Database::default();
Storage::<Bytes32, FuelBlockLight>::insert(&mut db, &id, &block).unwrap();
Storage::<Bytes32, FuelBlockDb>::insert(&mut db, &id, &block).unwrap();

// setup server & client
let srv = FuelService::from_database(db, Config::local_node())
Expand All @@ -37,12 +37,15 @@ async fn block() {
async fn block_connection_first_5() {
// blocks
let blocks = (0..10u32)
.map(|i| FuelBlockLight {
headers: FuelBlockHeaders {
fuel_height: i.into(),
.map(|i| FuelBlockDb {
headers: FuelBlockHeader {
height: i.into(),
number: Default::default(),
parent_hash: Default::default(),
time: Utc.timestamp(i.into(), 0),
producer: Default::default(),
transactions_commitment: Default::default(),
transactions_root: Default::default(),
prev_root: Default::default(),
},
transactions: vec![],
})
Expand All @@ -52,7 +55,7 @@ async fn block_connection_first_5() {
let mut db = Database::default();
for block in blocks {
let id = block.id();
Storage::<Bytes32, FuelBlockLight>::insert(&mut db, &id, &block).unwrap();
Storage::<Bytes32, FuelBlockDb>::insert(&mut db, &id, &block).unwrap();
}

// setup server & client
Expand Down Expand Up @@ -83,12 +86,15 @@ async fn block_connection_first_5() {
async fn block_connection_last_5() {
// blocks
let blocks = (0..10u32)
.map(|i| FuelBlockLight {
headers: FuelBlockHeaders {
fuel_height: i.into(),
.map(|i| FuelBlockDb {
headers: FuelBlockHeader {
height: i.into(),
number: Default::default(),
parent_hash: Default::default(),
time: Utc.timestamp(i.into(), 0),
producer: Default::default(),
transactions_commitment: Default::default(),
transactions_root: Default::default(),
prev_root: Default::default(),
},
transactions: vec![],
})
Expand All @@ -98,7 +104,7 @@ async fn block_connection_last_5() {
let mut db = Database::default();
for block in blocks {
let id = block.id();
Storage::<Bytes32, FuelBlockLight>::insert(&mut db, &id, &block).unwrap();
Storage::<Bytes32, FuelBlockDb>::insert(&mut db, &id, &block).unwrap();
}

// setup server & client
Expand Down
24 changes: 15 additions & 9 deletions fuel-client/tests/tx.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use chrono::Utc;
use fuel_core::executor::ExecutionMode;
use fuel_core::model::fuel_block::{FuelBlockFull, FuelBlockHeaders};
use fuel_core::model::fuel_block::{FuelBlock, FuelBlockHeader};
use fuel_core::{
database::Database,
executor::Executor,
Expand Down Expand Up @@ -265,25 +265,31 @@ async fn get_transactions_from_manual_blocks() {
let txs: Vec<Transaction> = (0..10).map(create_mock_tx).collect();

// make 1st test block
let mut first_test_block = FuelBlockFull {
headers: FuelBlockHeaders {
fuel_height: 1u32.into(),
let mut first_test_block = FuelBlock {
header: FuelBlockHeader {
height: 1u32.into(),
number: Default::default(),
parent_hash: Default::default(),
time: Utc::now(),
producer: Default::default(),
transactions_commitment: Default::default(),
transactions_root: Default::default(),
prev_root: Default::default(),
},

// set the first 5 ids of the manually saved txs
transactions: txs.iter().take(5).cloned().collect(),
};

// make 2nd test block
let mut second_test_block = FuelBlockFull {
headers: FuelBlockHeaders {
fuel_height: 2u32.into(),
let mut second_test_block = FuelBlock {
header: FuelBlockHeader {
height: 2u32.into(),
number: Default::default(),
parent_hash: Default::default(),
time: Utc::now(),
producer: Default::default(),
transactions_commitment: Default::default(),
transactions_root: Default::default(),
prev_root: Default::default(),
},
// set the last 5 ids of the manually saved txs
transactions: txs.iter().skip(5).take(5).cloned().collect(),
Expand Down
1 change: 1 addition & 0 deletions fuel-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ dirs = "3.0"
env_logger = "0.9"
fuel-asm = { version = "0.1", features = ["serde-types"] }
fuel-core-interfaces = { path = "../fuel-core-interfaces", version = "0.3.2" }
fuel-merkle = "0.1"
fuel-storage = { version = "0.1" }
fuel-tx = { version = "0.5", features = ["serde-types"] }
fuel-txpool = { path = "../fuel-txpool", version = "0.3.2" }
Expand Down
4 changes: 2 additions & 2 deletions fuel-core/src/database.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#[cfg(feature = "rocksdb")]
use crate::database::columns::COLUMN_NUM;
use crate::database::transactional::DatabaseTransaction;
use crate::model::fuel_block::FuelBlockLight;
use crate::model::fuel_block::FuelBlockDb;
#[cfg(feature = "rocksdb")]
use crate::state::rocks_db::RocksDb;
use crate::state::{
Expand Down Expand Up @@ -174,7 +174,7 @@ impl InterpreterStorage for Database {
fn coinbase(&self) -> Result<Address, Error> {
let height = self.get_block_height()?.unwrap_or_default();
let id = self.block_hash(height.into())?;
let block = Storage::<Bytes32, FuelBlockLight>::get(self, &id)?.unwrap_or_default();
let block = Storage::<Bytes32, FuelBlockDb>::get(self, &id)?.unwrap_or_default();
Ok(block.headers.producer)
}
}
18 changes: 9 additions & 9 deletions fuel-core/src/database/block.rs
Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
use crate::{
database::{columns::BLOCKS, columns::BLOCK_IDS, Database, KvStoreError},
model::fuel_block::{BlockHeight, FuelBlockLight},
model::fuel_block::{BlockHeight, FuelBlockDb},
state::{Error, IterDirection},
};
use fuel_storage::Storage;
use fuel_tx::Bytes32;
use std::borrow::Cow;
use std::convert::{TryFrom, TryInto};

impl Storage<Bytes32, FuelBlockLight> for Database {
impl Storage<Bytes32, FuelBlockDb> for Database {
type Error = KvStoreError;

fn insert(
&mut self,
key: &Bytes32,
value: &FuelBlockLight,
) -> Result<Option<FuelBlockLight>, KvStoreError> {
Database::insert(self, value.headers.fuel_height, BLOCK_IDS, *key)?;
value: &FuelBlockDb,
) -> Result<Option<FuelBlockDb>, KvStoreError> {
Database::insert(self, value.headers.height, BLOCK_IDS, *key)?;
Database::insert(self, key.as_ref(), BLOCKS, value.clone()).map_err(Into::into)
}

fn remove(&mut self, key: &Bytes32) -> Result<Option<FuelBlockLight>, KvStoreError> {
let block: Option<FuelBlockLight> = Database::remove(self, key.as_ref(), BLOCKS)?;
fn remove(&mut self, key: &Bytes32) -> Result<Option<FuelBlockDb>, KvStoreError> {
let block: Option<FuelBlockDb> = Database::remove(self, key.as_ref(), BLOCKS)?;
if let Some(block) = &block {
let _: Option<Bytes32> =
Database::remove(self, &block.headers.fuel_height.to_bytes(), BLOCK_IDS)?;
Database::remove(self, &block.headers.height.to_bytes(), BLOCK_IDS)?;
}
Ok(block)
}

fn get(&self, key: &Bytes32) -> Result<Option<Cow<FuelBlockLight>>, KvStoreError> {
fn get(&self, key: &Bytes32) -> Result<Option<Cow<FuelBlockDb>>, KvStoreError> {
Database::get(self, key.as_ref(), BLOCKS).map_err(Into::into)
}

Expand Down
6 changes: 4 additions & 2 deletions fuel-core/src/database/contracts.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use crate::database::columns::CONTRACT_UTXO_ID;
use crate::{
database::{columns::CONTRACTS, Database},
database::{
columns::{CONTRACTS, CONTRACT_UTXO_ID},
Database,
},
state::Error,
};
use fuel_tx::UtxoId;
Expand Down

0 comments on commit 10a47d0

Please sign in to comment.