aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--ethchain/dagger.go25
-rw-r--r--ethchain/genesis.go2
-rw-r--r--ethminer/miner.go11
-rw-r--r--ethvm/stack.go12
-rw-r--r--ethvm/types.go132
-rw-r--r--ethvm/vm.go50
-rw-r--r--peer.go2
8 files changed, 207 insertions, 29 deletions
diff --git a/README.md b/README.md
index 3ed340612..ae624d84a 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 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
individual package for more information.
diff --git a/ethchain/dagger.go b/ethchain/dagger.go
index 917b3d722..478b7e877 100644
--- a/ethchain/dagger.go
+++ b/ethchain/dagger.go
@@ -1,15 +1,16 @@
package ethchain
import (
+ "hash"
+ "math/big"
+ "math/rand"
+ "time"
+
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethreact"
"github.com/ethereum/eth-go/ethutil"
"github.com/obscuren/sha3"
- "hash"
- "math/big"
- "math/rand"
- "time"
)
var powlogger = ethlog.NewLogger("POW")
@@ -18,23 +19,30 @@ type PoW interface {
Search(block *Block, reactChan chan ethreact.Event) []byte
Verify(hash []byte, diff *big.Int, nonce []byte) bool
GetHashrate() int64
+ Turbo(bool)
}
type EasyPow struct {
hash *big.Int
HashRate int64
+ turbo bool
}
func (pow *EasyPow) GetHashrate() int64 {
return pow.HashRate
}
+func (pow *EasyPow) Turbo(on bool) {
+ pow.turbo = on
+}
+
func (pow *EasyPow) Search(block *Block, reactChan chan ethreact.Event) []byte {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
hash := block.HashNoNonce()
diff := block.Difficulty
i := int64(0)
start := time.Now().UnixNano()
+ t := time.Now()
for {
select {
@@ -43,11 +51,14 @@ func (pow *EasyPow) Search(block *Block, reactChan chan ethreact.Event) []byte {
return nil
default:
i++
- if i%1234567 == 0 {
+
+ if time.Since(t) > (1 * time.Second) {
elapsed := time.Now().UnixNano() - start
hashes := ((float64(1e9) / float64(elapsed)) * float64(i)) / 1000
pow.HashRate = int64(hashes)
powlogger.Infoln("Hashing @", int64(pow.HashRate), "khash")
+
+ t = time.Now()
}
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
}
}
+
+ if !pow.turbo {
+ time.Sleep(20 * time.Microsecond)
+ }
}
return nil
diff --git a/ethchain/genesis.go b/ethchain/genesis.go
index 0ce53a6ee..8a1219acb 100644
--- a/ethchain/genesis.go
+++ b/ethchain/genesis.go
@@ -28,7 +28,7 @@ var GenesisHeader = []interface{}{
"",
// Difficulty
//ethutil.BigPow(2, 22),
- big.NewInt(4096),
+ big.NewInt(131072),
// Number
ethutil.Big0,
// Block minimum gas price
diff --git a/ethminer/miner.go b/ethminer/miner.go
index e51b37e05..799db79f1 100644
--- a/ethminer/miner.go
+++ b/ethminer/miner.go
@@ -2,11 +2,12 @@ package ethminer
import (
"bytes"
+ "sort"
+
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethreact"
"github.com/ethereum/eth-go/ethwire"
- "sort"
)
var logger = ethlog.NewLogger("MINER")
@@ -22,6 +23,8 @@ type Miner struct {
powChan chan []byte
powQuitChan chan ethreact.Event
quitChan chan chan error
+
+ turbo bool
}
func (self *Miner) GetPow() ethchain.PoW {
@@ -38,6 +41,12 @@ func NewDefaultMiner(coinbase []byte, ethereum ethchain.EthManager) *Miner {
return &miner
}
+func (self *Miner) ToggleTurbo() {
+ self.turbo = !self.turbo
+
+ self.pow.Turbo(self.turbo)
+}
+
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.powChan = make(chan []byte, 1) // This is the channel that receives valid sha hashes for a given block
diff --git a/ethvm/stack.go b/ethvm/stack.go
index f4b0be393..82dd612c2 100644
--- a/ethvm/stack.go
+++ b/ethvm/stack.go
@@ -64,6 +64,18 @@ func (st *Stack) Peekn() (*big.Int, *big.Int) {
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) {
st.data = append(st.data, new(big.Int).Set(d))
}
diff --git a/ethvm/types.go b/ethvm/types.go
index 1c3f66139..98fd8fba0 100644
--- a/ethvm/types.go
+++ b/ethvm/types.go
@@ -27,10 +27,12 @@ const (
NOT = 0x0f
// 0x10 range - bit ops
- AND = 0x10
- OR = 0x11
- XOR = 0x12
- BYTE = 0x13
+ AND = 0x10
+ OR = 0x11
+ XOR = 0x12
+ BYTE = 0x13
+ ADDMOD = 0x14
+ MULMOD = 0x15
// 0x20 range - crypto
SHA3 = 0x20
@@ -105,6 +107,40 @@ const (
PUSH31 = 0x7e
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
CREATE = 0xf0
CALL = 0xf1
@@ -136,10 +172,12 @@ var opCodeToString = map[OpCode]string{
NOT: "NOT",
// 0x10 range - bit ops
- AND: "AND",
- OR: "OR",
- XOR: "XOR",
- BYTE: "BYTE",
+ AND: "AND",
+ OR: "OR",
+ XOR: "XOR",
+ BYTE: "BYTE",
+ ADDMOD: "ADDMOD",
+ MULMOD: "MULMOD",
// 0x20 range - crypto
SHA3: "SHA3",
@@ -214,6 +252,40 @@ var opCodeToString = map[OpCode]string{
PUSH31: "PUSH31",
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
CREATE: "CREATE",
CALL: "CALL",
@@ -252,10 +324,12 @@ var OpCodes = map[string]byte{
"NOT": 0x0d,
// 0x10 range - bit ops
- "AND": 0x10,
- "OR": 0x11,
- "XOR": 0x12,
- "BYTE": 0x13,
+ "AND": 0x10,
+ "OR": 0x11,
+ "XOR": 0x12,
+ "BYTE": 0x13,
+ "ADDMOD": 0x14,
+ "MULMOD": 0x15,
// 0x20 range - crypto
"SHA3": 0x20,
@@ -326,6 +400,40 @@ var OpCodes = map[string]byte{
"PUSH31": 0x7e,
"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
"CREATE": 0xf0,
"CALL": 0xf1,
diff --git a/ethvm/vm.go b/ethvm/vm.go
index ddad0d366..29dc2515c 100644
--- a/ethvm/vm.go
+++ b/ethvm/vm.go
@@ -439,6 +439,36 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
} else {
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
case SHA3:
@@ -600,16 +630,20 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
case POP:
require(1)
stack.Pop()
- case DUP:
- require(1)
- stack.Push(stack.Peek())
+ case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
+ n := int(op - DUP1 + 1)
+ stack.Dupn(n)
+
+ 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(" => 0x%x", stack.Peek().Bytes())
+ self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes())
+ case DUP:
+ // NOP
case SWAP:
- require(2)
- x, y := stack.Popn()
- stack.Push(y)
- stack.Push(x)
+ // NOP
case MLOAD:
require(1)
offset := stack.Pop()
diff --git a/peer.go b/peer.go
index d841b2ad3..ab17466e1 100644
--- a/peer.go
+++ b/peer.go
@@ -24,7 +24,7 @@ const (
// The size of the output buffer for writing messages
outputBufferSize = 50
// Current protocol version
- ProtocolVersion = 27
+ ProtocolVersion = 28
// Interval for ping/pong message
pingPongTimer = 2 * time.Second
)