60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
|
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
|
||
|
}
|