Compare commits

..

3 Commits

Author SHA1 Message Date
Chrysostomos Nanakos
754765ba31
chore: orc support (#110)
Support ORC memory model (https://github.com/logos-storage/logos-storage-nim-dht/issues/109)

Signed-off-by: Chrysostomos Nanakos <chris@include.gr>
2025-12-23 23:23:31 +02:00
Arnaud
99884b5971
Rename Codex to Logos Storage (#108) 2025-12-15 13:46:04 +01:00
Jacek Sieka
6c7de03622
chore: bump stew et al (#107)
* fix use of deprecated imports
* bump stew
* `results` is its own package
* drop protobuf_serialization
* force leveldb version
2025-12-11 13:47:10 +01:00
22 changed files with 84 additions and 73 deletions

View File

@ -7,15 +7,15 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
nim: [2.0.14]
os: [ubuntu-latest, macOS-latest, windows-latest]
nim: [2.2.4]
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Nim
uses: iffy/install-nim@v5
- uses: jiro4989/setup-nim-action@v2
with:
version: ${{ matrix.nim }}
nim-version: ${{matrix.nim}}
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Build
run: nimble install -y
- name: Test

View File

@ -1,12 +1,12 @@
# A DHT implementation for Codex
# A DHT implementation for Logos Storage
[![License: Apache](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Stability: experimental](https://img.shields.io/badge/stability-experimental-orange.svg)](#stability)
[![CI (GitHub Actions)](https://github.com/codex-storage/nim-codex-dht/workflows/CI/badge.svg?branch=master)](https://github.com/codex-storage/nim-codex-dht/actions/workflows/ci.yml?query=workflow%3ACI+branch%3Amaster)
[![codecov](https://codecov.io/gh/codex-storage/nim-codex-dht/branch/master/graph/badge.svg?token=tlmMJgU4l7)](https://codecov.io/gh/codex-storage/nim-codex-dht)
[![CI (GitHub Actions)](https://github.com/logos-storage/logos-storage-nim-dht/workflows/CI/badge.svg?branch=master)](https://github.com/logos-storage/logos-storage-nim-dht/actions/workflows/ci.yml?query=workflow%3ACI+branch%3Amaster)
[![codecov](https://codecov.io/gh/logos-storage/logos-storage-nim-dht/branch/master/graph/badge.svg?token=tlmMJgU4l7)](https://codecov.io/gh/logos-storage/logos-storage-nim-dht)
This DHT implementation is aiming to provide a DHT for Codex with the following properties
This DHT implementation is aiming to provide a DHT for Logos Storage with the following properties
* flexible secure transport usage with
* fast UDP based operation
* eventual fallback to TCP-based operation (maybe though libp2p)

View File

@ -1,25 +1,25 @@
# Package
version = "0.5.0"
version = "0.6.0"
author = "Status Research & Development GmbH"
description = "DHT based on Eth discv5 implementation"
license = "MIT"
skipDirs = @["tests"]
# Dependencies
requires "nim >= 2.0.14 & < 3.0.0"
requires "nim >= 2.2.4 & < 3.0.0"
requires "secp256k1 >= 0.6.0 & < 0.7.0"
requires "protobuf_serialization >= 0.3.0 & < 0.4.0"
requires "nimcrypto >= 0.6.2 & < 0.7.0"
requires "nimcrypto >= 0.6.2 & < 0.8.0"
requires "bearssl >= 0.2.5 & < 0.3.0"
requires "chronicles >= 0.10.2 & < 0.11.0"
requires "chronos >= 4.0.3 & < 4.1.0"
requires "libp2p >= 1.5.0 & < 2.0.0"
requires "chronicles >= 0.11.2 & < 0.13.0"
requires "chronos >= 4.0.4 & < 4.1.0"
requires "libp2p >= 1.14.1 & < 2.0.0"
requires "metrics >= 0.1.0 & < 0.2.0"
requires "stew >= 0.2.0 & < 0.3.0"
requires "stew >= 0.4.2"
requires "stint >= 0.8.1 & < 0.9.0"
requires "https://github.com/codex-storage/nim-datastore >= 0.2.0 & < 0.3.0"
requires "https://github.com/logos-storage/nim-datastore >= 0.2.1 & < 0.3.0"
requires "questionable >= 0.10.15 & < 0.11.0"
requires "leveldbstatic >= 0.2.1 & < 0.3.0"
task testAll, "Run all test suites":
exec "nimble install -d -y"

View File

@ -1,13 +1,13 @@
import
std/sugar,
libp2p/crypto/[crypto, secp],
stew/[byteutils, objects, results, ptrops]
stew/[byteutils, objects, ptrops],
results
# from secp256k1 import ecdh, SkEcdhSecretSize, toRaw, SkSecretKey, SkPublicKey
import secp256k1
const
KeyLength* = SkEcdhSecretSize
KeyLength* = secp256k1.SkEcdhSecretSize
## Ecdh shared secret key length without leading byte
## (publicKey * privateKey).x, where length of x is 32 bytes
@ -25,12 +25,12 @@ type
data*: array[FullKeyLength, byte]
proc fromHex*(T: type PrivateKey, data: string): Result[PrivateKey, cstring] =
let skKey = ? SkPrivateKey.init(data).mapErr(e =>
let skKey = ? secp.SkPrivateKey.init(data).mapErr(e =>
("Failed to init private key from hex string: " & $e).cstring)
ok PrivateKey.init(skKey)
proc fromHex*(T: type PublicKey, data: string): Result[PublicKey, cstring] =
let skKey = ? SkPublicKey.init(data).mapErr(e =>
let skKey = ? secp.SkPublicKey.init(data).mapErr(e =>
("Failed to init public key from hex string: " & $e).cstring)
ok PublicKey.init(skKey)
@ -45,14 +45,17 @@ proc ecdhSharedSecretHash(output: ptr byte, x32, y32: ptr byte, data: pointer):
## Take the `x32` part as ecdh shared secret.
## output length is derived from x32 length and taken from ecdh
## generic parameter `KeyLength`
copyMem(output, x32, SkEcdhSecretSize)
copyMem(output, x32, KeyLength)
return 1
func ecdhSharedSecret(seckey: SkPrivateKey, pubkey: secp.SkPublicKey): SharedSecret =
## Compute ecdh agreed shared secret.
let res = ecdh[SkEcdhSecretSize](secp256k1.SkSecretKey(seckey),
secp256k1.SkPublicKey(pubkey),
ecdhSharedSecretHash, nil)
let res = secp256k1.ecdh[KeyLength](
secp256k1.SkSecretKey(seckey),
secp256k1.SkPublicKey(pubkey),
ecdhSharedSecretHash,
nil,
)
# This function only fail if the hash function return zero.
# Because our hash function always success, we can turn the error into defect
doAssert res.isOk, $res.error

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
@ -18,13 +18,14 @@ import
stew/endians2,
bearssl/rand,
chronicles,
stew/[results, byteutils],
stew/[byteutils],
stint,
libp2p/crypto/crypto as libp2p_crypto,
libp2p/crypto/secp,
libp2p/signed_envelope,
metrics,
nimcrypto,
results,
"."/[messages, messages_encoding, node, spr, hkdf, sessions],
"."/crypto

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2021 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2020-2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
@ -8,12 +8,11 @@
{.push raises: [].}
import
std/hashes,
std/[hashes, net],
bearssl/rand,
chronicles,
chronos,
nimcrypto,
stew/shims/net,
stint,
./crypto,
./spr
@ -89,7 +88,9 @@ func newNode*(r: SignedPeerRecord): Result[Node, cstring] =
nodeId = ? pk.get().toNodeId()
if r.ip.isSome() and r.udp.isSome():
let a = Address(ip: ipv4(r.ip.get()), port: Port(r.udp.get()))
let a = Address(
ip: IpAddress(family: IPv4, address_v4: r.ip.get()), port: Port(r.udp.get())
)
ok(Node(
id: nodeId,

View File

@ -1,8 +1,8 @@
{.push raises: [].}
import
std/[sets, options],
stew/results, stew/shims/net, chronicles, chronos,
std/[net, sets, options],
results, chronicles, chronos,
"."/[node, spr, routing_table]
logScope:

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
@ -74,15 +74,15 @@
{.push raises: [].}
import
std/[tables, sets, options, math, sequtils, algorithm, strutils],
stew/shims/net as stewNet,
std/[net, tables, sets, options, math, sequtils, algorithm, strutils],
json_serialization/std/net,
stew/[base64, endians2, results],
stew/[base64, endians2],
pkg/[chronicles, chronicles/chronos_tools],
pkg/chronos,
pkg/stint,
pkg/bearssl/rand,
pkg/metrics
pkg/metrics,
pkg/results
import "."/[
messages,

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
@ -14,7 +14,6 @@ import pkg/datastore
import pkg/chronos
import pkg/libp2p
import pkg/chronicles
import pkg/stew/results as rs
import pkg/stew/byteutils
import pkg/questionable
import pkg/questionable/results

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
@ -8,8 +8,8 @@
{.push raises: [].}
import
std/[algorithm, times, sequtils, bitops, sets, options, tables],
stint, chronicles, metrics, bearssl/rand, chronos, stew/shims/net as stewNet,
std/[algorithm, net, times, sequtils, bitops, sets, options, tables],
stint, chronicles, metrics, bearssl/rand, chronos,
"."/[node, random2, spr]
export options
@ -524,10 +524,16 @@ proc len*(r: RoutingTable): int =
proc moveRight[T](arr: var openArray[T], a, b: int) =
## In `arr` move elements in range [a, b] right by 1.
var t: T
shallowCopy(t, arr[b + 1])
for i in countdown(b, a):
shallowCopy(arr[i + 1], arr[i])
shallowCopy(arr[a], t)
when declared(shallowCopy):
shallowCopy(t, arr[b + 1])
for i in countdown(b, a):
shallowCopy(arr[i + 1], arr[i])
shallowCopy(arr[a], t)
else:
t = move arr[b + 1]
for i in countdown(b, a):
arr[i + 1] = move arr[i]
arr[a] = move t
proc setJustSeen*(r: RoutingTable, n: Node, seen = true) =
## If seen, move `n` to the head (most recently seen) of its bucket.

View File

@ -1,4 +1,4 @@
# codex-dht - Codex DHT
# logos-storage-dht - Logos Storage DHT
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
@ -19,8 +19,8 @@
{.push raises: [].}
import
std/options,
stint, stew/endians2, stew/shims/net,
std/[net, options],
stint, stew/endians2,
node, lru
export lru

View File

@ -6,10 +6,10 @@
#
import
chronicles,
std/[options, strutils, sugar],
pkg/stew/[results, byteutils, arrayops],
results,
std/[net, options, strutils, sugar],
pkg/stew/[byteutils, arrayops],
stew/endians2,
stew/shims/net,
stew/base64,
libp2p/crypto/crypto,
libp2p/crypto/secp,
@ -122,9 +122,13 @@ proc update*(
.mapErr((e: string) => e.cstring)
existingIp =
if existingNetProtoFam == MultiCodec.codec("ip6"):
ipv6 array[16, byte].initCopyFrom(existingNetProtoAddr)
IpAddress(
family: IPv6, address_v6: array[16, byte].initCopyFrom(existingNetProtoAddr)
)
else:
ipv4 array[4, byte].initCopyFrom(existingNetProtoAddr)
IpAddress(
family: IPv4, address_v4: array[4, byte].initCopyFrom(existingNetProtoAddr)
)
ipAddr = ip.get(existingIp)

View File

@ -6,13 +6,12 @@
# Everything below the handling of ordinary messages
import
std/[tables, options, sets],
std/[net, tables, options, sets],
bearssl/rand,
chronos,
chronicles,
metrics,
libp2p/crypto/crypto,
stew/shims/net,
"."/[node, encoding, sessions]
const

View File

@ -4,6 +4,3 @@ switch("define", "libp2p_pki_schemes=secp256k1")
when withDir(thisDir(), system.fileExists("nimble.paths")):
include "nimble.paths"
# end Nimble config
when (NimMajor, NimMinor) >= (2, 0):
--mm:refc

View File

@ -1,4 +1,5 @@
import
std/net,
bearssl/rand,
chronos,
libp2p/crypto/[crypto, secp],
@ -7,7 +8,7 @@ import
codexdht/discv5/protocol as discv5_protocol
proc localAddress*(port: int): Address =
Address(ip: parseIpAddress("127.0.0.1"), port: Port(port))
Address(ip: IPv4_loopback(), port: Port(port))
proc example*(T: type PrivateKey, rng: ref HmacDrbgContext): PrivateKey =
PrivateKey.random(PKScheme.Secp256k1, rng[]).expect("Valid rng for private key")
@ -101,13 +102,13 @@ proc addSeenNode*(d: discv5_protocol.Protocol, n: Node): bool =
d.addNode(n)
func udpExample*(_: type MultiAddress): MultiAddress =
## creates a new udp multiaddress on a random port
Multiaddress.init("/ip4/0.0.0.0/udp/0")
## creates a new udp MultiAddress on a random port
MultiAddress.init("/ip4/0.0.0.0/udp/0")
func udpExamples*(_: type MultiAddress, count: int): seq[MultiAddress] =
var res: seq[MultiAddress] = @[]
for i in 1..count:
res.add Multiaddress.init("/ip4/0.0.0.0/udp/" & $i).get
res.add MultiAddress.init("/ip4/0.0.0.0/udp/" & $i).get
return res
proc toSignedPeerRecord*(privKey: PrivateKey) : SignedPeerRecord =

View File

@ -2,7 +2,7 @@
version = "0.4.0"
author = "Status Research & Development GmbH"
description = "Tests for Codex DHT"
description = "Tests for Logos Storage DHT"
license = "MIT"
installFiles = @["build.nims"]