From 2f51d5873234baa8dfb90a5e56b31f0bfe6c2e2e Mon Sep 17 00:00:00 2001 From: kalipso Date: Sat, 3 Aug 2024 00:48:29 +0200 Subject: [PATCH] continue prototyping --- go.mod | 11 +- go.sum | 25 +++-- main.go | 320 +++++++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 282 insertions(+), 74 deletions(-) diff --git a/go.mod b/go.mod index af5de7e..a704b67 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.5 require ( github.com/hsanjuan/ipfs-lite v1.8.2 github.com/ipfs/go-datastore v0.6.0 - github.com/ipfs/go-ds-badger v0.3.0 + github.com/ipfs/go-ds-badger2 v0.1.3 github.com/ipfs/go-ds-crdt v0.5.2 github.com/ipfs/go-log/v2 v2.5.1 github.com/libp2p/go-libp2p v0.35.4 @@ -15,11 +15,12 @@ require ( ) require ( - github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect + github.com/DataDog/zstd v1.4.1 // indirect github.com/Jorropo/jsync v1.0.1 // indirect github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect @@ -28,8 +29,9 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect - github.com/dgraph-io/badger v1.6.2 // indirect + github.com/dgraph-io/badger/v2 v2.2007.3 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/elastic/gosigar v0.14.3 // indirect @@ -42,6 +44,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.2.2 // indirect github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.1 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect github.com/google/uuid v1.6.0 // indirect @@ -130,7 +133,7 @@ require ( github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/quic-go v0.45.1 // indirect + github.com/quic-go/quic-go v0.45.2 // indirect github.com/quic-go/webtransport-go v0.8.0 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect diff --git a/go.sum b/go.sum index b27ee8c..a2fa0d4 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,11 @@ git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGy github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= +github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU= github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= @@ -27,6 +30,7 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -62,11 +66,14 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnN github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -128,6 +135,8 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -188,13 +197,15 @@ github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= -github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= +github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= github.com/ipfs/go-ds-crdt v0.5.2 h1:3cTJ79/UocAoukkXr0OvpPHcH7v4YwN8xCb8F9pfngc= github.com/ipfs/go-ds-crdt v0.5.2/go.mod h1:sJdQqdCp2Vwv1azk1sPl+Dxk780CQc11rf7B8aWmomc= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= @@ -214,8 +225,8 @@ github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99 github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM= github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= -github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= @@ -425,8 +436,8 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/quic-go v0.45.1 h1:tPfeYCk+uZHjmDRwHHQmvHRYL2t44ROTujLeFVBmjCA= -github.com/quic-go/quic-go v0.45.1/go.mod h1:1dLehS7TIR64+vxGR70GDcatWTOtMX2PUtnKsjbTurI= +github.com/quic-go/quic-go v0.45.2 h1:DfqBmqjb4ExSdxRIb/+qXhPC+7k6+DUNZha4oeiC9fY= +github.com/quic-go/quic-go v0.45.2/go.mod h1:1dLehS7TIR64+vxGR70GDcatWTOtMX2PUtnKsjbTurI= github.com/quic-go/webtransport-go v0.8.0 h1:HxSrwun11U+LlmwpgM1kEqIqH90IT4N8auv/cD7QFJg= github.com/quic-go/webtransport-go v0.8.0/go.mod h1:N99tjprW432Ut5ONql/aUhSLT0YVSlwHohQsuac9WaM= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= @@ -539,7 +550,6 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= @@ -641,6 +651,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/main.go b/main.go index 52d3d79..d247e6b 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,7 @@ import ( pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" + //"github.com/libp2p/go-libp2p/core/peerstore" drouting "github.com/libp2p/go-libp2p/p2p/discovery/routing" dutil "github.com/libp2p/go-libp2p/p2p/discovery/util" ds "github.com/ipfs/go-datastore" @@ -27,15 +28,18 @@ import ( multiaddr "github.com/multiformats/go-multiaddr" - badger "github.com/ipfs/go-ds-badger" + badger "github.com/ipfs/go-ds-badger2" + dsq "github.com/ipfs/go-datastore/query" crdt "github.com/ipfs/go-ds-crdt" logging "github.com/ipfs/go-log/v2" crypto "github.com/libp2p/go-libp2p/core/crypto" + routed "github.com/libp2p/go-libp2p/p2p/host/routed" ) var ( - topicNameFlag = flag.String("topicName", "applesauce", "name of topic to join") + topicNameFlag = flag.String("topicName", "applesauce1234", "name of topic to join") dbPath = flag.String("db", "./db", "db file path") + nameSpace = flag.String("namespace", "crdt", "namespace") logger = logging.Logger("globaldb") listen = libp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/0") // topicName = "globaldb-example" @@ -43,34 +47,8 @@ var ( // config = "globaldb-example" ) -func main() { - flag.Parse() - ctx := context.Background() - - h, err := libp2p.New(listen) - if err != nil { - panic(err) - } - ps, err := pubsub.NewGossipSub(ctx, h) - if err != nil { - panic(err) - } - topic, err := ps.Join(*topicNameFlag) - if err != nil { - panic(err) - } - - kademliaDHT := initDHT(ctx, h) - go discoverPeers(ctx, h, kademliaDHT) - +func SetupLibp2pHost(ctx context.Context) (host host.Host, dht *dht.IpfsDHT, err error) { data := *dbPath - - store, err := badger.NewDatastore(data, &badger.DefaultOptions) - if err != nil { - logger.Fatal(err) - } - defer store.Close() - keyPath := filepath.Join(data, "key") var priv crypto.PrivKey _, err = os.Stat(keyPath) @@ -100,11 +78,201 @@ func main() { } } - pid, err := peer.IDFromPublicKey(priv.GetPublic()) + if err != nil { logger.Fatal(err) } + host, err = libp2p.New(libp2p.Identity(priv), listen) + + if err != nil { + return nil, nil, err + } + + dht = initDHT(ctx, host) + host = routed.Wrap(host, dht) + + + return host, dht, nil +} + +type Peer struct { + Id string + //Todo: AgeKey Key +} + +type NamespaceConfig struct { + Name string + Id string + Peers []Peer +} + +type Config []NamespaceConfig + +func NewConfig() []NamespaceConfig { + //fmt.Println("NewConfig Path not implemented yet") + return []NamespaceConfig{ + { + Name: "root", + Id: "akdjlask-23klaj2idalj2-ajl2kjd3i-2ldakjd2", + Peers: []Peer{ + { Id: "12D3KooWLF7BU5VgpqWdS1XwSTFCLphENozhYQAj6i5LqU8BPZZZ" }, + { Id: "12D3KooWBRvtW83QYnPgJCyVyAgMXtg71wjkGefVB2fBnm1A36kS" }, + }, + }, + { + Name: "TestNamespace", + Id: "2-903djl1290djl1-21jdl1kjd2-1d1jdl1k2jd11", + Peers: []Peer{ + { Id: "12D3KooWLF7BU5VgpqWdS1XwSTFCLphENozhYQAj6i5LqU8BPZZZ" }, + { Id: "12D3KooWBRvtW83QYnPgJCyVyAgMXtg71wjkGefVB2fBnm1A36kS" }, + }, + }, + } +} + +func GetTrustedPeers() map[string][]Peer { + cfg := NewConfig() + + result := make(map[string][]Peer) + for _, c := range cfg { + result[c.Id] = c.Peers + } + + return result +} + +func InitRootNs() { + //TODO: check if "SharedKeyRegistry" key exists, if not create +} + +type Namespace struct { + ID string + Datastore *crdt.Datastore + //Registry *sharedKeyRegistry + CancelFunc context.CancelFunc +} + +func (n *Namespace) Close() { + n.Datastore.Close() + n.CancelFunc() +} + +type StorageHandler struct { + Ctx context.Context + Store *badger.Datastore + Host host.Host + Ipfs *ipfslite.Peer + PubSub *pubsub.PubSub +} + +func IsTrustedPeer(ctx context.Context, id peer.ID, namespace string) bool { + peerMap := GetTrustedPeers() + + val, ok := peerMap[namespace] + + if ok { + for _, v := range val { + if v.Id == id.String() { + fmt.Printf("Trusting %s in Namspace %s\n", id.String(), namespace) + return true + } + } + } + + fmt.Printf("NOT! trusting %s in Namspace %s\n", id.String(), namespace) + return false +} + +func PrintDBContent(ctx context.Context, store *badger.Datastore) { + q := dsq.Query{} + result, _ := store.Query(ctx, q) + + entries, _ := result.Rest() + for _, entry := range entries { + fmt.Printf("Key: %s, Value: %s\n", entry.Key, string(entry.Value)) + } +} + +func CreateNamespace(ID string, storageHandler StorageHandler) (*Namespace, error) { + fmt.Printf("Creating Namespace %s\n", ID) + err := storageHandler.PubSub.RegisterTopicValidator( + ID, //== topicName + func(ctx context.Context, _ peer.ID, msg *pubsub.Message) bool { + fmt.Println("Running Validator") + signer := msg.GetFrom() + trusted := IsTrustedPeer(ctx, signer, ID) + if !trusted { + logger.Debug("discarded pubsub message from non trusted source %s ", signer) + } + return trusted + }, + ) + if err != nil { + logger.Errorf("error registering topic validator: %s", err) + } + + psubCtx, psubCancel := context.WithCancel(storageHandler.Ctx) + pubsubBC, err := crdt.NewPubSubBroadcaster(psubCtx, storageHandler.PubSub, ID) + if err != nil { + logger.Fatal(err) + } + + opts := crdt.DefaultOptions() + opts.Logger = logger + opts.RebroadcastInterval = 5 * time.Second + opts.PutHook = func(k ds.Key, v []byte) { + fmt.Printf("Added: [%s] -> %s\n", k, string(v)) + + } + opts.DeleteHook = func(k ds.Key) { + fmt.Printf("Removed: [%s]\n", k) + } + + crdt, err := crdt.New(storageHandler.Store, ds.NewKey(*nameSpace), storageHandler.Ipfs, pubsubBC, opts) + if err != nil { + logger.Fatal(err) + psubCancel() + return nil, err + } + + return &Namespace{ID: ID, Datastore: crdt, CancelFunc: psubCancel}, nil +} + +func main() { + flag.Parse() + ctx := context.Background() + data := *dbPath + + h, dht, err := SetupLibp2pHost(ctx) + + pid := h.ID().String() + fmt.Println(h.ID().String()) + + if err != nil { + panic(err) + } + + ps, err := pubsub.NewGossipSub(ctx, h) + if err != nil { + panic(err) + } + + topic, err := ps.Join(*topicNameFlag) + if err != nil { + panic(err) + } + + go discoverPeers(ctx, h, dht) + + store, err := badger.NewDatastore(data, &badger.DefaultOptions) + if err != nil { + logger.Fatal(err) + } + defer store.Close() + + PrintDBContent(ctx, store) + netSubs, err := topic.Subscribe() if err != nil { logger.Fatal(err) @@ -135,43 +303,40 @@ func main() { } }() - - ipfs, err := ipfslite.New(ctx, store, nil, h, kademliaDHT, nil) + ipfs, err := ipfslite.New(ctx, store, nil, h, dht, nil) if err != nil { logger.Fatal(err) } - psubCtx, psubCancel := context.WithCancel(ctx) - pubsubBC, err := crdt.NewPubSubBroadcaster(psubCtx, ps, *topicNameFlag + "BC") - if err != nil { - logger.Fatal(err) + storageHandler := StorageHandler{ + Ctx: ctx , + Store: store, + Host: h, + Ipfs: ipfs, + PubSub: ps, } - opts := crdt.DefaultOptions() - opts.Logger = logger - opts.RebroadcastInterval = 5 * time.Second - opts.PutHook = func(k ds.Key, v []byte) { - fmt.Printf("Added: [%s] -> %s\n", k, string(v)) + Cfg := NewConfig() - } - opts.DeleteHook = func(k ds.Key) { - fmt.Printf("Removed: [%s]\n", k) + var Namespaces []*Namespace + for _, nsCfg := range Cfg { + ns1, err := CreateNamespace(nsCfg.Id, storageHandler) + + if err != nil { + logger.Fatal(err) + } + + Namespaces = append(Namespaces, ns1) + defer ns1.Close() } - crdt, err := crdt.New(store, ds.NewKey("crdt"), ipfs, pubsubBC, opts) - if err != nil { - logger.Fatal(err) - } - defer crdt.Close() - defer psubCancel() + //fmt.Println("Bootstrapping...") - fmt.Println("Bootstrapping...") - - bstr, _ := multiaddr.NewMultiaddr("/ip4/94.130.135.167/tcp/33123/ipfs/12D3KooWFta2AE7oiK1ioqjVAKajUJauZWfeM7R413K7ARtHRDAu") - inf, _ := peer.AddrInfoFromP2pAddr(bstr) - list := append(ipfslite.DefaultBootstrapPeers(), *inf) - ipfs.Bootstrap(list) - h.ConnManager().TagPeer(inf.ID, "keep", 100) +// bstr, _ := multiaddr.NewMultiaddr("/ip4/94.130.135.167/tcp/33123/ipfs/12D3KooWFta2AE7oiK1ioqjVAKajUJauZWfeM7R413K7ARtHRDAu") +// inf, _ := peer.AddrInfoFromP2pAddr(bstr) +// list := append(ipfslite.DefaultBootstrapPeers(), *inf) +// ipfs.Bootstrap(list) +// h.ConnManager().TagPeer(inf.ID, "keep", 100) fmt.Printf(` Peer ID: %s @@ -212,6 +377,8 @@ Commands: return } + crdt := Namespaces[0].Datastore + fmt.Printf("Setting default namespace %s", Namespaces[0].ID) fmt.Printf("> ") scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { @@ -257,14 +424,14 @@ Commands: printErr(err) } - testKey := "0123912-09adskldj123-adlskj192-ajdl2k1" - testValue := "{ \"hello\": \"world\" }" + //testKey := "0123912-09adskldj123-adlskj192-ajdl2k1" + //testValue := "{ \"hello\": \"world\" }" - err = crdt.Put(ctx, ds.NewKey(testKey), []byte(testValue)) + //err = crdt.Put(ctx, ds.NewKey(testKey), []byte(testValue)) - if err != nil { - printErr(err) - } +// if err != nil { +// printErr(err) +// } for r := range results.Next() { if r.Error != nil { @@ -340,6 +507,33 @@ func initDHT(ctx context.Context, h host.Host) *dht.IpfsDHT { } func discoverPeers(ctx context.Context, h host.Host, dht *dht.IpfsDHT) { + //cfg := NewConfig() + + //for _, v := range cfg { + // for _, p := range v.Peers { + // peerID, err := peer.Decode(p.Id) + + // if err != nil { + // logger.Fatal(err) + // } + + // peerInfo, err := dht.FindPeer(ctx, peerID) + + // if err != nil { + // fmt.Println(err) + // } + + // h.Peerstore().AddAddrs(peerInfo.ID, peerInfo.Addrs, peerstore.PermanentAddrTTL) + + // err = h.Connect(ctx, peerInfo) + + // if err != nil { + // fmt.Printf("Failed connecting to %s, error: %s\n", peerInfo.ID, err) + // } else { + // fmt.Println("Connected to:", peerInfo.ID) + // } + // } + //} routingDiscovery := drouting.NewRoutingDiscovery(dht) dutil.Advertise(ctx, routingDiscovery, *topicNameFlag)