Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
dms3
go-unixfs
Commits
45fc43c9
Commit
45fc43c9
authored
10 years ago
by
Jeromy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add pub/priv key code to identify, not complete yet
parent
9338caa9
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
181 additions
and
27 deletions
+181
-27
config/config.go
config/config.go
+9
-2
core/core.go
core/core.go
+45
-25
identify/identify.go
identify/identify.go
+69
-0
routing/dht/dht.go
routing/dht/dht.go
+8
-0
routing/dht/routing.go
routing/dht/routing.go
+50
-0
No files found.
config/config.go
View file @
45fc43c9
package
config
import
(
u
"github.com/jbenet/go-ipfs/util"
"os"
u
"github.com/jbenet/go-ipfs/util"
)
// Identity tracks the configuration of the local node's identity.
type
Identity
struct
{
PeerID
string
PeerID
string
Address
string
}
// Datastore tracks the configuration of the datastore.
...
...
@@ -16,10 +18,15 @@ type Datastore struct {
Path
string
}
type
SavedPeer
struct
{
Address
string
}
// Config is used to load IPFS config files.
type
Config
struct
{
Identity
*
Identity
Datastore
*
Datastore
Peers
[]
*
SavedPeer
}
var
defaultConfigFilePath
=
"~/.go-ipfs/config"
...
...
This diff is collapsed.
Click to expand it.
core/core.go
View file @
45fc43c9
...
...
@@ -67,34 +67,10 @@ func NewIpfsNode(cfg *config.Config, online bool) (*IpfsNode, error) {
var
swap
*
bitswap
.
BitSwap
if
online
{
maddr
,
err
:
=
ma
.
NewMultiaddr
(
"/ip4/127.0.0.1/tcp/4001"
)
swap
,
err
=
loadBitswap
(
cfg
,
d
)
if
err
!=
nil
{
return
nil
,
err
}
local
:=
&
peer
.
Peer
{
ID
:
peer
.
ID
(
cfg
.
Identity
.
PeerID
),
Addresses
:
[]
*
ma
.
Multiaddr
{
maddr
},
}
if
len
(
local
.
ID
)
==
0
{
mh
,
err
:=
u
.
Hash
([]
byte
(
"blah blah blah ID"
))
if
err
!=
nil
{
return
nil
,
err
}
local
.
ID
=
peer
.
ID
(
mh
)
}
net
:=
swarm
.
NewSwarm
(
local
)
err
=
net
.
Listen
()
if
err
!=
nil
{
return
nil
,
err
}
route
:=
dht
.
NewDHT
(
local
,
net
,
d
)
route
.
Start
()
swap
=
bitswap
.
NewBitSwap
(
local
,
net
,
d
,
route
)
}
bs
,
err
:=
bserv
.
NewBlockService
(
d
,
swap
)
...
...
@@ -115,3 +91,47 @@ func NewIpfsNode(cfg *config.Config, online bool) (*IpfsNode, error) {
return
n
,
nil
}
func
loadBitswap
(
cfg
*
config
.
Config
,
d
ds
.
Datastore
)
(
*
bitswap
.
BitSwap
,
error
)
{
maddr
,
err
:=
ma
.
NewMultiaddr
(
"/ip4/127.0.0.1/tcp/4001"
)
if
err
!=
nil
{
return
nil
,
err
}
local
:=
&
peer
.
Peer
{
ID
:
peer
.
ID
(
cfg
.
Identity
.
PeerID
),
Addresses
:
[]
*
ma
.
Multiaddr
{
maddr
},
}
if
len
(
local
.
ID
)
==
0
{
mh
,
err
:=
u
.
Hash
([]
byte
(
"blah blah blah ID"
))
if
err
!=
nil
{
return
nil
,
err
}
local
.
ID
=
peer
.
ID
(
mh
)
}
net
:=
swarm
.
NewSwarm
(
local
)
err
=
net
.
Listen
()
if
err
!=
nil
{
return
nil
,
err
}
route
:=
dht
.
NewDHT
(
local
,
net
,
d
)
route
.
Start
()
for
_
,
p
:=
range
cfg
.
Peers
{
maddr
,
err
:=
ma
.
NewMultiaddr
(
p
.
Address
)
if
err
!=
nil
{
u
.
PErr
(
"error: %v
\n
"
,
err
)
continue
}
_
,
err
=
route
.
Connect
(
maddr
)
if
err
!=
nil
{
u
.
PErr
(
"Bootstrapping error: %v
\n
"
,
err
)
}
}
return
bitswap
.
NewBitSwap
(
local
,
net
,
d
,
route
),
nil
}
This diff is collapsed.
Click to expand it.
identify/identify.go
View file @
45fc43c9
...
...
@@ -3,6 +3,13 @@
package
identify
import
(
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"errors"
"io/ioutil"
peer
"github.com/jbenet/go-ipfs/peer"
u
"github.com/jbenet/go-ipfs/util"
)
...
...
@@ -18,3 +25,65 @@ func Handshake(self, remote *peer.Peer, in, out chan []byte) error {
return
nil
}
type
KeyPair
struct
{
Pub
crypto
.
PublicKey
Priv
crypto
.
PrivateKey
}
func
GenKeypair
()
(
*
KeyPair
,
error
)
{
priv
,
err
:=
rsa
.
GenerateKey
(
rand
.
Reader
,
4096
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
KeyPair
{
Priv
:
priv
,
Pub
:
priv
.
PublicKey
,
},
nil
}
func
LoadKeypair
(
dir
string
)
(
*
KeyPair
,
error
)
{
var
kp
KeyPair
pk_b
,
err
:=
ioutil
.
ReadFile
(
dir
+
"/priv.key"
)
if
err
!=
nil
{
return
nil
,
err
}
priv
,
err
:=
x509
.
ParsePKCS1PrivateKey
(
pk_b
)
if
err
!=
nil
{
return
nil
,
err
}
kp
.
Priv
=
priv
kp
.
Pub
=
priv
.
PublicKey
return
&
kp
,
nil
}
func
(
pk
*
KeyPair
)
ID
()
(
peer
.
ID
,
error
)
{
pub_b
,
err
:=
x509
.
MarshalPKIXPublicKey
(
pk
.
Pub
)
if
err
!=
nil
{
return
nil
,
err
}
hash
,
err
:=
u
.
Hash
(
pub_b
)
if
err
!=
nil
{
return
nil
,
err
}
return
peer
.
ID
(
hash
),
nil
}
func
(
kp
*
KeyPair
)
Save
(
dir
string
)
error
{
switch
k
:=
kp
.
Priv
.
(
type
)
{
case
*
rsa
.
PrivateKey
:
err
:=
k
.
Validate
()
if
err
!=
nil
{
return
err
}
pk_b
:=
x509
.
MarshalPKCS1PrivateKey
(
k
)
err
=
ioutil
.
WriteFile
(
dir
+
"/priv.key"
,
pk_b
,
0600
)
return
err
default
:
return
errors
.
New
(
"invalid private key type."
)
}
}
This diff is collapsed.
Click to expand it.
routing/dht/dht.go
View file @
45fc43c9
...
...
@@ -2,6 +2,7 @@ package dht
import
(
"bytes"
"crypto/rand"
"fmt"
"sync"
"time"
...
...
@@ -637,3 +638,10 @@ func (dht *IpfsDHT) peerFromInfo(pbp *PBDHTMessage_PBPeer) (*peer.Peer, error) {
return
dht
.
network
.
GetConnection
(
peer
.
ID
(
pbp
.
GetId
()),
maddr
)
}
// Builds up list of peers by requesting random peer IDs
func
(
dht
*
IpfsDHT
)
Bootstrap
()
{
id
:=
make
([]
byte
,
16
)
rand
.
Read
(
id
)
dht
.
FindPeer
(
peer
.
ID
(
id
),
time
.
Second
*
10
)
}
This diff is collapsed.
Click to expand it.
routing/dht/routing.go
View file @
45fc43c9
...
...
@@ -340,6 +340,56 @@ func (dht *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, err
return
nil
,
u
.
ErrNotFound
}
func
(
dht
*
IpfsDHT
)
findPeerMultiple
(
id
peer
.
ID
,
timeout
time
.
Duration
)
(
*
peer
.
Peer
,
error
)
{
// Check if were already connected to them
p
,
_
:=
dht
.
Find
(
id
)
if
p
!=
nil
{
return
p
,
nil
}
routeLevel
:=
0
peers
:=
dht
.
routingTables
[
routeLevel
]
.
NearestPeers
(
kb
.
ConvertPeerID
(
id
),
AlphaValue
)
if
len
(
peers
)
==
0
{
return
nil
,
kb
.
ErrLookupFailure
}
found
:=
make
(
chan
*
peer
.
Peer
)
after
:=
time
.
After
(
timeout
)
for
_
,
p
:=
range
peers
{
go
func
(
p
*
peer
.
Peer
)
{
pmes
,
err
:=
dht
.
findPeerSingle
(
p
,
id
,
timeout
,
routeLevel
)
if
err
!=
nil
{
u
.
DErr
(
"getPeer error: %v
\n
"
,
err
)
return
}
plist
:=
pmes
.
GetPeers
()
if
len
(
plist
)
==
0
{
routeLevel
++
}
for
_
,
fp
:=
range
plist
{
nxtp
,
err
:=
dht
.
peerFromInfo
(
fp
)
if
err
!=
nil
{
u
.
DErr
(
"findPeer error: %v
\n
"
,
err
)
continue
}
if
nxtp
.
ID
.
Equal
(
dht
.
self
.
ID
)
{
found
<-
nxtp
return
}
}
}(
p
)
}
select
{
case
p
:=
<-
found
:
return
p
,
nil
case
<-
after
:
return
nil
,
u
.
ErrTimeout
}
}
// Ping a peer, log the time it took
func
(
dht
*
IpfsDHT
)
Ping
(
p
*
peer
.
Peer
,
timeout
time
.
Duration
)
error
{
// Thoughts: maybe this should accept an ID and do a peer lookup?
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment