Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
12c0e827
Commit
12c0e827
authored
Jan 12, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Verion acknowledgement
parent
c3fabfe0
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
65 additions
and
9 deletions
+65
-9
peer.go
peer.go
+65
-9
No files found.
peer.go
View file @
12c0e827
...
@@ -2,6 +2,7 @@ package main
...
@@ -2,6 +2,7 @@ package main
import
(
import
(
"github.com/ethereum/ethwire-go"
"github.com/ethereum/ethwire-go"
"github.com/ethereum/ethutil-go"
"log"
"log"
"net"
"net"
)
)
...
@@ -12,24 +13,26 @@ type Peer struct {
...
@@ -12,24 +13,26 @@ type Peer struct {
// Net connection
// Net connection
conn
net
.
Conn
conn
net
.
Conn
// Output queue which is used to communicate and handle messages
// Output queue which is used to communicate and handle messages
outputQueue
chan
ethwire
.
InOutMsg
outputQueue
chan
*
ethwire
.
InOutMsg
// Quit channel
// Quit channel
quit
chan
bool
quit
chan
bool
inbound
bool
// Determines whether it's an inbound or outbound peer
}
}
func
NewPeer
(
conn
net
.
Conn
,
server
*
Server
)
*
Peer
{
func
NewPeer
(
conn
net
.
Conn
,
server
*
Server
,
inbound
bool
)
*
Peer
{
return
&
Peer
{
return
&
Peer
{
outputQueue
:
make
(
chan
ethwire
.
InOutMsg
,
1
),
// Buffered chan of 1 is enough
outputQueue
:
make
(
chan
*
ethwire
.
InOutMsg
,
1
),
// Buffered chan of 1 is enough
quit
:
make
(
chan
bool
),
quit
:
make
(
chan
bool
),
server
:
server
,
server
:
server
,
conn
:
conn
,
conn
:
conn
,
inbound
:
inbound
,
}
}
}
}
// Outputs any RLP encoded data to the peer
// Outputs any RLP encoded data to the peer
func
(
p
*
Peer
)
QueueMessage
(
msg
Type
string
,
data
[]
byte
)
{
func
(
p
*
Peer
)
QueueMessage
(
msg
*
ethwire
.
InOutMsg
)
{
p
.
outputQueue
<-
ethwire
.
InOutMsg
{
MsgType
:
msgType
,
Data
:
data
}
p
.
outputQueue
<-
msg
//ethwire.InOutMsg{MsgType: msgType, Nonce: ethutil.RandomUint64()
, Data: data}
}
}
// Outbound message handler. Outbound messages are handled here
// Outbound message handler. Outbound messages are handled here
...
@@ -69,9 +72,22 @@ out:
...
@@ -69,9 +72,22 @@ out:
break
out
break
out
}
}
// TODO
if
Debug
{
data
,
_
:=
Decode
(
msg
.
Data
,
0
)
log
.
Printf
(
"Received %s
\n
"
,
msg
.
MsgType
)
log
.
Printf
(
"%s, %s
\n
"
,
msg
.
MsgType
,
data
)
}
// TODO Hash data and check if for existence (= ignore)
switch
msg
.
MsgType
{
case
"verack"
:
// Version message
p
.
handleVersionAck
(
msg
)
case
"block"
:
err
:=
p
.
server
.
blockManager
.
ProcessBlock
(
ethutil
.
NewBlock
(
msg
.
Data
))
if
err
!=
nil
{
log
.
Println
(
err
)
}
}
}
}
// Notify the out handler we're quiting
// Notify the out handler we're quiting
...
@@ -79,6 +95,15 @@ out:
...
@@ -79,6 +95,15 @@ out:
}
}
func
(
p
*
Peer
)
Start
()
{
func
(
p
*
Peer
)
Start
()
{
if
!
p
.
inbound
{
err
:=
p
.
pushVersionAck
()
if
err
!=
nil
{
log
.
Printf
(
"Peer can't send outbound version ack"
,
err
)
p
.
Stop
()
}
}
// Run the outbound handler in a new goroutine
// Run the outbound handler in a new goroutine
go
p
.
HandleOutbound
()
go
p
.
HandleOutbound
()
// Run the inbound handler in a new goroutine
// Run the inbound handler in a new goroutine
...
@@ -90,3 +115,34 @@ func (p *Peer) Stop() {
...
@@ -90,3 +115,34 @@ func (p *Peer) Stop() {
p
.
quit
<-
true
p
.
quit
<-
true
}
}
func
(
p
*
Peer
)
pushVersionAck
()
error
{
msg
:=
ethwire
.
NewMessage
(
"verack"
,
p
.
server
.
Nonce
,
[]
byte
(
"01"
))
p
.
QueueMessage
(
msg
)
return
nil
}
func
(
p
*
Peer
)
handleVersionAck
(
msg
*
ethwire
.
InOutMsg
)
{
// Detect self connect
if
msg
.
Nonce
==
p
.
server
.
Nonce
{
log
.
Println
(
"Peer connected to self, disconnecting"
)
p
.
Stop
()
return
}
log
.
Println
(
"mnonce"
,
msg
.
Nonce
,
"snonce"
,
p
.
server
.
Nonce
)
// If this is an inbound connection send an ack back
if
p
.
inbound
{
err
:=
p
.
pushVersionAck
()
if
err
!=
nil
{
log
.
Println
(
"Peer can't send ack back"
)
p
.
Stop
()
}
}
}
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