Upped protocol version for VM change
This commit is contained in:
parent
b3834d8272
commit
f3a93b046e
@ -5,5 +5,3 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var BlockReward *big.Int = big.NewInt(1.5e+18)
|
var BlockReward *big.Int = big.NewInt(1.5e+18)
|
||||||
var UncleReward *big.Int = big.NewInt(1.125e+18)
|
|
||||||
var UncleInclusionReward *big.Int = big.NewInt(1.875e+17)
|
|
||||||
|
@ -92,6 +92,13 @@ func (cache *Cache) Get(key []byte) *ethutil.Value {
|
|||||||
data, _ := cache.db.Get(key)
|
data, _ := cache.db.Get(key)
|
||||||
// Create the cached value
|
// Create the cached value
|
||||||
value := ethutil.NewValueFromBytes(data)
|
value := ethutil.NewValueFromBytes(data)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
fmt.Println("RECOVER GET", cache, cache.nodes)
|
||||||
|
panic("bye")
|
||||||
|
}
|
||||||
|
}()
|
||||||
// Create caching node
|
// Create caching node
|
||||||
cache.nodes[string(key)] = NewNode(key, value, false)
|
cache.nodes[string(key)] = NewNode(key, value, false)
|
||||||
|
|
||||||
|
@ -872,8 +872,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
default:
|
default:
|
||||||
vmlogger.Debugf("(pc) %-3v Invalid opcode %x\n", pc, op)
|
vmlogger.Debugf("(pc) %-3v Invalid opcode %x\n", pc, op)
|
||||||
|
|
||||||
// XXX Really?
|
//panic(fmt.Sprintf("Invalid opcode %x", op))
|
||||||
closure.UseGas(closure.Gas)
|
|
||||||
|
|
||||||
return closure.Return(nil), fmt.Errorf("Invalid opcode %x", op)
|
return closure.Return(nil), fmt.Errorf("Invalid opcode %x", op)
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ func NewSimpleClientIdentity(clientIdentifier string, version string, customIden
|
|||||||
version: version,
|
version: version,
|
||||||
customIdentifier: customIdentifier,
|
customIdentifier: customIdentifier,
|
||||||
os: runtime.GOOS,
|
os: runtime.GOOS,
|
||||||
implementation: "Go",
|
implementation: runtime.Version(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return clientIdentity
|
return clientIdentity
|
||||||
|
193
peer.go
193
peer.go
@ -24,9 +24,11 @@ const (
|
|||||||
// The size of the output buffer for writing messages
|
// The size of the output buffer for writing messages
|
||||||
outputBufferSize = 50
|
outputBufferSize = 50
|
||||||
// Current protocol version
|
// Current protocol version
|
||||||
ProtocolVersion = 32
|
ProtocolVersion = 33
|
||||||
// Current P2P version
|
// Current P2P version
|
||||||
P2PVersion = 0
|
P2PVersion = 0
|
||||||
|
// Ethereum network version
|
||||||
|
NetVersion = 0
|
||||||
// Interval for ping/pong message
|
// Interval for ping/pong message
|
||||||
pingPongTimer = 2 * time.Second
|
pingPongTimer = 2 * time.Second
|
||||||
)
|
)
|
||||||
@ -72,7 +74,7 @@ func (d DiscReason) String() string {
|
|||||||
type Caps byte
|
type Caps byte
|
||||||
|
|
||||||
const (
|
const (
|
||||||
CapPeerDiscTy = 1 << iota
|
CapPeerDiscTy Caps = 1 << iota
|
||||||
CapTxTy
|
CapTxTy
|
||||||
CapChainTy
|
CapChainTy
|
||||||
|
|
||||||
@ -309,6 +311,14 @@ out:
|
|||||||
select {
|
select {
|
||||||
// Main message queue. All outbound messages are processed through here
|
// Main message queue. All outbound messages are processed through here
|
||||||
case msg := <-p.outputQueue:
|
case msg := <-p.outputQueue:
|
||||||
|
if !p.statusKnown {
|
||||||
|
switch msg.Type {
|
||||||
|
case ethwire.MsgGetTxsTy, ethwire.MsgGetBlockHashesTy, ethwire.MsgGetBlocksTy, ethwire.MsgBlockHashesTy, ethwire.MsgBlockTy:
|
||||||
|
peerlogger.Debugln("Blocked outgoing [eth] message to peer without the [eth] cap.")
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
p.writeMessage(msg)
|
p.writeMessage(msg)
|
||||||
p.lastSend = time.Now()
|
p.lastSend = time.Now()
|
||||||
|
|
||||||
@ -435,100 +445,106 @@ func (p *Peer) HandleInbound() {
|
|||||||
case ethwire.MsgStatusTy:
|
case ethwire.MsgStatusTy:
|
||||||
// Handle peer's status msg
|
// Handle peer's status msg
|
||||||
p.handleStatus(msg)
|
p.handleStatus(msg)
|
||||||
case ethwire.MsgGetTxsTy:
|
}
|
||||||
// Get the current transactions of the pool
|
|
||||||
txs := p.ethereum.TxPool().CurrentTransactions()
|
|
||||||
// Get the RlpData values from the txs
|
|
||||||
txsInterface := make([]interface{}, len(txs))
|
|
||||||
for i, tx := range txs {
|
|
||||||
txsInterface[i] = tx.RlpData()
|
|
||||||
}
|
|
||||||
// Broadcast it back to the peer
|
|
||||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgTxTy, txsInterface))
|
|
||||||
|
|
||||||
case ethwire.MsgGetBlockHashesTy:
|
// TMP
|
||||||
if msg.Data.Len() < 2 {
|
if p.statusKnown {
|
||||||
peerlogger.Debugln("err: argument length invalid ", msg.Data.Len())
|
switch msg.Type {
|
||||||
}
|
case ethwire.MsgGetTxsTy:
|
||||||
|
// Get the current transactions of the pool
|
||||||
hash := msg.Data.Get(0).Bytes()
|
txs := p.ethereum.TxPool().CurrentTransactions()
|
||||||
amount := msg.Data.Get(1).Uint()
|
// Get the RlpData values from the txs
|
||||||
|
txsInterface := make([]interface{}, len(txs))
|
||||||
hashes := p.ethereum.BlockChain().GetChainHashesFromHash(hash, amount)
|
for i, tx := range txs {
|
||||||
|
txsInterface[i] = tx.RlpData()
|
||||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockHashesTy, ethutil.ByteSliceToInterface(hashes)))
|
|
||||||
|
|
||||||
case ethwire.MsgGetBlocksTy:
|
|
||||||
// Limit to max 300 blocks
|
|
||||||
max := int(math.Min(float64(msg.Data.Len()), 300.0))
|
|
||||||
var blocks []interface{}
|
|
||||||
|
|
||||||
for i := 0; i < max; i++ {
|
|
||||||
hash := msg.Data.Get(i).Bytes()
|
|
||||||
block := p.ethereum.BlockChain().GetBlock(hash)
|
|
||||||
if block != nil {
|
|
||||||
blocks = append(blocks, block.Value().Raw())
|
|
||||||
}
|
}
|
||||||
}
|
// Broadcast it back to the peer
|
||||||
|
p.QueueMessage(ethwire.NewMessage(ethwire.MsgTxTy, txsInterface))
|
||||||
|
|
||||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, blocks))
|
case ethwire.MsgGetBlockHashesTy:
|
||||||
|
if msg.Data.Len() < 2 {
|
||||||
case ethwire.MsgBlockHashesTy:
|
peerlogger.Debugln("err: argument length invalid ", msg.Data.Len())
|
||||||
p.catchingUp = true
|
|
||||||
|
|
||||||
blockPool := p.ethereum.blockPool
|
|
||||||
|
|
||||||
foundCommonHash := false
|
|
||||||
|
|
||||||
it := msg.Data.NewIterator()
|
|
||||||
for it.Next() {
|
|
||||||
hash := it.Value().Bytes()
|
|
||||||
|
|
||||||
if blockPool.HasCommonHash(hash) {
|
|
||||||
foundCommonHash = true
|
|
||||||
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
blockPool.AddHash(hash)
|
hash := msg.Data.Get(0).Bytes()
|
||||||
|
amount := msg.Data.Get(1).Uint()
|
||||||
|
|
||||||
p.lastReceivedHash = hash
|
hashes := p.ethereum.BlockChain().GetChainHashesFromHash(hash, amount)
|
||||||
|
|
||||||
p.lastBlockReceived = time.Now()
|
p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockHashesTy, ethutil.ByteSliceToInterface(hashes)))
|
||||||
}
|
|
||||||
|
|
||||||
if foundCommonHash {
|
case ethwire.MsgGetBlocksTy:
|
||||||
p.FetchBlocks()
|
// Limit to max 300 blocks
|
||||||
} else {
|
max := int(math.Min(float64(msg.Data.Len()), 300.0))
|
||||||
p.FetchHashes()
|
var blocks []interface{}
|
||||||
}
|
|
||||||
|
|
||||||
case ethwire.MsgBlockTy:
|
for i := 0; i < max; i++ {
|
||||||
p.catchingUp = true
|
hash := msg.Data.Get(i).Bytes()
|
||||||
|
block := p.ethereum.BlockChain().GetBlock(hash)
|
||||||
|
if block != nil {
|
||||||
|
blocks = append(blocks, block.Value().Raw())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
blockPool := p.ethereum.blockPool
|
p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, blocks))
|
||||||
|
|
||||||
it := msg.Data.NewIterator()
|
case ethwire.MsgBlockHashesTy:
|
||||||
for it.Next() {
|
p.catchingUp = true
|
||||||
block := ethchain.NewBlockFromRlpValue(it.Value())
|
|
||||||
//fmt.Printf("%v %x - %x\n", block.Number, block.Hash()[0:4], block.PrevHash[0:4])
|
|
||||||
|
|
||||||
blockPool.SetBlock(block, p)
|
blockPool := p.ethereum.blockPool
|
||||||
|
|
||||||
p.lastBlockReceived = time.Now()
|
foundCommonHash := false
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
it := msg.Data.NewIterator()
|
||||||
blockPool.CheckLinkAndProcess(func(block *ethchain.Block) {
|
for it.Next() {
|
||||||
err = p.ethereum.StateManager().Process(block, false)
|
hash := it.Value().Bytes()
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
if blockPool.HasCommonHash(hash) {
|
||||||
peerlogger.Infoln(err)
|
foundCommonHash = true
|
||||||
} else {
|
|
||||||
// Don't trigger if there's just one block.
|
break
|
||||||
if blockPool.Len() != 0 && msg.Data.Len() > 1 {
|
}
|
||||||
|
|
||||||
|
blockPool.AddHash(hash)
|
||||||
|
|
||||||
|
p.lastReceivedHash = hash
|
||||||
|
|
||||||
|
p.lastBlockReceived = time.Now()
|
||||||
|
}
|
||||||
|
|
||||||
|
if foundCommonHash {
|
||||||
p.FetchBlocks()
|
p.FetchBlocks()
|
||||||
|
} else {
|
||||||
|
p.FetchHashes()
|
||||||
|
}
|
||||||
|
|
||||||
|
case ethwire.MsgBlockTy:
|
||||||
|
p.catchingUp = true
|
||||||
|
|
||||||
|
blockPool := p.ethereum.blockPool
|
||||||
|
|
||||||
|
it := msg.Data.NewIterator()
|
||||||
|
for it.Next() {
|
||||||
|
block := ethchain.NewBlockFromRlpValue(it.Value())
|
||||||
|
//fmt.Printf("%v %x - %x\n", block.Number, block.Hash()[0:4], block.PrevHash[0:4])
|
||||||
|
|
||||||
|
blockPool.SetBlock(block, p)
|
||||||
|
|
||||||
|
p.lastBlockReceived = time.Now()
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
blockPool.CheckLinkAndProcess(func(block *ethchain.Block) {
|
||||||
|
err = p.ethereum.StateManager().Process(block, false)
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
peerlogger.Infoln(err)
|
||||||
|
} else {
|
||||||
|
// Don't trigger if there's just one block.
|
||||||
|
if blockPool.Len() != 0 && msg.Data.Len() > 1 {
|
||||||
|
p.FetchBlocks()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -645,10 +661,9 @@ func (p *Peer) pushPeers() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *Peer) pushStatus() {
|
func (self *Peer) pushStatus() {
|
||||||
const netVersion = 0
|
|
||||||
msg := ethwire.NewMessage(ethwire.MsgStatusTy, []interface{}{
|
msg := ethwire.NewMessage(ethwire.MsgStatusTy, []interface{}{
|
||||||
uint32(ProtocolVersion),
|
uint32(ProtocolVersion),
|
||||||
uint32(netVersion),
|
uint32(NetVersion),
|
||||||
self.ethereum.BlockChain().TD,
|
self.ethereum.BlockChain().TD,
|
||||||
self.ethereum.BlockChain().CurrentBlock.Hash(),
|
self.ethereum.BlockChain().CurrentBlock.Hash(),
|
||||||
self.ethereum.BlockChain().Genesis().Hash(),
|
self.ethereum.BlockChain().Genesis().Hash(),
|
||||||
@ -669,7 +684,17 @@ func (self *Peer) handleStatus(msg *ethwire.Msg) {
|
|||||||
)
|
)
|
||||||
|
|
||||||
if bytes.Compare(self.ethereum.BlockChain().Genesis().Hash(), genesis) != 0 {
|
if bytes.Compare(self.ethereum.BlockChain().Genesis().Hash(), genesis) != 0 {
|
||||||
ethlogger.Warnf("Invalid genisis hash %x. Disabling [ETH]\n", genesis)
|
ethlogger.Warnf("Invalid genisis hash %x. Disabling [eth]\n", genesis)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if netVersion != NetVersion {
|
||||||
|
ethlogger.Warnf("Invalid network version %d. Disabling [eth]\n", netVersion)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if protoVersion != ProtocolVersion {
|
||||||
|
ethlogger.Warnf("Invalid protocol version %d. Disabling [eth]\n", protoVersion)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -687,7 +712,7 @@ func (self *Peer) handleStatus(msg *ethwire.Msg) {
|
|||||||
self.FetchHashes()
|
self.FetchHashes()
|
||||||
}
|
}
|
||||||
|
|
||||||
ethlogger.Infof("Peer is [ETH] capable. (TD = %v ~ %x) %d / %d", self.td, self.bestHash, protoVersion, netVersion)
|
ethlogger.Infof("Peer is [eth] capable. (TD = %v ~ %x) %d / %d", self.td, self.bestHash, protoVersion, netVersion)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user