Change PeerID type from distinct type.

Fix MultiAddress compilation error.
Fix chat example.
This commit is contained in:
cheatfate 2019-03-05 22:28:46 +02:00
parent a96718cf9e
commit d7a7f8102d
No known key found for this signature in database
GPG Key ID: 46ADD633A7201F95
3 changed files with 75 additions and 75 deletions

View File

@ -1,6 +1,9 @@
import chronos, nimcrypto, strutils import chronos, nimcrypto, strutils
import ../libp2p/daemon/daemonapi import ../libp2p/daemon/daemonapi
when not(compileOption("threads")):
{.fatal: "Please, compile this program with the --threads:on option!".}
const const
ConsoleAddress = "/tmp/console-chat.sock" ConsoleAddress = "/tmp/console-chat.sock"
ServerAddress = "/tmp/remote-chat.sock" ServerAddress = "/tmp/remote-chat.sock"
@ -94,7 +97,7 @@ proc serveThread(server: StreamServer,
if len(pending) > 0: if len(pending) > 0:
var results = await all(pending) var results = await all(pending)
except: except:
break echo getCurrentException().msg
proc main() {.async.} = proc main() {.async.} =
var data = new CustomData var data = new CustomData

View File

@ -571,7 +571,7 @@ proc init*(mtype: typedesc[MultiAddress], protocol: MultiCodec,
if proto.kind == None: if proto.kind == None:
raise newException(MultiAddressError, "Protocol not found") raise newException(MultiAddressError, "Protocol not found")
result.data = initVBuffer() result.data = initVBuffer()
result.data.writeVarint(cast[uint64](proto.code)) result.data.writeVarint(cast[uint64](proto.mcodec))
if proto.kind in {Fixed, Length, Path}: if proto.kind in {Fixed, Length, Path}:
if len(value) == 0: if len(value) == 0:
raise newException(MultiAddressError, "Value must not be empty array") raise newException(MultiAddressError, "Value must not be empty array")

View File

@ -17,35 +17,35 @@ const
maxInlineKeyLength* = 42 maxInlineKeyLength* = 42
type type
PeerID* = distinct seq[byte] PeerID* = object
data*: seq[byte]
PeerIDError* = object of Exception PeerIDError* = object of Exception
proc pretty*(peerid: PeerID): string {.inline.} = proc pretty*(pid: PeerID): string {.inline.} =
## Return base58 encoded ``peerid`` representation. ## Return base58 encoded ``pid`` representation.
Base58.encode(cast[seq[byte]](peerid)) result = Base58.encode(pid.data)
proc toBytes*(peerid: PeerID, data: var openarray[byte]): int = proc toBytes*(pid: PeerID, data: var openarray[byte]): int =
## Store PeerID ``peerid`` to array of bytes ``data``. ## Store PeerID ``pid`` to array of bytes ``data``.
## ##
## Returns number of bytes needed to store ``peerid``. ## Returns number of bytes needed to store ``pid``.
var p = cast[seq[byte]](peerid) result = len(pid.data)
result = len(p)
if len(data) >= result and result > 0: if len(data) >= result and result > 0:
copyMem(addr data[0], addr p[0], result) copyMem(addr data[0], unsafeAddr pid.data[0], result)
proc getBytes*(peerid: PeerID): seq[byte] {.inline.} = proc getBytes*(pid: PeerID): seq[byte] {.inline.} =
## Return PeerID as array of bytes. ## Return PeerID ``pid`` as array of bytes.
var p = cast[seq[byte]](peerid) result = pid.data
result = @p
proc hex*(peerid: PeerID): string {.inline.} = proc hex*(pid: PeerID): string {.inline.} =
## Returns hexadecimal string representation of ``peerid``. ## Returns hexadecimal string representation of ``pid``.
var p = cast[seq[byte]](peerid) if len(pid.data) > 0:
if len(p) > 0: result = toHex(pid.data)
result = toHex(p)
proc len*(a: PeerID): int {.borrow.} proc len*(pid: PeerID): int {.inline.} =
## Returns length of ``pid`` binary representation.
result = len(pid.data)
proc cmp*(a, b: PeerID): int = proc cmp*(a, b: PeerID): int =
## Compares two peer ids ``a`` and ``b``. ## Compares two peer ids ``a`` and ``b``.
@ -54,15 +54,13 @@ proc cmp*(a, b: PeerID): int =
## | 0 iff a == b ## | 0 iff a == b
## | < 0 iff a < b ## | < 0 iff a < b
## | > 0 iff a > b ## | > 0 iff a > b
var ab = cast[seq[byte]](a)
var bb = cast[seq[byte]](b)
var i = 0 var i = 0
var m = min(len(ab), len(bb)) var m = min(len(a.data), len(b.data))
while i < m: while i < m:
result = ord(ab[i]) - ord(bb[i]) result = ord(a.data[i]) - ord(b.data[i])
if result != 0: return if result != 0: return
inc(i) inc(i)
result = len(ab) - len(bb) result = len(a.data) - len(b.data)
proc `<=`*(a, b: PeerID): bool {.inline.} = proc `<=`*(a, b: PeerID): bool {.inline.} =
(cmp(a, b) <= 0) (cmp(a, b) <= 0)
@ -79,57 +77,55 @@ proc `>`*(a, b: PeerID): bool {.inline.} =
proc `==`*(a, b: PeerID): bool {.inline.} = proc `==`*(a, b: PeerID): bool {.inline.} =
(cmp(a, b) == 0) (cmp(a, b) == 0)
proc hash*(peerid: PeerID): Hash {.inline.} = proc hash*(pid: PeerID): Hash {.inline.} =
var p = cast[seq[byte]](peerid) result = hash(pid.data)
result = hash(p)
proc validate*(peerid: PeerID): bool = proc validate*(pid: PeerID): bool =
## Validate check if ``peerid`` is empty or not. ## Validate check if ``pid`` is empty or not.
var p = cast[seq[byte]](peerid) if len(pid.data) > 0:
if len(p) > 0: result = MultiHash.validate(pid.data)
result = MultiHash.validate(p)
proc hasPublicKey*(peerid: PeerID): bool = proc hasPublicKey*(pid: PeerID): bool =
## Returns ``true`` if ``peerid`` is small enough to hold public key inside. ## Returns ``true`` if ``pid`` is small enough to hold public key inside.
var mh: MultiHash if len(pid.data) > 0:
var p = cast[seq[byte]](peerid) var mh: MultiHash
if len(p) > 0: if MultiHash.decode(pid.data, mh) > 0:
if MultiHash.decode(p, mh) > 0:
if mh.mcodec == multiCodec("identity"): if mh.mcodec == multiCodec("identity"):
result = true result = true
proc extractPublicKey*(peerid: PeerID, pubkey: var PublicKey): bool = proc extractPublicKey*(pid: PeerID, pubkey: var PublicKey): bool =
## Returns ``true`` if public key was successfully decoded and stored ## Returns ``true`` if public key was successfully decoded from PeerID
## in ``pubkey``. ## ``pid``and stored to ``pubkey``.
## ##
## Returns ``false`` otherwise ## Returns ``false`` otherwise.
var mh: MultiHash var mh: MultiHash
var p = cast[seq[byte]](peerid) if len(pid.data) > 0:
if len(p) > 0: if MultiHash.decode(pid.data, mh) > 0:
if MultiHash.decode(p, mh) > 0:
if mh.mcodec == multiCodec("identity"): if mh.mcodec == multiCodec("identity"):
let length = len(mh.data.buffer) let length = len(mh.data.buffer)
result = pubkey.init(mh.data.buffer.toOpenArray(mh.dpos, length - 1)) result = pubkey.init(mh.data.buffer.toOpenArray(mh.dpos, length - 1))
proc `$`*(peerid: PeerID): string = proc `$`*(pid: PeerID): string =
## Returns compact string representation of ``peerid``. ## Returns compact string representation of ``pid``.
var pid = peerid.pretty() var spid = pid.pretty()
if len(pid) <= 10: if len(spid) <= 10:
result = pid result = spid
else: else:
result = newStringOfCap(10)
for i in 0..<2: for i in 0..<2:
result.add(pid[i]) result.add(spid[i])
result.add("*") result.add("*")
for i in (len(pid) - 6)..(len(pid) - 1): for i in (len(spid) - 6)..(len(spid) - 1):
result.add(pid[i]) result.add(spid[i])
proc init*(pid: var PeerID, data: openarray[byte]): bool = proc init*(pid: var PeerID, data: openarray[byte]): bool =
## Initialize peer id from raw binary representation ``data``. ## Initialize peer id from raw binary representation ``data``.
## ##
## Returns ``true`` if peer was successfully initialiazed. ## Returns ``true`` if peer was successfully initialiazed.
var p = cast[PeerID](@data) var p = PeerID(data: @data)
if p.validate(): if p.validate():
pid = p pid = p
result = true
proc init*(pid: var PeerID, data: string): bool = proc init*(pid: var PeerID, data: string): bool =
## Initialize peer id from base58 encoded string representation. ## Initialize peer id from base58 encoded string representation.
@ -139,9 +135,11 @@ proc init*(pid: var PeerID, data: string): bool =
var length = 0 var length = 0
if Base58.decode(data, p, length) == Base58Status.Success: if Base58.decode(data, p, length) == Base58Status.Success:
p.setLen(length) p.setLen(length)
var opid = cast[PeerID](p) var opid: PeerID
shallowCopy(opid.data, p)
if opid.validate(): if opid.validate():
pid = opid pid = opid
result = true
proc init*(t: typedesc[PeerID], data: openarray[byte]): PeerID {.inline.} = proc init*(t: typedesc[PeerID], data: openarray[byte]): PeerID {.inline.} =
## Create new peer id from raw binary representation ``data``. ## Create new peer id from raw binary representation ``data``.
@ -162,37 +160,36 @@ proc init*(t: typedesc[PeerID], pubkey: PublicKey): PeerID =
mh = MultiHash.digest("identity", pubraw) mh = MultiHash.digest("identity", pubraw)
else: else:
mh = MultiHash.digest("sha2-256", pubraw) mh = MultiHash.digest("sha2-256", pubraw)
result = cast[PeerID](mh.data.buffer) result.data = mh.data.buffer
proc init*(t: typedesc[PeerID], seckey: PrivateKey): PeerID {.inline.} = proc init*(t: typedesc[PeerID], seckey: PrivateKey): PeerID {.inline.} =
## Create new peer id from private key ``seckey``. ## Create new peer id from private key ``seckey``.
result = PeerID.init(seckey.getKey()) result = PeerID.init(seckey.getKey())
proc match*(peerid: PeerID, pubkey: PublicKey): bool {.inline.} = proc match*(pid: PeerID, pubkey: PublicKey): bool {.inline.} =
## Returns ``true`` if ``peerid`` matches public key ``pubkey``. ## Returns ``true`` if ``pid`` matches public key ``pubkey``.
result = (peerid == PeerID.init(pubkey)) result = (pid == PeerID.init(pubkey))
proc match*(peerid: PeerID, seckey: PrivateKey): bool {.inline.} = proc match*(pid: PeerID, seckey: PrivateKey): bool {.inline.} =
## Returns ``true`` if ``peerid`` matches private key ``seckey``. ## Returns ``true`` if ``pid`` matches private key ``seckey``.
result = (peerid == PeerID.init(seckey)) result = (pid == PeerID.init(seckey))
## Serialization/Deserialization helpers ## Serialization/Deserialization helpers
proc write*(vb: var VBuffer, peerid: PeerID) {.inline.} = proc write*(vb: var VBuffer, pid: PeerID) {.inline.} =
## Write PeerID value ``peerid`` to buffer ``vb``. ## Write PeerID value ``peerid`` to buffer ``vb``.
var p = cast[seq[byte]](peerid) vb.writeSeq(pid.data)
vb.writeSeq(p)
proc initProtoField*(index: int, peerid: PeerID): ProtoField = proc initProtoField*(index: int, pid: PeerID): ProtoField =
## Initialize ProtoField with PeerID ``value``. ## Initialize ProtoField with PeerID ``value``.
var p = cast[seq[byte]](peerid) result = initProtoField(index, pid.data)
result = initProtoField(index, p)
proc getValue*(data: var ProtoBuffer, field: int, value: var PeerID): int = proc getValue*(data: var ProtoBuffer, field: int, value: var PeerID): int =
## Read ``PeerID`` from ProtoBuf's message and validate it. ## Read ``PeerID`` from ProtoBuf's message and validate it.
var buffer: seq[byte] var pid: PeerID
result = getLengthValue(data, field, buffer) result = getLengthValue(data, field, pid.data)
if result > 0: if result > 0:
value = cast[PeerID](buffer) if not pid.validate():
if not value.validate():
result = -1 result = -1
else:
value = pid