diff --git a/rust-libs/duniter-dbs-read-ops/src/lib.rs b/rust-libs/duniter-dbs-read-ops/src/lib.rs
index d98ccbd146d0259f72df8b9bce682cab109de91b..3f7bc6b0a3b36b96f1f8a5111176194284e66ba4 100644
--- a/rust-libs/duniter-dbs-read-ops/src/lib.rs
+++ b/rust-libs/duniter-dbs-read-ops/src/lib.rs
@@ -32,8 +32,8 @@ use dubp::documents::transaction::TransactionDocumentV10;
 use dubp::{common::prelude::BlockNumber, wallet::prelude::SourceAmount};
 use duniter_dbs::bc_v2::BcV2DbReadable;
 use duniter_dbs::{
-    kv_typed::prelude::*, BlockMetaV2, BlockNumberKeyV2, GvaV1DbReadable, HashKeyV2, PubKeyKeyV2,
-    TxDbV2, TxsMpV2DbReadable,
+    kv_typed::prelude::*, BlockMetaV2, GvaV1DbReadable, HashKeyV2, PubKeyKeyV2, TxDbV2,
+    TxsMpV2DbReadable,
 };
 use resiter::map::Map;
 use std::ops::{Bound, RangeBounds};
diff --git a/rust-libs/duniter-dbs-read-ops/src/uds_of_pubkey.rs b/rust-libs/duniter-dbs-read-ops/src/uds_of_pubkey.rs
index 7effec9421a3f2f0091d35f74e353b64bbce83d3..498924f0341c09d8e55c0c44327020bc2be22fa0 100644
--- a/rust-libs/duniter-dbs-read-ops/src/uds_of_pubkey.rs
+++ b/rust-libs/duniter-dbs-read-ops/src/uds_of_pubkey.rs
@@ -44,7 +44,7 @@ pub fn uds_of_pubkey<DB: BcV2DbReadable, R: 'static + RangeBounds<BlockNumber>>(
             Ok((vec![], SourceAmount::ZERO))
         } else {
             let first_reval = uds_reval
-                .iter(..=BlockNumberKeyV2(blocks_numbers[0]), |it| {
+                .iter(..=U32BE(blocks_numbers[0].0), |it| {
                     it.reverse().keys().next_res()
                 })?
                 .expect("corrupted db");
@@ -65,7 +65,7 @@ pub fn uds_of_pubkey<DB: BcV2DbReadable, R: 'static + RangeBounds<BlockNumber>>(
 
 fn collect_uds<BC: BackendCol, I: ExactSizeIterator<Item = BlockNumber>>(
     mut blocks_numbers: I,
-    first_reval: BlockNumberKeyV2,
+    first_reval: U32BE,
     uds_reval: TxColRo<BC, UdsRevalEvent>,
     amount_opt: Option<SourceAmount>,
 ) -> KvResult<(Vec<(BlockNumber, SourceAmount)>, SourceAmount)> {
@@ -81,7 +81,7 @@ fn collect_uds<BC: BackendCol, I: ExactSizeIterator<Item = BlockNumber>>(
         // Uds before last reval
         for (block_reval, amount_reval) in &uds_revals[1..] {
             'blocks_numbers: while let Some(block_number) = blocks_numbers.next() {
-                if block_number >= block_reval.0 {
+                if block_number.0 >= block_reval.0 {
                     current_ud = amount_reval.0;
                     uds.push((block_number, current_ud));
                     sum = sum + current_ud;
diff --git a/rust-libs/duniter-dbs-write-ops/src/bc.rs b/rust-libs/duniter-dbs-write-ops/src/bc.rs
index 3898eaff1ddcb93db11d0cb424faba70cfd8f864..7ef2c5009209a90c50bbde86fbeb5ee2228bdba7 100644
--- a/rust-libs/duniter-dbs-write-ops/src/bc.rs
+++ b/rust-libs/duniter-dbs-write-ops/src/bc.rs
@@ -20,9 +20,6 @@ mod uds;
 use crate::*;
 use duniter_dbs::bc_v2::BcV2DbWritable;
 
-// ["blocks_meta", blocks_meta, BlockNumberKeyV2, BlockMetaV2,],
-// ["identities", identities, PubKeyKeyV2, IdtyDbV2,],
-
 pub fn revert_block<B: Backend>(
     bc_db: &duniter_dbs::bc_v2::BcV2Db<B>,
     block: DubpBlockV10,
@@ -45,11 +42,11 @@ pub fn revert_block<B: Backend>(
                     )?;
                 }
                 identities::revert_identities::<B>(&block, &mut identities)?;
-                blocks_meta.remove(BlockNumberKeyV2(block.number()));
+                blocks_meta.remove(U32BE(block.number().0));
                 Ok(if block.number() == BlockNumber(0) {
                     None
                 } else {
-                    blocks_meta.get(&BlockNumberKeyV2(BlockNumber(block.number().0 - 1)))?
+                    blocks_meta.get(&U32BE(block.number().0 - 1))?
                 })
             },
         )
@@ -84,7 +81,7 @@ pub fn apply_block<B: Backend>(
     )
         .write(
             |(mut blocks_meta, mut identities, mut uds, mut uds_reval)| {
-                blocks_meta.upsert(BlockNumberKeyV2(block.number()), block_meta);
+                blocks_meta.upsert(U32BE(block.number().0), block_meta);
                 identities::update_identities::<B>(&block, &mut identities)?;
                 if let Some(dividend) = block.dividend() {
                     uds::create_uds::<B>(
diff --git a/rust-libs/duniter-dbs-write-ops/src/bc/uds.rs b/rust-libs/duniter-dbs-write-ops/src/bc/uds.rs
index 140f770c8ac26103bc6a7ebc907bcd6b78eaf3e4..17abafeaf08c32ded69726b0c8cc711854a8c397 100644
--- a/rust-libs/duniter-dbs-write-ops/src/bc/uds.rs
+++ b/rust-libs/duniter-dbs-write-ops/src/bc/uds.rs
@@ -19,9 +19,6 @@ use duniter_dbs::{
     UdIdV2,
 };
 
-// ["uds_reval", uds_reval, BlockNumberKeyV2, SourceAmountValV2,],
-// ["uds", uds, UdIdV2, (),],
-
 pub(crate) fn create_uds<B: Backend>(
     block_number: BlockNumber,
     dividend: SourceAmount,
@@ -33,7 +30,7 @@ pub(crate) fn create_uds<B: Backend>(
         .iter(.., |it| it.reverse().values().next_res())?
         .unwrap_or_else(|| SourceAmountValV2(SourceAmount::ZERO));
     if dividend > previous_ud_amount.0 {
-        uds_reval.upsert(BlockNumberKeyV2(block_number), SourceAmountValV2(dividend));
+        uds_reval.upsert(U32BE(block_number.0), SourceAmountValV2(dividend));
     }
 
     let members = identities.iter(.., |it| {
@@ -56,8 +53,8 @@ pub(crate) fn revert_uds<B: Backend>(
         .iter(.., |it| it.reverse().keys().next_res())?
         .expect("corrupted db")
         .0;
-    if block_number == previous_reval_block_number {
-        uds_reval.remove(BlockNumberKeyV2(block_number));
+    if block_number.0 == previous_reval_block_number {
+        uds_reval.remove(U32BE(block_number.0));
     }
 
     let members = identities.iter(.., |it| {
diff --git a/rust-libs/duniter-dbs-write-ops/src/lib.rs b/rust-libs/duniter-dbs-write-ops/src/lib.rs
index f03e95980ab9f0871f5f06517fb723aba5f582ec..15bc7130b095252c720442013a8e3f446d49d908 100644
--- a/rust-libs/duniter-dbs-write-ops/src/lib.rs
+++ b/rust-libs/duniter-dbs-write-ops/src/lib.rs
@@ -39,9 +39,9 @@ use dubp::documents::{
 use dubp::wallet::prelude::*;
 use duniter_dbs::gva_v1::{TxsByIssuerEvent, TxsByRecipientEvent, TxsEvent};
 use duniter_dbs::{
-    kv_typed::prelude::*, BlockMetaV2, BlockNumberKeyV2, DuniterDbs, GvaV1Db, GvaV1DbReadable,
-    GvaV1DbWritable, HashKeyV2, PendingTxDbV2, PubKeyKeyV2, PubKeyValV2, SourceAmountValV2, TxDbV2,
-    TxsMpV2Db, TxsMpV2DbReadable, TxsMpV2DbWritable, WalletConditionsV2,
+    kv_typed::prelude::*, BlockMetaV2, DuniterDbs, GvaV1Db, GvaV1DbReadable, GvaV1DbWritable,
+    HashKeyV2, PendingTxDbV2, PubKeyKeyV2, PubKeyValV2, SourceAmountValV2, TxDbV2, TxsMpV2Db,
+    TxsMpV2DbReadable, TxsMpV2DbWritable, WalletConditionsV2,
 };
 use resiter::filter_map::FilterMap;
 use resiter::flatten::Flatten;
diff --git a/rust-libs/duniter-dbs/src/bc_v2.rs b/rust-libs/duniter-dbs/src/bc_v2.rs
index 4ab7b559b1cbcb7807c12ee21e7e9adf34f62ca9..99a643f3ceb7247a223f388f928fec6ad2c15584 100644
--- a/rust-libs/duniter-dbs/src/bc_v2.rs
+++ b/rust-libs/duniter-dbs/src/bc_v2.rs
@@ -18,8 +18,8 @@ use crate::*;
 db_schema!(
     BcV2,
     [
-        ["blocks_meta", BlocksMeta, BlockNumberKeyV2, BlockMetaV2],
-        ["uds_reval", UdsReval, BlockNumberKeyV2, SourceAmountValV2],
+        ["blocks_meta", BlocksMeta, U32BE, BlockMetaV2],
+        ["uds_reval", UdsReval, U32BE, SourceAmountValV2],
         ["identities", Identities, PubKeyKeyV2, IdtyDbV2],
         ["uds", Uds, UdIdV2, ()],
     ]
diff --git a/rust-libs/duniter-dbs/src/lib.rs b/rust-libs/duniter-dbs/src/lib.rs
index b6c88e9a4f13a9ba1778ebda34b6233fade73fd4..710d1fe535f3a4174019b59b360acd21ed5b78a3 100644
--- a/rust-libs/duniter-dbs/src/lib.rs
+++ b/rust-libs/duniter-dbs/src/lib.rs
@@ -61,7 +61,7 @@ pub use crate::open_dbs::open_dbs;
 pub use bc_v1::{BcV1Db, BcV1DbReadable, BcV1DbRo, BcV1DbWritable, MainBlocksEvent, UidsEvent};
 pub use gva_v1::{GvaV1Db, GvaV1DbReadable, GvaV1DbRo, GvaV1DbWritable};
 pub use keys::all::AllKeyV1;
-pub use keys::block_number::{BlockNumberKeyV1, BlockNumberKeyV2};
+pub use keys::block_number::BlockNumberKeyV1;
 pub use keys::blockstamp::BlockstampKeyV1;
 pub use keys::hash::{HashKeyV1, HashKeyV2};
 pub use keys::pubkey::{PubKeyKeyV1, PubKeyKeyV2};
diff --git a/rust-libs/modules/duniter-gva/src/queries/uds.rs b/rust-libs/modules/duniter-gva/src/queries/uds.rs
index 9f698a68782124c500326e64a49cb926b430d6ca..7cab2002838c19e1422775a411d671e046b9b29e 100644
--- a/rust-libs/modules/duniter-gva/src/queries/uds.rs
+++ b/rust-libs/modules/duniter-gva/src/queries/uds.rs
@@ -83,7 +83,7 @@ impl UdsQuery {
                     it.map_ok(|(block_number, sa)| RevalUdGva {
                         amount: sa.0.amount(),
                         base: sa.0.base(),
-                        block_number: (block_number.0).0,
+                        block_number: block_number.0,
                     })
                     .collect::<KvResult<Vec<_>>>()
                 })
diff --git a/rust-libs/tools/kv_typed/src/as_bytes.rs b/rust-libs/tools/kv_typed/src/as_bytes.rs
index 0ba24d8e07edab661687ce0010693134924f3394..97a5dc70f670809d9239f444bf4d8e03942d82a5 100644
--- a/rust-libs/tools/kv_typed/src/as_bytes.rs
+++ b/rust-libs/tools/kv_typed/src/as_bytes.rs
@@ -118,7 +118,7 @@ where
     }
 }
 
-macro_rules! impl_as_bytes_for_numbers {
+macro_rules! impl_as_bytes_for_le_numbers {
     ($($T:ty),*) => {$(
         impl KeyAsBytes for $T {
             fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T {
@@ -132,7 +132,22 @@ macro_rules! impl_as_bytes_for_numbers {
         }
     )*};
 }
-
-impl_as_bytes_for_numbers!(
+impl_as_bytes_for_le_numbers!(
     usize, u8, u16, u32, u64, u128, isize, i8, i16, i32, i64, i128, f32, f64
 );
+
+macro_rules! impl_as_bytes_for_be_numbers {
+    ($($T:ty),*) => {$(
+        impl KeyAsBytes for $T {
+            fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T {
+                f(&self.0.to_be_bytes()[..])
+            }
+        }
+        impl ValueAsBytes for $T {
+            fn as_bytes<T, F: FnMut(&[u8]) -> Result<T, KvError>>(&self, mut f: F) -> Result<T, KvError> {
+                f(&self.0.to_be_bytes()[..])
+            }
+        }
+    )*};
+}
+impl_as_bytes_for_be_numbers!(U32BE);
diff --git a/rust-libs/tools/kv_typed/src/explorer.rs b/rust-libs/tools/kv_typed/src/explorer.rs
index e3a4ab089583c1510463b8641c597c52c2294e5c..5a86fa1daa87ced1f3ebc780b06e362f0e1e898f 100644
--- a/rust-libs/tools/kv_typed/src/explorer.rs
+++ b/rust-libs/tools/kv_typed/src/explorer.rs
@@ -50,9 +50,23 @@ macro_rules! impl_explorable_key_for_numbers {
         }
     )*};
 }
-
 impl_explorable_key_for_numbers!(usize, u8, u16, u32, u64, u128, i8, i16, i32, i64, i128, f32, f64);
 
+macro_rules! impl_explorable_key_for_be_numbers {
+    ($($T:ty),*) => {$(
+        impl ExplorableKey for $T {
+            fn from_explorer_str(source: &str) -> Result<Self, StringErr> {
+                Ok(Self(source.parse().map_err(|e| StringErr(format!("{}", e)))?))
+            }
+
+            fn to_explorer_string(&self) -> KvResult<String> {
+                Ok(format!("{}", self.0))
+            }
+        }
+    )*};
+}
+impl_explorable_key_for_be_numbers!(U32BE);
+
 pub trait ExplorableValue: Sized {
     fn from_explorer_str(source: &str) -> Result<Self, StringErr>;
     fn to_explorer_json(&self) -> KvResult<serde_json::Value>;
diff --git a/rust-libs/tools/kv_typed/src/from_bytes.rs b/rust-libs/tools/kv_typed/src/from_bytes.rs
index a8837d27d53aa461f6516a8f3fbd3e0d2dbaa572..5bfe507254a7a440e37af53944ffda9b434884f3 100644
--- a/rust-libs/tools/kv_typed/src/from_bytes.rs
+++ b/rust-libs/tools/kv_typed/src/from_bytes.rs
@@ -26,11 +26,23 @@ macro_rules! impl_from_bytes_for_numbers {
         }
     )*};
 }
-
 impl_from_bytes_for_numbers!(
     usize, u8, u16, u32, u64, u128, isize, i8, i16, i32, i64, i128, f32, f64
 );
 
+macro_rules! impl_from_bytes_for_be_numbers {
+    ($(($T:ty, $INT:ty)),*) => {$(
+        impl FromBytes for $T {
+            type Err = std::array::TryFromSliceError;
+
+            fn from_bytes(bytes: &[u8]) -> Result<Self, Self::Err> {
+                Ok(Self(<$INT>::from_be_bytes(bytes.try_into()?)))
+            }
+        }
+    )*};
+}
+impl_from_bytes_for_be_numbers!((U32BE, u32));
+
 impl FromBytes for String {
     type Err = std::str::Utf8Error;
 
diff --git a/rust-libs/tools/kv_typed/src/key.rs b/rust-libs/tools/kv_typed/src/key.rs
index 7d820dfa7b4453454f5a0642e0e76bd8dd96d929..da3992b9a23d9e39ab8cb86e1b100a98f8e03bd0 100644
--- a/rust-libs/tools/kv_typed/src/key.rs
+++ b/rust-libs/tools/kv_typed/src/key.rs
@@ -60,3 +60,6 @@ impl<T> Key for T where
         + Sized
 {
 }
+
+#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
+pub struct U32BE(pub u32);
diff --git a/rust-libs/tools/kv_typed/src/lib.rs b/rust-libs/tools/kv_typed/src/lib.rs
index 87eab552096d013a75e5d60b325c5249441ba3a8..0908acaaa0c563be45bfa0eed80b50fafc676edd 100644
--- a/rust-libs/tools/kv_typed/src/lib.rs
+++ b/rust-libs/tools/kv_typed/src/lib.rs
@@ -82,7 +82,7 @@ pub mod prelude {
     pub use crate::iter::{
         keys::KvIterKeys, values::KvIterValues, EntryIter, KvIter, ResultIter, ReversableIterator,
     };
-    pub use crate::key::Key;
+    pub use crate::key::{Key, U32BE};
     pub use crate::subscription::{NewSubscribers, Subscriber, Subscribers};
     pub use crate::transactional_read::{TransactionalRead, TxColRo};
     pub use crate::transactional_write::{DbTxCollectionRw, TransactionalWrite, TxColRw};