Merge branch 'develop'
This commit is contained in:
commit
6b7dfa1fb5
|
@ -1,7 +1,6 @@
|
||||||
package ethchain
|
package ethchain
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"github.com/ethereum/eth-go/ethdb"
|
"github.com/ethereum/eth-go/ethdb"
|
||||||
"github.com/ethereum/eth-go/ethutil"
|
"github.com/ethereum/eth-go/ethutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
|
@ -62,7 +62,7 @@ func TestRun4(t *testing.T) {
|
||||||
Diff: big.NewInt(256),
|
Diff: big.NewInt(256),
|
||||||
})
|
})
|
||||||
var ret []byte
|
var ret []byte
|
||||||
ret, e = callerClosure.Call(vm, nil, nil)
|
ret, _, e = callerClosure.Call(vm, nil, nil)
|
||||||
if e != nil {
|
if e != nil {
|
||||||
fmt.Println("error", e)
|
fmt.Println("error", e)
|
||||||
}
|
}
|
||||||
|
|
21
ethereum.go
21
ethereum.go
|
@ -165,6 +165,8 @@ func (s *Ethereum) AddPeer(conn net.Conn) {
|
||||||
ethutil.Config.Log.Debugf("[SERV] Max connected peers reached. Not adding incoming peer.")
|
ethutil.Config.Log.Debugf("[SERV] Max connected peers reached. Not adding incoming peer.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.reactor.Post("peerList", s.peers)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Ethereum) ProcessPeerList(addrs []string) {
|
func (s *Ethereum) ProcessPeerList(addrs []string) {
|
||||||
|
@ -236,6 +238,7 @@ func (s *Ethereum) ConnectToPeer(addr string) error {
|
||||||
s.peers.PushBack(peer)
|
s.peers.PushBack(peer)
|
||||||
|
|
||||||
ethutil.Config.Log.Infof("[SERV] Adding peer (%s) %d / %d\n", addr, s.peers.Len(), s.MaxPeers)
|
ethutil.Config.Log.Infof("[SERV] Adding peer (%s) %d / %d\n", addr, s.peers.Len(), s.MaxPeers)
|
||||||
|
s.reactor.Post("peerList", s.peers)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -303,12 +306,26 @@ func (s *Ethereum) Peers() *list.List {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Ethereum) reapPeers() {
|
func (s *Ethereum) reapPeers() {
|
||||||
|
eachPeer(s.peers, func(p *Peer, e *list.Element) {
|
||||||
|
if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) {
|
||||||
|
s.removePeerElement(e)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Ethereum) removePeerElement(e *list.Element) {
|
||||||
s.peerMut.Lock()
|
s.peerMut.Lock()
|
||||||
defer s.peerMut.Unlock()
|
defer s.peerMut.Unlock()
|
||||||
|
|
||||||
eachPeer(s.peers, func(p *Peer, e *list.Element) {
|
|
||||||
if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) {
|
|
||||||
s.peers.Remove(e)
|
s.peers.Remove(e)
|
||||||
|
|
||||||
|
s.reactor.Post("peerList", s.peers)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Ethereum) RemovePeer(p *Peer) {
|
||||||
|
eachPeer(s.peers, func(peer *Peer, e *list.Element) {
|
||||||
|
if peer == p {
|
||||||
|
s.removePeerElement(e)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ func NewDefaultMiner(coinbase []byte, ethereum ethchain.EthManager) Miner {
|
||||||
reactChan := make(chan ethutil.React, 1) // This is the channel that receives 'updates' when ever a new transaction or block comes in
|
reactChan := make(chan ethutil.React, 1) // This is the channel that receives 'updates' when ever a new transaction or block comes in
|
||||||
powChan := make(chan []byte, 1) // This is the channel that receives valid sha hases for a given block
|
powChan := make(chan []byte, 1) // This is the channel that receives valid sha hases for a given block
|
||||||
powQuitChan := make(chan ethutil.React, 1) // This is the channel that can exit the miner thread
|
powQuitChan := make(chan ethutil.React, 1) // This is the channel that can exit the miner thread
|
||||||
|
quitChan := make(chan bool, 1)
|
||||||
|
|
||||||
ethereum.Reactor().Subscribe("newBlock", reactChan)
|
ethereum.Reactor().Subscribe("newBlock", reactChan)
|
||||||
ethereum.Reactor().Subscribe("newTx:pre", reactChan)
|
ethereum.Reactor().Subscribe("newTx:pre", reactChan)
|
||||||
|
@ -44,7 +45,7 @@ func NewDefaultMiner(coinbase []byte, ethereum ethchain.EthManager) Miner {
|
||||||
reactChan: reactChan,
|
reactChan: reactChan,
|
||||||
powChan: powChan,
|
powChan: powChan,
|
||||||
powQuitChan: powQuitChan,
|
powQuitChan: powQuitChan,
|
||||||
quitChan: make(chan bool),
|
quitChan: quitChan,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert initial TXs in our little miner 'pool'
|
// Insert initial TXs in our little miner 'pool'
|
||||||
|
@ -148,7 +149,7 @@ func (self *Miner) mineNewBlock() {
|
||||||
// Find a valid nonce
|
// Find a valid nonce
|
||||||
self.block.Nonce = self.pow.Search(self.block, self.powQuitChan)
|
self.block.Nonce = self.pow.Search(self.block, self.powQuitChan)
|
||||||
if self.block.Nonce != nil {
|
if self.block.Nonce != nil {
|
||||||
err := self.ethereum.StateManager().Process(self.block, true)
|
err := self.ethereum.StateManager().Process(self.block, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ethutil.Config.Log.Infoln(err)
|
ethutil.Config.Log.Infoln(err)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"github.com/ethereum/eth-go/ethchain"
|
"github.com/ethereum/eth-go/ethchain"
|
||||||
"github.com/ethereum/eth-go/ethutil"
|
"github.com/ethereum/eth-go/ethutil"
|
||||||
|
"math/big"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -95,14 +96,30 @@ func (lib *PEthereum) Create(key, valueStr, gasStr, gasPriceStr, script string)
|
||||||
return lib.createTx(key, "", valueStr, gasStr, gasPriceStr, script)
|
return lib.createTx(key, "", valueStr, gasStr, gasPriceStr, script)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var namereg = ethutil.FromHex("bb5f186604d057c1c5240ca2ae0f6430138ac010")
|
||||||
|
|
||||||
|
func GetAddressFromNameReg(stateManager *ethchain.StateManager, name string) []byte {
|
||||||
|
recp := new(big.Int).SetBytes([]byte(name))
|
||||||
|
object := stateManager.CurrentState().GetStateObject(namereg)
|
||||||
|
reg := object.GetStorage(recp)
|
||||||
|
|
||||||
|
return reg.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, scriptStr string) (*PReceipt, error) {
|
func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, scriptStr string) (*PReceipt, error) {
|
||||||
var hash []byte
|
var hash []byte
|
||||||
var contractCreation bool
|
var contractCreation bool
|
||||||
if len(recipient) == 0 {
|
if len(recipient) == 0 {
|
||||||
contractCreation = true
|
contractCreation = true
|
||||||
|
} else {
|
||||||
|
// Check if an address is stored by this address
|
||||||
|
addr := GetAddressFromNameReg(lib.stateManager, recipient)
|
||||||
|
if len(addr) > 0 {
|
||||||
|
hash = addr
|
||||||
} else {
|
} else {
|
||||||
hash = ethutil.FromHex(recipient)
|
hash = ethutil.FromHex(recipient)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var keyPair *ethutil.KeyPair
|
var keyPair *ethutil.KeyPair
|
||||||
var err error
|
var err error
|
||||||
|
@ -122,29 +139,6 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, sc
|
||||||
var tx *ethchain.Transaction
|
var tx *ethchain.Transaction
|
||||||
// Compile and assemble the given data
|
// Compile and assemble the given data
|
||||||
if contractCreation {
|
if contractCreation {
|
||||||
/*
|
|
||||||
var initScript, mainScript []byte
|
|
||||||
var err error
|
|
||||||
if ethutil.IsHex(initStr) {
|
|
||||||
initScript = ethutil.FromHex(initStr[2:])
|
|
||||||
} else {
|
|
||||||
initScript, err = ethutil.Compile(initStr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ethutil.IsHex(scriptStr) {
|
|
||||||
mainScript = ethutil.FromHex(scriptStr[2:])
|
|
||||||
} else {
|
|
||||||
mainScript, err = ethutil.Compile(scriptStr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
script := ethchain.AppendScript(initScript, mainScript)
|
|
||||||
*/
|
|
||||||
var script []byte
|
var script []byte
|
||||||
var err error
|
var err error
|
||||||
if ethutil.IsHex(scriptStr) {
|
if ethutil.IsHex(scriptStr) {
|
||||||
|
|
|
@ -16,6 +16,7 @@ type PBlock struct {
|
||||||
Hash string `json:"hash"`
|
Hash string `json:"hash"`
|
||||||
Transactions string `json:"transactions"`
|
Transactions string `json:"transactions"`
|
||||||
Time int64 `json:"time"`
|
Time int64 `json:"time"`
|
||||||
|
Coinbase string `json:"coinbase"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a new QML Block from a chain block
|
// Creates a new QML Block from a chain block
|
||||||
|
@ -34,7 +35,7 @@ func NewPBlock(block *ethchain.Block) *PBlock {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return &PBlock{ref: block, Number: int(block.Number.Uint64()), Hash: ethutil.Hex(block.Hash()), Transactions: string(txJson), Time: block.Time}
|
return &PBlock{ref: block, Number: int(block.Number.Uint64()), Hash: ethutil.Hex(block.Hash()), Transactions: string(txJson), Time: block.Time, Coinbase: ethutil.Hex(block.Coinbase)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *PBlock) ToString() string {
|
func (self *PBlock) ToString() string {
|
||||||
|
|
|
@ -49,6 +49,10 @@ func BigD(data []byte) *big.Int {
|
||||||
func BigToBytes(num *big.Int, base int) []byte {
|
func BigToBytes(num *big.Int, base int) []byte {
|
||||||
ret := make([]byte, base/8)
|
ret := make([]byte, base/8)
|
||||||
|
|
||||||
|
if len(num.Bytes()) > base/8 {
|
||||||
|
return num.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
return append(ret[:len(ret)-len(num.Bytes())], num.Bytes()...)
|
return append(ret[:len(ret)-len(num.Bytes())], num.Bytes()...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,26 +22,54 @@ type config struct {
|
||||||
Identifier string
|
Identifier string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultConf = `
|
||||||
|
id = ""
|
||||||
|
port = 30303
|
||||||
|
upnp = true
|
||||||
|
maxpeer = 10
|
||||||
|
rpc = false
|
||||||
|
rpcport = 8080
|
||||||
|
`
|
||||||
|
|
||||||
var Config *config
|
var Config *config
|
||||||
|
|
||||||
|
func ApplicationFolder(base string) string {
|
||||||
|
usr, _ := user.Current()
|
||||||
|
p := path.Join(usr.HomeDir, base)
|
||||||
|
|
||||||
|
if len(base) > 0 {
|
||||||
|
//Check if the logging directory already exists, create it if not
|
||||||
|
_, err := os.Stat(p)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
log.Printf("Debug logging directory %s doesn't exist, creating it\n", p)
|
||||||
|
os.Mkdir(p, 0777)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iniFilePath := path.Join(p, "conf.ini")
|
||||||
|
_, err = os.Stat(iniFilePath)
|
||||||
|
if err != nil && os.IsNotExist(err) {
|
||||||
|
file, err := os.Create(iniFilePath)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
} else {
|
||||||
|
assetPath := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "ethereal", "assets")
|
||||||
|
file.Write([]byte(defaultConf + "\nasset_path = " + assetPath))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
// Read config
|
// Read config
|
||||||
//
|
//
|
||||||
// Initialize the global Config variable with default settings
|
// Initialize the global Config variable with default settings
|
||||||
func ReadConfig(base string, logTypes LoggerType, id string) *config {
|
func ReadConfig(base string, logTypes LoggerType, id string) *config {
|
||||||
if Config == nil {
|
if Config == nil {
|
||||||
usr, _ := user.Current()
|
path := ApplicationFolder(base)
|
||||||
path := path.Join(usr.HomeDir, base)
|
|
||||||
|
|
||||||
if len(base) > 0 {
|
|
||||||
//Check if the logging directory already exists, create it if not
|
|
||||||
_, err := os.Stat(path)
|
|
||||||
if err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
log.Printf("Debug logging directory %s doesn't exist, creating it\n", path)
|
|
||||||
os.Mkdir(path, 0777)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC11"}
|
Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC11"}
|
||||||
Config.Identifier = id
|
Config.Identifier = id
|
||||||
|
|
|
@ -176,7 +176,7 @@ func (val *Value) Get(idx int) *Value {
|
||||||
}
|
}
|
||||||
|
|
||||||
if idx < 0 {
|
if idx < 0 {
|
||||||
panic("negative idx for Value Get")
|
return NewValue(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
return NewValue(d[idx])
|
return NewValue(d[idx])
|
||||||
|
|
13
peer.go
13
peer.go
|
@ -2,7 +2,6 @@ package eth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"container/list"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/ethereum/eth-go/ethchain"
|
"github.com/ethereum/eth-go/ethchain"
|
||||||
"github.com/ethereum/eth-go/ethutil"
|
"github.com/ethereum/eth-go/ethutil"
|
||||||
|
@ -440,7 +439,7 @@ func (p *Peer) HandleInbound() {
|
||||||
ethutil.Config.Log.Debugf("[PEER] Found canonical block, returning chain from: %x ", parent.Hash())
|
ethutil.Config.Log.Debugf("[PEER] Found canonical block, returning chain from: %x ", parent.Hash())
|
||||||
chain := p.ethereum.BlockChain().GetChainFromHash(parent.Hash(), amountOfBlocks)
|
chain := p.ethereum.BlockChain().GetChainFromHash(parent.Hash(), amountOfBlocks)
|
||||||
if len(chain) > 0 {
|
if len(chain) > 0 {
|
||||||
ethutil.Config.Log.Debugf("[PEER] Returning %d blocks: %x ", len(chain), parent.Hash())
|
//ethutil.Config.Log.Debugf("[PEER] Returning %d blocks: %x ", len(chain), parent.Hash())
|
||||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, chain))
|
p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, chain))
|
||||||
} else {
|
} else {
|
||||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, []interface{}{}))
|
p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, []interface{}{}))
|
||||||
|
@ -450,10 +449,12 @@ func (p *Peer) HandleInbound() {
|
||||||
//ethutil.Config.Log.Debugf("[PEER] Could not find a similar block")
|
//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
|
// If no blocks are found we send back a reply with msg not in chain
|
||||||
// and the last hash from get chain
|
// and the last hash from get chain
|
||||||
|
if l > 0 {
|
||||||
lastHash := msg.Data.Get(l - 1)
|
lastHash := msg.Data.Get(l - 1)
|
||||||
//log.Printf("Sending not in chain with hash %x\n", lastHash.AsRaw())
|
//log.Printf("Sending not in chain with hash %x\n", lastHash.AsRaw())
|
||||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgNotInChainTy, []interface{}{lastHash.Raw()}))
|
p.QueueMessage(ethwire.NewMessage(ethwire.MsgNotInChainTy, []interface{}{lastHash.Raw()}))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
case ethwire.MsgNotInChainTy:
|
case ethwire.MsgNotInChainTy:
|
||||||
ethutil.Config.Log.Debugf("Not in chain: %x\n", msg.Data.Get(0).Bytes())
|
ethutil.Config.Log.Debugf("Not in chain: %x\n", msg.Data.Get(0).Bytes())
|
||||||
if p.diverted == true {
|
if p.diverted == true {
|
||||||
|
@ -521,13 +522,7 @@ func (p *Peer) Stop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pre-emptively remove the peer; don't wait for reaping. We already know it's dead if we are here
|
// Pre-emptively remove the peer; don't wait for reaping. We already know it's dead if we are here
|
||||||
p.ethereum.peerMut.Lock()
|
p.ethereum.RemovePeer(p)
|
||||||
defer p.ethereum.peerMut.Unlock()
|
|
||||||
eachPeer(p.ethereum.peers, func(peer *Peer, e *list.Element) {
|
|
||||||
if peer == p {
|
|
||||||
p.ethereum.peers.Remove(e)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Peer) pushHandshake() error {
|
func (p *Peer) pushHandshake() error {
|
||||||
|
|
Loading…
Reference in New Issue