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
3f6baa45
Commit
3f6baa45
authored
10 years ago
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Documented methods & removed old manifest
parent
558c67d3
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
36 additions
and
131 deletions
+36
-131
coin.js
cmd/mist/assets/examples/coin.js
+1
-0
block_processor.go
core/block_processor.go
+14
-29
manifest.go
state/manifest.go
+0
-61
statedb.go
state/statedb.go
+21
-30
vm.go
vm/vm.go
+0
-11
No files found.
cmd/mist/assets/examples/coin.js
0 → 100644
View file @
3f6baa45
var
contract
=
web3
.
eth
.
contractFromAbi
([{
"constant"
:
false
,
"inputs"
:[{
"name"
:
"_h"
,
"type"
:
"hash256"
}],
"name"
:
"confirm"
,
"outputs"
:[],
"type"
:
"function"
},{
"constant"
:
false
,
"inputs"
:[{
"name"
:
_to
","
type
":"
address
"},{"
name
":"
_value
","
type
":"
uint256
"},{"
name
":"
_data
","
type
":"
bytes
"}],"
name
":"
execute
","
outputs
":[{"
name
":"
_r
","
type
":"
hash256
"}],"
type
":"
function
"},{"
constant
":false,"
inputs
":[{"
name
":"
_to
","
type
":"
address
"}],"
name
":"
kill
","
outputs
":[],"
type
":"
function
"},{"
constant
":false,"
inputs
":[{"
name
":"
_from
","
type
":"
address
"},{"
name
":"
_to
","
type
":"
address
"}],"
name
":"
changeOwner
","
outputs
":[],"
type
":"
function
"},{"
inputs
":[{"
indexed
":false,"
name
":"
value
","
type
":"
uint256
"}],"
name
":"
CashIn
","
type
":"
event
"},{"
inputs
":[{"
indexed
":true,"
name
":"
out
","
type
":"
string32
"},{"
indexed
":false,"
name
":"
owner
","
type
":"
address
"},{"
indexed
":false,"
name
":"
value
","
type
":"
uint256
"},{"
indexed
":false,"
name
":"
to
","
type
":"
address
"}],"
name
":"
SingleTransact
","
type
":"
event
"},{"
inputs
":[{"
indexed
":true,"
name
":"
out
","
type
":"
string32
"},{"
indexed
":false,"
name
":"
owner
","
type
":"
address
"},{"
indexed
":false,"
name
":"
operation
","
type
":"
hash256
"},{"
indexed
":false,"
name
":"
value
","
type
":"
uint256
"},{"
indexed
":false,"
name
":"
to
","
type
":"
address
"}],"
name
":"
MultiTransact
","
type
":"
event
"}]);
This diff is collapsed.
Click to expand it.
core/block_processor.go
View file @
3f6baa45
...
...
@@ -143,6 +143,9 @@ func (self *BlockProcessor) ApplyTransactions(coinbase *state.StateObject, state
return
receipts
,
handled
,
unhandled
,
erroneous
,
err
}
// Process block will attempt to process the given block's transactions and applies them
// on top of the block's parent state (given it exists) and will return wether it was
// successful or not.
func
(
sm
*
BlockProcessor
)
Process
(
block
*
types
.
Block
)
(
td
*
big
.
Int
,
err
error
)
{
// Processing a blocks may never happen simultaneously
sm
.
mutex
.
Lock
()
...
...
@@ -158,14 +161,14 @@ func (sm *BlockProcessor) Process(block *types.Block) (td *big.Int, err error) {
}
parent
:=
sm
.
bc
.
GetBlock
(
header
.
ParentHash
)
return
sm
.
P
rocessWithParent
(
block
,
parent
)
return
sm
.
p
rocessWithParent
(
block
,
parent
)
}
func
(
sm
*
BlockProcessor
)
P
rocessWithParent
(
block
,
parent
*
types
.
Block
)
(
td
*
big
.
Int
,
err
error
)
{
func
(
sm
*
BlockProcessor
)
p
rocessWithParent
(
block
,
parent
*
types
.
Block
)
(
td
*
big
.
Int
,
err
error
)
{
sm
.
lastAttemptedBlock
=
block
// Create a new state based on the parent's root (e.g., create copy)
state
:=
state
.
New
(
parent
.
Root
(),
sm
.
db
)
//state := state.New(parent.Trie().Copy())
// Block validation
if
err
=
sm
.
ValidateBlock
(
block
,
parent
);
err
!=
nil
{
...
...
@@ -179,18 +182,23 @@ func (sm *BlockProcessor) ProcessWithParent(block, parent *types.Block) (td *big
header
:=
block
.
Header
()
// Validate the received block's bloom with the one derived from the generated receipts.
// For valid blocks this should always validate to true.
rbloom
:=
types
.
CreateBloom
(
receipts
)
if
bytes
.
Compare
(
rbloom
,
header
.
Bloom
)
!=
0
{
err
=
fmt
.
Errorf
(
"unable to replicate block's bloom=%x"
,
rbloom
)
return
}
// The transactions Trie's root (R = (Tr [[H1, T1], [H2, T2], ... [Hn, Tn]]))
// can be used by light clients to make sure they've received the correct Txs
txSha
:=
types
.
DeriveSha
(
block
.
Transactions
())
if
bytes
.
Compare
(
txSha
,
header
.
TxHash
)
!=
0
{
err
=
fmt
.
Errorf
(
"validating transaction root. received=%x got=%x"
,
header
.
TxHash
,
txSha
)
return
}
// Tre receipt Trie's root (R = (Tr [[H1, R1], ... [Hn, R1]]))
receiptSha
:=
types
.
DeriveSha
(
receipts
)
if
bytes
.
Compare
(
receiptSha
,
header
.
ReceiptHash
)
!=
0
{
fmt
.
Println
(
"receipts"
,
receipts
)
...
...
@@ -198,12 +206,14 @@ func (sm *BlockProcessor) ProcessWithParent(block, parent *types.Block) (td *big
return
}
// Accumulate static rewards; block reward, uncle's and uncle inclusion.
if
err
=
sm
.
AccumulateRewards
(
state
,
block
,
parent
);
err
!=
nil
{
return
}
// Commit state objects/accounts to a temporary trie (does not save)
// used to calculate the state root.
state
.
Update
(
ethutil
.
Big0
)
if
!
bytes
.
Equal
(
header
.
Root
,
state
.
Root
())
{
err
=
fmt
.
Errorf
(
"invalid merkle root. received=%x got=%x"
,
header
.
Root
,
state
.
Root
())
return
...
...
@@ -213,10 +223,6 @@ func (sm *BlockProcessor) ProcessWithParent(block, parent *types.Block) (td *big
td
=
CalculateTD
(
block
,
parent
)
// Sync the current block's state to the database
state
.
Sync
()
// Set the block hashes for the current messages
state
.
Manifest
()
.
SetHash
(
block
.
Hash
())
// Reset the manifest XXX We need this?
state
.
Manifest
()
.
Reset
()
// Remove transactions from the pool
sm
.
txpool
.
RemoveSet
(
block
.
Transactions
())
...
...
@@ -296,27 +302,6 @@ func (sm *BlockProcessor) AccumulateRewards(statedb *state.StateDB, block, paren
return
nil
}
func
(
sm
*
BlockProcessor
)
GetMessages
(
block
*
types
.
Block
)
(
messages
[]
*
state
.
Message
,
err
error
)
{
if
!
sm
.
bc
.
HasBlock
(
block
.
Header
()
.
ParentHash
)
{
return
nil
,
ParentError
(
block
.
Header
()
.
ParentHash
)
}
sm
.
lastAttemptedBlock
=
block
var
(
parent
=
sm
.
bc
.
GetBlock
(
block
.
Header
()
.
ParentHash
)
//state = state.New(parent.Trie().Copy())
state
=
state
.
New
(
parent
.
Root
(),
sm
.
db
)
)
defer
state
.
Reset
()
sm
.
TransitionState
(
state
,
parent
,
block
)
sm
.
AccumulateRewards
(
state
,
block
,
parent
)
return
state
.
Manifest
()
.
Messages
,
nil
}
func
(
sm
*
BlockProcessor
)
GetLogs
(
block
*
types
.
Block
)
(
logs
state
.
Logs
,
err
error
)
{
if
!
sm
.
bc
.
HasBlock
(
block
.
Header
()
.
ParentHash
)
{
return
nil
,
ParentError
(
block
.
Header
()
.
ParentHash
)
...
...
This diff is collapsed.
Click to expand it.
state/manifest.go
deleted
100644 → 0
View file @
558c67d3
package
state
import
(
"fmt"
"math/big"
)
// Object manifest
//
// The object manifest is used to keep changes to the state so we can keep track of the changes
// that occurred during a state transitioning phase.
type
Manifest
struct
{
Messages
Messages
}
func
NewManifest
()
*
Manifest
{
m
:=
&
Manifest
{}
m
.
Reset
()
return
m
}
func
(
m
*
Manifest
)
Reset
()
{
m
.
Messages
=
nil
}
func
(
self
*
Manifest
)
AddMessage
(
msg
*
Message
)
*
Message
{
self
.
Messages
=
append
(
self
.
Messages
,
msg
)
return
msg
}
func
(
self
*
Manifest
)
SetHash
(
hash
[]
byte
)
{
for
_
,
message
:=
range
self
.
Messages
{
message
.
Block
=
hash
}
}
type
Messages
[]
*
Message
type
Message
struct
{
To
,
From
[]
byte
Input
[]
byte
Output
[]
byte
Path
int
Origin
[]
byte
Timestamp
int64
Coinbase
[]
byte
Block
[]
byte
Number
*
big
.
Int
Value
*
big
.
Int
ChangedAddresses
[][]
byte
}
func
(
self
*
Message
)
AddStorageChange
(
addr
[]
byte
)
{
self
.
ChangedAddresses
=
append
(
self
.
ChangedAddresses
,
addr
)
}
func
(
self
*
Message
)
String
()
string
{
return
fmt
.
Sprintf
(
"Message{to: %x from: %x input: %x output: %x origin: %x coinbase: %x block: %x number: %v timestamp: %d path: %d value: %v"
,
self
.
To
,
self
.
From
,
self
.
Input
,
self
.
Output
,
self
.
Origin
,
self
.
Coinbase
,
self
.
Block
,
self
.
Number
,
self
.
Timestamp
,
self
.
Path
,
self
.
Value
)
}
This diff is collapsed.
Click to expand it.
state/statedb.go
View file @
3f6baa45
...
...
@@ -22,8 +22,6 @@ type StateDB struct {
stateObjects
map
[
string
]
*
StateObject
manifest
*
Manifest
refund
map
[
string
]
*
big
.
Int
logs
Logs
...
...
@@ -32,7 +30,7 @@ type StateDB struct {
// Create a new state from a given trie
func
New
(
root
[]
byte
,
db
ethutil
.
Database
)
*
StateDB
{
trie
:=
trie
.
New
(
ethutil
.
CopyBytes
(
root
),
db
)
return
&
StateDB
{
db
:
db
,
trie
:
trie
,
stateObjects
:
make
(
map
[
string
]
*
StateObject
),
manifest
:
NewManifest
(),
refund
:
make
(
map
[
string
]
*
big
.
Int
)}
return
&
StateDB
{
db
:
db
,
trie
:
trie
,
stateObjects
:
make
(
map
[
string
]
*
StateObject
),
refund
:
make
(
map
[
string
]
*
big
.
Int
)}
}
func
(
self
*
StateDB
)
EmptyLogs
()
{
...
...
@@ -47,6 +45,13 @@ func (self *StateDB) Logs() Logs {
return
self
.
logs
}
func
(
self
*
StateDB
)
Refund
(
addr
[]
byte
,
gas
*
big
.
Int
)
{
if
self
.
refund
[
string
(
addr
)]
==
nil
{
self
.
refund
[
string
(
addr
)]
=
new
(
big
.
Int
)
}
self
.
refund
[
string
(
addr
)]
.
Add
(
self
.
refund
[
string
(
addr
)],
gas
)
}
// Retrieve the balance from the given address or 0 if object not found
func
(
self
*
StateDB
)
GetBalance
(
addr
[]
byte
)
*
big
.
Int
{
stateObject
:=
self
.
GetStateObject
(
addr
)
...
...
@@ -57,13 +62,6 @@ func (self *StateDB) GetBalance(addr []byte) *big.Int {
return
ethutil
.
Big0
}
func
(
self
*
StateDB
)
Refund
(
addr
[]
byte
,
gas
*
big
.
Int
)
{
if
self
.
refund
[
string
(
addr
)]
==
nil
{
self
.
refund
[
string
(
addr
)]
=
new
(
big
.
Int
)
}
self
.
refund
[
string
(
addr
)]
.
Add
(
self
.
refund
[
string
(
addr
)],
gas
)
}
func
(
self
*
StateDB
)
AddBalance
(
addr
[]
byte
,
amount
*
big
.
Int
)
{
stateObject
:=
self
.
GetStateObject
(
addr
)
if
stateObject
!=
nil
{
...
...
@@ -103,6 +101,7 @@ func (self *StateDB) SetCode(addr, code []byte) {
}
}
// TODO vars
func
(
self
*
StateDB
)
GetState
(
a
,
b
[]
byte
)
[]
byte
{
stateObject
:=
self
.
GetStateObject
(
a
)
if
stateObject
!=
nil
{
...
...
@@ -212,25 +211,21 @@ func (s *StateDB) Cmp(other *StateDB) bool {
}
func
(
self
*
StateDB
)
Copy
()
*
StateDB
{
if
self
.
trie
!=
nil
{
state
:=
New
(
nil
,
self
.
db
)
state
.
trie
=
self
.
trie
.
Copy
()
for
k
,
stateObject
:=
range
self
.
stateObjects
{
state
.
stateObjects
[
k
]
=
stateObject
.
Copy
()
}
for
addr
,
refund
:=
range
self
.
refund
{
state
.
refund
[
addr
]
=
new
(
big
.
Int
)
.
Set
(
refund
)
}
logs
:=
make
(
Logs
,
len
(
self
.
logs
))
copy
(
logs
,
self
.
logs
)
state
.
logs
=
logs
state
:=
New
(
nil
,
self
.
db
)
state
.
trie
=
self
.
trie
.
Copy
()
for
k
,
stateObject
:=
range
self
.
stateObjects
{
state
.
stateObjects
[
k
]
=
stateObject
.
Copy
()
}
return
state
for
addr
,
refund
:=
range
self
.
refund
{
state
.
refund
[
addr
]
=
new
(
big
.
Int
)
.
Set
(
refund
)
}
return
nil
logs
:=
make
(
Logs
,
len
(
self
.
logs
))
copy
(
logs
,
self
.
logs
)
state
.
logs
=
logs
return
state
}
func
(
self
*
StateDB
)
Set
(
state
*
StateDB
)
{
...
...
@@ -301,10 +296,6 @@ func (self *StateDB) Update(gasUsed *big.Int) {
}
}
func
(
self
*
StateDB
)
Manifest
()
*
Manifest
{
return
self
.
manifest
}
// Debug stuff
func
(
self
*
StateDB
)
CreateOutputForDiff
()
{
for
_
,
stateObject
:=
range
self
.
stateObjects
{
...
...
This diff is collapsed.
Click to expand it.
vm/vm.go
View file @
3f6baa45
...
...
@@ -38,13 +38,6 @@ func New(env Environment) *Vm {
func
(
self
*
Vm
)
Run
(
me
,
caller
ContextRef
,
code
[]
byte
,
value
,
gas
,
price
*
big
.
Int
,
callData
[]
byte
)
(
ret
[]
byte
,
err
error
)
{
self
.
env
.
SetDepth
(
self
.
env
.
Depth
()
+
1
)
msg
:=
self
.
env
.
State
()
.
Manifest
()
.
AddMessage
(
&
state
.
Message
{
To
:
me
.
Address
(),
From
:
caller
.
Address
(),
Input
:
callData
,
Origin
:
self
.
env
.
Origin
(),
Timestamp
:
self
.
env
.
Time
(),
Coinbase
:
self
.
env
.
Coinbase
(),
Number
:
self
.
env
.
BlockNumber
(),
Value
:
value
,
})
context
:=
NewContext
(
caller
,
me
,
code
,
gas
,
price
)
vmlogger
.
Debugf
(
"(%d) (%x) %x (code=%d) gas: %v (d) %x
\n
"
,
self
.
env
.
Depth
(),
caller
.
Address
()[
:
4
],
context
.
Address
(),
len
(
code
),
context
.
Gas
,
callData
)
...
...
@@ -618,8 +611,6 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
val
,
loc
:=
stack
.
Popn
()
statedb
.
SetState
(
context
.
Address
(),
loc
.
Bytes
(),
val
)
msg
.
AddStorageChange
(
loc
.
Bytes
())
self
.
Printf
(
" {0x%x : 0x%x}"
,
loc
.
Bytes
(),
val
.
Bytes
())
case
JUMP
:
jump
(
pc
,
stack
.
Pop
())
...
...
@@ -670,7 +661,6 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
dataGas
.
Mul
(
dataGas
,
GasCreateByte
)
if
context
.
UseGas
(
dataGas
)
{
ref
.
SetCode
(
ret
)
msg
.
Output
=
ret
}
addr
=
ref
.
Address
()
...
...
@@ -713,7 +703,6 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
vmlogger
.
Debugln
(
err
)
}
else
{
stack
.
Push
(
ethutil
.
BigTrue
)
msg
.
Output
=
ret
mem
.
Set
(
retOffset
.
Uint64
(),
retSize
.
Uint64
(),
ret
)
}
...
...
This diff is collapsed.
Click to expand it.
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