Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
95adac75
Commit
95adac75
authored
May 28, 2014
by
Maran
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'release/poc5-rc11'
parents
818cbcbd
76a59274
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
354 additions
and
306 deletions
+354
-306
README.md
README.md
+1
-1
asm.go
ethchain/asm.go
+2
-2
closure.go
ethchain/closure.go
+19
-4
state_manager.go
ethchain/state_manager.go
+28
-15
transaction.go
ethchain/transaction.go
+12
-16
transaction_pool.go
ethchain/transaction_pool.go
+15
-5
types.go
ethchain/types.go
+163
-170
vm.go
ethchain/vm.go
+82
-82
miner.go
ethminer/miner.go
+4
-1
types.go
ethpub/types.go
+17
-9
bytes.go
ethutil/bytes.go
+10
-0
config.go
ethutil/config.go
+1
-1
No files found.
README.md
View file @
95adac75
...
...
@@ -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 RC
9
". For build instructions see the
[
Wiki
](
https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go
)
).
of Concept 5.0 RC
11
". 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.
...
...
ethchain/asm.go
View file @
95adac75
...
...
@@ -21,9 +21,9 @@ func Disassemble(script []byte) (asm []string) {
asm
=
append
(
asm
,
fmt
.
Sprintf
(
"%v"
,
op
))
switch
op
{
case
oPUSH1
,
oPUSH2
,
oPUSH3
,
oPUSH4
,
oPUSH5
,
oPUSH6
,
oPUSH7
,
oPUSH8
,
oPUSH9
,
oPUSH10
,
oPUSH11
,
oPUSH12
,
oPUSH13
,
oPUSH14
,
oPUSH15
,
oPUSH16
,
oPUSH17
,
oPUSH18
,
oPUSH19
,
oPUSH20
,
oPUSH21
,
oPUSH22
,
oPUSH23
,
oPUSH24
,
oPUSH25
,
oPUSH26
,
oPUSH27
,
oPUSH28
,
oPUSH29
,
oPUSH30
,
oPUSH31
,
o
PUSH32
:
case
PUSH1
,
PUSH2
,
PUSH3
,
PUSH4
,
PUSH5
,
PUSH6
,
PUSH7
,
PUSH8
,
PUSH9
,
PUSH10
,
PUSH11
,
PUSH12
,
PUSH13
,
PUSH14
,
PUSH15
,
PUSH16
,
PUSH17
,
PUSH18
,
PUSH19
,
PUSH20
,
PUSH21
,
PUSH22
,
PUSH23
,
PUSH24
,
PUSH25
,
PUSH26
,
PUSH27
,
PUSH28
,
PUSH29
,
PUSH30
,
PUSH31
,
PUSH32
:
pc
.
Add
(
pc
,
ethutil
.
Big1
)
a
:=
int64
(
op
)
-
int64
(
o
PUSH1
)
+
1
a
:=
int64
(
op
)
-
int64
(
PUSH1
)
+
1
data
:=
script
[
pc
.
Int64
()
:
pc
.
Int64
()
+
a
]
val
:=
ethutil
.
BigD
(
data
)
...
...
ethchain/closure.go
View file @
95adac75
...
...
@@ -22,8 +22,7 @@ type Closure struct {
Script
[]
byte
State
*
State
Gas
*
big
.
Int
Price
*
big
.
Int
Gas
,
UsedGas
,
Price
*
big
.
Int
Args
[]
byte
}
...
...
@@ -36,6 +35,7 @@ func NewClosure(callee, object *StateObject, script []byte, state *State, gas, p
// and we don't want the transaction's values to change.
c
.
Gas
=
new
(
big
.
Int
)
.
Set
(
gas
)
c
.
Price
=
new
(
big
.
Int
)
.
Set
(
price
)
c
.
UsedGas
=
new
(
big
.
Int
)
return
c
}
...
...
@@ -74,10 +74,12 @@ func (c *Closure) Address() []byte {
type
DebugHook
func
(
step
int
,
op
OpCode
,
mem
*
Memory
,
stack
*
Stack
,
stateObject
*
StateObject
)
bool
func
(
c
*
Closure
)
Call
(
vm
*
Vm
,
args
[]
byte
,
hook
DebugHook
)
([]
byte
,
error
)
{
func
(
c
*
Closure
)
Call
(
vm
*
Vm
,
args
[]
byte
,
hook
DebugHook
)
([]
byte
,
*
big
.
Int
,
error
)
{
c
.
Args
=
args
return
vm
.
RunClosure
(
c
,
hook
)
ret
,
err
:=
vm
.
RunClosure
(
c
,
hook
)
return
ret
,
c
.
UsedGas
,
err
}
func
(
c
*
Closure
)
Return
(
ret
[]
byte
)
[]
byte
{
...
...
@@ -93,10 +95,23 @@ func (c *Closure) Return(ret []byte) []byte {
return
ret
}
func
(
c
*
Closure
)
UseGas
(
gas
*
big
.
Int
)
bool
{
if
c
.
Gas
.
Cmp
(
gas
)
<
0
{
return
false
}
// Sub the amount of gas from the remaining
c
.
Gas
.
Sub
(
c
.
Gas
,
gas
)
c
.
UsedGas
.
Add
(
c
.
UsedGas
,
gas
)
return
true
}
// Implement the Callee interface
func
(
c
*
Closure
)
ReturnGas
(
gas
,
price
*
big
.
Int
,
state
*
State
)
{
// Return the gas to the closure
c
.
Gas
.
Add
(
c
.
Gas
,
gas
)
c
.
UsedGas
.
Sub
(
c
.
UsedGas
,
gas
)
}
func
(
c
*
Closure
)
Object
()
*
StateObject
{
...
...
ethchain/state_manager.go
View file @
95adac75
...
...
@@ -105,8 +105,11 @@ func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Tra
for
_
,
tx
:=
range
txs
{
usedGas
,
err
:=
sm
.
ApplyTransaction
(
state
,
block
,
tx
)
if
err
!=
nil
{
if
IsNonceErr
(
err
)
{
continue
}
ethutil
.
Config
.
Log
.
Infoln
(
err
)
continue
}
accumelative
:=
new
(
big
.
Int
)
.
Set
(
totalUsedGas
.
Add
(
totalUsedGas
,
usedGas
))
...
...
@@ -116,10 +119,10 @@ func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Tra
validTxs
=
append
(
validTxs
,
tx
)
}
return
receipts
,
t
xs
return
receipts
,
validT
xs
}
func
(
sm
*
StateManager
)
ApplyTransaction
(
state
*
State
,
block
*
Block
,
tx
*
Transaction
)
(
*
big
.
Int
,
error
)
{
func
(
sm
*
StateManager
)
ApplyTransaction
(
state
*
State
,
block
*
Block
,
tx
*
Transaction
)
(
totalGasUsed
*
big
.
Int
,
err
error
)
{
/*
Applies transactions to the given state and creates new
state objects where needed.
...
...
@@ -129,9 +132,17 @@ func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transac
assume there's a return value. The return value will be set to
the script section of the state object.
*/
totalGasUsed
:=
big
.
NewInt
(
0
)
var
(
addTotalGas
=
func
(
gas
*
big
.
Int
)
{
totalGasUsed
.
Add
(
totalGasUsed
,
gas
)
}
gas
=
new
(
big
.
Int
)
script
[]
byte
)
totalGasUsed
=
big
.
NewInt
(
0
)
// Apply the transaction to the current state
err
:=
sm
.
Ethereum
.
TxPool
()
.
ProcessTransaction
(
tx
,
state
,
false
)
gas
,
err
=
sm
.
Ethereum
.
TxPool
()
.
ProcessTransaction
(
tx
,
state
,
false
)
addTotalGas
(
gas
)
if
tx
.
CreatesContract
()
{
if
err
==
nil
{
// Create a new state object and the transaction
...
...
@@ -141,30 +152,32 @@ func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transac
// Evaluate the initialization script
// and use the return value as the
// script section for the state object.
script
,
err
:=
sm
.
EvalScript
(
state
,
contract
.
Init
(),
contract
,
tx
,
block
)
script
,
gas
,
err
=
sm
.
EvalScript
(
state
,
contract
.
Init
(),
contract
,
tx
,
block
)
addTotalGas
(
gas
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"[STATE] Error during init script run %v"
,
err
)
err
=
fmt
.
Errorf
(
"[STATE] Error during init script run %v"
,
err
)
return
}
contract
.
script
=
script
state
.
UpdateStateObject
(
contract
)
}
else
{
return
nil
,
fmt
.
Errorf
(
"[STATE] Unable to create contract"
)
err
=
fmt
.
Errorf
(
"[STATE] Unable to create contract"
)
}
}
else
{
return
nil
,
fmt
.
Errorf
(
"[STATE] contract creation tx:
"
,
err
)
err
=
fmt
.
Errorf
(
"[STATE] contract creation tx: %v
"
,
err
)
}
}
else
{
// Find the state object at the "recipient" address. If
// there's an object attempt to run the script.
stateObject
:=
state
.
GetStateObject
(
tx
.
Recipient
)
if
err
==
nil
&&
stateObject
!=
nil
&&
len
(
stateObject
.
Script
())
>
0
{
sm
.
EvalScript
(
state
,
stateObject
.
Script
(),
stateObject
,
tx
,
block
)
}
else
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"[STATE] process:"
,
err
)
_
,
gas
,
err
=
sm
.
EvalScript
(
state
,
stateObject
.
Script
(),
stateObject
,
tx
,
block
)
addTotalGas
(
gas
)
}
}
return
totalGasUsed
,
nil
return
}
func
(
sm
*
StateManager
)
Process
(
block
*
Block
,
dontReact
bool
)
error
{
...
...
@@ -349,7 +362,7 @@ func (sm *StateManager) Stop() {
sm
.
bc
.
Stop
()
}
func
(
sm
*
StateManager
)
EvalScript
(
state
*
State
,
script
[]
byte
,
object
*
StateObject
,
tx
*
Transaction
,
block
*
Block
)
(
ret
[]
byte
,
err
error
)
{
func
(
sm
*
StateManager
)
EvalScript
(
state
*
State
,
script
[]
byte
,
object
*
StateObject
,
tx
*
Transaction
,
block
*
Block
)
(
ret
[]
byte
,
gas
*
big
.
Int
,
err
error
)
{
account
:=
state
.
GetAccount
(
tx
.
Sender
())
err
=
account
.
ConvertGas
(
tx
.
Gas
,
tx
.
GasPrice
)
...
...
@@ -369,7 +382,7 @@ func (sm *StateManager) EvalScript(state *State, script []byte, object *StateObj
Value
:
tx
.
Value
,
//Price: tx.GasPrice,
})
ret
,
err
=
closure
.
Call
(
vm
,
tx
.
Data
,
nil
)
ret
,
gas
,
err
=
closure
.
Call
(
vm
,
tx
.
Data
,
nil
)
// Update the account (refunds)
state
.
UpdateStateObject
(
account
)
...
...
ethchain/transaction.go
View file @
95adac75
...
...
@@ -147,22 +147,6 @@ func (tx *Transaction) RlpValueDecode(decoder *ethutil.Value) {
if
len
(
tx
.
Recipient
)
==
0
{
tx
.
contractCreation
=
true
}
/*
// If the list is of length 10 it's a contract creation tx
if decoder.Len() == 10 {
tx.contractCreation = true
tx.Init = decoder.Get(6).Bytes()
tx.v = byte(decoder.Get(7).Uint())
tx.r = decoder.Get(8).Bytes()
tx.s = decoder.Get(9).Bytes()
} else {
tx.v = byte(decoder.Get(6).Uint())
tx.r = decoder.Get(7).Bytes()
tx.s = decoder.Get(8).Bytes()
}
*/
}
func
(
tx
*
Transaction
)
String
()
string
{
...
...
@@ -228,3 +212,15 @@ func (self *Receipt) String() string {
self
.
PostState
,
self
.
CumulativeGasUsed
)
}
// Transaction slice type for basic sorting
type
Transactions
[]
*
Transaction
func
(
s
Transactions
)
Len
()
int
{
return
len
(
s
)
}
func
(
s
Transactions
)
Swap
(
i
,
j
int
)
{
s
[
i
],
s
[
j
]
=
s
[
j
],
s
[
i
]
}
type
TxByNonce
struct
{
Transactions
}
func
(
s
TxByNonce
)
Less
(
i
,
j
int
)
bool
{
return
s
.
Transactions
[
i
]
.
Nonce
<
s
.
Transactions
[
j
]
.
Nonce
}
ethchain/transaction_pool.go
View file @
95adac75
...
...
@@ -91,28 +91,37 @@ func (pool *TxPool) addTransaction(tx *Transaction) {
// Process transaction validates the Tx and processes funds from the
// sender to the recipient.
func
(
pool
*
TxPool
)
ProcessTransaction
(
tx
*
Transaction
,
state
*
State
,
toContract
bool
)
(
err
error
)
{
func
(
pool
*
TxPool
)
ProcessTransaction
(
tx
*
Transaction
,
state
*
State
,
toContract
bool
)
(
gas
*
big
.
Int
,
err
error
)
{
defer
func
()
{
if
r
:=
recover
();
r
!=
nil
{
ethutil
.
Config
.
Log
.
Infoln
(
r
)
err
=
fmt
.
Errorf
(
"%v"
,
r
)
}
}()
gas
=
new
(
big
.
Int
)
addGas
:=
func
(
g
*
big
.
Int
)
{
gas
.
Add
(
gas
,
g
)
}
// Get the sender
sender
:=
state
.
GetAccount
(
tx
.
Sender
())
if
sender
.
Nonce
!=
tx
.
Nonce
{
return
fmt
.
Errorf
(
"[TXPL] Invalid account nonce, state nonce is %d transaction nonce is %d instead"
,
sender
.
Nonce
,
tx
.
Nonce
)
err
=
NonceError
(
tx
.
Nonce
,
sender
.
Nonce
)
return
}
txTotalBytes
:=
big
.
NewInt
(
int64
(
len
(
tx
.
Data
)))
txTotalBytes
.
Div
(
txTotalBytes
,
ethutil
.
Big32
)
addGas
(
new
(
big
.
Int
)
.
Mul
(
txTotalBytes
,
GasSStore
))
// Make sure there's enough in the sender's account. Having insufficient
// funds won't invalidate this transaction but simple ignores it.
//totAmount := new(big.Int).Add(tx.Value, new(big.Int).Mul(TxFee, TxFeeRat))
totAmount
:=
new
(
big
.
Int
)
.
Add
(
tx
.
Value
,
new
(
big
.
Int
)
.
Mul
(
tx
.
Gas
,
tx
.
GasPrice
))
if
sender
.
Amount
.
Cmp
(
totAmount
)
<
0
{
return
fmt
.
Errorf
(
"[TXPL] Insufficient amount in sender's (%x) account"
,
tx
.
Sender
())
err
=
fmt
.
Errorf
(
"[TXPL] Insufficient amount in sender's (%x) account"
,
tx
.
Sender
())
return
}
//fmt.Println(tx)
// Get the receiver
receiver
:=
state
.
GetAccount
(
tx
.
Recipient
)
...
...
@@ -120,6 +129,7 @@ func (pool *TxPool) ProcessTransaction(tx *Transaction, state *State, toContract
// Send Tx to self
if
bytes
.
Compare
(
tx
.
Recipient
,
tx
.
Sender
())
==
0
{
addGas
(
GasTx
)
// Subtract the fee
sender
.
SubAmount
(
new
(
big
.
Int
)
.
Mul
(
GasTx
,
tx
.
GasPrice
))
}
else
{
...
...
@@ -225,7 +235,7 @@ func (pool *TxPool) RemoveInvalid(state *State) {
tx
:=
e
.
Value
.
(
*
Transaction
)
sender
:=
state
.
GetAccount
(
tx
.
Sender
())
err
:=
pool
.
ValidateTransaction
(
tx
)
if
err
!=
nil
||
sender
.
Nonce
!
=
tx
.
Nonce
{
if
err
!=
nil
||
sender
.
Nonce
>
=
tx
.
Nonce
{
pool
.
pool
.
Remove
(
e
)
}
}
...
...
ethchain/types.go
View file @
95adac75
...
...
@@ -5,206 +5,206 @@ type OpCode int
// Op codes
const
(
// 0x0 range - arithmetic ops
o
STOP
=
0x00
o
ADD
=
0x01
o
MUL
=
0x02
o
SUB
=
0x03
o
DIV
=
0x04
o
SDIV
=
0x05
o
MOD
=
0x06
o
SMOD
=
0x07
o
EXP
=
0x08
o
NEG
=
0x09
o
LT
=
0x0a
o
GT
=
0x0b
o
EQ
=
0x0c
o
NOT
=
0x0d
STOP
=
0x00
ADD
=
0x01
MUL
=
0x02
SUB
=
0x03
DIV
=
0x04
SDIV
=
0x05
MOD
=
0x06
SMOD
=
0x07
EXP
=
0x08
NEG
=
0x09
LT
=
0x0a
GT
=
0x0b
EQ
=
0x0c
NOT
=
0x0d
// 0x10 range - bit ops
o
AND
=
0x10
o
OR
=
0x11
o
XOR
=
0x12
o
BYTE
=
0x13
AND
=
0x10
OR
=
0x11
XOR
=
0x12
BYTE
=
0x13
// 0x20 range - crypto
o
SHA3
=
0x20
SHA3
=
0x20
// 0x30 range - closure state
o
ADDRESS
=
0x30
o
BALANCE
=
0x31
o
ORIGIN
=
0x32
o
CALLER
=
0x33
o
CALLVALUE
=
0x34
o
CALLDATALOAD
=
0x35
o
CALLDATASIZE
=
0x36
o
GASPRICE
=
0x37
ADDRESS
=
0x30
BALANCE
=
0x31
ORIGIN
=
0x32
CALLER
=
0x33
CALLVALUE
=
0x34
CALLDATALOAD
=
0x35
CALLDATASIZE
=
0x36
GASPRICE
=
0x37
// 0x40 range - block operations
o
PREVHASH
=
0x40
o
COINBASE
=
0x41
o
TIMESTAMP
=
0x42
o
NUMBER
=
0x43
o
DIFFICULTY
=
0x44
o
GASLIMIT
=
0x45
PREVHASH
=
0x40
COINBASE
=
0x41
TIMESTAMP
=
0x42
NUMBER
=
0x43
DIFFICULTY
=
0x44
GASLIMIT
=
0x45
// 0x50 range - 'storage' and execution
o
POP
=
0x51
o
DUP
=
0x52
o
SWAP
=
0x53
o
MLOAD
=
0x54
o
MSTORE
=
0x55
o
MSTORE8
=
0x56
o
SLOAD
=
0x57
o
SSTORE
=
0x58
o
JUMP
=
0x59
o
JUMPI
=
0x5a
o
PC
=
0x5b
o
MSIZE
=
0x5c
POP
=
0x51
DUP
=
0x52
SWAP
=
0x53
MLOAD
=
0x54
MSTORE
=
0x55
MSTORE8
=
0x56
SLOAD
=
0x57
SSTORE
=
0x58
JUMP
=
0x59
JUMPI
=
0x5a
PC
=
0x5b
MSIZE
=
0x5c
// 0x60 range
o
PUSH1
=
0x60
o
PUSH2
=
0x61
o
PUSH3
=
0x62
o
PUSH4
=
0x63
o
PUSH5
=
0x64
o
PUSH6
=
0x65
o
PUSH7
=
0x66
o
PUSH8
=
0x67
o
PUSH9
=
0x68
o
PUSH10
=
0x69
o
PUSH11
=
0x6a
o
PUSH12
=
0x6b
o
PUSH13
=
0x6c
o
PUSH14
=
0x6d
o
PUSH15
=
0x6e
o
PUSH16
=
0x6f
o
PUSH17
=
0x70
o
PUSH18
=
0x71
o
PUSH19
=
0x72
o
PUSH20
=
0x73
o
PUSH21
=
0x74
o
PUSH22
=
0x75
o
PUSH23
=
0x76
o
PUSH24
=
0x77
o
PUSH25
=
0x78
o
PUSH26
=
0x79
o
PUSH27
=
0x7a
o
PUSH28
=
0x7b
o
PUSH29
=
0x7c
o
PUSH30
=
0x7d
o
PUSH31
=
0x7e
o
PUSH32
=
0x7f
PUSH1
=
0x60
PUSH2
=
0x61
PUSH3
=
0x62
PUSH4
=
0x63
PUSH5
=
0x64
PUSH6
=
0x65
PUSH7
=
0x66
PUSH8
=
0x67
PUSH9
=
0x68
PUSH10
=
0x69
PUSH11
=
0x6a
PUSH12
=
0x6b
PUSH13
=
0x6c
PUSH14
=
0x6d
PUSH15
=
0x6e
PUSH16
=
0x6f
PUSH17
=
0x70
PUSH18
=
0x71
PUSH19
=
0x72
PUSH20
=
0x73
PUSH21
=
0x74
PUSH22
=
0x75
PUSH23
=
0x76
PUSH24
=
0x77
PUSH25
=
0x78
PUSH26
=
0x79
PUSH27
=
0x7a
PUSH28
=
0x7b
PUSH29
=
0x7c
PUSH30
=
0x7d
PUSH31
=
0x7e
PUSH32
=
0x7f
// 0xf0 range - closures
o
CREATE
=
0xf0
o
CALL
=
0xf1
o
RETURN
=
0xf2
CREATE
=
0xf0
CALL
=
0xf1
RETURN
=
0xf2
// 0x70 range - other
o
LOG
=
0xfe
// XXX Unofficial
o
SUICIDE
=
0xff
LOG
=
0xfe
// XXX Unofficial
SUICIDE
=
0xff
)
// Since the opcodes aren't all in order we can't use a regular slice
var
opCodeToString
=
map
[
OpCode
]
string
{
// 0x0 range - arithmetic ops
o
STOP
:
"STOP"
,
o
ADD
:
"ADD"
,
o
MUL
:
"MUL"
,
o
SUB
:
"SUB"
,
o
DIV
:
"DIV"
,
o
SDIV
:
"SDIV"
,
o
MOD
:
"MOD"
,
o
SMOD
:
"SMOD"
,
o
EXP
:
"EXP"
,
o
NEG
:
"NEG"
,
o
LT
:
"LT"
,
o
GT
:
"GT"
,
o
EQ
:
"EQ"
,
o
NOT
:
"NOT"
,
STOP
:
"STOP"
,
ADD
:
"ADD"
,
MUL
:
"MUL"
,
SUB
:
"SUB"
,
DIV
:
"DIV"
,
SDIV
:
"SDIV"
,
MOD
:
"MOD"
,
SMOD
:
"SMOD"
,
EXP
:
"EXP"
,
NEG
:
"NEG"
,
LT
:
"LT"
,
GT
:
"GT"
,
EQ
:
"EQ"
,
NOT
:
"NOT"
,
// 0x10 range - bit ops
o
AND
:
"AND"
,
o
OR
:
"OR"
,
o
XOR
:
"XOR"
,
o
BYTE
:
"BYTE"
,
AND
:
"AND"
,
OR
:
"OR"
,
XOR
:
"XOR"
,
BYTE
:
"BYTE"
,
// 0x20 range - crypto
o
SHA3
:
"SHA3"
,
SHA3
:
"SHA3"
,
// 0x30 range - closure state
o
ADDRESS
:
"ADDRESS"
,
o
BALANCE
:
"BALANCE"
,
o
ORIGIN
:
"ORIGIN"
,
o
CALLER
:
"CALLER"
,
o
CALLVALUE
:
"CALLVALUE"
,
o
CALLDATALOAD
:
"CALLDATALOAD"
,
o
CALLDATASIZE
:
"CALLDATASIZE"
,
o
GASPRICE
:
"TXGASPRICE"
,
ADDRESS
:
"ADDRESS"
,
BALANCE
:
"BALANCE"
,
ORIGIN
:
"ORIGIN"
,
CALLER
:
"CALLER"
,
CALLVALUE
:
"CALLVALUE"
,
CALLDATALOAD
:
"CALLDATALOAD"
,
CALLDATASIZE
:
"CALLDATASIZE"
,
GASPRICE
:
"TXGASPRICE"
,
// 0x40 range - block operations
o
PREVHASH
:
"PREVHASH"
,
o
COINBASE
:
"COINBASE"
,
o
TIMESTAMP
:
"TIMESTAMP"
,
o
NUMBER
:
"NUMBER"
,
o
DIFFICULTY
:
"DIFFICULTY"
,
o
GASLIMIT
:
"GASLIMIT"
,
PREVHASH
:
"PREVHASH"
,
COINBASE
:
"COINBASE"
,
TIMESTAMP
:
"TIMESTAMP"
,
NUMBER
:
"NUMBER"
,
DIFFICULTY
:
"DIFFICULTY"
,
GASLIMIT
:
"GASLIMIT"
,
// 0x50 range - 'storage' and execution
o
DUP
:
"DUP"
,
o
SWAP
:
"SWAP"
,
o
MLOAD
:
"MLOAD"
,
o
MSTORE
:
"MSTORE"
,
o
MSTORE8
:
"MSTORE8"
,
o
SLOAD
:
"SLOAD"
,
o
SSTORE
:
"SSTORE"
,
o
JUMP
:
"JUMP"
,
o
JUMPI
:
"JUMPI"
,
o
PC
:
"PC"
,
o
MSIZE
:
"MSIZE"
,
DUP
:
"DUP"
,
SWAP
:
"SWAP"
,
MLOAD
:
"MLOAD"
,
MSTORE
:
"MSTORE"
,
MSTORE8
:
"MSTORE8"
,
SLOAD
:
"SLOAD"
,
SSTORE
:
"SSTORE"
,
JUMP
:
"JUMP"
,
JUMPI
:
"JUMPI"
,
PC
:
"PC"
,
MSIZE
:
"MSIZE"
,
// 0x60 range - push
o
PUSH1
:
"PUSH1"
,
o
PUSH2
:
"PUSH2"
,
o
PUSH3
:
"PUSH3"
,
o
PUSH4
:
"PUSH4"
,
o
PUSH5
:
"PUSH5"
,
o
PUSH6
:
"PUSH6"
,
o
PUSH7
:
"PUSH7"
,
o
PUSH8
:
"PUSH8"
,
o
PUSH9
:
"PUSH9"
,
o
PUSH10
:
"PUSH10"
,
o
PUSH11
:
"PUSH11"
,
o
PUSH12
:
"PUSH12"
,
o
PUSH13
:
"PUSH13"
,
o
PUSH14
:
"PUSH14"
,
o
PUSH15
:
"PUSH15"
,
o
PUSH16
:
"PUSH16"
,
o
PUSH17
:
"PUSH17"
,
o
PUSH18
:
"PUSH18"
,
o
PUSH19
:
"PUSH19"
,
o
PUSH20
:
"PUSH20"
,
o
PUSH21
:
"PUSH21"
,
o
PUSH22
:
"PUSH22"
,
o
PUSH23
:
"PUSH23"
,
o
PUSH24
:
"PUSH24"
,
o
PUSH25
:
"PUSH25"
,
o
PUSH26
:
"PUSH26"
,
o
PUSH27
:
"PUSH27"
,
o
PUSH28
:
"PUSH28"
,
o
PUSH29
:
"PUSH29"
,
o
PUSH30
:
"PUSH30"
,
o
PUSH31
:
"PUSH31"
,
o
PUSH32
:
"PUSH32"
,
PUSH1
:
"PUSH1"
,
PUSH2
:
"PUSH2"
,
PUSH3
:
"PUSH3"
,
PUSH4
:
"PUSH4"
,
PUSH5
:
"PUSH5"
,
PUSH6
:
"PUSH6"
,
PUSH7
:
"PUSH7"
,
PUSH8
:
"PUSH8"
,
PUSH9
:
"PUSH9"
,
PUSH10
:
"PUSH10"
,
PUSH11
:
"PUSH11"
,
PUSH12
:
"PUSH12"
,
PUSH13
:
"PUSH13"
,
PUSH14
:
"PUSH14"
,
PUSH15
:
"PUSH15"
,
PUSH16
:
"PUSH16"
,
PUSH17
:
"PUSH17"
,
PUSH18
:
"PUSH18"
,
PUSH19
:
"PUSH19"
,
PUSH20
:
"PUSH20"
,
PUSH21
:
"PUSH21"
,
PUSH22
:
"PUSH22"
,
PUSH23
:
"PUSH23"
,
PUSH24
:
"PUSH24"
,
PUSH25
:
"PUSH25"
,
PUSH26
:
"PUSH26"
,
PUSH27
:
"PUSH27"
,
PUSH28
:
"PUSH28"
,
PUSH29
:
"PUSH29"
,
PUSH30
:
"PUSH30"
,
PUSH31
:
"PUSH31"
,
PUSH32
:
"PUSH32"
,
// 0xf0 range
o
CREATE
:
"CREATE"
,
o
CALL
:
"CALL"
,
o
RETURN
:
"RETURN"
,
CREATE
:
"CREATE"
,
CALL
:
"CALL"
,
RETURN
:
"RETURN"
,
// 0x70 range - other
o
LOG
:
"LOG"
,
o
SUICIDE
:
"SUICIDE"
,
LOG
:
"LOG"
,
SUICIDE
:
"SUICIDE"
,
}
func
(
o
OpCode
)
String
()
string
{
...
...
@@ -322,10 +322,3 @@ func IsOpCode(s string) bool {
}
return
false
}
func
AppendScript
(
init
,
script
[]
byte
)
[]
byte
{
s
:=
append
(
init
,
byte
(
oRETURN
))
s
=
append
(
s
,
script
...
)
return
s
}
ethchain/vm.go
View file @
95adac75
This diff is collapsed.
Click to expand it.
ethminer/miner.go
View file @
95adac75
...
...
@@ -5,6 +5,7 @@ import (
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethwire"
"sort"
)
type
Miner
struct
{
...
...
@@ -12,7 +13,7 @@ type Miner struct {
ethereum
ethchain
.
EthManager
coinbase
[]
byte
reactChan
chan
ethutil
.
React
txs
[]
*
ethchain
.
Transaction
txs
ethchain
.
Transactions
uncles
[]
*
ethchain
.
Block
block
*
ethchain
.
Block
powChan
chan
[]
byte
...
...
@@ -132,6 +133,8 @@ func (self *Miner) mineNewBlock() {
self
.
block
.
SetUncles
(
self
.
uncles
)
}
// Sort the transactions by nonce in case of odd network propagation
sort
.
Sort
(
ethchain
.
TxByNonce
{
self
.
txs
})
// Accumulate all valid transaction and apply them to the new state
receipts
,
txs
:=
stateManager
.
ApplyTransactions
(
self
.
block
.
State
(),
self
.
block
,
self
.
txs
)
self
.
txs
=
txs
...
...
ethpub/types.go
View file @
95adac75
...
...
@@ -57,25 +57,33 @@ func (self *PBlock) GetTransaction(hash string) *PTx {
type
PTx
struct
{
ref
*
ethchain
.
Transaction
Value
string
`json:"value"`
Gas
string
`json:"gas"`
GasPrice
string
`json:"gasPrice"`
Hash
string
`json:"hash"`
Address
string
`json:"address"`
Sender
string
`json:"sender"`
Data
string
`json:"data"`
Contract
bool
`json:"isContract"`
Value
string
`json:"value"`
Gas
string
`json:"gas"`
GasPrice
string
`json:"gasPrice"`
Hash
string
`json:"hash"`
Address
string
`json:"address"`
Sender
string
`json:"sender"`
RawData
string
`json:"rawData"`
Data
string
`json:"data"`
Contract
bool
`json:"isContract"`
CreatesContract
bool
`json:"createsContract"`
}
func
NewPTx
(
tx
*
ethchain
.
Transaction
)
*
PTx
{
hash
:=
hex
.
EncodeToString
(
tx
.
Hash
())
receiver
:=
hex
.
EncodeToString
(
tx
.
Recipient
)
if
receiver
==
""
{
receiver
=
hex
.
EncodeToString
(
tx
.
CreationAddress
())
}
sender
:=
hex
.
EncodeToString
(
tx
.
Sender
())
createsContract
:=
tx
.
CreatesContract
()
data
:=
strings
.
Join
(
ethchain
.
Disassemble
(
tx
.
Data
),
"
\n
"
)
isContract
:=
len
(
tx
.
Data
)
>
0
return
&
PTx
{
ref
:
tx
,
Hash
:
hash
,
Value
:
ethutil
.
CurrencyToString
(
tx
.
Value
),
Address
:
receiver
,
Contract
:
isContract
,
Gas
:
tx
.
Gas
.
String
(),
GasPrice
:
tx
.
GasPrice
.
String
(),
Data
:
data
,
Sender
:
sender
}
return
&
PTx
{
ref
:
tx
,
Hash
:
hash
,
Value
:
ethutil
.
CurrencyToString
(
tx
.
Value
),
Address
:
receiver
,
Contract
:
isContract
,
Gas
:
tx
.
Gas
.
String
(),
GasPrice
:
tx
.
GasPrice
.
String
(),
Data
:
data
,
Sender
:
sender
,
CreatesContract
:
createsContract
,
RawData
:
hex
.
EncodeToString
(
tx
.
Data
)
}
}
func
(
self
*
PTx
)
ToString
()
string
{
...
...
ethutil/bytes.go
View file @
95adac75
...
...
@@ -88,3 +88,13 @@ func IsHex(str string) bool {
l
:=
len
(
str
)
return
l
>=
4
&&
l
%
2
==
0
&&
str
[
0
:
2
]
==
"0x"
}
func
StringToByteFunc
(
str
string
,
cb
func
(
str
string
)
[]
byte
)
(
ret
[]
byte
)
{
if
len
(
str
)
>
1
&&
str
[
0
:
2
]
==
"0x"
{
ret
=
FromHex
(
str
[
2
:
])
}
else
{
ret
=
cb
(
str
)
}
return
}
ethutil/config.go
View file @
95adac75
...
...
@@ -43,7 +43,7 @@ func ReadConfig(base string, logTypes LoggerType, id string) *config {
}
}
Config
=
&
config
{
ExecPath
:
path
,
Debug
:
true
,
Ver
:
"0.5.0 RC1
0
"
}
Config
=
&
config
{
ExecPath
:
path
,
Debug
:
true
,
Ver
:
"0.5.0 RC1
1
"
}
Config
.
Identifier
=
id
Config
.
Log
=
NewLogger
(
logTypes
,
LogLevelDebug
)
Config
.
SetClientString
(
"/Ethereum(G)"
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment