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
7ccf51fd
Commit
7ccf51fd
authored
Jan 30, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated seed peers
parent
3e400739
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
138 additions
and
119 deletions
+138
-119
ethereum.go
ethereum.go
+9
-5
peer.go
peer.go
+129
-114
No files found.
ethereum.go
View file @
7ccf51fd
...
...
@@ -72,10 +72,13 @@ func (s *Ethereum) AddPeer(conn net.Conn) {
peer
:=
NewPeer
(
conn
,
s
,
true
)
if
peer
!=
nil
{
if
s
.
peers
.
Len
()
>
-
1
{
log
.
Println
(
"SEED"
)
peer
.
Start
(
true
)
}
else
{
s
.
peers
.
PushBack
(
peer
)
peer
.
Start
()
log
.
Println
(
"Peer connected ::"
,
conn
.
RemoteAddr
())
peer
.
Start
(
false
)
}
}
}
...
...
@@ -164,8 +167,9 @@ func (s *Ethereum) Start() {
}
else
{
// Starting accepting connections
go
func
()
{
for
{
log
.
Println
(
"Ready and accepting connections"
)
for
{
conn
,
err
:=
ln
.
Accept
()
if
err
!=
nil
{
log
.
Println
(
err
)
...
...
peer.go
View file @
7ccf51fd
...
...
@@ -42,6 +42,9 @@ type Peer struct {
// Indicates whether a MsgGetPeersTy was requested of the peer
// this to prevent receiving false peers.
requestedPeerList
bool
// Determines whether this is a seed peer
seed
bool
}
func
NewPeer
(
conn
net
.
Conn
,
ethereum
*
Ethereum
,
inbound
bool
)
*
Peer
{
...
...
@@ -81,9 +84,7 @@ func NewOutboundPeer(addr string, ethereum *Ethereum) *Peer {
atomic
.
StoreInt32
(
&
p
.
connected
,
1
)
atomic
.
StoreInt32
(
&
p
.
disconnect
,
0
)
log
.
Println
(
"Connected to peer ::"
,
conn
.
RemoteAddr
())
p
.
Start
()
p
.
Start
(
false
)
}()
return
p
...
...
@@ -115,6 +116,14 @@ func (p *Peer) writeMessage(msg *ethwire.Msg) {
p
.
Stop
()
return
}
// XXX TMP CODE FOR TESTNET
switch
msg
.
Type
{
case
ethwire
.
MsgPeersTy
:
if
p
.
seed
{
p
.
Stop
()
}
}
}
// Outbound message handler. Outbound messages are handled here
...
...
@@ -157,17 +166,14 @@ func (p *Peer) HandleInbound() {
out
:
for
atomic
.
LoadInt32
(
&
p
.
disconnect
)
==
0
{
// Wait for a message from the peer
msg
,
err
:=
ethwire
.
ReadMessage
(
p
.
conn
)
msgs
,
err
:=
ethwire
.
ReadMessages
(
p
.
conn
)
for
_
,
msg
:=
range
msgs
{
if
err
!=
nil
{
log
.
Println
(
err
)
break
out
}
if
ethutil
.
Config
.
Debug
{
log
.
Printf
(
"Received %s
\n
"
,
msg
.
Type
.
String
())
}
switch
msg
.
Type
{
case
ethwire
.
MsgHandshakeTy
:
// Version message
...
...
@@ -183,8 +189,8 @@ out:
// active.
p
.
lastPong
=
time
.
Now
()
.
Unix
()
case
ethwire
.
MsgBlockTy
:
// Get all blocks and process them (TODO reverse order?)
msg
.
Data
=
msg
.
Data
.
Get
(
0
)
// Get all blocks and process them
msg
.
Data
=
msg
.
Data
for
i
:=
msg
.
Data
.
Length
()
-
1
;
i
>=
0
;
i
--
{
block
:=
ethchain
.
NewBlockFromRlpValue
(
msg
.
Data
.
Get
(
i
))
err
:=
p
.
ethereum
.
BlockManager
.
ProcessBlock
(
block
)
...
...
@@ -222,13 +228,17 @@ out:
p
.
ethereum
.
ProcessPeerList
(
peers
)
// Mark unrequested again
p
.
requestedPeerList
=
false
}
case
ethwire
.
MsgGetChainTy
:
var
parent
*
ethchain
.
Block
// FIXME
msg
.
Data
=
msg
.
Data
.
Get
(
0
)
// Length minus one since the very last element in the array is a count
l
:=
msg
.
Data
.
Length
()
-
1
// Ignore empty get chains
if
l
<=
1
{
break
}
// Amount of parents in the canonical chain
amountOfBlocks
:=
msg
.
Data
.
Get
(
l
)
.
AsUint
()
// Check each SHA block hash from the message and determine whether
...
...
@@ -243,27 +253,31 @@ out:
// If a parent is found send back a reply
if
parent
!=
nil
{
chain
:=
p
.
ethereum
.
BlockManager
.
BlockChain
()
.
GetChainFromHash
(
parent
.
Hash
(),
amountOfBlocks
)
p
.
QueueMessage
(
ethwire
.
NewMessage
(
ethwire
.
MsgBlockTy
,
chain
))
p
.
QueueMessage
(
ethwire
.
NewMessage
(
ethwire
.
MsgBlockTy
,
append
(
chain
,
amountOfBlocks
)
))
}
else
{
// If no blocks are found we send back a reply with msg not in chain
// and the last hash from get chain
lastHash
:=
msg
.
Data
.
Get
(
l
)
p
.
QueueMessage
(
ethwire
.
NewMessage
(
ethwire
.
MsgNotInChainTy
,
lastHash
.
AsRaw
()))
lastHash
:=
msg
.
Data
.
Get
(
l
-
1
)
log
.
Printf
(
"Sending not in chain with hash %x
\n
"
,
lastHash
.
AsRaw
())
p
.
QueueMessage
(
ethwire
.
NewMessage
(
ethwire
.
MsgNotInChainTy
,
[]
interface
{}{
lastHash
.
AsRaw
()}))
}
case
ethwire
.
MsgNotInChainTy
:
log
.
Println
(
"Not in chain, not yet implemented"
)
log
.
Printf
(
"Not in chain %x
\n
"
,
msg
.
Data
)
// TODO
// Unofficial but fun nonetheless
case
ethwire
.
MsgTalkTy
:
log
.
Printf
(
"%v says: %s
\n
"
,
p
.
conn
.
RemoteAddr
(),
msg
.
Data
.
Get
(
0
)
.
AsString
())
log
.
Printf
(
"%v says: %s
\n
"
,
p
.
conn
.
RemoteAddr
(),
msg
.
Data
.
AsString
())
}
}
}
p
.
Stop
()
}
func
(
p
*
Peer
)
Start
()
{
func
(
p
*
Peer
)
Start
(
seed
bool
)
{
p
.
seed
=
seed
if
!
p
.
inbound
{
err
:=
p
.
pushHandshake
()
if
err
!=
nil
{
...
...
@@ -277,6 +291,7 @@ func (p *Peer) Start() {
go
p
.
HandleOutbound
()
// Run the inbound handler in a new goroutine
go
p
.
HandleInbound
()
}
func
(
p
*
Peer
)
Stop
()
{
...
...
@@ -294,9 +309,9 @@ func (p *Peer) Stop() {
}
func
(
p
*
Peer
)
pushHandshake
()
error
{
msg
:=
ethwire
.
NewMessage
(
ethwire
.
MsgHandshakeTy
,
ethutil
.
Encode
(
[]
interface
{}{
1
,
0
,
p
.
ethereum
.
Nonce
,
})
)
msg
:=
ethwire
.
NewMessage
(
ethwire
.
MsgHandshakeTy
,
[]
interface
{}{
uint32
(
0
),
uint32
(
0
),
"/Ethereum(G) v0.0.1/"
,
})
p
.
QueueMessage
(
msg
)
...
...
@@ -305,6 +320,7 @@ func (p *Peer) pushHandshake() error {
// Pushes the list of outbound peers to the client when requested
func
(
p
*
Peer
)
pushPeers
()
{
outPeers
:=
make
([]
interface
{},
len
(
p
.
ethereum
.
OutboundPeers
()))
// Serialise each peer
for
i
,
peer
:=
range
p
.
ethereum
.
OutboundPeers
()
{
...
...
@@ -312,7 +328,7 @@ func (p *Peer) pushPeers() {
}
// Send message to the peer with the known list of connected clients
msg
:=
ethwire
.
NewMessage
(
ethwire
.
MsgPeersTy
,
ethutil
.
Encode
(
outPeers
)
)
msg
:=
ethwire
.
NewMessage
(
ethwire
.
MsgPeersTy
,
outPeers
)
p
.
QueueMessage
(
msg
)
}
...
...
@@ -320,29 +336,28 @@ func (p *Peer) pushPeers() {
func
(
p
*
Peer
)
handleHandshake
(
msg
*
ethwire
.
Msg
)
{
c
:=
msg
.
Data
// [PROTOCOL_VERSION, NETWORK_ID, CLIENT_ID]
if
c
.
Get
(
2
)
.
AsUint
()
==
p
.
ethereum
.
Nonce
{
//if msg.Nonce == p.ethereum.Nonce {
log
.
Println
(
"Peer connected to self, disconnecting"
)
p
.
Stop
()
return
}
p
.
versionKnown
=
true
var
istr
string
// If this is an inbound connection send an ack back
if
p
.
inbound
{
/*
err := p.pushHandshake()
if err != nil {
log.Println("Peer can't send ack back")
p.Stop()
}
*/
istr
=
"inbound"
}
else
{
msg
:=
ethwire
.
NewMessage
(
ethwire
.
MsgGetChainTy
,
[]
interface
{}{
p
.
ethereum
.
BlockManager
.
BlockChain
()
.
CurrentBlock
.
Hash
(),
uint64
(
100
)})
p
.
QueueMessage
(
msg
)
istr
=
"outbound"
}
log
.
Printf
(
"peer connect (%s) %v %s
\n
"
,
istr
,
p
.
conn
.
RemoteAddr
(),
c
.
Get
(
2
)
.
AsString
())
}
func
(
p
*
Peer
)
RlpEncode
()
[]
byte
{
...
...
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