mirror of
https://github.com/logos-storage/nim-libp2p.git
synced 2026-01-07 16:13:10 +00:00
This adds gossipsub and floodsub, as well as basic interop testing with the go libp2p daemon. * add close event * wip: gossipsub * splitting rpc message * making message handling more consistent * initial gossipsub implementation * feat: nim 1.0 cleanup * wip: gossipsub protobuf * adding encoding/decoding of gossipsub messages * add disconnect handler * add proper gossipsub msg handling * misc: cleanup for nim 1.0 * splitting floodsub and gossipsub tests * feat: add mesh rebalansing * test pubsub * add mesh rebalansing tests * testing mesh maintenance * finishing mcache implementatin * wip: commenting out broken tests * wip: don't run heartbeat for now * switchout debug for trace logging * testing gossip peer selection algorithm * test stream piping * more work around message amplification * get the peerid from message * use timed cache as backing store * allow setting timeout in constructor * several changes to improve performance * more through testing of msg amplification * prevent gc issues * allow piping to self and prevent deadlocks * improove floodsub * allow running hook on cache eviction * prevent race conditions * prevent race conditions and improove tests * use hashes as cache keys * removing useless file * don't create a new seq * re-enable pubsub tests * fix imports * reduce number of runs to speed up tests * break out control message processing * normalize sleeps between steps * implement proper transport filtering * initial interop testing * clean up floodsub publish logic * allow dialing without a protocol * adding multiple reads/writes * use protobuf varint in mplex * don't loose conn's peerInfo * initial interop pubsub tests * don't duplicate connections/peers * bring back interop tests * wip: interop * re-enable interop and daemon tests * add multiple read write tests from handlers * don't cleanup channel prematurely * use correct channel to send/receive msgs * adjust tests with latest changes * include interop tests * remove temp logging output * fix ci * use correct public key serialization * additional tests for pubsub interop
74 lines
2.1 KiB
Nim
74 lines
2.1 KiB
Nim
## Nim-LibP2P
|
|
## Copyright (c) 2019 Status Research & Development GmbH
|
|
## Licensed under either of
|
|
## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
## * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
## at your option.
|
|
## This file may not be copied, modified, or distributed except according to
|
|
## those terms.
|
|
|
|
import options
|
|
import chronicles
|
|
import nimcrypto/sysrand
|
|
import messages, protobuf,
|
|
../../../peer,
|
|
../../../crypto/crypto,
|
|
../../../protobuf/minprotobuf
|
|
|
|
logScope:
|
|
topic = "PubSubMessage"
|
|
|
|
proc msgId*(m: Message): string =
|
|
m.seqno.toHex() & PeerID.init(m.fromPeer).pretty
|
|
|
|
proc fromPeerId*(m: Message): PeerId =
|
|
PeerID.init(m.fromPeer)
|
|
|
|
proc sign*(peerId: PeerID, msg: Message): Message {.gcsafe.} =
|
|
var buff = initProtoBuffer()
|
|
encodeMessage(msg, buff)
|
|
# NOTE: leave as is, moving out would imply making this .threadsafe., etc...
|
|
let prefix = cast[seq[byte]]("libp2p-pubsub:")
|
|
if buff.buffer.len > 0:
|
|
result = msg
|
|
if peerId.privateKey.isSome:
|
|
result.signature = peerId.
|
|
privateKey.
|
|
get().
|
|
sign(prefix & buff.buffer).
|
|
getBytes()
|
|
|
|
proc verify*(peerId: PeerID, m: Message): bool =
|
|
if m.signature.len > 0 and m.key.len > 0:
|
|
var msg = m
|
|
msg.signature = @[]
|
|
msg.key = @[]
|
|
|
|
var buff = initProtoBuffer()
|
|
encodeMessage(msg, buff)
|
|
|
|
var remote: Signature
|
|
var key: PublicKey
|
|
if remote.init(m.signature) and key.init(m.key):
|
|
result = remote.verify(buff.buffer, key)
|
|
|
|
proc newMessage*(peerId: PeerID,
|
|
data: seq[byte],
|
|
name: string,
|
|
sign: bool = true): Message {.gcsafe.} =
|
|
var seqno: seq[byte] = newSeq[byte](20)
|
|
if randomBytes(addr seqno[0], 20) > 0:
|
|
var key: seq[byte] = @[]
|
|
|
|
if peerId.publicKey.isSome:
|
|
key = peerId.publicKey.get().getBytes()
|
|
|
|
result = Message(fromPeer: peerId.getBytes(),
|
|
data: data,
|
|
seqno: seqno,
|
|
topicIDs: @[name])
|
|
if sign:
|
|
result = sign(peerId, result)
|
|
|
|
result.key = key
|