Skip to content

NDRS-76: cleanup work#16

Merged
Fraser999 merged 9 commits intocasper-network:masterfrom
Fraser999:NDRS-76-storage
Jun 9, 2020
Merged

NDRS-76: cleanup work#16
Fraser999 merged 9 commits intocasper-network:masterfrom
Fraser999:NDRS-76-storage

Conversation

@Fraser999
Copy link
Contributor

This resolves some todos from previous PRs and discussions, the main points being:

  • removed dummy storage consumer component
  • removed displaydoc
  • reduced usage of anyhow
  • refactored storage component to return Results

tls::{self, KeyFingerprint, Signed, TlsCert},
};
// Seems to be a false positive.
#[allow(unreachable_pub)]
Copy link
Contributor

Choose a reason for hiding this comment

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

Looks like it's because the components module is only pub(crate), so any visibility higher than pub(crate) makes no sense here.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Well, the components module itself is actually private, but in lib.rs, we export these two objects:

pub use components::small_network::{Config, Error};

They are really exported via the top level API, as can bee seen if we generate the docs.

Copy link
Contributor

Choose a reason for hiding this comment

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

Yes, but that makes them visible via casperlabs_node::{Config, Error} - they are still not reachable from the outside via casperlabs_node::components::small_network::{Config, Error}. And the first part would work regardless of their visibility in the module itself, as long as they are visible to lib.rs. So the warning is still correct, I think.

#[allow(unreachable_pub)]
pub use config::Config;
// Seems to be a false positive.
#[allow(unreachable_pub)]
Copy link
Contributor

Choose a reason for hiding this comment

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

Same as above.

@Fraser999 Fraser999 merged commit 8724ef9 into casper-network:master Jun 9, 2020
Copy link
Contributor

@marc-casperlabs marc-casperlabs left a comment

Choose a reason for hiding this comment

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

Oh no, I'm too late =).

Important bits are From conversions for errors and the RNG choice. =)

modules in `components`, and `warn` level for the remaining codebase:

