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
...
@@ -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 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
Ethereum Go is split up in several sub packages Please refer to each
individual package for more information.
individual package for more information.
...
...
ethchain/asm.go
View file @
95adac75
...
@@ -21,9 +21,9 @@ func Disassemble(script []byte) (asm []string) {
...
@@ -21,9 +21,9 @@ func Disassemble(script []byte) (asm []string) {
asm
=
append
(
asm
,
fmt
.
Sprintf
(
"%v"
,
op
))
asm
=
append
(
asm
,
fmt
.
Sprintf
(
"%v"
,
op
))
switch
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
)
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
]
data
:=
script
[
pc
.
Int64
()
:
pc
.
Int64
()
+
a
]
val
:=
ethutil
.
BigD
(
data
)
val
:=
ethutil
.
BigD
(
data
)
...
...
ethchain/closure.go
View file @
95adac75
...
@@ -22,8 +22,7 @@ type Closure struct {
...
@@ -22,8 +22,7 @@ type Closure struct {
Script
[]
byte
Script
[]
byte
State
*
State
State
*
State
Gas
*
big
.
Int
Gas
,
UsedGas
,
Price
*
big
.
Int
Price
*
big
.
Int
Args
[]
byte
Args
[]
byte
}
}
...
@@ -36,6 +35,7 @@ func NewClosure(callee, object *StateObject, script []byte, state *State, gas, p
...
@@ -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.
// and we don't want the transaction's values to change.
c
.
Gas
=
new
(
big
.
Int
)
.
Set
(
gas
)
c
.
Gas
=
new
(
big
.
Int
)
.
Set
(
gas
)
c
.
Price
=
new
(
big
.
Int
)
.
Set
(
price
)
c
.
Price
=
new
(
big
.
Int
)
.
Set
(
price
)
c
.
UsedGas
=
new
(
big
.
Int
)
return
c
return
c
}
}
...
@@ -74,10 +74,12 @@ func (c *Closure) Address() []byte {
...
@@ -74,10 +74,12 @@ func (c *Closure) Address() []byte {
type
DebugHook
func
(
step
int
,
op
OpCode
,
mem
*
Memory
,
stack
*
Stack
,
stateObject
*
StateObject
)
bool
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
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
{
func
(
c
*
Closure
)
Return
(
ret
[]
byte
)
[]
byte
{
...
@@ -93,10 +95,23 @@ func (c *Closure) Return(ret []byte) []byte {
...
@@ -93,10 +95,23 @@ func (c *Closure) Return(ret []byte) []byte {
return
ret
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
// Implement the Callee interface
func
(
c
*
Closure
)
ReturnGas
(
gas
,
price
*
big
.
Int
,
state
*
State
)
{
func
(
c
*
Closure
)
ReturnGas
(
gas
,
price
*
big
.
Int
,
state
*
State
)
{
// Return the gas to the closure
// Return the gas to the closure
c
.
Gas
.
Add
(
c
.
Gas
,
gas
)
c
.
Gas
.
Add
(
c
.
Gas
,
gas
)
c
.
UsedGas
.
Sub
(
c
.
UsedGas
,
gas
)
}
}
func
(
c
*
Closure
)
Object
()
*
StateObject
{
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
...
@@ -105,8 +105,11 @@ func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Tra
for
_
,
tx
:=
range
txs
{
for
_
,
tx
:=
range
txs
{
usedGas
,
err
:=
sm
.
ApplyTransaction
(
state
,
block
,
tx
)
usedGas
,
err
:=
sm
.
ApplyTransaction
(
state
,
block
,
tx
)
if
err
!=
nil
{
if
err
!=
nil
{
if
IsNonceErr
(
err
)
{
continue
}
ethutil
.
Config
.
Log
.
Infoln
(
err
)
ethutil
.
Config
.
Log
.
Infoln
(
err
)
continue
}
}
accumelative
:=
new
(
big
.
Int
)
.
Set
(
totalUsedGas
.
Add
(
totalUsedGas
,
usedGas
))
accumelative
:=
new
(
big
.
Int
)
.
Set
(
totalUsedGas
.
Add
(
totalUsedGas
,
usedGas
))
...
@@ -116,10 +119,10 @@ func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Tra
...
@@ -116,10 +119,10 @@ func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Tra
validTxs
=
append
(
validTxs
,
tx
)
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
Applies transactions to the given state and creates new
state objects where needed.
state objects where needed.
...
@@ -129,9 +132,17 @@ func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transac
...
@@ -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
assume there's a return value. The return value will be set to
the script section of the state object.
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
// 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
tx
.
CreatesContract
()
{
if
err
==
nil
{
if
err
==
nil
{
// Create a new state object and the transaction
// Create a new state object and the transaction
...
@@ -141,30 +152,32 @@ func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transac
...
@@ -141,30 +152,32 @@ func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transac
// Evaluate the initialization script
// Evaluate the initialization script
// and use the return value as the
// and use the return value as the
// script section for the state object.
// 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
{
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
contract
.
script
=
script
state
.
UpdateStateObject
(
contract
)
state
.
UpdateStateObject
(
contract
)
}
else
{
}
else
{
return
nil
,
fmt
.
Errorf
(
"[STATE] Unable to create contract"
)
err
=
fmt
.
Errorf
(
"[STATE] Unable to create contract"
)
}
}
}
else
{
}
else
{
return
nil
,
fmt
.
Errorf
(
"[STATE] contract creation tx:
"
,
err
)
err
=
fmt
.
Errorf
(
"[STATE] contract creation tx: %v
"
,
err
)
}
}
}
else
{
}
else
{
// Find the state object at the "recipient" address. If
// Find the state object at the "recipient" address. If
// there's an object attempt to run the script.
// there's an object attempt to run the script.
stateObject
:=
state
.
GetStateObject
(
tx
.
Recipient
)
stateObject
:=
state
.
GetStateObject
(
tx
.
Recipient
)
if
err
==
nil
&&
stateObject
!=
nil
&&
len
(
stateObject
.
Script
())
>
0
{
if
err
==
nil
&&
stateObject
!=
nil
&&
len
(
stateObject
.
Script
())
>
0
{
sm
.
EvalScript
(
state
,
stateObject
.
Script
(),
stateObject
,
tx
,
block
)
_
,
gas
,
err
=
sm
.
EvalScript
(
state
,
stateObject
.
Script
(),
stateObject
,
tx
,
block
)
}
else
if
err
!=
nil
{
addTotalGas
(
gas
)
return
nil
,
fmt
.
Errorf
(
"[STATE] process:"
,
err
)
}
}
}
}
return
totalGasUsed
,
nil
return
}
}
func
(
sm
*
StateManager
)
Process
(
block
*
Block
,
dontReact
bool
)
error
{
func
(
sm
*
StateManager
)
Process
(
block
*
Block
,
dontReact
bool
)
error
{
...
@@ -349,7 +362,7 @@ func (sm *StateManager) Stop() {
...
@@ -349,7 +362,7 @@ func (sm *StateManager) Stop() {
sm
.
bc
.
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
())
account
:=
state
.
GetAccount
(
tx
.
Sender
())
err
=
account
.
ConvertGas
(
tx
.
Gas
,
tx
.
GasPrice
)
err
=
account
.
ConvertGas
(
tx
.
Gas
,
tx
.
GasPrice
)
...
@@ -369,7 +382,7 @@ func (sm *StateManager) EvalScript(state *State, script []byte, object *StateObj
...
@@ -369,7 +382,7 @@ func (sm *StateManager) EvalScript(state *State, script []byte, object *StateObj
Value
:
tx
.
Value
,
Value
:
tx
.
Value
,
//Price: tx.GasPrice,
//Price: tx.GasPrice,
})
})
ret
,
err
=
closure
.
Call
(
vm
,
tx
.
Data
,
nil
)
ret
,
gas
,
err
=
closure
.
Call
(
vm
,
tx
.
Data
,
nil
)
// Update the account (refunds)
// Update the account (refunds)
state
.
UpdateStateObject
(
account
)
state
.
UpdateStateObject
(
account
)
...
...
ethchain/transaction.go
View file @
95adac75
...
@@ -147,22 +147,6 @@ func (tx *Transaction) RlpValueDecode(decoder *ethutil.Value) {
...
@@ -147,22 +147,6 @@ func (tx *Transaction) RlpValueDecode(decoder *ethutil.Value) {
if
len
(
tx
.
Recipient
)
==
0
{
if
len
(
tx
.
Recipient
)
==
0
{
tx
.
contractCreation
=
true
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
{
func
(
tx
*
Transaction
)
String
()
string
{
...
@@ -228,3 +212,15 @@ func (self *Receipt) String() string {
...
@@ -228,3 +212,15 @@ func (self *Receipt) String() string {
self
.
PostState
,
self
.
PostState
,
self
.
CumulativeGasUsed
)
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) {
...
@@ -91,28 +91,37 @@ func (pool *TxPool) addTransaction(tx *Transaction) {
// Process transaction validates the Tx and processes funds from the
// Process transaction validates the Tx and processes funds from the
// sender to the recipient.
// 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
()
{
defer
func
()
{
if
r
:=
recover
();
r
!=
nil
{
if
r
:=
recover
();
r
!=
nil
{
ethutil
.
Config
.
Log
.
Infoln
(
r
)
ethutil
.
Config
.
Log
.
Infoln
(
r
)
err
=
fmt
.
Errorf
(
"%v"
,
r
)
err
=
fmt
.
Errorf
(
"%v"
,
r
)
}
}
}()
}()
gas
=
new
(
big
.
Int
)
addGas
:=
func
(
g
*
big
.
Int
)
{
gas
.
Add
(
gas
,
g
)
}
// Get the sender
// Get the sender
sender
:=
state
.
GetAccount
(
tx
.
Sender
())
sender
:=
state
.
GetAccount
(
tx
.
Sender
())
if
sender
.
Nonce
!=
tx
.
Nonce
{
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
// Make sure there's enough in the sender's account. Having insufficient
// funds won't invalidate this transaction but simple ignores it.
// 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(TxFee, TxFeeRat))
totAmount
:=
new
(
big
.
Int
)
.
Add
(
tx
.
Value
,
new
(
big
.
Int
)
.
Mul
(
tx
.
Gas
,
tx
.
GasPrice
))
totAmount
:=
new
(
big
.
Int
)
.
Add
(
tx
.
Value
,
new
(
big
.
Int
)
.
Mul
(
tx
.
Gas
,
tx
.
GasPrice
))
if
sender
.
Amount
.
Cmp
(
totAmount
)
<
0
{
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
// Get the receiver
receiver
:=
state
.
GetAccount
(
tx
.
Recipient
)
receiver
:=
state
.
GetAccount
(
tx
.
Recipient
)
...
@@ -120,6 +129,7 @@ func (pool *TxPool) ProcessTransaction(tx *Transaction, state *State, toContract
...
@@ -120,6 +129,7 @@ func (pool *TxPool) ProcessTransaction(tx *Transaction, state *State, toContract
// Send Tx to self
// Send Tx to self
if
bytes
.
Compare
(
tx
.
Recipient
,
tx
.
Sender
())
==
0
{
if
bytes
.
Compare
(
tx
.
Recipient
,
tx
.
Sender
())
==
0
{
addGas
(
GasTx
)
// Subtract the fee
// Subtract the fee
sender
.
SubAmount
(
new
(
big
.
Int
)
.
Mul
(
GasTx
,
tx
.
GasPrice
))
sender
.
SubAmount
(
new
(
big
.
Int
)
.
Mul
(
GasTx
,
tx
.
GasPrice
))
}
else
{
}
else
{
...
@@ -225,7 +235,7 @@ func (pool *TxPool) RemoveInvalid(state *State) {
...
@@ -225,7 +235,7 @@ func (pool *TxPool) RemoveInvalid(state *State) {
tx
:=
e
.
Value
.
(
*
Transaction
)
tx
:=
e
.
Value
.
(
*
Transaction
)
sender
:=
state
.
GetAccount
(
tx
.
Sender
())
sender
:=
state
.
GetAccount
(
tx
.
Sender
())
err
:=
pool
.
ValidateTransaction
(
tx
)
err
:=
pool
.
ValidateTransaction
(
tx
)
if
err
!=
nil
||
sender
.
Nonce
!
=
tx
.
Nonce
{
if
err
!=
nil
||
sender
.
Nonce
>
=
tx
.
Nonce
{
pool
.
pool
.
Remove
(
e
)
pool
.
pool
.
Remove
(
e
)
}
}
}
}
...
...
ethchain/types.go
View file @
95adac75
...
@@ -5,206 +5,206 @@ type OpCode int
...
@@ -5,206 +5,206 @@ type OpCode int
// Op codes
// Op codes
const
(
const
(
// 0x0 range - arithmetic ops
// 0x0 range - arithmetic ops
o
STOP
=
0x00
STOP
=
0x00
o
ADD
=
0x01
ADD
=
0x01
o
MUL
=
0x02
MUL
=
0x02
o
SUB
=
0x03
SUB
=
0x03
o
DIV
=
0x04
DIV
=
0x04
o
SDIV
=
0x05
SDIV
=
0x05
o
MOD
=
0x06
MOD
=
0x06
o
SMOD
=
0x07
SMOD
=
0x07
o
EXP
=
0x08
EXP
=
0x08
o
NEG
=
0x09
NEG
=
0x09
o
LT
=
0x0a
LT
=
0x0a
o
GT
=
0x0b
GT
=
0x0b
o
EQ
=
0x0c
EQ
=
0x0c
o
NOT
=
0x0d
NOT
=
0x0d
// 0x10 range - bit ops
// 0x10 range - bit ops
o
AND
=
0x10
AND
=
0x10
o
OR
=
0x11
OR
=
0x11
o
XOR
=
0x12
XOR
=
0x12
o
BYTE
=
0x13
BYTE
=
0x13
// 0x20 range - crypto
// 0x20 range - crypto
o
SHA3
=
0x20
SHA3
=
0x20
// 0x30 range - closure state
// 0x30 range - closure state
o
ADDRESS
=
0x30
ADDRESS
=
0x30
o
BALANCE
=
0x31
BALANCE
=
0x31
o
ORIGIN
=
0x32
ORIGIN
=
0x32
o
CALLER
=
0x33
CALLER
=
0x33
o
CALLVALUE
=
0x34
CALLVALUE
=
0x34
o
CALLDATALOAD
=
0x35
CALLDATALOAD
=
0x35
o
CALLDATASIZE
=
0x36
CALLDATASIZE
=
0x36
o
GASPRICE
=
0x37
GASPRICE
=
0x37
// 0x40 range - block operations
// 0x40 range - block operations
o
PREVHASH
=
0x40
PREVHASH
=
0x40
o
COINBASE
=
0x41
COINBASE
=
0x41
o
TIMESTAMP
=
0x42
TIMESTAMP
=
0x42
o
NUMBER
=
0x43
NUMBER
=
0x43
o
DIFFICULTY
=
0x44
DIFFICULTY
=
0x44
o
GASLIMIT
=
0x45
GASLIMIT
=
0x45
// 0x50 range - 'storage' and execution
// 0x50 range - 'storage' and execution
o
POP
=
0x51
POP
=
0x51
o
DUP
=
0x52
DUP
=
0x52
o
SWAP
=
0x53
SWAP
=
0x53
o
MLOAD
=
0x54
MLOAD
=
0x54
o
MSTORE
=
0x55
MSTORE
=
0x55
o
MSTORE8
=
0x56
MSTORE8
=
0x56
o
SLOAD
=
0x57
SLOAD
=
0x57
o
SSTORE
=
0x58
SSTORE
=
0x58
o
JUMP
=
0x59
JUMP
=
0x59
o
JUMPI
=
0x5a
JUMPI
=
0x5a
o
PC
=
0x5b
PC
=
0x5b
o
MSIZE
=
0x5c
MSIZE
=
0x5c
// 0x60 range
// 0x60 range
o
PUSH1
=
0x60
PUSH1
=
0x60
o
PUSH2
=
0x61
PUSH2
=
0x61
o
PUSH3
=
0x62
PUSH3
=
0x62
o
PUSH4
=
0x63
PUSH4
=
0x63
o
PUSH5
=
0x64
PUSH5
=
0x64
o
PUSH6
=
0x65
PUSH6
=
0x65
o
PUSH7
=
0x66
PUSH7
=
0x66
o
PUSH8
=
0x67
PUSH8
=
0x67
o
PUSH9
=
0x68
PUSH9
=
0x68
o
PUSH10
=
0x69
PUSH10
=
0x69
o
PUSH11
=
0x6a
PUSH11
=
0x6a
o
PUSH12
=
0x6b
PUSH12
=
0x6b
o
PUSH13
=
0x6c
PUSH13
=
0x6c
o
PUSH14
=
0x6d
PUSH14
=
0x6d
o
PUSH15
=
0x6e
PUSH15
=
0x6e
o
PUSH16
=
0x6f
PUSH16
=
0x6f
o
PUSH17
=
0x70
PUSH17
=
0x70
o
PUSH18
=
0x71
PUSH18
=
0x71
o
PUSH19
=
0x72
PUSH19
=
0x72
o
PUSH20
=
0x73
PUSH20
=
0x73
o
PUSH21
=
0x74
PUSH21
=
0x74
o
PUSH22
=
0x75
PUSH22
=
0x75
o
PUSH23
=
0x76
PUSH23
=
0x76
o
PUSH24
=
0x77
PUSH24
=
0x77
o
PUSH25
=
0x78
PUSH25
=
0x78
o
PUSH26
=
0x79
PUSH26
=
0x79
o
PUSH27
=
0x7a
PUSH27
=
0x7a
o
PUSH28
=
0x7b
PUSH28
=
0x7b
o
PUSH29
=
0x7c
PUSH29
=
0x7c
o
PUSH30
=
0x7d
PUSH30
=
0x7d
o
PUSH31
=
0x7e
PUSH31
=
0x7e
o
PUSH32
=
0x7f
PUSH32
=
0x7f
// 0xf0 range - closures
// 0xf0 range - closures
o
CREATE
=
0xf0
CREATE
=
0xf0
o
CALL
=
0xf1
CALL
=
0xf1
o
RETURN
=
0xf2
RETURN
=
0xf2
// 0x70 range - other
// 0x70 range - other
o
LOG
=
0xfe
// XXX Unofficial
LOG
=
0xfe
// XXX Unofficial
o
SUICIDE
=
0xff
SUICIDE
=
0xff
)
)
// Since the opcodes aren't all in order we can't use a regular slice
// Since the opcodes aren't all in order we can't use a regular slice
var
opCodeToString
=
map
[
OpCode
]
string
{
var
opCodeToString
=
map
[
OpCode
]
string
{
// 0x0 range - arithmetic ops
// 0x0 range - arithmetic ops
o
STOP
:
"STOP"
,
STOP
:
"STOP"
,
o
ADD
:
"ADD"
,
ADD
:
"ADD"
,
o
MUL
:
"MUL"
,
MUL
:
"MUL"
,
o
SUB
:
"SUB"
,
SUB
:
"SUB"
,
o
DIV
:
"DIV"
,
DIV
:
"DIV"
,
o
SDIV
:
"SDIV"
,
SDIV
:
"SDIV"
,
o
MOD
:
"MOD"
,
MOD
:
"MOD"
,
o
SMOD
:
"SMOD"
,
SMOD
:
"SMOD"
,
o
EXP
:
"EXP"
,
EXP
:
"EXP"
,
o
NEG
:
"NEG"
,
NEG
:
"NEG"
,
o
LT
:
"LT"
,
LT
:
"LT"
,
o
GT
:
"GT"
,
GT
:
"GT"
,
o
EQ
:
"EQ"
,
EQ
:
"EQ"
,
o
NOT
:
"NOT"
,
NOT
:
"NOT"
,
// 0x10 range - bit ops
// 0x10 range - bit ops
o
AND
:
"AND"
,
AND
:
"AND"
,
o
OR
:
"OR"
,
OR
:
"OR"
,
o
XOR
:
"XOR"
,
XOR
:
"XOR"
,
o
BYTE
:
"BYTE"
,
BYTE
:
"BYTE"
,
// 0x20 range - crypto
// 0x20 range - crypto
o
SHA3
:
"SHA3"
,
SHA3
:
"SHA3"
,
// 0x30 range - closure state
// 0x30 range - closure state
o
ADDRESS
:
"ADDRESS"
,
ADDRESS
:
"ADDRESS"
,
o
BALANCE
:
"BALANCE"
,
BALANCE
:
"BALANCE"
,
o
ORIGIN
:
"ORIGIN"
,
ORIGIN
:
"ORIGIN"
,
o
CALLER
:
"CALLER"
,
CALLER
:
"CALLER"
,
o
CALLVALUE
:
"CALLVALUE"
,
CALLVALUE
:
"CALLVALUE"
,
o
CALLDATALOAD
:
"CALLDATALOAD"
,
CALLDATALOAD
:
"CALLDATALOAD"
,
o
CALLDATASIZE
:
"CALLDATASIZE"
,
CALLDATASIZE
:
"CALLDATASIZE"
,
o
GASPRICE
:
"TXGASPRICE"
,
GASPRICE
:
"TXGASPRICE"
,
// 0x40 range - block operations
// 0x40 range - block operations
o
PREVHASH
:
"PREVHASH"
,
PREVHASH
:
"PREVHASH"
,
o
COINBASE
:
"COINBASE"
,
COINBASE
:
"COINBASE"
,
o
TIMESTAMP
:
"TIMESTAMP"
,
TIMESTAMP
:
"TIMESTAMP"
,
o
NUMBER
:
"NUMBER"
,
NUMBER
:
"NUMBER"
,
o
DIFFICULTY
:
"DIFFICULTY"
,
DIFFICULTY
:
"DIFFICULTY"
,
o
GASLIMIT
:
"GASLIMIT"
,
GASLIMIT
:
"GASLIMIT"
,
// 0x50 range - 'storage' and execution
// 0x50 range - 'storage' and execution
o
DUP
:
"DUP"
,
DUP
:
"DUP"
,
o
SWAP
:
"SWAP"
,
SWAP
:
"SWAP"
,
o
MLOAD
:
"MLOAD"
,
MLOAD
:
"MLOAD"
,
o
MSTORE
:
"MSTORE"
,
MSTORE
:
"MSTORE"
,
o
MSTORE8
:
"MSTORE8"
,
MSTORE8
:
"MSTORE8"
,
o
SLOAD
:
"SLOAD"
,
SLOAD
:
"SLOAD"
,
o
SSTORE
:
"SSTORE"
,
SSTORE
:
"SSTORE"
,
o
JUMP
:
"JUMP"
,
JUMP
:
"JUMP"
,
o
JUMPI
:
"JUMPI"
,
JUMPI
:
"JUMPI"
,
o
PC
:
"PC"
,
PC
:
"PC"
,
o
MSIZE
:
"MSIZE"
,
MSIZE
:
"MSIZE"
,
// 0x60 range - push
// 0x60 range - push
o
PUSH1
:
"PUSH1"
,
PUSH1
:
"PUSH1"
,
o
PUSH2
:
"PUSH2"
,
PUSH2
:
"PUSH2"
,
o
PUSH3
:
"PUSH3"
,
PUSH3
:
"PUSH3"
,
o
PUSH4
:
"PUSH4"
,
PUSH4
:
"PUSH4"
,
o
PUSH5
:
"PUSH5"
,
PUSH5
:
"PUSH5"
,
o
PUSH6
:
"PUSH6"
,
PUSH6
:
"PUSH6"
,
o
PUSH7
:
"PUSH7"
,
PUSH7
:
"PUSH7"
,
o
PUSH8
:
"PUSH8"
,
PUSH8
:
"PUSH8"
,
o
PUSH9
:
"PUSH9"
,
PUSH9
:
"PUSH9"
,
o
PUSH10
:
"PUSH10"
,
PUSH10
:
"PUSH10"
,
o
PUSH11
:
"PUSH11"
,
PUSH11
:
"PUSH11"
,
o
PUSH12
:
"PUSH12"
,
PUSH12
:
"PUSH12"
,
o
PUSH13
:
"PUSH13"
,
PUSH13
:
"PUSH13"
,
o
PUSH14
:
"PUSH14"
,
PUSH14
:
"PUSH14"
,
o
PUSH15
:
"PUSH15"
,
PUSH15
:
"PUSH15"
,
o
PUSH16
:
"PUSH16"
,
PUSH16
:
"PUSH16"
,
o
PUSH17
:
"PUSH17"
,
PUSH17
:
"PUSH17"
,
o
PUSH18
:
"PUSH18"
,
PUSH18
:
"PUSH18"
,
o
PUSH19
:
"PUSH19"
,
PUSH19
:
"PUSH19"
,
o
PUSH20
:
"PUSH20"
,
PUSH20
:
"PUSH20"
,
o
PUSH21
:
"PUSH21"
,
PUSH21
:
"PUSH21"
,
o
PUSH22
:
"PUSH22"
,
PUSH22
:
"PUSH22"
,
o
PUSH23
:
"PUSH23"
,
PUSH23
:
"PUSH23"
,
o
PUSH24
:
"PUSH24"
,
PUSH24
:
"PUSH24"
,
o
PUSH25
:
"PUSH25"
,
PUSH25
:
"PUSH25"
,
o
PUSH26
:
"PUSH26"
,
PUSH26
:
"PUSH26"
,
o
PUSH27
:
"PUSH27"
,
PUSH27
:
"PUSH27"
,
o
PUSH28
:
"PUSH28"
,
PUSH28
:
"PUSH28"
,
o
PUSH29
:
"PUSH29"
,
PUSH29
:
"PUSH29"
,
o
PUSH30
:
"PUSH30"
,
PUSH30
:
"PUSH30"
,
o
PUSH31
:
"PUSH31"
,
PUSH31
:
"PUSH31"
,
o
PUSH32
:
"PUSH32"
,
PUSH32
:
"PUSH32"
,
// 0xf0 range
// 0xf0 range
o
CREATE
:
"CREATE"
,
CREATE
:
"CREATE"
,
o
CALL
:
"CALL"
,
CALL
:
"CALL"
,
o
RETURN
:
"RETURN"
,
RETURN
:
"RETURN"
,
// 0x70 range - other
// 0x70 range - other
o
LOG
:
"LOG"
,
LOG
:
"LOG"
,
o
SUICIDE
:
"SUICIDE"
,
SUICIDE
:
"SUICIDE"
,
}
}
func
(
o
OpCode
)
String
()
string
{
func
(
o
OpCode
)
String
()
string
{
...
@@ -322,10 +322,3 @@ func IsOpCode(s string) bool {
...
@@ -322,10 +322,3 @@ func IsOpCode(s string) bool {
}
}
return
false
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 (
...
@@ -5,6 +5,7 @@ import (
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethwire"
"github.com/ethereum/eth-go/ethwire"
"sort"
)
)
type
Miner
struct
{
type
Miner
struct
{
...
@@ -12,7 +13,7 @@ type Miner struct {
...
@@ -12,7 +13,7 @@ type Miner struct {
ethereum
ethchain
.
EthManager
ethereum
ethchain
.
EthManager
coinbase
[]
byte
coinbase
[]
byte
reactChan
chan
ethutil
.
React
reactChan
chan
ethutil
.
React
txs
[]
*
ethchain
.
Transaction
txs
ethchain
.
Transactions
uncles
[]
*
ethchain
.
Block
uncles
[]
*
ethchain
.
Block
block
*
ethchain
.
Block
block
*
ethchain
.
Block
powChan
chan
[]
byte
powChan
chan
[]
byte
...
@@ -132,6 +133,8 @@ func (self *Miner) mineNewBlock() {
...
@@ -132,6 +133,8 @@ func (self *Miner) mineNewBlock() {
self
.
block
.
SetUncles
(
self
.
uncles
)
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
// Accumulate all valid transaction and apply them to the new state
receipts
,
txs
:=
stateManager
.
ApplyTransactions
(
self
.
block
.
State
(),
self
.
block
,
self
.
txs
)
receipts
,
txs
:=
stateManager
.
ApplyTransactions
(
self
.
block
.
State
(),
self
.
block
,
self
.
txs
)
self
.
txs
=
txs
self
.
txs
=
txs
...
...
ethpub/types.go
View file @
95adac75
...
@@ -57,25 +57,33 @@ func (self *PBlock) GetTransaction(hash string) *PTx {
...
@@ -57,25 +57,33 @@ func (self *PBlock) GetTransaction(hash string) *PTx {
type
PTx
struct
{
type
PTx
struct
{
ref
*
ethchain
.
Transaction
ref
*
ethchain
.
Transaction
Value
string
`json:"value"`
Value
string
`json:"value"`
Gas
string
`json:"gas"`
Gas
string
`json:"gas"`
GasPrice
string
`json:"gasPrice"`
GasPrice
string
`json:"gasPrice"`
Hash
string
`json:"hash"`
Hash
string
`json:"hash"`
Address
string
`json:"address"`
Address
string
`json:"address"`
Sender
string
`json:"sender"`
Sender
string
`json:"sender"`
Data
string
`json:"data"`
RawData
string
`json:"rawData"`
Contract
bool
`json:"isContract"`
Data
string
`json:"data"`
Contract
bool
`json:"isContract"`
CreatesContract
bool
`json:"createsContract"`
}
}
func
NewPTx
(
tx
*
ethchain
.
Transaction
)
*
PTx
{
func
NewPTx
(
tx
*
ethchain
.
Transaction
)
*
PTx
{
hash
:=
hex
.
EncodeToString
(
tx
.
Hash
())
hash
:=
hex
.
EncodeToString
(
tx
.
Hash
())
receiver
:=
hex
.
EncodeToString
(
tx
.
Recipient
)
receiver
:=
hex
.
EncodeToString
(
tx
.
Recipient
)
if
receiver
==
""
{
receiver
=
hex
.
EncodeToString
(
tx
.
CreationAddress
())
}
sender
:=
hex
.
EncodeToString
(
tx
.
Sender
())
sender
:=
hex
.
EncodeToString
(
tx
.
Sender
())
createsContract
:=
tx
.
CreatesContract
()
data
:=
strings
.
Join
(
ethchain
.
Disassemble
(
tx
.
Data
),
"
\n
"
)
data
:=
strings
.
Join
(
ethchain
.
Disassemble
(
tx
.
Data
),
"
\n
"
)
isContract
:=
len
(
tx
.
Data
)
>
0
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
{
func
(
self
*
PTx
)
ToString
()
string
{
...
...
ethutil/bytes.go
View file @
95adac75
...
@@ -88,3 +88,13 @@ func IsHex(str string) bool {
...
@@ -88,3 +88,13 @@ func IsHex(str string) bool {
l
:=
len
(
str
)
l
:=
len
(
str
)
return
l
>=
4
&&
l
%
2
==
0
&&
str
[
0
:
2
]
==
"0x"
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 {
...
@@ -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
.
Identifier
=
id
Config
.
Log
=
NewLogger
(
logTypes
,
LogLevelDebug
)
Config
.
Log
=
NewLogger
(
logTypes
,
LogLevelDebug
)
Config
.
SetClientString
(
"/Ethereum(G)"
)
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