sc_network_bitswap/
lib.rs1use cid::Version as CidVersion;
21
22mod handle;
23mod metrics;
24mod service;
25
26pub use cid::Cid;
27pub(crate) use handle::BitswapCommand;
28pub use handle::{BitswapError, BitswapHandle, FetchItem};
29pub use service::start;
30
31pub(crate) const LOG_TARGET: &str = "sub-libp2p::bitswap";
32
33pub const MAX_WANTED_BLOCKS: usize = 16;
35
36pub const RAW_CODEC: u64 = 0x55;
38
39pub const BLAKE2B_256_MULTIHASH_CODE: u64 = 0xb220;
41
42pub const SHA2_256_MULTIHASH_CODE: u64 = 0x12;
44
45pub const KECCAK_256_MULTIHASH_CODE: u64 = 0x1b;
47
48pub fn is_cid_supported(cid: &Cid) -> bool {
50 cid.version() != CidVersion::V0 &&
51 cid.hash().size() == 32 &&
52 matches!(
53 cid.hash().code(),
54 BLAKE2B_256_MULTIHASH_CODE | SHA2_256_MULTIHASH_CODE | KECCAK_256_MULTIHASH_CODE
55 )
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61
62 #[test]
63 fn is_cid_supported_accepts_all_three_supported_hashings() {
64 use cid::multihash::Multihash;
65 for multihash_code in
66 [BLAKE2B_256_MULTIHASH_CODE, SHA2_256_MULTIHASH_CODE, KECCAK_256_MULTIHASH_CODE]
67 {
68 let digest = [9u8; 32];
69 let mh = Multihash::<64>::wrap(multihash_code, &digest).unwrap();
70 let cid = Cid::new_v1(RAW_CODEC, mh);
71 assert!(is_cid_supported(&cid), "{multihash_code} CID should be supported");
72 }
73 }
74
75 #[test]
76 fn is_cid_supported_rejects_unknown_multihash_code() {
77 use cid::multihash::Multihash;
78 let digest = [9u8; 32];
79 let mh = Multihash::<64>::wrap(0x99, &digest).unwrap();
80 let cid = Cid::new_v1(RAW_CODEC, mh);
81 assert!(!is_cid_supported(&cid));
82 }
83}