Merge branch 'release/poc5-rc12'

This commit is contained in:
obscuren 2014-06-09 22:24:05 +02:00
commit 006ac772e6
8 changed files with 62 additions and 16 deletions

View File

@ -6,7 +6,7 @@ Ethereum
Ethereum Go Development package (C) Jeffrey Wilcke Ethereum Go Development package (C) Jeffrey Wilcke
Ethereum is currently in its testing phase. The current state is "Proof Ethereum is currently in its testing phase. The current state is "Proof
of Concept 5.0 RC11". For build instructions see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)). of Concept 5.0 RC12". For build instructions see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)).
Ethereum Go is split up in several sub packages Please refer to each Ethereum Go is split up in several sub packages Please refer to each
individual package for more information. individual package for more information.

View File

@ -22,6 +22,7 @@ type Peer interface {
Host() []byte Host() []byte
Port() uint16 Port() uint16
Version() string Version() string
PingTime() string
Connected() *int32 Connected() *int32
} }
@ -177,7 +178,7 @@ func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transac
err = fmt.Errorf("[STATE] Unable to create contract") err = fmt.Errorf("[STATE] Unable to create contract")
} }
} else { } else {
err = fmt.Errorf("[STATE] contract creation tx: %v", err) err = fmt.Errorf("[STATE] contract creation tx: %v for sender %x", err, tx.Sender())
} }
} else { } else {
// Find the state object at the "recipient" address. If // Find the state object at the "recipient" address. If

View File

@ -309,7 +309,7 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
case SHA3: case SHA3:
require(2) require(2)
size, offset := stack.Popn() size, offset := stack.Popn()
data := mem.Get(offset.Int64(), size.Int64()) data := ethutil.Sha3Bin(mem.Get(offset.Int64(), size.Int64()))
stack.Push(ethutil.BigD(data)) stack.Push(ethutil.BigD(data))
// 0x30 range // 0x30 range

View File

@ -56,6 +56,7 @@ func (lib *PEthereum) GetPeers() []PPeer {
var peers []PPeer var peers []PPeer
for peer := lib.manager.Peers().Front(); peer != nil; peer = peer.Next() { for peer := lib.manager.Peers().Front(); peer != nil; peer = peer.Next() {
p := peer.Value.(ethchain.Peer) p := peer.Value.(ethchain.Peer)
// we only want connected peers
if atomic.LoadInt32(p.Connected()) != 0 { if atomic.LoadInt32(p.Connected()) != 0 {
peers = append(peers, *NewPPeer(p)) peers = append(peers, *NewPPeer(p))
} }

View File

@ -20,6 +20,7 @@ type PPeer struct {
Port int `json:"port"` Port int `json:"port"`
Version string `json:"version"` Version string `json:"version"`
LastResponse string `json:"lastResponse"` LastResponse string `json:"lastResponse"`
Latency string `json:"latency"`
} }
func NewPPeer(peer ethchain.Peer) *PPeer { func NewPPeer(peer ethchain.Peer) *PPeer {
@ -34,7 +35,7 @@ func NewPPeer(peer ethchain.Peer) *PPeer {
} }
ipAddress := strings.Join(ip, ".") ipAddress := strings.Join(ip, ".")
return &PPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port())} return &PPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port()), Latency: peer.PingTime()}
} }
// Block interface exposed to QML // Block interface exposed to QML
@ -206,6 +207,31 @@ func (c *PStateObject) IsContract() bool {
return false return false
} }
type KeyVal struct {
Key string
Value string
}
func (c *PStateObject) StateKeyVal(asJson bool) interface{} {
var values []KeyVal
if c.object != nil {
c.object.State().EachStorage(func(name string, value *ethutil.Value) {
values = append(values, KeyVal{name, ethutil.Hex(value.Bytes())})
})
}
if asJson {
valuesJson, err := json.Marshal(values)
if err != nil {
return nil
}
fmt.Println(string(valuesJson))
return string(valuesJson)
}
return values
}
func (c *PStateObject) Script() string { func (c *PStateObject) Script() string {
if c.object != nil { if c.object != nil {
return strings.Join(ethchain.Disassemble(c.object.Script()), " ") return strings.Join(ethchain.Disassemble(c.object.Script()), " ")

View File

@ -7,13 +7,15 @@ import (
// The different number of units // The different number of units
var ( var (
Ether = BigPow(10, 18) Douglas = BigPow(10, 42)
Finney = BigPow(10, 15) Einstein = BigPow(10, 21)
Szabo = BigPow(10, 12) Ether = BigPow(10, 18)
Shannon = BigPow(10, 9) Finney = BigPow(10, 15)
Babbage = BigPow(10, 6) Szabo = BigPow(10, 12)
Ada = BigPow(10, 3) Shannon = BigPow(10, 9)
Wei = big.NewInt(1) Babbage = BigPow(10, 6)
Ada = BigPow(10, 3)
Wei = big.NewInt(1)
) )
// Currency to string // Currency to string
@ -21,6 +23,10 @@ var (
// Returns a string representing a human readable format // Returns a string representing a human readable format
func CurrencyToString(num *big.Int) string { func CurrencyToString(num *big.Int) string {
switch { switch {
case num.Cmp(Douglas) >= 0:
return fmt.Sprintf("%v Douglas", new(big.Int).Div(num, Douglas))
case num.Cmp(Einstein) >= 0:
return fmt.Sprintf("%v Einstein", new(big.Int).Div(num, Einstein))
case num.Cmp(Ether) >= 0: case num.Cmp(Ether) >= 0:
return fmt.Sprintf("%v Ether", new(big.Int).Div(num, Ether)) return fmt.Sprintf("%v Ether", new(big.Int).Div(num, Ether))
case num.Cmp(Finney) >= 0: case num.Cmp(Finney) >= 0:

View File

@ -75,7 +75,7 @@ func ReadConfig(base string, logTypes LoggerType, g *globalconf.GlobalConf, id s
if Config == nil { if Config == nil {
path := ApplicationFolder(base) path := ApplicationFolder(base)
Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC11"} Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC12"}
Config.conf = g Config.conf = g
Config.Identifier = id Config.Identifier = id
Config.Log = NewLogger(logTypes, LogLevelDebug) Config.Log = NewLogger(logTypes, LogLevelDebug)

20
peer.go
View File

@ -130,6 +130,10 @@ type Peer struct {
blocksRequested int blocksRequested int
version string version string
// We use this to give some kind of pingtime to a node, not very accurate, could be improved.
pingTime time.Duration
pingStartTime time.Time
} }
func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer { func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer {
@ -185,6 +189,9 @@ func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer {
} }
// Getters // Getters
func (p *Peer) PingTime() string {
return p.pingTime.String()
}
func (p *Peer) Inbound() bool { func (p *Peer) Inbound() bool {
return p.inbound return p.inbound
} }
@ -246,7 +253,7 @@ func (p *Peer) writeMessage(msg *ethwire.Msg) {
// Outbound message handler. Outbound messages are handled here // Outbound message handler. Outbound messages are handled here
func (p *Peer) HandleOutbound() { func (p *Peer) HandleOutbound() {
// The ping timer. Makes sure that every 2 minutes a ping is send to the peer // The ping timer. Makes sure that every 2 minutes a ping is send to the peer
pingTimer := time.NewTicker(2 * time.Minute) pingTimer := time.NewTicker(30 * time.Second)
serviceTimer := time.NewTicker(5 * time.Minute) serviceTimer := time.NewTicker(5 * time.Minute)
out: out:
@ -255,12 +262,12 @@ out:
// 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:
p.writeMessage(msg) p.writeMessage(msg)
p.lastSend = time.Now() p.lastSend = time.Now()
// Ping timer sends a ping to the peer each 2 minutes // Ping timer sends a ping to the peer each 2 minutes
case <-pingTimer.C: case <-pingTimer.C:
p.writeMessage(ethwire.NewMessage(ethwire.MsgPingTy, "")) p.writeMessage(ethwire.NewMessage(ethwire.MsgPingTy, ""))
p.pingStartTime = time.Now()
// Service timer takes care of peer broadcasting, transaction // Service timer takes care of peer broadcasting, transaction
// posting or block posting // posting or block posting
@ -290,8 +297,8 @@ clean:
// Inbound handler. Inbound messages are received here and passed to the appropriate methods // Inbound handler. Inbound messages are received here and passed to the appropriate methods
func (p *Peer) HandleInbound() { func (p *Peer) HandleInbound() {
for atomic.LoadInt32(&p.disconnect) == 0 { for atomic.LoadInt32(&p.disconnect) == 0 {
// HMM? // HMM?
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
// Wait for a message from the peer // Wait for a message from the peer
@ -319,6 +326,7 @@ func (p *Peer) HandleInbound() {
// last pong so the peer handler knows this peer is still // last pong so the peer handler knows this peer is still
// active. // active.
p.lastPong = time.Now().Unix() p.lastPong = time.Now().Unix()
p.pingTime = time.Now().Sub(p.pingStartTime)
case ethwire.MsgBlockTy: case ethwire.MsgBlockTy:
// Get all blocks and process them // Get all blocks and process them
var block, lastBlock *ethchain.Block var block, lastBlock *ethchain.Block
@ -531,11 +539,15 @@ func (p *Peer) Start() {
return return
} }
// 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
go p.HandleInbound() go p.HandleInbound()
// Wait a few seconds for startup and then ask for an initial ping
time.Sleep(2 * time.Second)
p.writeMessage(ethwire.NewMessage(ethwire.MsgPingTy, ""))
p.pingStartTime = time.Now()
} }
func (p *Peer) Stop() { func (p *Peer) Stop() {