package transport import ( "crypto/ecdsa" "encoding/hex" "math/big" "strconv" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" ) const discoveryTopic = "contact-discovery" var ( // The number of partitions. nPartitions = big.NewInt(5000) ) // ToTopic converts a string to a whisper topic. func ToTopic(s string) []byte { return crypto.Keccak256([]byte(s))[:types.TopicLength] } func StrToPublicKey(str string) (*ecdsa.PublicKey, error) { publicKeyBytes, err := hex.DecodeString(str) if err != nil { return nil, err } return crypto.UnmarshalPubkey(publicKeyBytes) } func PublicKeyToStr(publicKey *ecdsa.PublicKey) string { return hex.EncodeToString(crypto.FromECDSAPub(publicKey)) } func PersonalDiscoveryTopic(publicKey *ecdsa.PublicKey) string { return "contact-discovery-" + PublicKeyToStr(publicKey) } // PartitionedTopic returns the associated partitioned topic string // with the given public key. func PartitionedTopic(publicKey *ecdsa.PublicKey) string { partition := big.NewInt(0) partition.Mod(publicKey.X, nPartitions) return "contact-discovery-" + strconv.FormatInt(partition.Int64(), 10) } func ContactCodeTopic(publicKey *ecdsa.PublicKey) string { return "0x" + PublicKeyToStr(publicKey) + "-contact-code" } func NegotiatedTopic(publicKey *ecdsa.PublicKey) string { return "0x" + PublicKeyToStr(publicKey) + "-negotiated" } func DiscoveryTopic() string { return discoveryTopic } func CommunityShardInfoTopic(communityID string) string { return communityID + CommunityShardInfoTopicPrefix() } func CommunityShardInfoTopicPrefix() string { return "-shard-info" }