Merge branch 'release/0.6.4'

This commit is contained in:
obscuren 2014-08-21 20:23:33 +02:00
commit fb90ecc8bc
8 changed files with 207 additions and 29 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 0.6.3". For build instructions see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)). of Concept 0.6.4". 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

@ -1,15 +1,16 @@
package ethchain package ethchain
import ( import (
"hash"
"math/big"
"math/rand"
"time"
"github.com/ethereum/eth-go/ethcrypto" "github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethreact"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/obscuren/sha3" "github.com/obscuren/sha3"
"hash"
"math/big"
"math/rand"
"time"
) )
var powlogger = ethlog.NewLogger("POW") var powlogger = ethlog.NewLogger("POW")
@ -18,23 +19,30 @@ type PoW interface {
Search(block *Block, reactChan chan ethreact.Event) []byte Search(block *Block, reactChan chan ethreact.Event) []byte
Verify(hash []byte, diff *big.Int, nonce []byte) bool Verify(hash []byte, diff *big.Int, nonce []byte) bool
GetHashrate() int64 GetHashrate() int64
Turbo(bool)
} }
type EasyPow struct { type EasyPow struct {
hash *big.Int hash *big.Int
HashRate int64 HashRate int64
turbo bool
} }
func (pow *EasyPow) GetHashrate() int64 { func (pow *EasyPow) GetHashrate() int64 {
return pow.HashRate return pow.HashRate
} }
func (pow *EasyPow) Turbo(on bool) {
pow.turbo = on
}
func (pow *EasyPow) Search(block *Block, reactChan chan ethreact.Event) []byte { func (pow *EasyPow) Search(block *Block, reactChan chan ethreact.Event) []byte {
r := rand.New(rand.NewSource(time.Now().UnixNano())) r := rand.New(rand.NewSource(time.Now().UnixNano()))
hash := block.HashNoNonce() hash := block.HashNoNonce()
diff := block.Difficulty diff := block.Difficulty
i := int64(0) i := int64(0)
start := time.Now().UnixNano() start := time.Now().UnixNano()
t := time.Now()
for { for {
select { select {
@ -43,11 +51,14 @@ func (pow *EasyPow) Search(block *Block, reactChan chan ethreact.Event) []byte {
return nil return nil
default: default:
i++ i++
if i%1234567 == 0 {
if time.Since(t) > (1 * time.Second) {
elapsed := time.Now().UnixNano() - start elapsed := time.Now().UnixNano() - start
hashes := ((float64(1e9) / float64(elapsed)) * float64(i)) / 1000 hashes := ((float64(1e9) / float64(elapsed)) * float64(i)) / 1000
pow.HashRate = int64(hashes) pow.HashRate = int64(hashes)
powlogger.Infoln("Hashing @", int64(pow.HashRate), "khash") powlogger.Infoln("Hashing @", int64(pow.HashRate), "khash")
t = time.Now()
} }
sha := ethcrypto.Sha3Bin(big.NewInt(r.Int63()).Bytes()) sha := ethcrypto.Sha3Bin(big.NewInt(r.Int63()).Bytes())
@ -55,6 +66,10 @@ func (pow *EasyPow) Search(block *Block, reactChan chan ethreact.Event) []byte {
return sha return sha
} }
} }
if !pow.turbo {
time.Sleep(20 * time.Microsecond)
}
} }
return nil return nil

View File

@ -28,7 +28,7 @@ var GenesisHeader = []interface{}{
"", "",
// Difficulty // Difficulty
//ethutil.BigPow(2, 22), //ethutil.BigPow(2, 22),
big.NewInt(4096), big.NewInt(131072),
// Number // Number
ethutil.Big0, ethutil.Big0,
// Block minimum gas price // Block minimum gas price

View File

@ -2,11 +2,12 @@ package ethminer
import ( import (
"bytes" "bytes"
"sort"
"github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethreact"
"github.com/ethereum/eth-go/ethwire" "github.com/ethereum/eth-go/ethwire"
"sort"
) )
var logger = ethlog.NewLogger("MINER") var logger = ethlog.NewLogger("MINER")
@ -22,6 +23,8 @@ type Miner struct {
powChan chan []byte powChan chan []byte
powQuitChan chan ethreact.Event powQuitChan chan ethreact.Event
quitChan chan chan error quitChan chan chan error
turbo bool
} }
func (self *Miner) GetPow() ethchain.PoW { func (self *Miner) GetPow() ethchain.PoW {
@ -38,6 +41,12 @@ func NewDefaultMiner(coinbase []byte, ethereum ethchain.EthManager) *Miner {
return &miner return &miner
} }
func (self *Miner) ToggleTurbo() {
self.turbo = !self.turbo
self.pow.Turbo(self.turbo)
}
func (miner *Miner) Start() { func (miner *Miner) Start() {
miner.reactChan = make(chan ethreact.Event, 1) // This is the channel that receives 'updates' when ever a new transaction or block comes in miner.reactChan = make(chan ethreact.Event, 1) // This is the channel that receives 'updates' when ever a new transaction or block comes in
miner.powChan = make(chan []byte, 1) // This is the channel that receives valid sha hashes for a given block miner.powChan = make(chan []byte, 1) // This is the channel that receives valid sha hashes for a given block

View File

@ -64,6 +64,18 @@ func (st *Stack) Peekn() (*big.Int, *big.Int) {
return ints[0], ints[1] return ints[0], ints[1]
} }
func (st *Stack) Swapn(n int) (*big.Int, *big.Int) {
st.data[n], st.data[0] = st.data[0], st.data[n]
return st.data[n], st.data[0]
}
func (st *Stack) Dupn(n int) *big.Int {
st.Push(st.data[n])
return st.Peek()
}
func (st *Stack) Push(d *big.Int) { func (st *Stack) Push(d *big.Int) {
st.data = append(st.data, new(big.Int).Set(d)) st.data = append(st.data, new(big.Int).Set(d))
} }

View File

@ -31,6 +31,8 @@ const (
OR = 0x11 OR = 0x11
XOR = 0x12 XOR = 0x12
BYTE = 0x13 BYTE = 0x13
ADDMOD = 0x14
MULMOD = 0x15
// 0x20 range - crypto // 0x20 range - crypto
SHA3 = 0x20 SHA3 = 0x20
@ -105,6 +107,40 @@ const (
PUSH31 = 0x7e PUSH31 = 0x7e
PUSH32 = 0x7f PUSH32 = 0x7f
DUP1 = 0x80
DUP2 = 0x81
DUP3 = 0x82
DUP4 = 0x83
DUP5 = 0x84
DUP6 = 0x85
DUP7 = 0x86
DUP8 = 0x87
DUP9 = 0x88
DUP10 = 0x89
DUP11 = 0x8a
DUP12 = 0x8b
DUP13 = 0x8c
DUP14 = 0x8d
DUP15 = 0x8e
DUP16 = 0x8f
SWAP1 = 0x90
SWAP2 = 0x91
SWAP3 = 0x92
SWAP4 = 0x93
SWAP5 = 0x94
SWAP6 = 0x95
SWAP7 = 0x96
SWAP8 = 0x97
SWAP9 = 0x98
SWAP10 = 0x99
SWAP11 = 0x9a
SWAP12 = 0x9b
SWAP13 = 0x9c
SWAP14 = 0x9d
SWAP15 = 0x9e
SWAP16 = 0x9f
// 0xf0 range - closures // 0xf0 range - closures
CREATE = 0xf0 CREATE = 0xf0
CALL = 0xf1 CALL = 0xf1
@ -140,6 +176,8 @@ var opCodeToString = map[OpCode]string{
OR: "OR", OR: "OR",
XOR: "XOR", XOR: "XOR",
BYTE: "BYTE", BYTE: "BYTE",
ADDMOD: "ADDMOD",
MULMOD: "MULMOD",
// 0x20 range - crypto // 0x20 range - crypto
SHA3: "SHA3", SHA3: "SHA3",
@ -214,6 +252,40 @@ var opCodeToString = map[OpCode]string{
PUSH31: "PUSH31", PUSH31: "PUSH31",
PUSH32: "PUSH32", PUSH32: "PUSH32",
DUP1: "DUP1",
DUP2: "DUP2",
DUP3: "DUP3",
DUP4: "DUP4",
DUP5: "DUP5",
DUP6: "DUP6",
DUP7: "DUP7",
DUP8: "DUP8",
DUP9: "DUP9",
DUP10: "DUP10",
DUP11: "DUP11",
DUP12: "DUP12",
DUP13: "DUP13",
DUP14: "DUP14",
DUP15: "DUP15",
DUP16: "DUP16",
SWAP1: "SWAP1",
SWAP2: "SWAP2",
SWAP3: "SWAP3",
SWAP4: "SWAP4",
SWAP5: "SWAP5",
SWAP6: "SWAP6",
SWAP7: "SWAP7",
SWAP8: "SWAP8",
SWAP9: "SWAP9",
SWAP10: "SWAP10",
SWAP11: "SWAP11",
SWAP12: "SWAP12",
SWAP13: "SWAP13",
SWAP14: "SWAP14",
SWAP15: "SWAP15",
SWAP16: "SWAP16",
// 0xf0 range // 0xf0 range
CREATE: "CREATE", CREATE: "CREATE",
CALL: "CALL", CALL: "CALL",
@ -256,6 +328,8 @@ var OpCodes = map[string]byte{
"OR": 0x11, "OR": 0x11,
"XOR": 0x12, "XOR": 0x12,
"BYTE": 0x13, "BYTE": 0x13,
"ADDMOD": 0x14,
"MULMOD": 0x15,
// 0x20 range - crypto // 0x20 range - crypto
"SHA3": 0x20, "SHA3": 0x20,
@ -326,6 +400,40 @@ var OpCodes = map[string]byte{
"PUSH31": 0x7e, "PUSH31": 0x7e,
"PUSH32": 0x7f, "PUSH32": 0x7f,
"DUP1": 0x80,
"DUP2": 0x81,
"DUP3": 0x82,
"DUP4": 0x83,
"DUP5": 0x84,
"DUP6": 0x85,
"DUP7": 0x86,
"DUP8": 0x87,
"DUP9": 0x88,
"DUP10": 0x89,
"DUP11": 0x8a,
"DUP12": 0x8b,
"DUP13": 0x8c,
"DUP14": 0x8d,
"DUP15": 0x8e,
"DUP16": 0x8f,
"SWAP1": 0x90,
"SWAP2": 0x91,
"SWAP3": 0x92,
"SWAP4": 0x93,
"SWAP5": 0x94,
"SWAP6": 0x95,
"SWAP7": 0x96,
"SWAP8": 0x97,
"SWAP9": 0x98,
"SWAP10": 0x99,
"SWAP11": 0x9a,
"SWAP12": 0x9b,
"SWAP13": 0x9c,
"SWAP14": 0x9d,
"SWAP15": 0x9e,
"SWAP16": 0x9f,
// 0xf0 range - closures // 0xf0 range - closures
"CREATE": 0xf0, "CREATE": 0xf0,
"CALL": 0xf1, "CALL": 0xf1,

View File

@ -439,6 +439,36 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
} else { } else {
stack.Push(ethutil.BigFalse) stack.Push(ethutil.BigFalse)
} }
case ADDMOD:
require(3)
x := stack.Pop()
y := stack.Pop()
z := stack.Pop()
base.Add(x, y)
base.Mod(base, z)
ensure256(base)
self.Printf(" = %v", base)
stack.Push(base)
case MULMOD:
require(3)
x := stack.Pop()
y := stack.Pop()
z := stack.Pop()
base.Mul(x, y)
base.Mod(base, z)
ensure256(base)
self.Printf(" = %v", base)
stack.Push(base)
// 0x20 range // 0x20 range
case SHA3: case SHA3:
@ -600,16 +630,20 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
case POP: case POP:
require(1) require(1)
stack.Pop() stack.Pop()
case DUP: case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
require(1) n := int(op - DUP1 + 1)
stack.Push(stack.Peek()) stack.Dupn(n)
self.Printf(" => 0x%x", stack.Peek().Bytes()) self.Printf(" => [%d] 0x%x", n, stack.Peek().Bytes())
case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16:
n := int(op - SWAP1 + 1)
x, y := stack.Swapn(n)
self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes())
case DUP:
// NOP
case SWAP: case SWAP:
require(2) // NOP
x, y := stack.Popn()
stack.Push(y)
stack.Push(x)
case MLOAD: case MLOAD:
require(1) require(1)
offset := stack.Pop() offset := stack.Pop()

View File

@ -24,7 +24,7 @@ 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 = 27 ProtocolVersion = 28
// Interval for ping/pong message // Interval for ping/pong message
pingPongTimer = 2 * time.Second pingPongTimer = 2 * time.Second
) )