```
RUST_LOG=casperlabs_node::components::small=trace,casperlabs_node::comp=info,warn
Copy link
Contributor

Choose a reason for hiding this comment

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

small should be small_network here

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The point of the example was to show that we don't need the full module path. I did a similar thing by abbreviating components to comp in the second group.

/// Server failed to present certificate.
#[error("no server certificate presented")]
NoServerCertificate,
/// Peer failed to present certificate.
Copy link
Contributor

Choose a reason for hiding this comment

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

We should probably say "client certificate" here, to avoid confusion.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I always find terminology doesn't translate too well from traditional client/server networking to p2p networking. But I agree here since we've already used the term "server".

/// Peer failed to present certificate.
#[error("no peer certificate presented")]
NoPeerCertificate,
/// Peer has wrong ID.
Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe add a little more docs to drive home that this means we connected to a different node that we were expected --- the peer ID presented does not match the one we're expecting.

/// Peer has wrong ID.
#[error("remote node has wrong ID")]
WrongId,
/// Invalid configuration.
Copy link
Contributor

Choose a reason for hiding this comment

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

There should be a description in the docs as well, do not lets this info only be present in the display string.

InvalidConfig,
/// I/O error.
#[error("I/O error: {0}")]
Io(#[from] io::Error),
Copy link
Contributor

Choose a reason for hiding this comment

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

I am not a fan of these. Can we have an individual error variant for each time where we raise an IO error please?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I will make the change, but can you expand on why you dislike nested errors?

Copy link
Contributor

Choose a reason for hiding this comment

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

Is it possible to handle IO errors right where they were thrown/returned rather than propagating upstream?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

We pretty much do, where we can. For example, when the async message_sender function returns an io::Error, we try to reconnect to the peer multiple times before giving up and removing the peer from our list of peers.

In other places, (e.g. if we can't start a TCP listener inside the new() constructor), we propagate the error upwards to the caller (the reactor's c'tor) since there's nothing we can do about that afaik. That error is propagated all the way up: this is a hard failure and causes the app to fail on startup.

Copy link
Contributor

Choose a reason for hiding this comment

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

Sure, if we can't recover/handle in the new() that makes sense. Still Io(io::Error) is hard to correctly handle as it may have many representations/variants. Should we "unwrap" the error cause in the new() constructor and signal a more narrow version to the caller?

Copy link
Contributor

Choose a reason for hiding this comment

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

To be clear, I advocate on making errors more meaningful than just "an IO error has occured". In general, this is only fine if there's just a single point where such an error can occur and even then I tend to give context in the variant. Naming it Io is redundant, since all that info is already in the type.

Imagine you have a function copying a file from a to b. There are two places where you could have an IO error: Reading a file, parsing it, making some changes and writing out the result file. Let's assume there's a permission issue, you'll get a non-descript "permission denied" message once your program crashes, without even the context of the filename.

Here's an example for what the error type could be:

Read(io::Error),
Parse(serde::de::Error),
Write(io::Error),

If there was just one error named Io, I'd have zero chance of figuring out what went wrong.

(I'm aware that the stdlib does precisely what I am advocating against =))

anyhow supports shortcutting this process using .context, for when you do not write this many errors.

A good example in the existing codebase is in the TLS module, just imagine how cryptic errors would be if there was just a single ErrorStack (which is openssl's error) variant: https://github.com/CasperLabs/casperlabs-node/blob/8724ef9960d4d95077f8b1117c1b42ad8b7ca5f9/src/tls.rs#L375

Trust me, the OpenSSL error messages aren't exactly easily understood without context. =)

I'll admit, I haven't checked too deeply of what kinds of errors we need, but if it is no longer named Io but had a meaningful name instead, it should be apparent.

Copy link
Contributor

@marc-casperlabs marc-casperlabs Jun 10, 2020

Choose a reason for hiding this comment

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

Rereading this, I want to point out that I am not against nested errors, to the contrary! Nested vs non-nesting is entirely orthogonal to this, I believe.

I.e. without nesting the example error would be

Read,
Parse,
Write,

which I am not advocating.

Io(#[from] io::Error),
/// OpenSSL error.
#[error("OpenSSL error: {0}")]
OpenSSL(#[from] ErrorStack),
Copy link
Contributor

Choose a reason for hiding this comment

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

Same as IO, they should be individual.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Will do, but with same question as above.

SystemTime(#[from] SystemTimeError),
/// Other error.
#[error(transparent)]
Anyhow(#[from] anyhow::Error),
Copy link
Contributor

Choose a reason for hiding this comment

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

Did we fail to capture others here?

If you do not want anyhow present here, an alternative would be Other(Box<std::error::Error>).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The tls module still uses anyhow extensively. I didn't remove anyhow from there since I'm still not sure if you plan to move this module to its own crate. I also feel there's less likelihood of other devs copying the error handling style from that module compared to the higher-profile small_network.

I believe that's the only place left where we use anyhow outside of application code.

api_server: ApiServer,
consensus: Consensus,
dummy_storage_consumer: storage::dummy::StorageConsumer,
rng: ChaCha20Rng,
Copy link
Contributor

Choose a reason for hiding this comment

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

What's the rationale behind not using OsRng by the way? It's the same as reading from /dev/urandom or using one of the blessed interfaces for getting random numbers. People with hardware RNGs will get theirs used that way!

We can "verify" it:

https://github.com/rust-random/rand/blob/63d53c09c197542e6ec6271e528aea1bc287c99d/rand_core/src/os.rs#L67

    fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> {
        getrandom(dest)?;
        Ok(())
    }

In the getrandom crate:

OS interface
Linux, Android getrandom system call if available, otherwise /dev/urandom after successfully polling /dev/random
unsafe fn getrandom(
    buf: *mut libc::c_void,
    buflen: libc::size_t,
    flags: libc::c_uint,
) -> libc::ssize_t {
    libc::syscall(libc::SYS_getrandom, buf, buflen, flags) as libc::ssize_t
}

From the getrandom(2) man page:

The getrandom() system call fills the buffer pointed to by buf with up to buflen random bytes. These bytes can be used to seed user-space random number generators or for cryptographic purposes.

Now here it says "seeding" but urandom also delivers an infinite amount of random bits. What's the reason not to use it?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

In no particular order, my reasons for choosing ChaCha20Rng over OsRng are:

  • its operations can't fail, which makes it simpler to use
  • it should be faster
  • it can be seeded (potentially critical in order to be able to reproduce test failures)
  • we already use it in the EE codebase
  • using an OS RNG to seed a CSPRNG is fairly standard practice afaik. I guess we can even reseed the ChaCha20Rng periodically if we think that level of security is required.

Note that if we were to go for the OsRng, there'd be no point to holding an instance in the reactor and passing a mut ref to components, since it's pretty much zero cost for any component to just construct an OsRng on the fly.

Copy link
Contributor

Choose a reason for hiding this comment

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

its operations can't fail, which makes it simpler to use

I don't think the RNG interfaces exposes failures either, right?

it should be faster

I believe that's not relevant in this case, OsRng should be by far fast enough.

it can be seeded (potentially critical in order to be able to reproduce test failures)
using an OS RNG to seed a CSPRNG is fairly standard practice afaik. I guess we can even reseed the ChaCha20Rng periodically if we think that level of security is required.

Note that if we were to go for the OsRng, there'd be no point to holding an instance in the reactor and passing a mut ref to components, since it's pretty much zero cost for any component to just construct an OsRng on the fly.

This I don't agree with at all. We pass in an Rng implementing type into each function and pass that all the way down. We only create an RNG at the very top of the call stack, on program instantiation. During normal operation, that is an OsRng instance, during testing, it's a PRNG with a fixed seed. But that only happens once!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I don't think the RNG interfaces exposes failures either, right?

Well, since getrandom() can fail, we shouldn't use the ones which don't return Results. All the methods which don't return a result can potentially panic as they're based on fill_bytes. I believe the chances of panic are slim, especially if the first usage succeeded, but still... why risk it?

I believe that's not relevant in this case, OsRng should be by far fast enough.

I don't see how we can possibly know yet what will be fast enough! We don't know all the use cases yet, do we?

This I don't agree with at all. We pass in an Rng implementing type into each function and pass that all the way down. We only create an RNG at the very top of the call stack, on program instantiation. During normal operation, that is an OsRng instance, during testing, it's a PRNG with a fixed seed. But that only happens once!

For all other rand RNGs (afaik) that makes sense, but not for OsRng. If you have a look at its implementation you'll see it's an empty struct. There's just no point in holding onto a single instance anywhere.

mpapierski pushed a commit to mpapierski/casper-node that referenced this pull request Nov 30, 2021
…adahead

Disable read ahead in LMDB databases.
casperlabs-bors-ng bot pushed a commit that referenced this pull request Jan 5, 2022
…k-queue

Port unit tests for `WorkQueue` from parallel trie fetching branch
casperlabs-bors-ng bot pushed a commit that referenced this pull request Mar 15, 2022
Changed several details of the chainspec registry and how its handled
afck pushed a commit to afck/casper-node that referenced this pull request Oct 19, 2022
rafal-ch pushed a commit that referenced this pull request Sep 11, 2024
* Change type alias of keys to wrapper of bytes

Convert key types to concrete wrapper types and use Deref/DerefMut as
coercion resolver.

This way, the compiler type resolution will be deterministic and will
facilitate complex traits generic type resolution.

* Use random keys for test cases
rafal-ch pushed a commit that referenced this pull request Sep 11, 2024
* Initial commit

* Update README.md

* Fuel VM in Rust

merging files from original repo

refactor

impl ethcall

completed todos

refactor program into interpreter mod

carry create2 programs through callframes

impl create2

impl codesize based on callframes

impl fuel tx init and data handling

refactor

update init code width

impl eth ops

impl fuel ops

define eth and fuel ops

Adding init field to eth tx format

define eth account and tx types

impl rotate ops

sign extend from u16 to u64

impl subi op

Sign extend imm val for arithmetic op

fix and style

impl of srav and sra

impl of sltiu and sltu

remove unnecessary refs

working tx handler

define op for data ld and test for tx exec

first step of tx execution impl

impl addtl tx types

minor refactor

initial tx format

moving from usize to u8 for size types

defining serder of eth opcodes

advancing notes

updating notes

cleaner style

base impl for all opcodes

implement malloc/free, local var, and stack opcodes

working call and return architecture

improving architecture and execution

some code improvements

improved stack handling thru mutable references

intermediate commit with some types and methods and cleanup

intermediate commit for stackframes

initial stack impl

using values in registers for computations

Run programs in loop to completion

Update notes

Adding tests for u32 bit manipulation

Change opcode instructions to 32 bits wide

change immediate values to 16-bit wide

minor edits

tidy

completing a few opcode implementations including beq

bug fix for tuple return

Starting to implement opcodes

intermediate commit with opcode deser

intermediate commit with opcode ser

Update status

Adding simple unit tests to memory after execution

Working simple execution with memory dump

Removing unused const

updating notes

updating notes

refactor u64 funcs to file

applying unit tests to serder

initial working serder of ADD opcode in program

AND serialization and refactoring

minor cleanup

Adding some indexed methods

Initial bit manipulation for opcode ser

Intermediate commit to opcode serder

Starting trait impl for Opcodes

Implement bit manipulation for u64

Enable basic architecture for tests

intermediate commit with restructured types for vm components

Working memory with hi register

splitting out base types

adding binary that matches Cargo.toml

adding binary that matches Cargo.toml

running instance, more cleanup pending

next step towards initial commit

next step towards initial commit

Fuel VM in Rust

* Adding new tx format based on FuelLabs/fuel-specs#6

* lifting utxo_id into parent struct

* working base ftx test

* working new tx format

* Adding `stateWitnessIndex` to OutputContract

* Working extended Fuel tx contract subtype

* impl sha256

Set $of flag in div and mod by 0

Rename of uf flags

Rename of uf flags

j jr tests

xor xori tests

sub subi tests

sll sllv srl srlv tests

or ori tests

mult multi test

updates to match spec #0d39f49

impl kecakk op

Add convenience functions

* jump ops

memory copy and compare ops

impl state opcodes using hashmap

refactor overflow into distinct register

impl sha256

Set $of flag in div and mod by 0

Rename of uf flags

Rename of uf flags

j jr tests

xor xori tests

sub subi tests

sll sllv srl srlv tests

or ori tests

mult multi test

updates to match spec #0d39f49

impl kecakk op

Add convenience functions

* cleanup

jnzi test

jnz test

jump ops

memory copy and compare ops

impl state opcodes using hashmap

refactor overflow into distinct register

impl sha256

Set $of flag in div and mod by 0

Rename of uf flags

Rename of uf flags

j jr tests

xor xori tests

sub subi tests

sll sllv srl srlv tests

or ori tests

mult multi test

updates to match spec #0d39f49

impl kecakk op

Add convenience functions

* slight adjustment to hashmap access

* added very basic gas

* ecrecover op

* Cfe and Cfs callframe stack opcodes

* Add test and format CI (#12)

* Add test and format CI.

* fmt

* Remove test suite unneeded.

* Update test CI (#13)

* Add private keys for dependencies.

* Use minimal toolchain profile.

* Use nightly toolchain.

* Update opcodes list (#9)

* Update opcodes list

The opcodes list was outdated and needed to be resync with the specs.

https://github.com/FuelLabs/fuel-specs/blob/master/specs/vm/opcodes.md

Also, the previous implementation didn't consider the different sizes of
immediate values, treating everything as u16.

The API still need to improve to prevent users from allocating invalid
register values with overflow.

Resolves #8

* Update interpreter to latest specs

The interpreter is not fully sync with the specs.

Also, the functionality scope can be split into different modules to
facilitate maintenance of the routines.

* Implement interpreter mem and crypto functions

Some of the functions contains particularities such as the ecrecover
that uses a special encoding regarding the recovery id. These are not
native to the public libraries and must be manually handled.

* Add test case for keccak256

This new test case is symmetric to the sha256 test case with the crypto
primitive as difference.

* Add Transaction structure

The transaction will define the VM initialization as well as the
underlying input/output/contract types.

* Implement recoverable secp256k1 signature

The EcRecover scheme may benefit from a compression that can save an
additional byte of storage.

This crypto primitive is implemented using rusk-secp256k1 as backend.

* Add MemClearI operation

* Rename 32-byte storage ops to "quad word"

* Rename opcodes to fit in 4 chars

* Add serialization for all tx types

* Change VM init to copy tx to stack

The initialization of the VM should copy the hash of the transaction,
its size and the serialized bytes to the stack area so the execution of
the program can access it when required.

* Update IO according to specs

The specs points that every number should be stored as u64 and the
arrays of bytes should be padded to multiples of 8.

* Change `crypto::hash` to encapsulate primitive

The underlying default hash function of the crypto module should not
impact the API and any change in the primitive should be transparent to
the users of the interpreter.

* Add Log opcode

This opcode will perform a naive dump of the selected registers ignoring
the zeroed indices.

This is a primitive implementation to a more complex log/event/topic
tracing system.

* Add binary interpreter

This binary executes transactions and output the log opcodes.

* Add tracing to interpreter execution

* Add debug to registers

The mutated registers should be print if the log level is set to debug.

* Update memcopy to non-overlapping

THe `MCP` operation should fail if the memory segments are overlapping.

This will allow the internals to benefit from `memcopy` instead of
`memmove`.

* Add `is_valid` function for all transaction types

* Add Tx validation to VM initialization

The VM initialization must validate the transaction before the registers
and memory are prepared for execution.

The TX validation is critical and most of the edge cases must have test
coverage.

* Optimize code and remove redundant checks

* Add Call, CallFrame and MemoryRange

The memory range tuples in the VM are expected to behave as start/size
pairs. However, Rust uses start/end patterns. The `MemoryRange` type is
an abstraction to interface with the values provided by the bytecode
operations and Rust memory scheme.

The `Call` and `CallFrame` structures will heavily depend on that
because they have internal references to owned memory regions.

* Add Call opcode implementation

The call frames structure and the reflection of a call in the registers
and memory is critical to the system and must be broadly tested.

This commit introduces the update of the program counter.

* Update dependencies to use fuel-* libs

The transaction and opcode structs were split into their own libraries.

This commit introduces the usage of these libraries as dependencies.

* Update ECR to clear err

In case of failure, ECRecover should set the recovered public-key to
`0` and turn the `err` flag on.

In case of success, `$rA` will be set with the recovered public-key and
the error flag will be cleared.

* Add predicate verification for tx create coin

* Add predicate verification

Predicate verification should initialize the VM in a special state and
execute the opcodes under special constraints defined in the specs.

* Remove Travis config. (#14)

* Add helper methods for VM executors (#17)

* Change LW and SW to multiple of a Word immediate (#16)

To maintain consistency with the high-level language, the LW and SW
immediate values will be used as word-multiple values instead of raw
memory addresses.

* Mint and burn (#18)

* Add CALL and CCP implementation

Both call and ccp relies on contract deployment over the blockchain.
These should be included with a refactor over the call frames structure
to correctly point to a contract code after a call frame is pushed to
the stack.

* Fix memory boundaries ownership check

The memory ranges are exclusive in the upper bound. This way, the
ownership check must reflect that standard for range checks.

* Add Mint and Burn opcode execution

* Update SW and LW to take imm as words

* Update LW and SW to mul word imm with explicit op

* Add function to encapsulate external const check

* Rename crate to `fuel-core` (#19)

`fuel-vm-rust` don't reflect the repo name and this may be confusing
under certain contexts. Also, there is no particular reason on why these
two names should diverge.

* Add data backend traits

The VM must be agnostic to the data backend, and this should comply only
with a non-restrictive trait.

This commit introduces the `Storage` trait. Some of the interpreter
functionality will specify implementation requirements for a given
Key/Value concrete pair.

* Use wrapper type for key structs

* Rename to fuel-vm

Co-authored-by: John Adler <adlerjohn@users.noreply.github.com>
Co-authored-by: Shahan Khatchadourian <shahan.k.code@gmail.com>
rafal-ch pushed a commit that referenced this pull request Sep 11, 2024
The program counter is being set relative to the $fp instead of
appending to $sp and incrementing both $sp and $ssp

Resolves #16
rafal-ch pushed a commit that referenced this pull request Sep 11, 2024
Co-authored-by: Victor Lopes <vlopes11@users.noreply.github.com>
rafal-ch pushed a commit that referenced this pull request Sep 11, 2024
zajko added a commit to zajko/casper-node that referenced this pull request Jun 16, 2025
# This is the 1st commit message:

Initial wip

# The commit message #2 will be skipped:

# Basic case working. Pre-fixture tests

# The commit message #3 will be skipped:

# Initial fixture tests passing

# The commit message #4 will be skipped:

# Test case passing for disabled versions

# The commit message #5 will be skipped:

# EE tests passing

# The commit message #6 will be skipped:

# Additional fixture tests and PR prep

# The commit message #7 will be skipped:

# Run make format

# The commit message #8 will be skipped:

# X

# The commit message #9 will be skipped:

# X

# The commit message casper-network#10 will be skipped:

# X

# The commit message casper-network#11 will be skipped:

# X

# The commit message casper-network#12 will be skipped:

# Add flag to engine config to return error

# The commit message casper-network#13 will be skipped:

# Add flag to chainspec.toml

# The commit message casper-network#14 will be skipped:

# Address CI issues

# The commit message casper-network#15 will be skipped:

# Add contract runtime tests

# The commit message casper-network#16 will be skipped:

# rebasing with darthsiroftardis/change-package-version-calls

# The commit message casper-network#17 will be skipped:

# fmt fix

# The commit message casper-network#18 will be skipped:

# fmt fix

# The commit message casper-network#19 will be skipped:

# fmt fix
zajko added a commit to zajko/casper-node that referenced this pull request Jun 16, 2025
# This is the 1st commit message:

Initial wip

# The commit message #2 will be skipped:

# Basic case working. Pre-fixture tests

# The commit message #3 will be skipped:

# Initial fixture tests passing

# The commit message #4 will be skipped:

# Test case passing for disabled versions

# The commit message #5 will be skipped:

# EE tests passing

# The commit message #6 will be skipped:

# Additional fixture tests and PR prep

# The commit message #7 will be skipped:

# Run make format

# The commit message #8 will be skipped:

# X

# The commit message #9 will be skipped:

# X

# The commit message casper-network#10 will be skipped:

# X

# The commit message casper-network#11 will be skipped:

# X

# The commit message casper-network#12 will be skipped:

# Add flag to engine config to return error

# The commit message casper-network#13 will be skipped:

# Add flag to chainspec.toml

# The commit message casper-network#14 will be skipped:

# Address CI issues

# The commit message casper-network#15 will be skipped:

# Add contract runtime tests

# The commit message casper-network#16 will be skipped:

# rebasing with darthsiroftardis/change-package-version-calls

# The commit message casper-network#17 will be skipped:

# fmt fix

# The commit message casper-network#18 will be skipped:

# fmt fix

# The commit message casper-network#19 will be skipped:

# fmt fix

# The commit message casper-network#20 will be skipped:

# refactoring put_key contract

# The commit message casper-network#21 will be skipped:

# refactoring put_key contract

# The commit message casper-network#22 will be skipped:

# X
zajko added a commit to zajko/casper-node that referenced this pull request Oct 13, 2025
# This is the 1st commit message:

rebasing

# The commit message #2 will be skipped:

# WIP

# The commit message #3 will be skipped:

# WIP

# The commit message #4 will be skipped:

# wip

# The commit message #5 will be skipped:

# wip

# The commit message #6 will be skipped:

# wip

# The commit message #7 will be skipped:

# wip

# The commit message #8 will be skipped:

# wip

# The commit message #9 will be skipped:

# wip

# The commit message casper-network#10 will be skipped:

# wip

# The commit message casper-network#11 will be skipped:

# wip

# The commit message casper-network#12 will be skipped:

# wip

# The commit message casper-network#13 will be skipped:

# rebasing

# The commit message casper-network#14 will be skipped:

# wip

# The commit message casper-network#15 will be skipped:

# wip

# The commit message casper-network#16 will be skipped:

# wip

# The commit message casper-network#17 will be skipped:

# wip

# The commit message casper-network#18 will be skipped:

# wip

# The commit message casper-network#19 will be skipped:

# wip
zajko added a commit to zajko/casper-node that referenced this pull request Oct 13, 2025
# This is the 1st commit message:

rebasing

# The commit message #2 will be skipped:

# WIP

# The commit message #3 will be skipped:

# WIP

# The commit message #4 will be skipped:

# wip

# The commit message #5 will be skipped:

# wip

# The commit message #6 will be skipped:

# wip

# The commit message #7 will be skipped:

# wip

# The commit message #8 will be skipped:

# wip

# The commit message #9 will be skipped:

# wip

# The commit message casper-network#10 will be skipped:

# wip

# The commit message casper-network#11 will be skipped:

# wip

# The commit message casper-network#12 will be skipped:

# wip

# The commit message casper-network#13 will be skipped:

# rebasing

# The commit message casper-network#14 will be skipped:

# wip

# The commit message casper-network#15 will be skipped:

# wip

# The commit message casper-network#16 will be skipped:

# wip

# The commit message casper-network#17 will be skipped:

# wip

# The commit message casper-network#18 will be skipped:

# wip

# The commit message casper-network#19 will be skipped:

# wip

# The commit message casper-network#20 will be skipped:

# rebasing

# The commit message casper-network#21 will be skipped:

# wip

# The commit message casper-network#22 will be skipped:

# wip

# The commit message casper-network#23 will be skipped:

# wip
zajko added a commit to zajko/casper-node that referenced this pull request Oct 13, 2025
# This is the 1st commit message:

rebasing

# The commit message #2 will be skipped:

# WIP

# The commit message #3 will be skipped:

# WIP

# The commit message #4 will be skipped:

# wip

# The commit message #5 will be skipped:

# wip

# The commit message #6 will be skipped:

# wip

# The commit message #7 will be skipped:

# wip

# The commit message #8 will be skipped:

# wip

# The commit message #9 will be skipped:

# wip

# The commit message casper-network#10 will be skipped:

# wip

# The commit message casper-network#11 will be skipped:

# wip

# The commit message casper-network#12 will be skipped:

# wip

# The commit message casper-network#13 will be skipped:

# rebasing

# The commit message casper-network#14 will be skipped:

# wip

# The commit message casper-network#15 will be skipped:

# wip

# The commit message casper-network#16 will be skipped:

# wip

# The commit message casper-network#17 will be skipped:

# wip

# The commit message casper-network#18 will be skipped:

# wip

# The commit message casper-network#19 will be skipped:

# wip

# The commit message casper-network#20 will be skipped:

# rebasing

# The commit message casper-network#21 will be skipped:

# wip

# The commit message casper-network#22 will be skipped:

# wip

# The commit message casper-network#23 will be skipped:

# wip

# The commit message casper-network#24 will be skipped:

# wip

# The commit message casper-network#25 will be skipped:

# wip

# The commit message casper-network#26 will be skipped:

# wip

# The commit message casper-network#27 will be skipped:

# wip

# The commit message casper-network#28 will be skipped:

# wip

# The commit message casper-network#29 will be skipped:

# wip
zajko added a commit to zajko/casper-node that referenced this pull request Oct 13, 2025
# This is the 1st commit message:

rebasing

# The commit message #2 will be skipped:

# WIP

# The commit message #3 will be skipped:

# WIP

# The commit message #4 will be skipped:

# wip

# The commit message #5 will be skipped:

# wip

# The commit message #6 will be skipped:

# wip

# The commit message #7 will be skipped:

# wip

# The commit message #8 will be skipped:

# wip

# The commit message #9 will be skipped:

# wip

# The commit message casper-network#10 will be skipped:

# wip

# The commit message casper-network#11 will be skipped:

# wip

# The commit message casper-network#12 will be skipped:

# wip

# The commit message casper-network#13 will be skipped:

# rebasing

# The commit message casper-network#14 will be skipped:

# wip

# The commit message casper-network#15 will be skipped:

# wip

# The commit message casper-network#16 will be skipped:

# wip

# The commit message casper-network#17 will be skipped:

# wip

# The commit message casper-network#18 will be skipped:

# wip

# The commit message casper-network#19 will be skipped:

# wip

# The commit message casper-network#20 will be skipped:

# rebasing

# The commit message casper-network#21 will be skipped:

# wip

# The commit message casper-network#22 will be skipped:

# wip

# The commit message casper-network#23 will be skipped:

# wip

# The commit message casper-network#24 will be skipped:

# wip

# The commit message casper-network#25 will be skipped:

# wip

# The commit message casper-network#26 will be skipped:

# wip

# The commit message casper-network#27 will be skipped:

# wip

# The commit message casper-network#28 will be skipped:

# wip

# The commit message casper-network#29 will be skipped:

# wip

# The commit message casper-network#30 will be skipped:

# wip

# The commit message casper-network#31 will be skipped:

# wip

# The commit message casper-network#32 will be skipped:

# wip
zajko added a commit to zajko/casper-node that referenced this pull request Oct 13, 2025
# This is the 1st commit message:

rebasing

# The commit message #2 will be skipped:

# WIP

# The commit message #3 will be skipped:

# WIP

# The commit message #4 will be skipped:

# wip

# The commit message #5 will be skipped:

# wip

# The commit message #6 will be skipped:

# wip

# The commit message #7 will be skipped:

# wip

# The commit message #8 will be skipped:

# wip

# The commit message #9 will be skipped:

# wip

# The commit message casper-network#10 will be skipped:

# wip

# The commit message casper-network#11 will be skipped:

# wip

# The commit message casper-network#12 will be skipped:

# wip

# The commit message casper-network#13 will be skipped:

# rebasing

# The commit message casper-network#14 will be skipped:

# wip

# The commit message casper-network#15 will be skipped:

# wip

# The commit message casper-network#16 will be skipped:

# wip

# The commit message casper-network#17 will be skipped:

# wip

# The commit message casper-network#18 will be skipped:

# wip

# The commit message casper-network#19 will be skipped:

# wip

# The commit message casper-network#20 will be skipped:

# rebasing

# The commit message casper-network#21 will be skipped:

# wip

# The commit message casper-network#22 will be skipped:

# wip

# The commit message casper-network#23 will be skipped:

# wip

# The commit message casper-network#24 will be skipped:

# wip

# The commit message casper-network#25 will be skipped:

# wip

# The commit message casper-network#26 will be skipped:

# wip

# The commit message casper-network#27 will be skipped:

# wip

# The commit message casper-network#28 will be skipped:

# wip

# The commit message casper-network#29 will be skipped:

# wip

# The commit message casper-network#30 will be skipped:

# wip

# The commit message casper-network#31 will be skipped:

# wip

# The commit message casper-network#32 will be skipped:

# wip

# The commit message casper-network#33 will be skipped:

# wip

# The commit message casper-network#34 will be skipped:

# wip

# The commit message casper-network#35 will be skipped:

# wip

# The commit message casper-network#36 will be skipped:

# wip

# The commit message casper-network#37 will be skipped:

# wip

# The commit message casper-network#38 will be skipped:

# wip

# The commit message casper-network#39 will be skipped:

# wip

# The commit message casper-network#40 will be skipped:

# rebasing
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants