good morning!!!!
Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
B
bor
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Harbor Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
open
bor
Commits
ca74bcc4
Commit
ca74bcc4
authored
Nov 17, 2014
by
Jeffrey Wilcke
Browse files
Options
Downloads
Patches
Plain Diff
cleaning up
parent
33afb10b
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
block_pool.go
+5
-3
5 additions, 3 deletions
block_pool.go
chain/chain_manager.go
+131
-154
131 additions, 154 deletions
chain/chain_manager.go
with
136 additions
and
157 deletions
block_pool.go
+
5
−
3
View file @
ca74bcc4
...
@@ -333,6 +333,7 @@ out:
...
@@ -333,6 +333,7 @@ out:
self
.
td
=
ethutil
.
Big0
self
.
td
=
ethutil
.
Big0
self
.
peer
=
nil
self
.
peer
=
nil
}
else
{
}
else
{
if
!
chain
.
IsTDError
(
err
)
{
chainManager
.
InsertChain
(
bchain
)
chainManager
.
InsertChain
(
bchain
)
for
_
,
block
:=
range
blocks
{
for
_
,
block
:=
range
blocks
{
self
.
Remove
(
block
.
Hash
())
self
.
Remove
(
block
.
Hash
())
...
@@ -342,3 +343,4 @@ out:
...
@@ -342,3 +343,4 @@ out:
}
}
}
}
}
}
}
This diff is collapsed.
Click to expand it.
chain/chain_manager.go
+
131
−
154
View file @
ca74bcc4
...
@@ -13,9 +13,39 @@ import (
...
@@ -13,9 +13,39 @@ import (
var
chainlogger
=
logger
.
NewLogger
(
"CHAIN"
)
var
chainlogger
=
logger
.
NewLogger
(
"CHAIN"
)
func
AddTestNetFunds
(
block
*
Block
)
{
for
_
,
addr
:=
range
[]
string
{
"51ba59315b3a95761d0863b05ccc7a7f54703d99"
,
"e4157b34ea9615cfbde6b4fda419828124b70c78"
,
"b9c015918bdaba24b4ff057a92a3873d6eb201be"
,
"6c386a4b26f73c802f34673f7248bb118f97424a"
,
"cd2a3d9f938e13cd947ec05abc7fe734df8dd826"
,
"2ef47100e0787b915105fd5e3f4ff6752079d5cb"
,
"e6716f9544a56c530d868e4bfbacb172315bdead"
,
"1a26338f0d905e295fccb71fa9ea849ffa12aaf4"
,
}
{
codedAddr
:=
ethutil
.
Hex2Bytes
(
addr
)
account
:=
block
.
state
.
GetAccount
(
codedAddr
)
account
.
SetBalance
(
ethutil
.
Big
(
"1606938044258990275541962092341162602522202993782792835301376"
))
//ethutil.BigPow(2, 200)
block
.
state
.
UpdateStateObject
(
account
)
}
}
func
CalcDifficulty
(
block
,
parent
*
Block
)
*
big
.
Int
{
diff
:=
new
(
big
.
Int
)
adjust
:=
new
(
big
.
Int
)
.
Rsh
(
parent
.
Difficulty
,
10
)
if
block
.
Time
>=
parent
.
Time
+
5
{
diff
.
Sub
(
parent
.
Difficulty
,
adjust
)
}
else
{
diff
.
Add
(
parent
.
Difficulty
,
adjust
)
}
return
diff
}
type
ChainManager
struct
{
type
ChainManager
struct
{
Ethereum
EthManager
eth
EthManager
// The famous, the fabulous Mister GENESIIIIIIS (block)
genesisBlock
*
Block
genesisBlock
*
Block
// Last known total difficulty
// Last known total difficulty
TD
*
big
.
Int
TD
*
big
.
Int
...
@@ -31,17 +61,34 @@ type ChainManager struct {
...
@@ -31,17 +61,34 @@ type ChainManager struct {
func
NewChainManager
(
ethereum
EthManager
)
*
ChainManager
{
func
NewChainManager
(
ethereum
EthManager
)
*
ChainManager
{
bc
:=
&
ChainManager
{}
bc
:=
&
ChainManager
{}
bc
.
genesisBlock
=
NewBlockFromBytes
(
ethutil
.
Encode
(
Genesis
))
bc
.
genesisBlock
=
NewBlockFromBytes
(
ethutil
.
Encode
(
Genesis
))
bc
.
E
th
ereum
=
ethereum
bc
.
e
th
=
ethereum
bc
.
setLastBlock
()
bc
.
setLastBlock
()
return
bc
return
bc
}
}
func
(
bc
*
ChainManager
)
Genesis
()
*
Block
{
func
(
bc
*
ChainManager
)
setLastBlock
()
{
return
bc
.
genesisBlock
data
,
_
:=
ethutil
.
Config
.
Db
.
Get
([]
byte
(
"LastBlock"
))
if
len
(
data
)
!=
0
{
// Prep genesis
AddTestNetFunds
(
bc
.
genesisBlock
)
block
:=
NewBlockFromBytes
(
data
)
bc
.
CurrentBlock
=
block
bc
.
LastBlockHash
=
block
.
Hash
()
bc
.
LastBlockNumber
=
block
.
Number
.
Uint64
()
// Set the last know difficulty (might be 0x0 as initial value, Genesis)
bc
.
TD
=
ethutil
.
BigD
(
ethutil
.
Config
.
Db
.
LastKnownTD
())
}
else
{
bc
.
Reset
()
}
}
chainlogger
.
Infof
(
"Last block (#%d) %x
\n
"
,
bc
.
LastBlockNumber
,
bc
.
CurrentBlock
.
Hash
())
}
// Block creation & chain handling
func
(
bc
*
ChainManager
)
NewBlock
(
coinbase
[]
byte
)
*
Block
{
func
(
bc
*
ChainManager
)
NewBlock
(
coinbase
[]
byte
)
*
Block
{
var
root
interface
{}
var
root
interface
{}
hash
:=
ZeroHash256
hash
:=
ZeroHash256
...
@@ -72,19 +119,6 @@ func (bc *ChainManager) NewBlock(coinbase []byte) *Block {
...
@@ -72,19 +119,6 @@ func (bc *ChainManager) NewBlock(coinbase []byte) *Block {
return
block
return
block
}
}
func
CalcDifficulty
(
block
,
parent
*
Block
)
*
big
.
Int
{
diff
:=
new
(
big
.
Int
)
adjust
:=
new
(
big
.
Int
)
.
Rsh
(
parent
.
Difficulty
,
10
)
if
block
.
Time
>=
parent
.
Time
+
5
{
diff
.
Sub
(
parent
.
Difficulty
,
adjust
)
}
else
{
diff
.
Add
(
parent
.
Difficulty
,
adjust
)
}
return
diff
}
func
(
bc
*
ChainManager
)
Reset
()
{
func
(
bc
*
ChainManager
)
Reset
()
{
AddTestNetFunds
(
bc
.
genesisBlock
)
AddTestNetFunds
(
bc
.
genesisBlock
)
...
@@ -99,36 +133,29 @@ func (bc *ChainManager) Reset() {
...
@@ -99,36 +133,29 @@ func (bc *ChainManager) Reset() {
bc
.
TD
=
ethutil
.
BigD
(
ethutil
.
Config
.
Db
.
LastKnownTD
())
bc
.
TD
=
ethutil
.
BigD
(
ethutil
.
Config
.
Db
.
LastKnownTD
())
}
}
func
(
bc
*
ChainManager
)
HasBlock
(
hash
[]
byte
)
bool
{
// Add a block to the chain and record addition information
data
,
_
:=
ethutil
.
Config
.
Db
.
Get
(
hash
)
func
(
bc
*
ChainManager
)
add
(
block
*
Block
)
{
return
len
(
data
)
!=
0
bc
.
writeBlockInfo
(
block
)
}
// TODO: At one point we might want to save a block by prevHash in the db to optimise this...
func
(
bc
*
ChainManager
)
HasBlockWithPrevHash
(
hash
[]
byte
)
bool
{
block
:=
bc
.
CurrentBlock
for
;
block
!=
nil
;
block
=
bc
.
GetBlock
(
block
.
PrevHash
)
{
bc
.
CurrentBlock
=
block
if
bytes
.
Compare
(
hash
,
block
.
PrevHash
)
==
0
{
bc
.
LastBlockHash
=
block
.
Hash
()
return
true
}
}
return
false
}
func
(
bc
*
ChainManager
)
CalculateBlockTD
(
block
*
Block
)
*
big
.
Int
{
encodedBlock
:=
block
.
RlpEncode
()
blockDiff
:=
new
(
big
.
Int
)
ethutil
.
Config
.
Db
.
Put
(
block
.
Hash
(),
encodedBlock
)
ethutil
.
Config
.
Db
.
Put
([]
byte
(
"LastBlock"
),
encodedBlock
)
for
_
,
uncle
:=
range
block
.
Uncles
{
//chainlogger.Infof("Imported block #%d (%x...)\n", block.Number, block.Hash()[0:4])
blockDiff
=
blockDiff
.
Add
(
blockDiff
,
uncle
.
Difficulty
)
}
}
blockDiff
=
blockDiff
.
Add
(
blockDiff
,
block
.
Difficulty
)
return
blockDiff
// Accessors
func
(
bc
*
ChainManager
)
Genesis
()
*
Block
{
return
bc
.
genesisBlock
}
}
func
(
bc
*
ChainManager
)
GenesisBlock
()
*
Block
{
// Block fetching methods
return
bc
.
genesisBlock
func
(
bc
*
ChainManager
)
HasBlock
(
hash
[]
byte
)
bool
{
data
,
_
:=
ethutil
.
Config
.
Db
.
Get
(
hash
)
return
len
(
data
)
!=
0
}
}
func
(
self
*
ChainManager
)
GetChainHashesFromHash
(
hash
[]
byte
,
max
uint64
)
(
chain
[][]
byte
)
{
func
(
self
*
ChainManager
)
GetChainHashesFromHash
(
hash
[]
byte
,
max
uint64
)
(
chain
[][]
byte
)
{
...
@@ -152,83 +179,6 @@ func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain
...
@@ -152,83 +179,6 @@ func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain
return
return
}
}
func
AddTestNetFunds
(
block
*
Block
)
{
for
_
,
addr
:=
range
[]
string
{
"51ba59315b3a95761d0863b05ccc7a7f54703d99"
,
"e4157b34ea9615cfbde6b4fda419828124b70c78"
,
"b9c015918bdaba24b4ff057a92a3873d6eb201be"
,
"6c386a4b26f73c802f34673f7248bb118f97424a"
,
"cd2a3d9f938e13cd947ec05abc7fe734df8dd826"
,
"2ef47100e0787b915105fd5e3f4ff6752079d5cb"
,
"e6716f9544a56c530d868e4bfbacb172315bdead"
,
"1a26338f0d905e295fccb71fa9ea849ffa12aaf4"
,
}
{
codedAddr
:=
ethutil
.
Hex2Bytes
(
addr
)
account
:=
block
.
state
.
GetAccount
(
codedAddr
)
account
.
SetBalance
(
ethutil
.
Big
(
"1606938044258990275541962092341162602522202993782792835301376"
))
//ethutil.BigPow(2, 200)
block
.
state
.
UpdateStateObject
(
account
)
}
}
func
(
bc
*
ChainManager
)
setLastBlock
()
{
data
,
_
:=
ethutil
.
Config
.
Db
.
Get
([]
byte
(
"LastBlock"
))
if
len
(
data
)
!=
0
{
// Prep genesis
AddTestNetFunds
(
bc
.
genesisBlock
)
block
:=
NewBlockFromBytes
(
data
)
bc
.
CurrentBlock
=
block
bc
.
LastBlockHash
=
block
.
Hash
()
bc
.
LastBlockNumber
=
block
.
Number
.
Uint64
()
// Set the last know difficulty (might be 0x0 as initial value, Genesis)
bc
.
TD
=
ethutil
.
BigD
(
ethutil
.
Config
.
Db
.
LastKnownTD
())
}
else
{
bc
.
Reset
()
}
chainlogger
.
Infof
(
"Last block (#%d) %x
\n
"
,
bc
.
LastBlockNumber
,
bc
.
CurrentBlock
.
Hash
())
}
func
(
bc
*
ChainManager
)
SetTotalDifficulty
(
td
*
big
.
Int
)
{
ethutil
.
Config
.
Db
.
Put
([]
byte
(
"LTD"
),
td
.
Bytes
())
bc
.
TD
=
td
}
// Add a block to the chain and record addition information
func
(
bc
*
ChainManager
)
add
(
block
*
Block
)
{
bc
.
writeBlockInfo
(
block
)
bc
.
CurrentBlock
=
block
bc
.
LastBlockHash
=
block
.
Hash
()
encodedBlock
:=
block
.
RlpEncode
()
ethutil
.
Config
.
Db
.
Put
(
block
.
Hash
(),
encodedBlock
)
ethutil
.
Config
.
Db
.
Put
([]
byte
(
"LastBlock"
),
encodedBlock
)
//chainlogger.Infof("Imported block #%d (%x...)\n", block.Number, block.Hash()[0:4])
}
func
(
self
*
ChainManager
)
CalcTotalDiff
(
block
*
Block
)
(
*
big
.
Int
,
error
)
{
parent
:=
self
.
GetBlock
(
block
.
PrevHash
)
if
parent
==
nil
{
return
nil
,
fmt
.
Errorf
(
"Unable to calculate total diff without known parent %x"
,
block
.
PrevHash
)
}
parentTd
:=
parent
.
BlockInfo
()
.
TD
uncleDiff
:=
new
(
big
.
Int
)
for
_
,
uncle
:=
range
block
.
Uncles
{
uncleDiff
=
uncleDiff
.
Add
(
uncleDiff
,
uncle
.
Difficulty
)
}
td
:=
new
(
big
.
Int
)
td
=
td
.
Add
(
parentTd
,
uncleDiff
)
td
=
td
.
Add
(
td
,
block
.
Difficulty
)
return
td
,
nil
}
func
(
self
*
ChainManager
)
GetBlock
(
hash
[]
byte
)
*
Block
{
func
(
self
*
ChainManager
)
GetBlock
(
hash
[]
byte
)
*
Block
{
data
,
_
:=
ethutil
.
Config
.
Db
.
Get
(
hash
)
data
,
_
:=
ethutil
.
Config
.
Db
.
Get
(
hash
)
if
len
(
data
)
==
0
{
if
len
(
data
)
==
0
{
...
@@ -262,22 +212,29 @@ func (self *ChainManager) GetBlockByNumber(num uint64) *Block {
...
@@ -262,22 +212,29 @@ func (self *ChainManager) GetBlockByNumber(num uint64) *Block {
return
block
return
block
}
}
func
(
self
*
ChainManager
)
GetBlockBack
(
num
uint64
)
*
Block
{
func
(
bc
*
ChainManager
)
SetTotalDifficulty
(
td
*
big
.
Int
)
{
block
:=
self
.
CurrentBlock
ethutil
.
Config
.
Db
.
Put
([]
byte
(
"LTD"
),
td
.
Bytes
())
bc
.
TD
=
td
}
for
;
num
!=
0
&&
block
!=
nil
;
num
--
{
func
(
self
*
ChainManager
)
CalcTotalDiff
(
block
*
Block
)
(
*
big
.
Int
,
error
)
{
block
=
self
.
GetBlock
(
block
.
PrevHash
)
parent
:=
self
.
GetBlock
(
block
.
PrevHash
)
if
parent
==
nil
{
return
nil
,
fmt
.
Errorf
(
"Unable to calculate total diff without known parent %x"
,
block
.
PrevHash
)
}
}
return
block
parentTd
:=
parent
.
BlockInfo
()
.
TD
uncleDiff
:=
new
(
big
.
Int
)
for
_
,
uncle
:=
range
block
.
Uncles
{
uncleDiff
=
uncleDiff
.
Add
(
uncleDiff
,
uncle
.
Difficulty
)
}
}
func
(
bc
*
ChainManager
)
BlockInfoByHash
(
hash
[]
byte
)
BlockInfo
{
td
:=
new
(
big
.
Int
)
bi
:=
BlockInfo
{}
td
=
td
.
Add
(
parentTd
,
uncleDiff
)
data
,
_
:=
ethutil
.
Config
.
Db
.
Get
(
append
(
hash
,
[]
byte
(
"Info"
)
...
))
td
=
td
.
Add
(
td
,
block
.
Difficulty
)
bi
.
RlpDecode
(
data
)
return
bi
return
td
,
nil
}
}
func
(
bc
*
ChainManager
)
BlockInfo
(
block
*
Block
)
BlockInfo
{
func
(
bc
*
ChainManager
)
BlockInfo
(
block
*
Block
)
BlockInfo
{
...
@@ -303,24 +260,8 @@ func (bc *ChainManager) Stop() {
...
@@ -303,24 +260,8 @@ func (bc *ChainManager) Stop() {
}
}
}
}
type
link
struct
{
func
(
self
*
ChainManager
)
NewIterator
(
startHash
[]
byte
)
*
ChainIterator
{
block
*
Block
return
&
ChainIterator
{
self
,
self
.
GetBlock
(
startHash
)}
messages
state
.
Messages
td
*
big
.
Int
}
type
BlockChain
struct
{
*
list
.
List
}
func
NewChain
(
blocks
Blocks
)
*
BlockChain
{
chain
:=
&
BlockChain
{
list
.
New
()}
for
_
,
block
:=
range
blocks
{
chain
.
PushBack
(
&
link
{
block
,
nil
,
nil
})
}
return
chain
}
}
// This function assumes you've done your checking. No checking is done at this stage anymore
// This function assumes you've done your checking. No checking is done at this stage anymore
...
@@ -330,8 +271,8 @@ func (self *ChainManager) InsertChain(chain *BlockChain) {
...
@@ -330,8 +271,8 @@ func (self *ChainManager) InsertChain(chain *BlockChain) {
self
.
add
(
link
.
block
)
self
.
add
(
link
.
block
)
self
.
SetTotalDifficulty
(
link
.
td
)
self
.
SetTotalDifficulty
(
link
.
td
)
self
.
E
th
ereum
.
EventMux
()
.
Post
(
NewBlockEvent
{
link
.
block
})
self
.
e
th
.
EventMux
()
.
Post
(
NewBlockEvent
{
link
.
block
})
self
.
E
th
ereum
.
EventMux
()
.
Post
(
link
.
messages
)
self
.
e
th
.
EventMux
()
.
Post
(
link
.
messages
)
}
}
b
,
e
:=
chain
.
Front
(),
chain
.
Back
()
b
,
e
:=
chain
.
Front
(),
chain
.
Back
()
...
@@ -352,16 +293,13 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
...
@@ -352,16 +293,13 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
parent
=
self
.
GetBlock
(
block
.
PrevHash
)
parent
=
self
.
GetBlock
(
block
.
PrevHash
)
)
)
//fmt.Println("parent", parent)
//fmt.Println("current", block)
if
parent
==
nil
{
if
parent
==
nil
{
err
=
fmt
.
Errorf
(
"incoming chain broken on hash %x
\n
"
,
block
.
PrevHash
[
0
:
4
])
err
=
fmt
.
Errorf
(
"incoming chain broken on hash %x
\n
"
,
block
.
PrevHash
[
0
:
4
])
return
return
}
}
var
messages
state
.
Messages
var
messages
state
.
Messages
td
,
messages
,
err
=
self
.
E
th
ereum
.
BlockManager
()
.
ProcessWithParent
(
block
,
parent
)
td
,
messages
,
err
=
self
.
e
th
.
BlockManager
()
.
ProcessWithParent
(
block
,
parent
)
if
err
!=
nil
{
if
err
!=
nil
{
chainlogger
.
Infoln
(
err
)
chainlogger
.
Infoln
(
err
)
chainlogger
.
Debugf
(
"Block #%v failed (%x...)
\n
"
,
block
.
Number
,
block
.
Hash
()[
0
:
4
])
chainlogger
.
Debugf
(
"Block #%v failed (%x...)
\n
"
,
block
.
Number
,
block
.
Hash
()[
0
:
4
])
...
@@ -383,3 +321,42 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
...
@@ -383,3 +321,42 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error)
return
return
}
}
type
link
struct
{
block
*
Block
messages
state
.
Messages
td
*
big
.
Int
}
type
BlockChain
struct
{
*
list
.
List
}
func
NewChain
(
blocks
Blocks
)
*
BlockChain
{
chain
:=
&
BlockChain
{
list
.
New
()}
for
_
,
block
:=
range
blocks
{
chain
.
PushBack
(
&
link
{
block
,
nil
,
nil
})
}
return
chain
}
func
(
self
*
BlockChain
)
RlpEncode
()
[]
byte
{
dat
:=
make
([]
interface
{},
0
)
for
e
:=
self
.
Front
();
e
!=
nil
;
e
=
e
.
Next
()
{
dat
=
append
(
dat
,
e
.
Value
.
(
*
link
)
.
block
.
RlpData
())
}
return
ethutil
.
Encode
(
dat
)
}
type
ChainIterator
struct
{
cm
*
ChainManager
block
*
Block
// current block in the iterator
}
func
(
self
*
ChainIterator
)
Prev
()
*
Block
{
self
.
block
=
self
.
cm
.
GetBlock
(
self
.
block
.
PrevHash
)
return
self
.
block
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment