aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-06-12 17:19:32 +0800
committerobscuren <geffobscura@gmail.com>2014-06-12 17:19:32 +0800
commitb855e5f7df194c84651d7cc7ee32d307a2fa0a2e (patch)
treee4a87b6d81fb7c01963713cb1cc647d1327eca16
parent6593c6942454233f61d7d74f030a9075a84807cd (diff)
downloadgo-tangerine-b855e5f7df194c84651d7cc7ee32d307a2fa0a2e.tar.gz
go-tangerine-b855e5f7df194c84651d7cc7ee32d307a2fa0a2e.tar.zst
go-tangerine-b855e5f7df194c84651d7cc7ee32d307a2fa0a2e.zip
Changed opcode numbers and added missing opcodes
-rw-r--r--ethchain/state_manager.go8
-rw-r--r--ethchain/transaction.go4
-rw-r--r--ethchain/types.go45
-rw-r--r--ethchain/vm.go5
4 files changed, 43 insertions, 19 deletions
diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go
index 9631b55fe..7b44ba3b8 100644
--- a/ethchain/state_manager.go
+++ b/ethchain/state_manager.go
@@ -166,13 +166,9 @@ func (self *StateManager) ProcessTransaction(tx *Transaction, coinbase *StateObj
// Subtract the amount from the senders account
sender.SubAmount(totAmount)
- fmt.Printf("state root after sender update %x\n", state.Root())
-
// Add the amount to receivers account which should conclude this transaction
receiver.AddAmount(tx.Value)
state.UpdateStateObject(receiver)
-
- fmt.Printf("state root after receiver update %x\n", state.Root())
}
state.UpdateStateObject(sender)
@@ -215,6 +211,8 @@ func (sm *StateManager) ApplyTransactions(coinbase []byte, state *State, block *
validTxs = append(validTxs, tx)
}
+ fmt.Println("################# MADE\n", receipts, "\n############################")
+
// Update the total gas used for the block (to be mined)
block.GasUsed = totalUsedGas
@@ -250,6 +248,7 @@ func (sm *StateManager) ApplyTransaction(coinbase []byte, state *State, block *B
// as it's data provider.
contract := sm.MakeStateObject(state, tx)
if contract != nil {
+ fmt.Println(Disassemble(contract.Init()))
// Evaluate the initialization script
// and use the return value as the
// script section for the state object.
@@ -323,6 +322,7 @@ func (sm *StateManager) ProcessBlock(state *State, parent, block *Block, dontRea
if !sm.bc.HasBlock(block.PrevHash) && sm.bc.CurrentBlock != nil {
return ParentError(block.PrevHash)
}
+ fmt.Println(block.Receipts())
// Process the transactions on to current block
sm.ApplyTransactions(block.Coinbase, state, parent, block.Transactions())
diff --git a/ethchain/transaction.go b/ethchain/transaction.go
index 2cb946b3b..32dbd8388 100644
--- a/ethchain/transaction.go
+++ b/ethchain/transaction.go
@@ -1,6 +1,7 @@
package ethchain
import (
+ "bytes"
"fmt"
"github.com/ethereum/eth-go/ethutil"
"github.com/obscuren/secp256k1-go"
@@ -144,7 +145,8 @@ func (tx *Transaction) RlpValueDecode(decoder *ethutil.Value) {
tx.v = byte(decoder.Get(6).Uint())
tx.r = decoder.Get(7).Bytes()
tx.s = decoder.Get(8).Bytes()
- if len(tx.Recipient) == 0 {
+
+ if bytes.Compare(tx.Recipient, ContractAddr) == 0 {
tx.contractCreation = true
}
}
diff --git a/ethchain/types.go b/ethchain/types.go
index 293871143..fdfd5792b 100644
--- a/ethchain/types.go
+++ b/ethchain/types.go
@@ -1,5 +1,9 @@
package ethchain
+import (
+ "fmt"
+)
+
type OpCode int
// Op codes
@@ -37,7 +41,10 @@ const (
CALLVALUE = 0x34
CALLDATALOAD = 0x35
CALLDATASIZE = 0x36
- GASPRICE = 0x37
+ CALLDATACOPY = 0x37
+ CODESIZE = 0x38
+ CODECOPY = 0x39
+ GASPRICE = 0x3a
// 0x40 range - block operations
PREVHASH = 0x40
@@ -48,18 +55,19 @@ const (
GASLIMIT = 0x45
// 0x50 range - 'storage' and execution
- POP = 0x51
- DUP = 0x52
- SWAP = 0x53
- MLOAD = 0x54
- MSTORE = 0x55
- MSTORE8 = 0x56
- SLOAD = 0x57
- SSTORE = 0x58
- JUMP = 0x59
- JUMPI = 0x5a
- PC = 0x5b
- MSIZE = 0x5c
+ POP = 0x50
+ DUP = 0x51
+ SWAP = 0x52
+ MLOAD = 0x53
+ MSTORE = 0x54
+ MSTORE8 = 0x55
+ SLOAD = 0x56
+ SSTORE = 0x57
+ JUMP = 0x58
+ JUMPI = 0x59
+ PC = 0x5a
+ MSIZE = 0x5b
+ GAS = 0x5c
// 0x60 range
PUSH1 = 0x60
@@ -140,6 +148,9 @@ var opCodeToString = map[OpCode]string{
CALLVALUE: "CALLVALUE",
CALLDATALOAD: "CALLDATALOAD",
CALLDATASIZE: "CALLDATASIZE",
+ CALLDATACOPY: "CALLDATACOPY",
+ CODESIZE: "CODESIZE",
+ CODECOPY: "CODECOPY",
GASPRICE: "TXGASPRICE",
// 0x40 range - block operations
@@ -162,6 +173,7 @@ var opCodeToString = map[OpCode]string{
JUMPI: "JUMPI",
PC: "PC",
MSIZE: "MSIZE",
+ GAS: "GAS",
// 0x60 range - push
PUSH1: "PUSH1",
@@ -208,7 +220,12 @@ var opCodeToString = map[OpCode]string{
}
func (o OpCode) String() string {
- return opCodeToString[o]
+ str := opCodeToString[o]
+ if len(str) == 0 {
+ return fmt.Sprintf("Missing opcode 0x%x", int(o))
+ }
+
+ return str
}
// Op codes for assembling
diff --git a/ethchain/vm.go b/ethchain/vm.go
index 955be847f..ebdc58659 100644
--- a/ethchain/vm.go
+++ b/ethchain/vm.go
@@ -337,6 +337,9 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
stack.Push(ethutil.BigD(data))
case CALLDATASIZE:
stack.Push(big.NewInt(int64(len(closure.Args))))
+ case CALLDATACOPY:
+ case CODESIZE:
+ case CODECOPY:
case GASPRICE:
stack.Push(closure.Price)
@@ -423,6 +426,8 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
stack.Push(pc)
case MSIZE:
stack.Push(big.NewInt(int64(mem.Len())))
+ case GAS:
+ stack.Push(closure.Gas)
// 0x60 range
case CREATE:
require(3)