From dc76183bbc78b0d6be8f4e6e1e8ea4cfb2548083 Mon Sep 17 00:00:00 2001 From: hayzamjs Date: Mon, 6 Dec 2021 19:36:43 +0530 Subject: [PATCH] Add bootstrap nodes for faster peer discovery --- example/example.cpp | 2 +- go.mod | 2 ++ src/constants/constants.go | 26 ++++++++++++++++++++++++-- src/ipfs/ipfs.go | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/example/example.cpp b/example/example.cpp index 898815b..50df7d0 100755 --- a/example/example.cpp +++ b/example/example.cpp @@ -25,4 +25,4 @@ int main() { std::cout << "Stopping IPFS node" << std::endl; std::cout << IPFSStopNode() << std::endl; -} \ No newline at end of file +} diff --git a/go.mod b/go.mod index d9b7474..4654aed 100644 --- a/go.mod +++ b/go.mod @@ -8,4 +8,6 @@ require ( github.com/ipfs/go-ipfs-config v0.16.0 // indirect github.com/ipfs/go-ipfs-files v0.0.8 // indirect github.com/ipfs/interface-go-ipfs-core v0.5.1 // indirect + github.com/libp2p/go-libp2p-core v0.9.0 // indirect + github.com/multiformats/go-multiaddr v0.4.0 // indirect ) diff --git a/src/constants/constants.go b/src/constants/constants.go index 93d88fa..283a68c 100755 --- a/src/constants/constants.go +++ b/src/constants/constants.go @@ -1,7 +1,7 @@ package constants const ( - Lib_version = "v2.0.0" + Lib_version = "v2.2.0" Lib_name = "libipfs" Lib_usage = "A C-Style library implemented in Go for using IPFS in C++/C." DefaultRepoPath = ".libipfs-repo" @@ -25,4 +25,26 @@ var DefaultServerFilters = []string{ "/ip6/2001:db8::/ipcidr/32", "/ip6/fc00::/ipcidr/7", "/ip6/fe80::/ipcidr/10", -} \ No newline at end of file +} + +var BootstrapNodes = []string{ + // IPFS Bootstrapper nodes. + "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt", + + // IPFS Cluster Pinning nodes + "/ip4/138.201.67.219/tcp/4001/p2p/QmUd6zHcbkbcs7SMxwLs48qZVX3vpcM8errYS7xEczwRMA", + "/ip4/138.201.67.219/udp/4001/quic/p2p/QmUd6zHcbkbcs7SMxwLs48qZVX3vpcM8errYS7xEczwRMA", + "/ip4/138.201.67.220/tcp/4001/p2p/QmNSYxZAiJHeLdkBg38roksAR9So7Y5eojks1yjEcUtZ7i", + "/ip4/138.201.67.220/udp/4001/quic/p2p/QmNSYxZAiJHeLdkBg38roksAR9So7Y5eojks1yjEcUtZ7i", + "/ip4/138.201.68.74/tcp/4001/p2p/QmdnXwLrC8p1ueiq2Qya8joNvk3TVVDAut7PrikmZwubtR", + "/ip4/138.201.68.74/udp/4001/quic/p2p/QmdnXwLrC8p1ueiq2Qya8joNvk3TVVDAut7PrikmZwubtR", + "/ip4/94.130.135.167/tcp/4001/p2p/QmUEMvxS2e7iDrereVYc5SWPauXPyNwxcy9BXZrC1QTcHE", + "/ip4/94.130.135.167/udp/4001/quic/p2p/QmUEMvxS2e7iDrereVYc5SWPauXPyNwxcy9BXZrC1QTcHE", + + // Scala IPFS nodes + "/ip4/135.181.166.154/tcp/4001/p2p/12D3KooWNKiAPbXoxjeNs5zVkHCCerYcUd1GShtETYtsc4W4qUYq", + "/ip4/135.181.166.154/udp/4010/quic/p2p/12D3KooWNKiAPbXoxjeNs5zVkHCCerYcUd1GShtETYtsc4W4qUYq", +} diff --git a/src/ipfs/ipfs.go b/src/ipfs/ipfs.go index d27afe5..56d5267 100755 --- a/src/ipfs/ipfs.go +++ b/src/ipfs/ipfs.go @@ -7,6 +7,7 @@ import ( "context" "path/filepath" "io/ioutil" + "sync" "github.com/ipfs/go-ipfs/plugin/loader" "github.com/ipfs/go-ipfs/repo/fsrepo" @@ -14,6 +15,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi" "github.com/scala-network/libipfs/src/constants" "github.com/scala-network/libipfs/src/utils" + "github.com/libp2p/go-libp2p-core/peer" files "github.com/ipfs/go-ipfs-files" icore "github.com/ipfs/interface-go-ipfs-core" @@ -21,12 +23,43 @@ import ( config "github.com/ipfs/go-ipfs-config" libp2p "github.com/ipfs/go-ipfs/core/node/libp2p" options "github.com/ipfs/interface-go-ipfs-core/options" + ma "github.com/multiformats/go-multiaddr" ) var ipfsCoreAll *core.IpfsNode var ipfsApiAll icore.CoreAPI var ctxAll context.Context +func connectToPeers(ctx context.Context, ipfs icore.CoreAPI, peers []string) (error) { + var wg sync.WaitGroup + peerInfos := make(map[peer.ID]*peer.AddrInfo, len(peers)) + for _, addrStr := range peers { + addr, err := ma.NewMultiaddr(addrStr) + if err != nil { + return err + } + pii, err := peer.AddrInfoFromP2pAddr(addr) + if err != nil { + return err + } + pi, ok := peerInfos[pii.ID] + if !ok { + pi = &peer.AddrInfo{ID: pii.ID} + peerInfos[pi.ID] = pi + } + pi.Addrs = append(pi.Addrs, pii.Addrs...) + } + + wg.Add(len(peerInfos)) + for _, peerInfo := range peerInfos { + go func(peerInfo *peer.AddrInfo) { + defer wg.Done() + }(peerInfo) + } + wg.Wait() + return nil +} + func createRepo(ctx context.Context, dataPath string, P2PPort int) (string, error) { repoPath := dataPath @@ -141,6 +174,7 @@ func Start(dataPath string, P2PPort int) (error) { var err error ctxAll = context.Background() ipfsCoreAll, ipfsApiAll, err = spawnIpfsNode(ctxAll, dataPath, P2PPort) + err = connectToPeers(ctxAll, ipfsApiAll, constants.BootstrapNodes) if err != nil { return err