Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add MerkleStorage trait to data #11

Merged
merged 20 commits into from
Aug 19, 2021
Merged

Add MerkleStorage trait to data #11

merged 20 commits into from
Aug 19, 2021

Conversation

vlopes11
Copy link
Contributor

@vlopes11 vlopes11 commented Aug 9, 2021

The merkle storage trait will extend the storage functionality, adding
the ability to calculate the merkle root.

The contract code root assumes a small in-memory merkle tree is used as
backend to calculate the contract id.

This commit also included the improvement over the instructions
execution that the opcodes are enforced by design to have consistent
register references (e.g. they only stored in 6 bits - hence they can't
overflow the 64 available registers). This means that range check for
read-only registers is not required.

The merkle storage trait will extend the storage functionality, adding
the ability to calculate the merkle root.

The contract code root assumes a small in-memory merkle tree is used as
backend to calculate the contract id.

This commit also included the improvement over the instructions
execution that the opcodes are enforced by design to have consistent
register references (e.g. they only stored in 6 bits - hence they can't
overflow the 64 available registers). This means that range check for
read-only registers is not required.
@vlopes11 vlopes11 self-assigned this Aug 9, 2021
@vlopes11
Copy link
Contributor Author

For the merkle storage trait, we can either expect a single structure to be the wrapper to all the underlying behavior such as merkle tree, sparse merkle tree, traditional KVS, etc; or we can have one generic type for every expected implementation (example: a dedicated type for the contract ID merkle root calculation).

I prefer the first (a single wrapper type) because this way the code is more readable and if we want to swap the implementor of one of the aspects, we just update the wrapper type. The syntax would be Interpreter<MemoryStorage> or Interpreter<FooStorage> and both MemoryStorage/FooStorage will be responsible to implement the internal strategies for every trait requirement of the VM. Example: the expected Storage<K, V> + MerkleStorage<K, V>, for (K, V) = (Word, [u8; 8]), is the implementation that is going to be used as code root merkle tree -> contract id.

