diff --git a/api/src/server.rs b/api/src/server.rs index 9eeb44844..456f001ec 100644 --- a/api/src/server.rs +++ b/api/src/server.rs @@ -186,10 +186,10 @@ where // Construct start and stop event id based on provided data. let start_builder = EventId::builder() .with_network(&self.network) - .with_sort_value(&sort_value); + .with_sort_value(&sort_key, &sort_value); let stop_builder = EventId::builder() .with_network(&self.network) - .with_sort_value(&sort_value); + .with_sort_value(&sort_key, &sort_value); let (start_builder, stop_builder) = if let Some(controller) = controller { if let Some(stream_id) = stream_id { let stream_id = StreamId::from_str(&stream_id) @@ -316,11 +316,12 @@ mod tests { let network = Network::InMemory; let event_id = EventId::new( &network, - "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9", - "did:key:zGs1Det7LHNeu7DXT4nvoYrPfj3n6g7d6bj2K4AMXEvg1", - &Cid::from_str("baejbeihyr3kf77etqdccjfoc33dmko2ijyugn6qk6yucfkioasjssz3bbu").unwrap(), + "model", + "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9", // cspell:disable-line + "did:key:zGs1Det7LHNeu7DXT4nvoYrPfj3n6g7d6bj2K4AMXEvg1", // cspell:disable-line + &Cid::from_str("baejbeihyr3kf77etqdccjfoc33dmko2ijyugn6qk6yucfkioasjssz3bbu").unwrap(), // cspell:disable-line 0, - &Cid::from_str("baejbeicqtpe5si4qvbffs2s7vtbk5ccbsfg6owmpidfj3zeluqz4hlnz6m").unwrap(), + &Cid::from_str("baejbeicqtpe5si4qvbffs2s7vtbk5ccbsfg6owmpidfj3zeluqz4hlnz6m").unwrap(), // cspell:disable-line ); let event_id_str = multibase::encode(Base::Base16Lower, event_id.to_bytes()); let mock_interest = MockReconInterestTest::new(); @@ -347,18 +348,19 @@ mod tests { async fn subscribe_sort_value() { let peer_id = PeerId::random(); let network = Network::InMemory; - let model = "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9"; + let model = "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9"; // cspell:disable-line + // Construct start and end event ids let start = EventId::builder() .with_network(&network) - .with_sort_value(model) + .with_sort_value("model", model) .with_min_controller() .with_min_init() .with_min_event_height() .build_fencepost(); let end = EventId::builder() .with_network(&network) - .with_sort_value(model) + .with_sort_value("model", model) .with_max_controller() .with_max_init() .with_max_event_height() @@ -367,18 +369,18 @@ mod tests { // Construct event to be returned let event_id = EventId::builder() .with_network(&network) - .with_sort_value(model) + .with_sort_value("model", model) .with_controller("did:key:zH3RdYVn3WtYR3LXmXk8wA6XWUjWMLgRa5ia1tgR3uR9D") .with_init( &StreamId::from_str( - "k2t6wz4ylx0qmwkzy91072jnjj1w0jvxlvyatf5jox9om5wp69euipjoqdejkd", + "k2t6wz4ylx0qmwkzy91072jnjj1w0jvxlvyatf5jox9om5wp69euipjoqdejkd", // cspell:disable-line ) .unwrap() .cid, ) .with_event_height(9) .with_event( - &Cid::from_str("baejbeibmbnp2ffyug3cfamsw7cno3plz5qkwfednrkyse6azcz7fycdym4") + &Cid::from_str("baejbeibmbnp2ffyug3cfamsw7cno3plz5qkwfednrkyse6azcz7fycdym4") // cspell:disable-line .unwrap(), ) .build(); @@ -433,18 +435,18 @@ mod tests { async fn subscribe_sort_value_controller() { let peer_id = PeerId::random(); let network = Network::InMemory; - let model = "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9"; + let model = "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9"; // cspell:disable-line let controller = "did:key:zGs1Det7LHNeu7DXT4nvoYrPfj3n6g7d6bj2K4AMXEvg1"; let start = EventId::builder() .with_network(&network) - .with_sort_value(model) + .with_sort_value("model", model) .with_controller(controller) .with_min_init() .with_min_event_height() .build_fencepost(); let end = EventId::builder() .with_network(&network) - .with_sort_value(model) + .with_sort_value("model", model) .with_controller(controller) .with_max_init() .with_max_event_height() @@ -496,21 +498,21 @@ mod tests { async fn subscribe_sort_value_controller_stream() { let peer_id = PeerId::random(); let network = Network::InMemory; - let model = "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9"; + let model = "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9"; // cspell:disable-line let controller = "did:key:zGs1Det7LHNeu7DXT4nvoYrPfj3n6g7d6bj2K4AMXEvg1"; let stream = - StreamId::from_str("k2t6wz4ylx0qs435j9oi1s6469uekyk6qkxfcb21ikm5ag2g1cook14ole90aw") + StreamId::from_str("k2t6wz4ylx0qs435j9oi1s6469uekyk6qkxfcb21ikm5ag2g1cook14ole90aw") // cspell:disable-line .unwrap(); let start = EventId::builder() .with_network(&network) - .with_sort_value(model) + .with_sort_value("model", model) .with_controller(controller) .with_init(&stream.cid) .with_min_event_height() .build_fencepost(); let end = EventId::builder() .with_network(&network) - .with_sort_value(model) + .with_sort_value("model", model) .with_controller(controller) .with_init(&stream.cid) .with_max_event_height() @@ -562,21 +564,21 @@ mod tests { async fn subscribe_sort_value_controller_stream_offset_limit() { let peer_id = PeerId::random(); let network = Network::InMemory; - let model = "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9"; + let model = "k2t6wz4ylx0qr6v7dvbczbxqy7pqjb0879qx930c1e27gacg3r8sllonqt4xx9"; // cspell:disable-line let controller = "did:key:zGs1Det7LHNeu7DXT4nvoYrPfj3n6g7d6bj2K4AMXEvg1"; let stream = - StreamId::from_str("k2t6wz4ylx0qs435j9oi1s6469uekyk6qkxfcb21ikm5ag2g1cook14ole90aw") + StreamId::from_str("k2t6wz4ylx0qs435j9oi1s6469uekyk6qkxfcb21ikm5ag2g1cook14ole90aw") // cspell:disable-line .unwrap(); let start = EventId::builder() .with_network(&network) - .with_sort_value(model) + .with_sort_value("model", model) .with_controller(controller) .with_init(&stream.cid) .with_min_event_height() .build_fencepost(); let end = EventId::builder() .with_network(&network) - .with_sort_value(model) + .with_sort_value("model", model) .with_controller(controller) .with_init(&stream.cid) .with_max_event_height() diff --git a/core/src/event_id.rs b/core/src/event_id.rs index 927518bf1..f4c360c16 100644 --- a/core/src/event_id.rs +++ b/core/src/event_id.rs @@ -3,7 +3,7 @@ //! varint(0xce) + // streamid, 1 byte //! varint(0x05) + // cip-124 EventID, 1 byte //! varint(networkId), // 1 byte (5 for local network) -//! last8Bytes(sha256(separator_value)), // 16 bytes +//! last8Bytes(sha256(separator_key + "|" + separator_value)), // 16 bytes //! last8Bytes(sha256(stream_controller_DID)), // 16 bytes //! last4Bytes(init_event_CID) // 8 bytes //! cbor(eventHeight), // 1-3 bytes @@ -40,6 +40,7 @@ impl EventId { /// EventId.new builds a Vec with the event id data. pub fn new( network: &Network, + sort_key: &str, sort_value: &str, controller: &str, init: &Cid, @@ -48,7 +49,7 @@ impl EventId { ) -> EventId { EventId::builder() .with_network(network) - .with_sort_value(sort_value) + .with_sort_value(sort_key, sort_value) .with_controller(controller) .with_init(init) .with_event_height(event_height) @@ -227,7 +228,7 @@ impl Builder { // varint(0xce) + // streamid, 1 byte // varint(0x05) + // cip-124 EventID, 1 byte // varint(networkId), // 5 bytes for local network - // last8Bytes(sha256(separator_value)), // 8 bytes + //! last8Bytes(sha256(separator_key + "|" + separator_value)), // 16 bytes // last8Bytes(sha256(stream_controller_DID)), // 8 bytes // last4Bytes(init_event_CID) // 4 bytes // cbor(eventHeight), // u64_max 9 bytes @@ -247,10 +248,11 @@ impl Builder { } impl Builder { // TODO sort_value should be bytes not str - pub fn with_sort_value(mut self, sort_value: &str) -> Builder { - self.state - .bytes - .extend(last8_bytes(&sha256_digest(sort_value))); + pub fn with_sort_value(mut self, sort_key: &str, sort_value: &str) -> Builder { + self.state.bytes.extend(last8_bytes(&sha256_digest(&format!( + "{}|{}", + sort_key, sort_value, + )))); Builder { state: WithSortValue { bytes: self.state.bytes, @@ -375,6 +377,7 @@ mod tests { #[test] fn blessing() { + let sort_key = "model".to_string(); let separator = "kh4q0ozorrgaq2mezktnrmdwleo1d".to_string(); // cspell:disable-line let controller = "did:key:z6MkgSV3tAuw7gUWqKCUY7ae6uWNxqYgdwPhUJbJhF9EFXm9".to_string(); let init = @@ -385,6 +388,7 @@ mod tests { let eid = EventId::new( &Network::Mainnet, + &sort_key, &separator, &controller, &init, @@ -392,63 +396,60 @@ mod tests { &event_cid, ); expect![[ - "fce0105002a30541a6fbdca4645cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86" + "fce0105007e710e217fa0e25945cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86" ]] .assert_eq(&multibase::encode(Base::Base16Lower, eid.0)); let eid = EventId::new( &Network::TestnetClay, + &sort_key, &separator, &controller, &init, event_height, &event_cid, ); - expect![[ - r#"fce0105012a30541a6fbdca4645cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86"# - ]] + expect!["fce0105017e710e217fa0e25945cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86"] .assert_eq(&multibase::encode(Base::Base16Lower, eid.0)); let eid = EventId::new( &Network::DevUnstable, + &sort_key, &separator, &controller, &init, event_height, &event_cid, ); - expect![[ - r#"fce0105022a30541a6fbdca4645cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86"# - ]] + expect!["fce0105027e710e217fa0e25945cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86"] .assert_eq(&multibase::encode(Base::Base16Lower, eid.0)); let eid = EventId::new( &Network::InMemory, + &sort_key, &separator, &controller, &init, event_height, &event_cid, ); - expect![[ - r#"fce0105ff012a30541a6fbdca4645cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86"# - ]].assert_eq(&multibase::encode(Base::Base16Lower, eid.0)); + expect!["fce0105ff017e710e217fa0e25945cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86"].assert_eq(&multibase::encode(Base::Base16Lower, eid.0)); let eid = EventId::new( &Network::Local(0xce4a441c), + &sort_key, &separator, &controller, &init, event_height, &event_cid, ); - expect![[ - r#"fce01059c88a9f21c2a30541a6fbdca4645cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86"# - ]].assert_eq(&multibase::encode(Base::Base16Lower, eid.0)); + expect!["fce01059c88a9f21c7e710e217fa0e25945cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86"].assert_eq(&multibase::encode(Base::Base16Lower, eid.0)); } #[test] fn test_serialize() { + let sort_key = "model".to_string(); let separator = "kh4q0ozorrgaq2mezktnrmdwleo1d".to_string(); // cspell:disable-line let controller = "did:key:z6MkgSV3tAuw7gUWqKCUY7ae6uWNxqYgdwPhUJbJhF9EFXm9".to_string(); let init = @@ -459,6 +460,7 @@ mod tests { let received = EventId::new( &Network::Mainnet, + &sort_key, &separator, &controller, &init, @@ -469,84 +471,84 @@ mod tests { let received_cbor = hex::encode(serde_ipld_dagcbor::ser::to_vec(&received).unwrap()); println!("serde_json {}", serde_json::to_string(&received).unwrap()); // Message as json expect![[ - "583ece0105002a30541a6fbdca4645cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86" + "583ece0105007e710e217fa0e25945cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86" ]].assert_eq(&received_cbor); } #[test] fn test_deserialize() { - let bytes = hex::decode("583ece0105002a30541a6fbdca4645cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86").unwrap(); + let bytes = hex::decode("583ece0105007e710e217fa0e25945cc7c072ff729ea683b751718ff01711220f4ef7ec208944d257025408bb647949e6b72930520bc80f34d8bfbafd2643d86").unwrap(); let x = serde_ipld_dagcbor::de::from_slice(bytes.as_slice()); let received: EventId = x.unwrap(); let cid = received.cid(); println!("{:?}, {:?}", &received, &cid); expect![[r#" - EventId( - [ - 206, - 1, - 5, - 0, - 42, - 48, - 84, - 26, - 111, - 189, - 202, - 70, - 69, - 204, - 124, - 7, - 47, - 247, - 41, - 234, - 104, - 59, - 117, - 23, - 24, - 255, - 1, - 113, - 18, - 32, - 244, - 239, - 126, - 194, - 8, - 148, - 77, - 37, - 112, - 37, - 64, - 139, - 182, - 71, - 148, - 158, - 107, - 114, - 147, - 5, - 32, - 188, - 128, - 243, - 77, - 139, - 251, - 175, - 210, - 100, - 61, - 134, - ], - ) + EventId( + [ + 206, + 1, + 5, + 0, + 126, + 113, + 14, + 33, + 127, + 160, + 226, + 89, + 69, + 204, + 124, + 7, + 47, + 247, + 41, + 234, + 104, + 59, + 117, + 23, + 24, + 255, + 1, + 113, + 18, + 32, + 244, + 239, + 126, + 194, + 8, + 148, + 77, + 37, + 112, + 37, + 64, + 139, + 182, + 71, + 148, + 158, + 107, + 114, + 147, + 5, + 32, + 188, + 128, + 243, + 77, + 139, + 251, + 175, + 210, + 100, + 61, + 134, + ], + ) "#]] .assert_debug_eq(&received); @@ -555,6 +557,7 @@ mod tests { } #[test] fn cid() { + let sort_key = "model".to_string(); let separator = "kh4q0ozorrgaq2mezktnrmdwleo1d".to_string(); // cspell:disable-line let controller = "did:key:z6MkgSV3tAuw7gUWqKCUY7ae6uWNxqYgdwPhUJbJhF9EFXm9".to_string(); let init = @@ -565,6 +568,7 @@ mod tests { let event_id = EventId::new( &Network::Mainnet, + &sort_key, &separator, &controller, &init, @@ -575,6 +579,7 @@ mod tests { } #[test] fn no_cid() { + let sort_key = "model".to_string(); let separator = "kh4q0ozorrgaq2mezktnrmdwleo1d".to_string(); // cspell:disable-line let controller = "did:key:z6MkgSV3tAuw7gUWqKCUY7ae6uWNxqYgdwPhUJbJhF9EFXm9".to_string(); let init = @@ -583,7 +588,7 @@ mod tests { // Max event height let event_id = EventId::builder() .with_network(&Network::Mainnet) - .with_sort_value(&separator) + .with_sort_value(&sort_key, &separator) .with_controller(&controller) .with_init(&init) .with_max_event_height() @@ -593,7 +598,7 @@ mod tests { // Min event height let event_id = EventId::builder() .with_network(&Network::Mainnet) - .with_sort_value(&separator) + .with_sort_value(&sort_key, &separator) .with_controller(&controller) .with_init(&init) .with_min_event_height() diff --git a/cspell.json b/cspell.json new file mode 100644 index 000000000..63d07e43b --- /dev/null +++ b/cspell.json @@ -0,0 +1,82 @@ +{ + "version": "0.2", + "ignorePaths": [ + "*.lock" + ], + "dictionaryDefinitions": [], + "dictionaries": [], + "words": [ + "aahed", + "addrs", + "ahash", + "ahashs", + "autonat", + "behaviour", + "bitswap", + "btreestore", + "cbor", + "chacha", + "cids", + "cidv1", + "codespan", + "dagcbor", + "Dcutr", + "Deque", + "eventid", + "gossipsub", + "hardline", + "Hasher", + "hashs", + "ipfs", + "ipld", + "iroh", + "irpc", + "Kademlia", + "kbucket", + "kbuckets", + "Keychain", + "Keypair", + "kubo", + "lalrpop", + "lib", + "libipld", + "libp2p", + "listen_addrs", + "mdns", + "meshsub", + "minicbor", + "mockall", + "Multiaddr", + "multiaddrs", + "multibase", + "multicodec", + "multiformat", + "multiformats", + "multihash", + "oneshot", + "opentelemetry", + "otlp", + "peerid", + "preimage", + "propernames", + "PROTO", + "quic", + "quickcheck", + "rusqlite", + "serde", + "softline", + "sqlitestore", + "streamid", + "Substream", + "termcolor", + "unimock", + "varint", + "wordle", + "wordlist", + "zymic", + "zythum" + ], + "ignoreWords": [ + ], + "import": [] +} diff --git a/recon/src/libp2p/tests.rs b/recon/src/libp2p/tests.rs index 7f17527d0..83fff4c34 100644 --- a/recon/src/libp2p/tests.rs +++ b/recon/src/libp2p/tests.rs @@ -77,6 +77,7 @@ fn build_swarm(name: &str, config: Config) -> SwarmTest { // Initialize with three events EventId::new( &Network::Mainnet, + "model", &format!("{}_model", name), &format!("{}_controller", name), &random_cid(), @@ -85,6 +86,7 @@ fn build_swarm(name: &str, config: Config) -> SwarmTest { ), EventId::new( &Network::Mainnet, + "model", &format!("{}_model", name), &format!("{}_controller", name), &random_cid(), @@ -93,6 +95,7 @@ fn build_swarm(name: &str, config: Config) -> SwarmTest { ), EventId::new( &Network::Mainnet, + "model", &format!("{}_model", name), &format!("{}_controller", name), &random_cid(), @@ -244,7 +247,7 @@ fn recon_sync() { #[test] #[traced_test] -fn unsupported_doesnt_fail() { +fn unsupported_does_not_fail() { let mut swarm1 = Swarm::new_ephemeral(|_| keep_alive::Behaviour); let mut swarm2 = build_swarm("swarm2", Config::default()); let result = async_std::task::block_on(async {