Merge branch 'release/0.6.0' into develop

This commit is contained in:
obscuren 2014-07-25 10:43:59 +02:00
commit 92ffc1cc4c
2 changed files with 41 additions and 31 deletions

View File

@ -282,20 +282,15 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
case SDIV: case SDIV:
require(2) require(2)
x, y := stack.Popn() x, y := stack.Popn()
// n > 2**255 self.Printf(" %v / %v", y, x)
if x.Cmp(Pow256) > 0 {
x.Sub(Pow256, x) if x.Cmp(ethutil.Big0) != 0 {
base.Div(y, x)
} }
if y.Cmp(Pow256) > 0 {
y.Sub(Pow256, y) self.Printf(" = %v", base)
} // Pop result back on the stack
z := new(big.Int) stack.Push(base)
z.Div(x, y)
if z.Cmp(Pow256) > 0 {
z.Sub(Pow256, z)
}
// Push result on to the stack
stack.Push(z)
case MOD: case MOD:
require(2) require(2)
x, y := stack.Popn() x, y := stack.Popn()
@ -309,20 +304,14 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
case SMOD: case SMOD:
require(2) require(2)
x, y := stack.Popn() x, y := stack.Popn()
// n > 2**255
if x.Cmp(Pow256) > 0 { self.Printf(" %v %% %v", y, x)
x.Sub(Pow256, x)
} base.Mod(y, x)
if y.Cmp(Pow256) > 0 {
y.Sub(Pow256, y) self.Printf(" = %v", base)
} stack.Push(base)
z := new(big.Int)
z.Mod(x, y)
if z.Cmp(Pow256) > 0 {
z.Sub(Pow256, z)
}
// Push result on to the stack
stack.Push(z)
case EXP: case EXP:
require(2) require(2)
x, y := stack.Popn() x, y := stack.Popn()

27
peer.go
View File

@ -122,6 +122,7 @@ type Peer struct {
// Last received pong message // Last received pong message
lastPong int64 lastPong int64
lastBlockReceived time.Time
host []byte host []byte
port uint16 port uint16
@ -408,10 +409,7 @@ func (p *Peer) HandleInbound() {
for i := msg.Data.Len() - 1; i >= 0; i-- { for i := msg.Data.Len() - 1; i >= 0; i-- {
block = ethchain.NewBlockFromRlpValue(msg.Data.Get(i)) block = ethchain.NewBlockFromRlpValue(msg.Data.Get(i))
//p.ethereum.StateManager().PrepareDefault(block)
//state := p.ethereum.StateManager().CurrentState()
err = p.ethereum.StateManager().Process(block, false) err = p.ethereum.StateManager().Process(block, false)
if err != nil { if err != nil {
if ethutil.Config.Debug { if ethutil.Config.Debug {
peerlogger.Infof("Block %x failed\n", block.Hash()) peerlogger.Infof("Block %x failed\n", block.Hash())
@ -422,6 +420,8 @@ func (p *Peer) HandleInbound() {
} else { } else {
lastBlock = block lastBlock = block
} }
p.lastBlockReceived = time.Now()
} }
if msg.Data.Len() <= 1 { if msg.Data.Len() <= 1 {
@ -561,6 +561,25 @@ func (p *Peer) HandleInbound() {
p.Stop() p.Stop()
} }
// General update method
func (self *Peer) update() {
serviceTimer := time.NewTicker(5 * time.Second)
out:
for {
select {
case <-serviceTimer.C:
if time.Since(self.lastBlockReceived) > 10*time.Second {
self.catchingUp = false
}
case <-self.quit:
break out
}
}
serviceTimer.Stop()
}
func (p *Peer) Start() { func (p *Peer) Start() {
peerHost, peerPort, _ := net.SplitHostPort(p.conn.LocalAddr().String()) peerHost, peerPort, _ := net.SplitHostPort(p.conn.LocalAddr().String())
servHost, servPort, _ := net.SplitHostPort(p.conn.RemoteAddr().String()) servHost, servPort, _ := net.SplitHostPort(p.conn.RemoteAddr().String())
@ -583,6 +602,8 @@ func (p *Peer) Start() {
go p.HandleOutbound() go p.HandleOutbound()
// Run the inbound handler in a new goroutine // Run the inbound handler in a new goroutine
go p.HandleInbound() go p.HandleInbound()
// Run the general update handler
go p.update()
// Wait a few seconds for startup and then ask for an initial ping // Wait a few seconds for startup and then ask for an initial ping
time.Sleep(2 * time.Second) time.Sleep(2 * time.Second)