The alternative is to use generic types for every of the specific implementations (example: code root merkle tree). This undermines the code readability and may lead to huge/coupled types. Example: Interpreter<MemoryStorage, CodeRootMerkleProvider, FooMerkleProvider>. The advantage of this approach is we discard the need of a wrapper that will need to have some knowledge of the specifics of the VM (example: the wrapper need to know that MerkleStorage<Word, [u8; 8> is used to calculate the code root).

@adlerjohn
Copy link
Contributor

I don't have strong opinions one way or the other on the interface. Note two things:

  1. The Merkle storages should return a hash, not a contract ID, on writes.
  2. Computing the contract ID from bytecode is actually not a storage op, it's a pure operation. So it should probably be done entirely in the VM, and not be present in the storage trait.

src/data/memory.rs Outdated Show resolved Hide resolved
src/data.rs Outdated Show resolved Hide resolved
src/interpreter/contract.rs Outdated Show resolved Hide resolved
@Voxelot
Copy link
Member

Voxelot commented Aug 13, 2021

Take it or leave it, here's one way the alternative proposal could make the Interpreter less painful to work with so you don't need to specify a dozen generic params each time it's used. It's got some of it's own boilerplate, but provides flexibility to separate out the data interfaces however is needed. This may feel more verbose and complicated in other ways, so I'm fine with sticking to the original approach for now.

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a75a1e07d407068356b0ca99e9fd313d

@vlopes11
Copy link
Contributor Author

Take it or leave it, here's one way the alternative proposal could make the Interpreter less painful to work with so you don't need to specify a dozen generic params each time it's used. It's got some of it's own boilerplate, but provides flexibility to separate out the data interfaces however is needed. This may feel more verbose and complicated in other ways, so I'm fine with sticking to the original approach for now.

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a75a1e07d407068356b0ca99e9fd313d

I like this approach you suggested.

The main advantage of the current approach is that we can have a single type with different trait implementations that will map the behavior of the storage according to the VM functionality. This prevents us from having duplicate concrete types that will behave the same way but for different underlying types.

Example:
impl Storage<ContractId, Contract> for FooStorage {..}
impl Storage<ContractId, ContractState> for FooStorage {..}

or

impl Storage<ContractId, Contract> for ContractCodeProvider {..}
impl Storage<ContractId, ContractState> for ContractStateProvider {..}

struct BarStorageProvider {
  type CodeProvider = ContractCodeProvider;
  type StateProvider = ContractStateProvider;
}

I'll make some tests and compare the differences

@Voxelot
Copy link
Member

Voxelot commented Aug 14, 2021

You don't have to use different structs for each type, so you could do it like this:

type ContractState = Bytes32
type MerkleRoot = Bytes32

impl Storage<ContractId, Contract> for MemoryStore {..}
impl Storage<ContractId, ContractState> for MemoryStore {..}
impl Storage<ContractId, MerkleRoot> for MerkleRootProvider {..}

struct BarStorageProvider {
  type CodeProvider = MemoryStore;
  type StateProvider = MemoryStore;
  type ContractMerkleRoot = MerkleRootProvider;
}

The main difference from what we have now is that the intent around each provider is a little more clear and we can disambiguate between Storage<K, V>'s with similar primitive values.

If you want to keep all the providers independent, they could just be newtype-wrappers around a generic MemoryStore type.

struct MemoryStore<K, V> { .. }
impl<K, V> Storage for MemoryStore<K, V> { }

struct BalanceProvider(MemoryStore<([u8;32], [u8;32]), [u8;32]>);
impl Storage<([u8;32], [u8;32]), [u8;32]> for BalanceProvider { 
    fn get(&self, key: &K) -> Option<&V> {
        self.0.get(key)
    }
}

While this cuts down some redundant impl, there is still a lot of wrapper to implement. Here is an admittedly lazy way of doing it if you really don't want to manually implement a impl Storage<K, V> for Provider for each provider wrapper type that just does a passthrough to a generic MemoryStore. Although this type of thing could also be automated with a macro.

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=bbd13bc662df38578c077dc3f9252f92

@vlopes11
Copy link
Contributor Author

@Voxelot I liked the approach you suggested. But we have an open question.

Considering this trait:

pub trait InterpreterStorage:
{
    type ContractStateProvider: KeyedMerkleStorage<ContractId, ContractData, (), ContractState>;
    type ColorBalanceProvider: KeyedMerkleStorage<ContractId, (), Color, Word>;
    type ContractMapProvider: KeyedMerkleStorage<ContractId, (), Bytes32, Bytes32>;

    fn block_height(&self) -> Result<u32, DataError>;
    fn coinbase(&self) -> Result<Address, DataError>;
    fn block_data(&self, block_height: u32) -> Result<BlockData, DataError>;
}

It forces us to have multiple attributes of the interpreter as the storage. Example:

struct Interpreter {
    ...,
    contract_state_provider: S::ContractStateProvider,
    color_balance_provider: S::ColorBalanceProvider,
    contract_map_provider: S::ContractMapProvider,
}

Instead of

struct Interpreter {
    ...,
    storage: S
}

We cannot expect the Interpreter::with_storage to take multiple arguments for each of these storages because it would create a hard coupling between the consumers of the interpreter and its internal storage requirements.

Example: If someday we decide to get rid of the contract_map_provider, we might produce an API breaking change for all Interpreter::with_storage(storage1, storage2, ...) calls (probably everywhere; from forc to graphql). However, if we only have storage: S, we just update the storage implementations + trait and Interpreter::with_storage(foo_storage) will still work as long as foo_storage meet the requirements.

As alternative, we can require InterpreterStorage to provide fn contract_state_provider(&self) -> &S::ContractStateProvider, but that kinda kills the purpose of having the dynamic types since the wrapper itself will still have to hold references to the providers (and that probably would be just &Self).

I think its best we just leave it as is for now until we come with a solution for the dynamic types that allows us to create an interpreter instance with only Interpreter::with_storage(foo_storage)

@vlopes11
Copy link
Contributor Author

vlopes11 commented Aug 15, 2021

@adlerjohn do you agree

type ContractStateProvider: KeyedMerkleStorage<ContractId, ContractData, (), ContractState>;

supersede

type ContractMapProvider: KeyedMerkleStorage<ContractId, (), Bytes32, Bytes32>;
?

We could keep the map provider as helper to the contract users, but maybe they can implement it themselves using the state storage. That looks like more of a responsibility of the high level language.

A TODO feature of the contract state is to return memory references instead of owned bulks in order to support huge contract states.

src/data.rs Outdated Show resolved Hide resolved
src/data.rs Outdated Show resolved Hide resolved
src/data/memory.rs Outdated Show resolved Hide resolved
If the merkle storage trait relies on the simple KVS trait, some
additional copy will need to be performed to use the parent key + key
tuple as reference to the storage.
pub(crate) fn burn(&mut self, a: Word) -> Result<(), ExecuteError> {
let (c, cx) = self.internal_contract_bounds()?;

// Safety: Memory bounds logically verified by the interpreter
Copy link
Member

@Voxelot Voxelot Aug 19, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not going to block, but I don't think this justification is sufficient. It should explain what about the interpreter allows us to do unsafe buffer access in this particular scenario.

Copy link
Member

@Voxelot Voxelot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One of my main concerns is rushing in the extensive use of unsafe code. The risk here is big, since as a distributed system everyone will need to be able to run arbitrary code put into their VM.

However, so far I haven't seen any lifetime rules broken or anything like that. But in the future I think we shouldn't be so eager to use unsafe code without more thorough justifications in the code comments.

@vlopes11 vlopes11 merged commit 9451fc9 into master Aug 19, 2021
@vlopes11 vlopes11 deleted the vlopes11/merkle-trait branch August 19, 2021 16:06
ControlCplusControlV pushed a commit that referenced this pull request Nov 24, 2022
ControlCplusControlV pushed a commit that referenced this pull request Nov 24, 2022
ControlCplusControlV pushed a commit that referenced this pull request Nov 24, 2022
ControlCplusControlV pushed a commit that referenced this pull request Dec 1, 2022
ControlCplusControlV pushed a commit that referenced this pull request Dec 1, 2022
ControlCplusControlV pushed a commit that referenced this pull request Dec 1, 2022
mitchmindtree pushed a commit that referenced this pull request Dec 5, 2022
@mitchmindtree mitchmindtree added the fuel-vm Related to the `fuel-vm` crate. label Dec 9, 2022
xgreenx pushed a commit that referenced this pull request Dec 20, 2022
xgreenx pushed a commit that referenced this pull request Dec 20, 2022
xgreenx pushed a commit that referenced this pull request Dec 20, 2022
xgreenx pushed a commit that referenced this pull request Dec 20, 2022
xgreenx pushed a commit that referenced this pull request Dec 20, 2022
xgreenx pushed a commit that referenced this pull request Dec 20, 2022
xgreenx pushed a commit that referenced this pull request Dec 20, 2022
xgreenx pushed a commit that referenced this pull request Dec 20, 2022
ControlCplusControlV pushed a commit that referenced this pull request Jan 13, 2023
* Refactor hash functions into separate file for BMT

* Update merkle_tree.rs

* Refactor NODE and LEAF as u8

* Remove generics

* Remove commented line

* Update mod.rs

* Remove deprecated files

* Lazy static empty sum

* Update Cargo.toml

* Update Cargo.toml

* Update hash.rs

* Return ref to empty sum
Voxelot added a commit that referenced this pull request Jan 24, 2023
* Initial commit

* Add test and format CI. (#2)

* Feature: Initial Binary Merkle Tree Implementation (#1)

* Initial Merkle Tree Implementation

* Delete verify.rs

* Remove unimplemented asmut

* Unpin dependencies

* Remove mod verify

* Add default implementation

* Remove IDE specifics from gitfile

* Pin minimum versions in dependencies

* Fix format with fmt

* Feature: Binary Merkle proof set and Verify (#3)

* Initial Merkle Tree Implementation

* Delete verify.rs

* Remove IDE specifics from gitfile

* Proof set

* Remove unused line

* fmt

* Implement proof and tests

* Refactor

* Simplify loop

* Update merkle_tree.rs

* Convert next_height and next_data to return options

* Refactor proof set

* Clippy

* Verify

* Format fix

* Update merkle_tree.rs

* Update verify.rs

* Semver for Bytes

* Clean up tests

* Format

* Tests

* Refactor tests

* Update toolchain to stable in cargo_test.yml (#9)

* Remove license. (#13)

* Chore: Refactor binary hash functions into separate file (#11)

* Refactor hash functions into separate file for BMT

* Update merkle_tree.rs

* Refactor NODE and LEAF as u8

* Remove generics

* Remove commented line

* Update mod.rs

* Remove deprecated files

* Lazy static empty sum

* Update Cargo.toml

* Update Cargo.toml

* Update hash.rs

* Return ref to empty sum

* Feat: Position struct and tests (#18)

* Position struct and tests

* Comment

* Update table comment

* Document

* Update position.rs

* Update comments

* Update comment again

* Fix tests

* Update position.rs

* `Storage` trait and concrete `StorageMap` struct (#20)

* `Storage` trait and concrete `StorageMap` struct

* Remodel trait after fuel-vm store trait

* Revert names to storage and storage_map

* Change Storage's Key to require `Clone` instead of `Copy`

* Feat: use `fuel-data` `storage` trait for `storage_map` (#27)

* Use fuel-data storage trait

* Update storagemap impl

* Update storage_map against updated storage trait

* Update cargo_test.yml

* Fetch with cli in CI

* Chore: Switch `fuel-data` to `fuel-storage` (#33)

* Refactor: move `binary` directory with BMT implementation to `test-helpers` (#30)

* Refactor `binary` to `tests`

* Cleanup Test imports

* Convert to internal crate `fuel-merkle-test-helpers`

* Format

* Add helper tests to CI

* Update cargo_test.yml

* Fix Run helper tests args

* Clean up test-helpers dependencies

* Update test_data.rs

* Feat: Binary Merkle Tree with Storage Backing (#23)

* Replace ProofSet wrapper with Vec (#34)

* Feat: Path iterator, MSB, and node traits (#39)

* Path iterator

* Create node.rs

* Add node to common

* Refactor SZ to SIZE

* Minor adjustment to comments

* Remove unnecessary Debug req for AsPathIterator

* Feedback

* Msb get_bit_at_index_from_msb returns option

* Feat: SMT `node` struct (#40)

* Sparse node and hash

* Add hex to cargo.toml

* Derive `StorageError clone`

* Run cargo sort on workspace (#43)

* Create LICENSE (#47)

* Feat: `Position` methods for `left_child` and `right_child` (#48)

* Position methods for left and right child

* Update position.rs

* Use constants for left and right child directions

* Update comment

* Bump bytes from ~1.0 to ~1.1 (#49)

* Bump bytes from ~1.0 to ~1.1

* Update Cargo.toml

Co-authored-by: John Adler <adlerjohn@users.noreply.github.com>

Co-authored-by: John Adler <adlerjohn@users.noreply.github.com>

* Update manifest (#50)

* Update author.

* Add more fields.

* Update author.

* Crates.io publishing (#52)

* crates.io workflow

* Fix overly restrictive semver requirements (#53)

make bytes dep compatible with async-graphql

* Remove cargo git fetch from CI (#54)

* Feat: Binary Merkle Sum Tree root calculation (#44)

* Binary Merkle Sum

* Clean up

* Format

* Update verify.rs

* Replace Hash struct and impl with template functions

* Update hash.rs

* refactor

* Refactor join_data_pair to accept fee before data

* Format

* Remove generics from Merkle sum tree

* Refactor join_data_pair and split_data_pair

* White space

* assert sizes in join and split data pair

* BMST lazy static empty sum

* Update lib.rs

* Update to use storage backing

* Path iterator for sum node (WIP)

* Node fmt

* Isolate `root` logic

* Remove unused code

* Refactor

* Simplify lifetimes

* u64 (8 byte) fee

* Remove extraneous variables

* Consolidate on `common` types

* Simplify

* Cosmetic

* Remove unnecessary references to hash

* Fix node fmt

* Update node.rs

* Update node.rs

* Include leaf fee in leaf sum calculation

* update hash comment

* Update sum Node `left_child` and `right_child` to return `Result`

* Remove unused lifetime param

* Return fee in BMST `root` call

* Remove unused `StorageNode`

* Feat: Add `PositionPath` and `PositionPathIter` to calculate the path and side positions from root to leaf (#55)

* Path set

* Add `height` to `common::Node` interface, add `Position::path_set`

* Position path_set tests

* Move position_iter to new file

* Clean up use statements

* Move position_iter to position_path

* Comments

* Update comments

* Update comments

* PR feedback

* Refactor binary node interface (#58)

* Feat: BMT prove uses position path (#61)

* BMT prove uses position path

* Format

* Remove unnecessary storage inserts

* Remove unnecessary mut from Node::create_node

* Remove unnecessary functions

* Update version for breaking change

* Change unnecessary `node_mut()` to `node()` in `join_subtrees()`

* Revert "Update version for breaking change"

This reverts commit db3460510b6861805b5e4a2f3b5eb24d704b10f4.

* Feat: Binary merkle tree load from storage (#62)

* Implement `load` for BMT

* Move p2_under to common

* Format

* Build tree from leaf nodes

* Test load error

* Alphabetical order for errors

* remove unnecessary mut

* Simplify

* Remove unnecessary cast

* Feat: Add height to sparse node (#64)

* Add height to sparse node

* Update tests

* Fix: Remove hashing from leaf keys in SMT Node (#69)

* Remove hashing from leaf keys

* Format

* Revert height change

* Revert changes unrelated to leaf keys!

* Undo change

* Refactor: Add method to SMT node to set prefix (#70)

* Minor SMT node refactor

* Undo assert change

* Feat: Add height to SMT node debug (#71)

* Add height to SMT node debug

* Traits

* Minor refactor

* Fix: SMT Node `left_child` and `right_child` return placeholder when key is zero sum (#72)

* Return placeholder when key is zero sum

* Tests

* Set height to be the greater height of left and right children (#73)

* Docs: Create Sparse Merkle Tree test spec (#66)

* Create sparse_merkle_tree_tests.md

* Typo

* Remove language hints for pseudocode

* Additional tests

* Additional tests

* Abstract

* Wording

* Wording

* Update test pseudocode

* Correction to Update 2 Delete 1

* Additional test and revisions

* Update sparse_merkle_tree_tests.md

* Clean up spec

* Add last test to TOC

* Update sparse_merkle_tree_tests.md

* Typos

* Convert key inputs to 32 byte keys

* Remove deprecated description

* Specify big endian

* Missed characters

* Docs: Fix expected root in SMT root test pseudocode example (#74)

* Fix expected root in pseudocode example

* Date

* White space

* Create nightly-cargo-audit.yml (#75)

* Feat: Sparse Merkle Tree with `Update` and `Delete` (#41)

* Squashed commit of the following:

commit 22daac34b6932a71841d76fa91be36896b42d5b4
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Sun Nov 14 20:52:23 2021 -0500

    Comment out test

commit de2bcadcdda2c6b83639584f4b6340ec8a219b7f
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Fri Nov 12 01:06:59 2021 -0500

    Path iterator comments

commit 5de45ab00ea22f93582158e8b9d2f3b162283b42
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Fri Nov 5 17:40:13 2021 -0400

    Minor refactor

commit 6d8c4d60f1f0e7a60dc846d69b93239fb2603aa8
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Fri Nov 5 17:32:04 2021 -0400

    Update Cargo.toml

commit ac570d6e97b98d42a112a2fae3111c998749e218
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Fri Nov 5 17:28:19 2021 -0400

    SMT delete

commit 66c858a118ece81ea24fc09358c72d338d9f8024
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Nov 4 12:49:12 2021 -0400

    Comments

commit 0594a9948b8bf4565e905f50317549914020e269
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Nov 3 14:50:15 2021 -0400

    Use 0 as zero buffer

commit 4993aba67c61d7ab2ed2791f746e1f23d87f5b34
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Nov 3 14:41:49 2021 -0400

    Typo

commit 57cfda43e3be393088b82b756c4b4dca5e1216df
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Nov 3 14:36:42 2021 -0400

    Update path iter comments

commit 933810c982d410888a948a6b016a735b18042dc3
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Nov 3 14:32:45 2021 -0400

    Update path iter comments

commit b1dd4f22668881994764b9deed07781f408db5be
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Nov 3 14:25:14 2021 -0400

    Format

commit c43371247d99d94439693b643460457fedcc762a
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Nov 3 14:11:57 2021 -0400

    Minor refactor

commit 69b1fe602f086ec7ed60dd65c0ff7f64494c6c96
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Nov 3 13:51:18 2021 -0400

    Update comment

commit a9aaf740a3ed4b7c1dafcdaa714c2ee1e05be221
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Nov 3 13:40:56 2021 -0400

    Fix node leaf_key

commit 07485e4be36735d95000561875120139894db033
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Nov 1 17:15:54 2021 -0400

    Tests

commit d77365dcf1150946cfe32cf32bc83c9a39bb0a14
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Nov 1 10:45:39 2021 -0400

    Remove unused subtree code

commit 29af99b9c852a9f6936a9924ef742d24b79dc494
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Nov 1 10:44:25 2021 -0400

    SMT update with path nodes and side nodes WIP

commit a6d3ac21a14037fde9e23e3287b44482abdb3742
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Nov 1 10:36:21 2021 -0400

    Simplify

commit 3089439afc957385fb3e6ac86332638358fa63e2
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Nov 1 00:15:38 2021 -0400

    Update node

commit d652f79ffea7b7bf8d3dfc0b952ddad9f92a4fd2
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Sun Oct 31 18:35:14 2021 -0400

    Impl node trait for sparse Node

commit 3309c740cd2f5da247ef46287288d63008dcd09f
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Sun Oct 31 18:34:56 2021 -0400

    MSB and iterator tests

commit 59e415e0b3dd1dbfbd0e82530ed7ab24fa725641
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Oct 28 15:19:41 2021 -0400

    Refactor tests

commit c4daa9d639f7368a1273a89650279772c0b363f9
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 27 01:33:24 2021 -0400

    Typo

commit da341056398ad947b6b7d69b3dbdca0e9d93c835
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 27 01:29:54 2021 -0400

    Refactor test

commit 4791a65519512b2e64a6637ea472f35e08b9168f
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 27 01:14:15 2021 -0400

    Update

commit f0d3911ffbbfe0dce6afc8e3acccebc264e200f2
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 27 01:10:06 2021 -0400

    Comments

commit 33935daa7f475aa1c68bdbf703ed40d54f139707
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 27 00:55:53 2021 -0400

    Tests

commit 7b5c330d5a4be4f50762e82edd0851ba1ea9ab4b
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Oct 25 22:06:44 2021 -0400

    Format

commit 4e2a5c64d4b0752f4bc17cca9c6aa77c8af4e318
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Oct 25 12:25:00 2021 -0400

    SMT update_for_root

commit 751339ee9ffc43ba15b74a1a9cbaee7d21e8ba68
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Fri Oct 22 17:05:10 2021 -0400

    Lookup prefix size using size_of Bytes1

commit a690029bff909ef780228f6b942ca3eb40c3afea
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Fri Oct 22 17:02:13 2021 -0400

    Fix formatting

commit e57c2389a1583cd049c1bbd95c755458b204342e
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Fri Oct 22 17:00:08 2021 -0400

    Node tests

commit 3715bb8d5b55fe1a29bd3db3486999a069ea9774
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Oct 21 23:34:10 2021 -0400

    Test update

commit a2515ca1facc3ee66c3951991245238b0e379474
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Oct 21 19:50:00 2021 -0400

    Clean up

commit 2e9c36eadd5fa0133580af888f588ef0d68fce2b
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Oct 21 19:40:49 2021 -0400

    Generic key types

commit 648648fa57272664aaa4267c556ef635834f0aac
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Oct 21 19:10:15 2021 -0400

    Update common.rs

commit ac4ab42a931d0324cbf4fc19b7668ec8671ed72f
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Oct 21 18:49:30 2021 -0400

    Add panic test for msb

commit c99ce9c49bd6b251b4b2a18b6848d0f85ea9735d
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Oct 21 18:37:50 2021 -0400

    Clean up

commit 1049b770ad10d03b60c4be679e1421fc3c52e89f
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Oct 21 17:36:38 2021 -0400

    Update sparse node

commit c535ebab613c7d4378d89e29e9a8d2bcce6e1151
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Thu Oct 21 01:06:53 2021 -0400

    Sparse node iterator

commit 3ac3f89d47448f63ed76415227c6475aad4c7638
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 20 12:47:33 2021 -0400

    Const BUFFER_SZ

commit 93b7ea918474154a424b670082560cf27c166b4f
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 20 12:38:55 2021 -0400

    Sparse node

commit ba893daf3b40fdcf3fdcf849dc9022211cafb4d3
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 20 12:38:49 2021 -0400

    Path iterator

commit 557e6755000094e9a5300f8131d7618956b11ac9
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Oct 18 12:57:34 2021 -0400

    Sparse node

commit 32e1a48e34702fd4365a8e48c848347d064dd6b9
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 13 13:24:36 2021 -0400

    Format

commit a1387caad401604b9a8a0796a748c46096075040
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Wed Oct 13 13:21:05 2021 -0400

    Generic path iterator

commit 8616e701bf72e68a76e506fcffda3f32c6a0fc5f
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Tue Oct 12 16:58:36 2021 -0400

    Update leaf.rs

commit 8fe009b1022b78764a79ba85518e0db590852a14
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Tue Oct 12 15:54:56 2021 -0400

    Additional `position` methods and tests

commit 274744b317969b20b5212fbc28f1487013de71ca
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Tue Oct 12 12:35:33 2021 -0400

    Format

commit ab95d7f24d529e89636c515212ac690e16f9a7d5
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Tue Oct 12 11:51:19 2021 -0400

    Update comments

commit 71f590c0f72f9f6d6b12fb048e6cba7676bf164f
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Oct 11 18:26:00 2021 -0400

    Expand documentation

commit aa6847c61c76314f180ce63b109e3fea89871b4b
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Mon Oct 11 17:43:28 2021 -0400

    Updated position comments

commit cbf5269c7152936e8d1c87ecdba2b85ef8d2ed2c
Author: Brandon Vrooman <brandon.vrooman@gmail.com>
Date:   Fri Oct 8 13:55:24 2021 -0400

    Sparse Merkle Tree skeleton

* Revert position changes

* Incorporate upstream changes

* Format

* Update tests

* Update merkle_tree.rs

* Add leaf node buffer on update to storage

* Undo bad conflict fix

* Format after merge

* Update to new node interface

* Fix tests

* Format

* Remove println statement

* Use results

* SMT new returns Result

* Format

* Remove comment

* Additional tests

* Return empty sum to sparse module

* Format

* Revert delete comment

* Format tests

* Remove `let _` from tests

* Additional tests and simplifications

* Format

* Move leaf key hashing to client side

* Format

* Rearrange sum calls on test keys

* Update tests to match spec

* Fix expected root string

* Refactor: Simplify SMT algorithms (#76)

* Merge

* Merge fix

* Update merkle_tree.rs

* Update comments based on feedback

* Feat: smt data driven test framework (#79)

* Data driven test framework

* Impl ToString for Test to generate test names

* revert unrelated change

* Stable

* Format

* Data test stable

* undo change to smt

* Use `?` instead of `unwrap`

* Reorder dependencies

* Use constants and enums for actions and encodings (#82)

* Load SMT from storage and root (#83)

* Feat: Refactor BMT and SMT interfaces to use `anyhow::Result` (#86)

* Add anyhow to cargo

* Update SMT interface to use anyhow Result

* Update BMT to use anyhow result

* Chore: Refactor comment length to maximum of 80 (#87)

* path_iterator

* Update position.rs

* Update position_path.rs

* Update merkle_tree.rs

* Update node.rs

* Update verify.rs

* Add no-std support (#88)

It is desirable to have no-std support so the consumers will have more
flexibility of use with this library, provided an appropriate storage
backend.

This functionality will support the usage of contracts in fuel-tx, since
its id is calculated with a binary merkle tree, according to fuel specs.

* Bump to v0.2.0 (#90)

* Debt: Refactor Merkle tree error propagation and handling (#94)

* Refactor error handling

* Format

* Support for no std config

* Fix storage error display attribute

* Fix warnings

* Remove commented out code

* Remove commented out code

* Refactor sparse `StorageNode` error

* Use `hashbrown::hashmap` (#96)

* Use infallible error for `StorageMap` error type (#98)

* Run tests without std during CI (#99)

* Run tests without std during CI

* Remove lazy static from test-helpers

* Rearrange ci workflows

* Update ci.yml

* Update ci.yml

* Feat: Infallible in-memory SMT  (#100)

* In memory SMT

* Format

* In memory SMT tests

* Tree ptr

* Use Option for delayed SMT initialization

* Use alloc box

* Strongly typed self as Pin in interface

* Use core phantompinned

* Format

* Use in-memory Merkle tree for data driven tests

* Remove block

* Relax constraint on Storage (#101)

* Relax constraint on Storage

* sum tree, and cleanup

* relax storage for binary

Co-authored-by: rakita <rakita@users.noreply.github.com>

* cargo clippy lints (#103)

* cargo clippy lints

* nit comment

* Feat: In-memory binary Merkle tree (#104)

* In memory binary merkle tree

* Add `prove` to in memory binary merkle tree

* Format

* No-std compat

* Use `Option` instead of `Result` in `prove`

* Update test names

* Feat: Implement Default for in-memory Merkle trees (#105)

* Impl Default for in-memory Merkle trees

* Formatting

* Add clippy job to CI (#106)

* Add clippy job to CI

* Formatting

* Update clippy args

* Release 0.3.0 (#108)

Create Release 0.3.0

* Use `check` in CI (#109)

* Use `check` in CI

* Clippy warnings

* Refactored usage of storage traits (#111)

* Refactored usage of storage traits.

* Make clippy happy=)

* Changed `fuel-storage` to ues release `0.3`

* Removed redundant lifetime from impl.

* Proper naming for the tables. Added detailed description

* Apply suggestions from code review

Co-authored-by: Brandon Vrooman <brandon.vrooman@gmail.com>

* Renamed table description for tests

* Update src/binary/merkle_tree.rs

Co-authored-by: Brandon Vrooman <brandon.vrooman@gmail.com>

Co-authored-by: Brandon Vrooman <brandon.vrooman@gmail.com>

* Bump version to 0.4.0 (#112)

* debt: Remove first leaf from BMT proof set (#115)

Remove first leaf from BMT proof set

* Revert #115 (#116)

Revert "debt: Remove first leaf from BMT proof se] t (#115)"

This reverts commit bf201991ae06353259d980f2633ba764a17980f2.

* feat: BMT integration tests (#36)

* Replace ProofSet wrapper with Vec

* Initial integration test folder

* BMT `root` and `proof` tests

* Storage integration tests

* binary merkle tree integration test struct

* Revert "debt: Remove first leaf from BMT proof set (#115)"

This reverts commit bf201991ae06353259d980f2633ba764a17980f2.

* Revert changes to proof set

* Whitespace

* chore: Minor clean up (#121)

* Clean up comments and code

* Additional comment format

* Minor comment formatting

* Update comment text

* Simplify test storage maps

* Simplify sparse test storage maps

* feat: Load BMT from MMR peaks (#123)

* WIP

* Simplify

* Clean up

* Replace unwraps with error

* Remove unused code

* Fix test import

* Refactor BMT integration tests

* BMT build inline docs

* Update inline comment for consistency

* Update test imports

* Minor refactor

* Update src/common/position_path.rs

Co-authored-by: Green Baneling <XgreenX9999@gmail.com>

* Refactor and add test

* Appease clippy

Co-authored-by: Green Baneling <XgreenX9999@gmail.com>

* Release 0.4.1 (#127)

* Clippy and dependency upgrades (#130)

* Cliipy

* Dep Upgrades

* feat: Data-driven BMT test generation and framework (#125)

* BMT data tests

* Additional tests

* Fixed rand seed for test data gen

* Update test pass fail return

* Additional negative tests

* Update test cases

* Manual cargo fmt

* Remove unused roottest struct

* Use verifyDigest

* Update binary.rs

* Upgrade serde yaml

* fix warning

* Use serialized enums over strings

* Rename tests

* Add test descriptions

* refactor into separate fns

* Update tests

* refactor: Add `Prefix` enum and buffer error checking (#131)

* Prefix enum

* Simplify

* Revert accidental change

* Clippy

* impl AsRef

* Update prefix.rs

* Error handling

* Error checks

* Collapse use statements

* Manual impl From StorageError

* Manual from prefix error

* Update node.rs

* Revert renaming Internal to Node

* Update binary_proofs.rs

* Revert "Update binary_proofs.rs"

This reverts commit d9996de6072072d73e6b5c0fd7d6fcfe939cf625.

* Update node.rs

* feat: ParentNode fallible interface (#133)

* ParentNode fallible interface

Merge

* ChildReturn alias

* Warnings

* Refactor

* Update node.rs

* Clean up

* Remove unnecessary trait restrictions

* Update path_iterator.rs

* Comments and test

* Rename to child error

* ChildError

* Add Key to ChildError

* Simplify

* Simplify

* Update merkle_tree.rs

* Refactor

* StroageNodeError

* NodeIsLeaf error for leaf nodes

* thiserror for StorageNodeError and ChildError

* Minor refactor common use statements

* Remove extern crate core

* Clean up use statements

* Update path_iterator.rs

* Update path_iterator.rs

* refactor: Introduce `Path` trait and `Instruction` (#134)

* Add path trait and instruction

* Comparable path

* Appease Lord Clippy

* Update msb.rs

* Simplify

* feat: BMT node buffer and table definition update (#136)

* BMT Node buffer

* Refactor buffer, add buffer views

* Simplify Node interface

* Clippy

* Remove unnecessary node clones

* Add safety comments

* Cosmetic

* Return hash as ref

* Replace Schema with constants

* Update safety notes in BMT buffer

* Replace Buffer with Primitive

* Remove Primitive trait

* Refactor primitive

* Simplify

* Make node members private

* Use as ref

* feat: SMT node primitive update (#137)

* BMT Node buffer

* Refactor buffer, add buffer views

* Simplify Node interface

* Clippy

* Remove unnecessary node clones

* Add safety comments

* SMT node buffer update

* Simplify

* Minor

* Simplify

* Simplify

* Fix warning

* Simplify

* Return references instead of copies

* Cosmetic

* Return hash as ref

* Replace Schema with constants

* Replace Schema with constants

* Update safety notes in BMT buffer

* Replace Buffer with Primitive

* Replace Buffer with Primitive (WIP)

* Passing tests

* cliipy

* clippy for real tho

* Remove Primitive trait

* Refactor primitive

* Refactor primitive

* Simplify

* Simplify

* Clean up

* Make node members private

* Make Node members private

* Use as ref

* revert

* Rename uses of buffer to primitive

* Rename uses of buffer to primitive in tests

* Use into for insertion in test

* feat: Configurable storage table for BMTs and SMTs (#129)

* Configurable storage table

* refactor sum tree

* Minor

* Update Cargo.toml

* Update position.rs

* Update storage_map.rs

* Refactor nodes tables

* Update binary.rs

* Fmt

* Use core over std

* Update binary_proofs.rs

* Revert "Update binary_proofs.rs"

This reverts commit ba38107c6cff3462041b3dbe8b6255431b056dc8.

* Merge fixes

* Fix warnings

* Clean up

* Clean up

* Update merkle_tree.rs

* consistency

* Use match over if else

* Revert "Use match over if else"

This reverts commit c74337a448f48c9eec89d7b436aa03a80e00e886.

* Rearrangement

* BMT Node buffer

* Refactor buffer, add buffer views

* Simplify Node interface

* Clippy

* Remove unnecessary node clones

* Add safety comments

* SMT node buffer update

* Simplify

* Minor

* Simplify

* Simplify

* Fix warning

* Simplify

* Return references instead of copies

* Cosmetic

* Return hash as ref

* Use Binary node buffer for tables

* Replace Schema with constants

* Replace Schema with constants

* Remove serde feature

* Update lib exports

* Clean up

* Update safety notes in BMT buffer

* Replace Buffer with Primitive

* Replace Buffer with Primitive (WIP)

* Passing tests

* cliipy

* clippy for real tho

* Remove Primitive trait

* Refactor primitive

* Refactor primitive

* Simplify

* Simplify

* Clean up

* Make node members private

* Make Node members private

* Use as ref

* Replace uses of Buffer with Primitive

* revert

* Rename uses of buffer to primitive

* Rename uses of buffer to primitive in tests

* Use into for insertion in test

* Fix imports

* Use hex values in test

* chore: Update test table names (#139)

Update table names

* Fix import

* Fix merge side effects

* feat: Make BMT `root` available to immutable trees  (#141)

* Refactor

* Refactor

* Infallible storage trait and impl

* Parallel trait usage for getting side nodes

* nostd compliance

* Clippy

* Infallible root

* Add comment docs to root_node

* Fix root_node doc line breaks

* Whitespace

* Fix typo

* Whitespace again

* Remove returned assigned values

* fix ci for fuel-merkle

* fmt merkle

* toml lint

* toml lint

* toml lint

* version bump

* fix lifetime issues

* Revert "version bump"

This reverts commit df268a9.

* Use `{ workspace = true }`

* clippy fixes

* always enable alloc in fuel-merkle to support all targets

* Revert "always enable alloc in fuel-merkle to support all targets"

This reverts commit 7afdd79.

* Revert "clippy fixes"

This reverts commit 83acb21.

* Remove lifetime from the `Mappable::Key` (#319)

* Removed `'a` lifetime from `Mappable::Key`.
Renamed `GetValue` with `OwnedValue`.
Added the same `OwnedKey` for `Key` to unblock:
```rust
    type Key = Self::OwnedKey;
    type OwnedKey = u64;
    type Value = Self::OwnedValue;
    type OwnedValue = Primitive;
```

Defined two double storage key for `ContractsAssets` and `ContractsState`.
Replaced `(&'a ContractId, &'a AssetId)` with corresponding double storage keys.

* Make clippy happy

* Make clippy happy

* Make clippy happy

* Fix `no_std` compilation

* Remove `AsRef` and `From` for `$first` and `$second`

* remove unused ci folder from fuel-merkle

Co-authored-by: John Adler <adlerjohn@users.noreply.github.com>
Co-authored-by: Brandon Vrooman <brandon.vrooman@gmail.com>
Co-authored-by: rakita <rakita@users.noreply.github.com>
Co-authored-by: Brandon Kite <brandonkite92@gmail.com>
Co-authored-by: Elliot <eyaghoobia@gmail.com>
Co-authored-by: Victor Lopes <vhrlopes@gmail.com>
Co-authored-by: GreenBaneling | Supercolony <XgreenX9999@gmail.com>
Co-authored-by: Brandon Vrooman <brandon.vrooman@fuel.sh>
Co-authored-by: Tom <tomrgowan@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
fuel-vm Related to the `fuel-vm` crate.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants