From 0c1f732c64b7c1380b2f0422ee82d462ea88dc03 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 May 2014 11:29:57 +0200 Subject: [PATCH 01/10] Do not queue messages if the peer isn't connected (e.g. timing out) --- ethchain/state_manager.go | 1 - peer.go | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go index 8f1eb1ce5..f830f2022 100644 --- a/ethchain/state_manager.go +++ b/ethchain/state_manager.go @@ -199,7 +199,6 @@ func (sm *StateManager) ProcessBlock(block *Block, dontReact bool) error { } sm.Ethereum.Broadcast(ethwire.MsgBlockTy, []interface{}{block.Value().Val}) - } else { fmt.Println("total diff failed") } diff --git a/peer.go b/peer.go index 932dbdc18..70759f246 100644 --- a/peer.go +++ b/peer.go @@ -187,6 +187,10 @@ func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer { // Outputs any RLP encoded data to the peer func (p *Peer) QueueMessage(msg *ethwire.Msg) { + if atomic.LoadInt32(&p.connected) != 1 { + return + } + p.outputQueue <- msg } From 7c0df348f86d4ee47111b57b83fb1613e6338e05 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 May 2014 11:52:16 +0200 Subject: [PATCH 02/10] Increased deadline --- ethwire/messaging.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ethwire/messaging.go b/ethwire/messaging.go index b622376f3..cc0e7a9a0 100644 --- a/ethwire/messaging.go +++ b/ethwire/messaging.go @@ -69,6 +69,12 @@ func NewMessage(msgType MsgType, data interface{}) *Msg { } func ReadMessage(data []byte) (msg *Msg, remaining []byte, done bool, err error) { + defer func() { + if r := recover(); r != nil { + panic(fmt.Sprintf("message error %d %v", len(data), data)) + } + }() + if len(data) == 0 { return nil, nil, true, nil } @@ -124,7 +130,7 @@ func ReadMessages(conn net.Conn) (msgs []*Msg, err error) { var totalBytes int for { // Give buffering some time - conn.SetReadDeadline(time.Now().Add(20 * time.Millisecond)) + conn.SetReadDeadline(time.Now().Add(500 * time.Millisecond)) // Create a new temporarily buffer b := make([]byte, 1440) // Wait for a message from this peer @@ -134,7 +140,6 @@ func ReadMessages(conn net.Conn) (msgs []*Msg, err error) { fmt.Println("err now", err) return nil, err } else { - fmt.Println("IOF NOW") break } From 0512113bdd5cc55ae35abd442b668ab5ed7a116b Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 May 2014 11:56:06 +0200 Subject: [PATCH 03/10] Removed defer --- ethwire/messaging.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ethwire/messaging.go b/ethwire/messaging.go index cc0e7a9a0..cbcbbb8b7 100644 --- a/ethwire/messaging.go +++ b/ethwire/messaging.go @@ -69,12 +69,6 @@ func NewMessage(msgType MsgType, data interface{}) *Msg { } func ReadMessage(data []byte) (msg *Msg, remaining []byte, done bool, err error) { - defer func() { - if r := recover(); r != nil { - panic(fmt.Sprintf("message error %d %v", len(data), data)) - } - }() - if len(data) == 0 { return nil, nil, true, nil } From f4fa0d48cb10f925908062357be965c54370cba9 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 May 2014 13:54:40 +0200 Subject: [PATCH 04/10] Moved keyring to ethutil & removed old methods. Implements #20 --- ethchain/keypair.go | 87 ------------------------------- ethdb/database.go | 2 + ethdb/memory_database.go | 2 + ethpub/pub.go | 13 ++--- ethpub/types.go | 2 +- ethutil/db.go | 2 +- ethutil/key.go | 19 ------- ethutil/keypair.go | 109 +++++++++++++++++++++++++++++++++++++++ peer.go | 4 +- 9 files changed, 122 insertions(+), 118 deletions(-) delete mode 100644 ethchain/keypair.go delete mode 100644 ethutil/key.go create mode 100644 ethutil/keypair.go diff --git a/ethchain/keypair.go b/ethchain/keypair.go deleted file mode 100644 index 0f23bacdf..000000000 --- a/ethchain/keypair.go +++ /dev/null @@ -1,87 +0,0 @@ -package ethchain - -import ( - "github.com/ethereum/eth-go/ethutil" - "github.com/obscuren/secp256k1-go" - "math/big" -) - -type KeyPair struct { - PrivateKey []byte - PublicKey []byte - - // The associated account - account *StateObject - state *State -} - -func NewKeyPairFromSec(seckey []byte) (*KeyPair, error) { - pubkey, err := secp256k1.GeneratePubKey(seckey) - if err != nil { - return nil, err - } - - return &KeyPair{PrivateKey: seckey, PublicKey: pubkey}, nil -} - -func NewKeyPairFromValue(val *ethutil.Value) *KeyPair { - keyPair := &KeyPair{PrivateKey: val.Get(0).Bytes(), PublicKey: val.Get(1).Bytes()} - - return keyPair -} - -func (k *KeyPair) Address() []byte { - return ethutil.Sha3Bin(k.PublicKey[1:])[12:] -} - -func (k *KeyPair) Account() *StateObject { - if k.account == nil { - k.account = k.state.GetAccount(k.Address()) - } - - return k.account -} - -// Create transaction, creates a new and signed transaction, ready for processing -func (k *KeyPair) CreateTx(receiver []byte, value *big.Int, data []string) *Transaction { - /* TODO - tx := NewTransaction(receiver, value, data) - tx.Nonce = k.account.Nonce - - // Sign the transaction with the private key in this key chain - tx.Sign(k.PrivateKey) - - return tx - */ - return nil -} - -func (k *KeyPair) RlpEncode() []byte { - return ethutil.EmptyValue().Append(k.PrivateKey).Append(k.PublicKey).Encode() -} - -type KeyRing struct { - keys []*KeyPair -} - -func (k *KeyRing) Add(pair *KeyPair) { - k.keys = append(k.keys, pair) -} - -// The public "singleton" keyring -var keyRing *KeyRing - -func GetKeyRing(state *State) *KeyRing { - if keyRing == nil { - keyRing = &KeyRing{} - - data, _ := ethutil.Config.Db.Get([]byte("KeyRing")) - it := ethutil.NewValueFromBytes(data).NewIterator() - for it.Next() { - v := it.Value() - keyRing.Add(NewKeyPairFromValue(v)) - } - } - - return keyRing -} diff --git a/ethdb/database.go b/ethdb/database.go index 3dbff36de..09e9d8c7d 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -54,11 +54,13 @@ func (db *LDBDatabase) LastKnownTD() []byte { return data } +/* func (db *LDBDatabase) GetKeys() []*ethutil.Key { data, _ := db.Get([]byte("KeyRing")) return []*ethutil.Key{ethutil.NewKeyFromBytes(data)} } +*/ func (db *LDBDatabase) Close() { // Close the leveldb database diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go index b0fa64ed7..1e9d2899a 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -26,11 +26,13 @@ func (db *MemDatabase) Get(key []byte) ([]byte, error) { return db.db[string(key)], nil } +/* func (db *MemDatabase) GetKeys() []*ethutil.Key { data, _ := db.Get([]byte("KeyRing")) return []*ethutil.Key{ethutil.NewKeyFromBytes(data)} } +*/ func (db *MemDatabase) Delete(key []byte) error { delete(db.db, string(key)) diff --git a/ethpub/pub.go b/ethpub/pub.go index 4d1536368..daacb9d78 100644 --- a/ethpub/pub.go +++ b/ethpub/pub.go @@ -39,10 +39,7 @@ func (lib *PEthereum) GetBlock(hexHash string) *PBlock { } func (lib *PEthereum) GetKey() *PKey { - keyPair, err := ethchain.NewKeyPairFromSec(ethutil.Config.Db.GetKeys()[0].PrivateKey) - if err != nil { - return nil - } + keyPair := ethutil.GetKeyRing().Get(0) return NewPKey(keyPair) } @@ -90,7 +87,7 @@ func (lib *PEthereum) IsContract(address string) bool { } func (lib *PEthereum) SecretToAddress(key string) string { - pair, err := ethchain.NewKeyPairFromSec(ethutil.FromHex(key)) + pair, err := ethutil.NewKeyPairFromSec(ethutil.FromHex(key)) if err != nil { return "" } @@ -115,12 +112,12 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, in hash = ethutil.FromHex(recipient) } - var keyPair *ethchain.KeyPair + var keyPair *ethutil.KeyPair var err error if key[0:2] == "0x" { - keyPair, err = ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key[0:2]))) + keyPair, err = ethutil.NewKeyPairFromSec([]byte(ethutil.FromHex(key[0:2]))) } else { - keyPair, err = ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key))) + keyPair, err = ethutil.NewKeyPairFromSec([]byte(ethutil.FromHex(key))) } if err != nil { diff --git a/ethpub/types.go b/ethpub/types.go index 7f25e48a6..c902afc56 100644 --- a/ethpub/types.go +++ b/ethpub/types.go @@ -39,7 +39,7 @@ type PKey struct { PublicKey string `json:"publicKey"` } -func NewPKey(key *ethchain.KeyPair) *PKey { +func NewPKey(key *ethutil.KeyPair) *PKey { return &PKey{ethutil.Hex(key.Address()), ethutil.Hex(key.PrivateKey), ethutil.Hex(key.PublicKey)} } diff --git a/ethutil/db.go b/ethutil/db.go index abbf4a2b0..e02a80fca 100644 --- a/ethutil/db.go +++ b/ethutil/db.go @@ -4,7 +4,7 @@ package ethutil type Database interface { Put(key []byte, value []byte) Get(key []byte) ([]byte, error) - GetKeys() []*Key + //GetKeys() []*Key Delete(key []byte) error LastKnownTD() []byte Close() diff --git a/ethutil/key.go b/ethutil/key.go deleted file mode 100644 index ec195f213..000000000 --- a/ethutil/key.go +++ /dev/null @@ -1,19 +0,0 @@ -package ethutil - -type Key struct { - PrivateKey []byte - PublicKey []byte -} - -func NewKeyFromBytes(data []byte) *Key { - val := NewValueFromBytes(data) - return &Key{val.Get(0).Bytes(), val.Get(1).Bytes()} -} - -func (k *Key) Address() []byte { - return Sha3Bin(k.PublicKey[1:])[12:] -} - -func (k *Key) RlpEncode() []byte { - return EmptyValue().Append(k.PrivateKey).Append(k.PublicKey).Encode() -} diff --git a/ethutil/keypair.go b/ethutil/keypair.go new file mode 100644 index 000000000..cf5882e2c --- /dev/null +++ b/ethutil/keypair.go @@ -0,0 +1,109 @@ +package ethutil + +import ( + "github.com/obscuren/secp256k1-go" +) + +type KeyPair struct { + PrivateKey []byte + PublicKey []byte + + // The associated account + account *StateObject +} + +func NewKeyPairFromSec(seckey []byte) (*KeyPair, error) { + pubkey, err := secp256k1.GeneratePubKey(seckey) + if err != nil { + return nil, err + } + + return &KeyPair{PrivateKey: seckey, PublicKey: pubkey}, nil +} + +func NewKeyPairFromValue(val *Value) *KeyPair { + v, _ := NewKeyPairFromSec(val.Bytes()) + + return v +} + +func (k *KeyPair) Address() []byte { + return Sha3Bin(k.PublicKey[1:])[12:] +} + +func (k *KeyPair) RlpEncode() []byte { + return k.RlpValue().Encode() +} + +func (k *KeyPair) RlpValue() *Value { + return NewValue(k.PrivateKey) +} + +type KeyRing struct { + keys []*KeyPair +} + +func (k *KeyRing) Add(pair *KeyPair) { + k.keys = append(k.keys, pair) +} + +func (k *KeyRing) Get(i int) *KeyPair { + if len(k.keys) > i { + return k.keys[i] + } + + return nil +} + +func (k *KeyRing) Len() int { + return len(k.keys) +} + +func (k *KeyRing) NewKeyPair(sec []byte) (*KeyPair, error) { + keyPair, err := NewKeyPairFromSec(sec) + if err != nil { + return nil, err + } + + k.Add(keyPair) + Config.Db.Put([]byte("KeyRing"), k.RlpValue().Encode()) + + return keyPair, nil +} + +func (k *KeyRing) Reset() { + Config.Db.Put([]byte("KeyRing"), nil) + k.keys = nil +} + +func (k *KeyRing) RlpValue() *Value { + v := EmptyValue() + for _, keyPair := range k.keys { + v.Append(keyPair.RlpValue()) + } + + return v +} + +// The public "singleton" keyring +var keyRing *KeyRing + +func GetKeyRing() *KeyRing { + if keyRing == nil { + keyRing = &KeyRing{} + + data, _ := Config.Db.Get([]byte("KeyRing")) + it := NewValueFromBytes(data).NewIterator() + for it.Next() { + v := it.Value() + + key, err := NewKeyPairFromSec(v.Bytes()) + if err != nil { + panic(err) + } + keyRing.Add(key) + } + } + + return keyRing +} diff --git a/peer.go b/peer.go index 70759f246..433ce161f 100644 --- a/peer.go +++ b/peer.go @@ -581,8 +581,8 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) { p.port = uint16(c.Get(4).Uint()) // Self connect detection - key := ethutil.Config.Db.GetKeys()[0] - if bytes.Compare(key.PublicKey, p.pubkey) == 0 { + keyPair := ethutil.GetKeyRing().Get(0) + if bytes.Compare(keyPair.PublicKey, p.pubkey) == 0 { p.Stop() return From 3ac74b1e7840720e8ae426c751328ed7595188a8 Mon Sep 17 00:00:00 2001 From: Maran Date: Wed, 14 May 2014 13:57:04 +0200 Subject: [PATCH 05/10] Implemented IsUpToDate to mark the node as ready to start mining --- ethereum.go | 12 ++++++++++++ peer.go | 2 ++ 2 files changed, 14 insertions(+) diff --git a/ethereum.go b/ethereum.go index 94e338c56..83a74f302 100644 --- a/ethereum.go +++ b/ethereum.go @@ -138,6 +138,18 @@ func (s *Ethereum) IsMining() bool { func (s *Ethereum) PeerCount() int { return s.peers.Len() } +func (s *Ethereum) IsUpToDate() bool { + upToDate := true + eachPeer(s.peers, func(peer *Peer, e *list.Element) { + if atomic.LoadInt32(&peer.connected) == 1 { + if peer.catchingUp == true { + upToDate = false + } + } + }) + return upToDate +} + func (s *Ethereum) IsListening() bool { return s.listening } diff --git a/peer.go b/peer.go index 70759f246..0f968d664 100644 --- a/peer.go +++ b/peer.go @@ -389,6 +389,8 @@ func (p *Peer) HandleInbound() { p.CatchupWithPeer(p.ethereum.BlockChain().CurrentBlock.Hash()) } } + + p.catchingUp = false case ethwire.MsgTxTy: // If the message was a transaction queue the transaction // in the TxPool where it will undergo validation and From 98a631b5563b8a87c3fc83f14256087251926a61 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 May 2014 16:29:34 +0200 Subject: [PATCH 06/10] Remove any invalid transactions after block processing --- ethchain/state_manager.go | 2 ++ ethchain/transaction_pool.go | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go index f830f2022..57d56469b 100644 --- a/ethchain/state_manager.go +++ b/ethchain/state_manager.go @@ -199,6 +199,8 @@ func (sm *StateManager) ProcessBlock(block *Block, dontReact bool) error { } sm.Ethereum.Broadcast(ethwire.MsgBlockTy, []interface{}{block.Value().Val}) + + sm.Ethereum.TxPool().RemoveInvalid(sm.procState) } else { fmt.Println("total diff failed") } diff --git a/ethchain/transaction_pool.go b/ethchain/transaction_pool.go index 56deae0c6..6c0282dc6 100644 --- a/ethchain/transaction_pool.go +++ b/ethchain/transaction_pool.go @@ -210,9 +210,9 @@ func (pool *TxPool) CurrentTransactions() []*Transaction { txList := make([]*Transaction, pool.pool.Len()) i := 0 for e := pool.pool.Front(); e != nil; e = e.Next() { - if tx, ok := e.Value.(*Transaction); ok { - txList[i] = tx - } + tx := e.Value.(*Transaction) + + txList[i] = tx i++ } @@ -220,6 +220,17 @@ func (pool *TxPool) CurrentTransactions() []*Transaction { return txList } +func (pool *TxPool) RemoveInvalid(state *State) { + for e := pool.pool.Front(); e != nil; e = e.Next() { + tx := e.Value.(*Transaction) + sender := state.GetAccount(tx.Sender()) + err := pool.ValidateTransaction(tx) + if err != nil || sender.Nonce != tx.Nonce { + pool.pool.Remove(e) + } + } +} + func (pool *TxPool) Flush() []*Transaction { txList := pool.CurrentTransactions() From 166853aed94484b327a89a2554312f6739fce8a9 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 May 2014 20:35:23 +0200 Subject: [PATCH 07/10] Test --- peer.go | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/peer.go b/peer.go index 29f98a4fb..a509178d2 100644 --- a/peer.go +++ b/peer.go @@ -299,28 +299,6 @@ func (p *Peer) HandleInbound() { var block, lastBlock *ethchain.Block var err error - // 1. Compare the first block over the wire's prev-hash with the hash of your last block - // 2. If these two values are the same you can just link the chains together. - // [1:0,2:1,3:2] <- Current blocks (format block:previous_block) - // [1:0,2:1,3:2,4:3,5:4] <- incoming blocks - // == [1,2,3,4,5] - // 3. If the values are not the same we will have to go back and calculate the chain with the highest total difficulty - // [1:0,2:1,3:2,11:3,12:11,13:12] - // [1:0,2:1,3:2,4:3,5:4,6:5] - - // [3:2,11:3,12:11,13:12] - // [3:2,4:3,5:4,6:5] - // Heb ik dit blok? - // Nee: heb ik een blok met PrevHash 3? - // Ja: DIVERSION - // Nee; Adding to chain - - // See if we can find a common ancestor - // 1. Get the earliest block in the package. - // 2. Do we have this block? - // 3. Yes: Let's continue what we are doing - // 4. No: Let's request more blocks back. - // Make sure we are actually receiving anything if msg.Data.Len()-1 > 1 && p.catchingUp { // We requested blocks and now we need to make sure we have a common ancestor somewhere in these blocks so we can find @@ -342,8 +320,9 @@ func (p *Peer) HandleInbound() { if !p.ethereum.StateManager().BlockChain().HasBlock(block.Hash()) { // We don't have this block, but we do have a block with the same prevHash, diversion time! if p.ethereum.StateManager().BlockChain().HasBlockWithPrevHash(block.PrevHash) { - //ethutil.Config.Log.Infof("[PEER] Local and foreign chain have diverted after %x, finding best chain!\n", block.PrevHash) if p.ethereum.StateManager().BlockChain().FindCanonicalChainFromMsg(msg, block.PrevHash) { + p.catchingUp = false + return } } @@ -375,7 +354,8 @@ func (p *Peer) HandleInbound() { p.catchingUp = false p.CatchupWithPeer(p.ethereum.BlockChain().CurrentBlock.Hash()) } else if ethchain.IsValidationErr(err) { - // TODO + fmt.Println(err) + p.catchingUp = false } } else { // XXX Do we want to catch up if there were errors? @@ -385,12 +365,20 @@ func (p *Peer) HandleInbound() { blockInfo := lastBlock.BlockInfo() ethutil.Config.Log.Infof("Synced to block height #%d %x %x\n", blockInfo.Number, lastBlock.Hash(), blockInfo.Hash) } + p.catchingUp = false - p.CatchupWithPeer(p.ethereum.BlockChain().CurrentBlock.Hash()) + + hash := p.ethereum.BlockChain().CurrentBlock.Hash() + p.CatchupWithPeer(hash) } } - p.catchingUp = false + if lastBlock != nil && err == nil { + fmt.Println("Did proc. no err") + } else { + fmt.Println("other") + } + fmt.Println("length of chain", msg.Data.Len()) case ethwire.MsgTxTy: // If the message was a transaction queue the transaction // in the TxPool where it will undergo validation and @@ -453,7 +441,10 @@ func (p *Peer) HandleInbound() { if len(chain) > 0 { ethutil.Config.Log.Debugf("[PEER] Returning %d blocks: %x ", len(chain), parent.Hash()) p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, chain)) + } else { + p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, []interface{})) } + } else { ethutil.Config.Log.Debugf("[PEER] Could not find a similar block") // If no blocks are found we send back a reply with msg not in chain From a6b9ea05e8dc291f69f9384071864a475e7872e6 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 May 2014 20:36:21 +0200 Subject: [PATCH 08/10] Test --- peer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/peer.go b/peer.go index a509178d2..3e1e4a181 100644 --- a/peer.go +++ b/peer.go @@ -442,7 +442,7 @@ func (p *Peer) HandleInbound() { ethutil.Config.Log.Debugf("[PEER] Returning %d blocks: %x ", len(chain), parent.Hash()) p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, chain)) } else { - p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, []interface{})) + p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, []interface{}{})) } } else { From 65f570271cc6bf2ea73a7ba2bf83d92a1ba42986 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 May 2014 20:50:37 +0200 Subject: [PATCH 09/10] Fixed catching up --- peer.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/peer.go b/peer.go index 3e1e4a181..4093a4902 100644 --- a/peer.go +++ b/peer.go @@ -321,8 +321,6 @@ func (p *Peer) HandleInbound() { // We don't have this block, but we do have a block with the same prevHash, diversion time! if p.ethereum.StateManager().BlockChain().HasBlockWithPrevHash(block.PrevHash) { if p.ethereum.StateManager().BlockChain().FindCanonicalChainFromMsg(msg, block.PrevHash) { - p.catchingUp = false - return } } @@ -373,12 +371,11 @@ func (p *Peer) HandleInbound() { } } - if lastBlock != nil && err == nil { - fmt.Println("Did proc. no err") - } else { - fmt.Println("other") + if msg.Data.Len() == 0 { + // Set catching up to false if + // the peer has nothing left to give + p.catchingUp = false } - fmt.Println("length of chain", msg.Data.Len()) case ethwire.MsgTxTy: // If the message was a transaction queue the transaction // in the TxPool where it will undergo validation and From ad4ffdc9474aca48ab1d3d361797398f795a6d31 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 May 2014 21:34:13 +0200 Subject: [PATCH 10/10] Bumped version --- README.md | 2 +- ethutil/config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 72e187db7..2627bc85e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Ethereum Ethereum Go Development package (C) Jeffrey Wilcke Ethereum is currently in its testing phase. The current state is "Proof -of Concept 5.0 RC4". For build instructions see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)). +of Concept 5.0 RC6". 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 individual package for more information. diff --git a/ethutil/config.go b/ethutil/config.go index 07dc85f08..b4bd9158e 100644 --- a/ethutil/config.go +++ b/ethutil/config.go @@ -50,7 +50,7 @@ func ReadConfig(base string) *config { } } - Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC4"} + Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC6"} Config.Log = NewLogger(LogFile|LogStd, LogLevelDebug) Config.SetClientString("/Ethereum(G)") }