@@ -763,46 +763,45 @@ async def find_peer(self, peer_id: ID) -> PeerInfo | None:
763763
764764 # Value storage and retrieval methods
765765
766- async def put_value (self , key : bytes , value : bytes ) -> None :
766+ async def put_value (self , key : str , value : bytes ) -> None :
767767 """
768768 Store a value in the DHT.
769+
770+ Args:
771+ key: String key (will be converted to bytes for storage)
772+ value: Binary value to store
773+
769774 """
770- logger .debug (f"Storing value for key { key . hex () } " )
775+ logger .debug (f"Storing value for key { key } " )
771776
772- if key .decode ("utf-8" ).startswith ("/" ):
773- if self .validator is not None :
774- # Dont allow local users to put bad values
775- self .validator .validate (key .decode ("utf-8" ), value )
777+ # Validate if key starts with "/" (namespaced keys like /pk/...)
778+ if self .validator is not None and key .startswith ("/" ):
779+ self .validator .validate (key , value )
776780
777- old_value_record = self .value_store .get (key )
778- if old_value_record is not None and old_value_record .value != value :
779- # Select which value is better
780- try :
781- index = self .validator .select (
782- key .decode ("utf-8" ), [value , old_value_record .value ]
783- )
784- if index != 0 :
785- raise ValueError (
786- "Refusing to replace newer value with the older one"
787- )
788- except Exception as e :
789- logger .debug (f"Validation error for key { key .hex ()} : { e } " )
790- raise
781+ key_bytes = key .encode ("utf-8" )
782+ old_value_record = self .value_store .get (key_bytes )
783+ if old_value_record is not None and old_value_record .value != value :
784+ index = self .validator .select (key , [value , old_value_record .value ])
785+ if index != 0 :
786+ raise ValueError (
787+ "Refusing to replace newer value with the older one"
788+ )
789+
790+ # Convert string key to bytes for storage
791+ key_bytes = key .encode ("utf-8" )
791792
792793 # 1. Store locally first
793- self .value_store .put (key , value )
794+ self .value_store .put (key_bytes , value )
794795 try :
795796 decoded_value = value .decode ("utf-8" )
796797 except UnicodeDecodeError :
797798 decoded_value = value .hex ()
798- logger .debug (
799- f"Stored value locally for key { key .hex ()} with value { decoded_value } "
800- )
799+ logger .debug (f"Stored value locally for key { key } with value { decoded_value } " )
801800
802801 # 2. Get closest peers, excluding self
803802 closest_peers = [
804803 peer
805- for peer in self .routing_table .find_local_closest_peers (key )
804+ for peer in self .routing_table .find_local_closest_peers (key_bytes )
806805 if peer != self .local_peer_id
807806 ]
808807 logger .debug (f"Found { len (closest_peers )} peers to store value at" )
@@ -817,7 +816,7 @@ async def store_one(idx: int, peer: ID) -> None:
817816 try :
818817 with trio .move_on_after (QUERY_TIMEOUT ):
819818 success = await self .value_store ._store_at_peer (
820- peer , key , value
819+ peer , key_bytes , value
821820 )
822821 batch_results [idx ] = success
823822 if success :
@@ -835,19 +834,32 @@ async def store_one(idx: int, peer: ID) -> None:
835834
836835 logger .info (f"Successfully stored value at { stored_count } peers" )
837836
838- async def get_value (self , key : bytes ) -> bytes | None :
839- logger .debug (f"Getting value for key: { key .hex ()} " )
837+ async def get_value (self , key : str ) -> bytes | None :
838+ """
839+ Retrieve a value from the DHT.
840+
841+ Args:
842+ key: String key (will be converted to bytes for lookup)
843+
844+ Returns:
845+ The value if found, None otherwise
846+
847+ """
848+ logger .debug (f"Getting value for key: { key } " )
849+
850+ # Convert string key to bytes for lookup
851+ key_bytes = key .encode ("utf-8" )
840852
841853 # 1. Check local store first
842- value_record = self .value_store .get (key )
854+ value_record = self .value_store .get (key_bytes )
843855 if value_record :
844856 logger .debug ("Found value locally" )
845857 return value_record .value
846858
847859 # 2. Get closest peers, excluding self
848860 closest_peers = [
849861 peer
850- for peer in self .routing_table .find_local_closest_peers (key )
862+ for peer in self .routing_table .find_local_closest_peers (key_bytes )
851863 if peer != self .local_peer_id
852864 ]
853865 logger .debug (f"Searching { len (closest_peers )} peers for value" )
@@ -861,7 +873,7 @@ async def query_one(peer: ID) -> None:
861873 nonlocal found_value
862874 try :
863875 with trio .move_on_after (QUERY_TIMEOUT ):
864- value = await self .value_store ._get_from_peer (peer , key )
876+ value = await self .value_store ._get_from_peer (peer , key_bytes )
865877 if value is not None and found_value is None :
866878 found_value = value
867879 logger .debug (f"Found value at peer { peer } " )
@@ -873,12 +885,12 @@ async def query_one(peer: ID) -> None:
873885 nursery .start_soon (query_one , peer )
874886
875887 if found_value is not None :
876- self .value_store .put (key , found_value )
888+ self .value_store .put (key_bytes , found_value )
877889 logger .info ("Successfully retrieved value from network" )
878890 return found_value
879891
880892 # 4. Not found
881- logger .warning (f"Value not found for key { key . hex () } " )
893+ logger .warning (f"Value not found for key { key } " )
882894 return None
883895
884896 # Add these methods in the Utility methods section
@@ -899,17 +911,19 @@ async def add_peer(self, peer_id: ID) -> bool:
899911 """
900912 return await self .routing_table .add_peer (peer_id )
901913
902- async def provide (self , key : bytes ) -> bool :
914+ async def provide (self , key : str ) -> bool :
903915 """
904916 Reference to provider_store.provide for convenience.
905917 """
906- return await self .provider_store .provide (key )
918+ key_bytes = key .encode ("utf-8" )
919+ return await self .provider_store .provide (key_bytes )
907920
908- async def find_providers (self , key : bytes , count : int = 20 ) -> list [PeerInfo ]:
921+ async def find_providers (self , key : str , count : int = 20 ) -> list [PeerInfo ]:
909922 """
910923 Reference to provider_store.find_providers for convenience.
911924 """
912- return await self .provider_store .find_providers (key , count )
925+ key_bytes = key .encode ("utf-8" )
926+ return await self .provider_store .find_providers (key_bytes , count )
913927
914928 def get_routing_table_size (self ) -> int :
915929 """
0 commit comments