mirror of
https://gitlab.com/pulsechaincom/go-pulse.git
synced 2025-01-15 06:48:20 +00:00
Added TD for each block
This commit is contained in:
parent
615d20598a
commit
57dc435f9b
@ -18,6 +18,7 @@ type BlockInfo struct {
|
|||||||
Number uint64
|
Number uint64
|
||||||
Hash []byte
|
Hash []byte
|
||||||
Parent []byte
|
Parent []byte
|
||||||
|
TD *big.Int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bi *BlockInfo) RlpDecode(data []byte) {
|
func (bi *BlockInfo) RlpDecode(data []byte) {
|
||||||
@ -26,10 +27,11 @@ func (bi *BlockInfo) RlpDecode(data []byte) {
|
|||||||
bi.Number = decoder.Get(0).Uint()
|
bi.Number = decoder.Get(0).Uint()
|
||||||
bi.Hash = decoder.Get(1).Bytes()
|
bi.Hash = decoder.Get(1).Bytes()
|
||||||
bi.Parent = decoder.Get(2).Bytes()
|
bi.Parent = decoder.Get(2).Bytes()
|
||||||
|
bi.TD = decoder.Get(3).BigInt()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bi *BlockInfo) RlpEncode() []byte {
|
func (bi *BlockInfo) RlpEncode() []byte {
|
||||||
return ethutil.Encode([]interface{}{bi.Number, bi.Hash, bi.Parent})
|
return ethutil.Encode([]interface{}{bi.Number, bi.Hash, bi.Parent, bi.TD})
|
||||||
}
|
}
|
||||||
|
|
||||||
type Blocks []*Block
|
type Blocks []*Block
|
||||||
|
@ -2,6 +2,7 @@ package ethchain
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/ethereum/eth-go/ethlog"
|
"github.com/ethereum/eth-go/ethlog"
|
||||||
@ -191,6 +192,26 @@ func (bc *BlockChain) Add(block *Block) {
|
|||||||
ethutil.Config.Db.Put([]byte("LastBlock"), encodedBlock)
|
ethutil.Config.Db.Put([]byte("LastBlock"), encodedBlock)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *BlockChain) 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 (bc *BlockChain) GetBlock(hash []byte) *Block {
|
func (bc *BlockChain) GetBlock(hash []byte) *Block {
|
||||||
data, _ := ethutil.Config.Db.Get(hash)
|
data, _ := ethutil.Config.Db.Get(hash)
|
||||||
if len(data) == 0 {
|
if len(data) == 0 {
|
||||||
@ -234,7 +255,7 @@ func (bc *BlockChain) BlockInfo(block *Block) BlockInfo {
|
|||||||
// Unexported method for writing extra non-essential block info to the db
|
// Unexported method for writing extra non-essential block info to the db
|
||||||
func (bc *BlockChain) writeBlockInfo(block *Block) {
|
func (bc *BlockChain) writeBlockInfo(block *Block) {
|
||||||
bc.LastBlockNumber++
|
bc.LastBlockNumber++
|
||||||
bi := BlockInfo{Number: bc.LastBlockNumber, Hash: block.Hash(), Parent: block.PrevHash}
|
bi := BlockInfo{Number: bc.LastBlockNumber, Hash: block.Hash(), Parent: block.PrevHash, TD: bc.TD}
|
||||||
|
|
||||||
// For now we use the block hash with the words "info" appended as key
|
// For now we use the block hash with the words "info" appended as key
|
||||||
ethutil.Config.Db.Put(append(block.Hash(), []byte("Info")...), bi.RlpEncode())
|
ethutil.Config.Db.Put(append(block.Hash(), []byte("Info")...), bi.RlpEncode())
|
||||||
|
14
ethereum.go
14
ethereum.go
@ -4,6 +4,7 @@ import (
|
|||||||
"container/list"
|
"container/list"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/big"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"path"
|
"path"
|
||||||
@ -188,6 +189,18 @@ func (s *Ethereum) IsListening() bool {
|
|||||||
return s.listening
|
return s.listening
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Ethereum) HighestTDPeer() (td *big.Int) {
|
||||||
|
td = big.NewInt(0)
|
||||||
|
|
||||||
|
eachPeer(s.peers, func(p *Peer, v *list.Element) {
|
||||||
|
if p.td.Cmp(td) > 0 {
|
||||||
|
td = p.td
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Ethereum) AddPeer(conn net.Conn) {
|
func (s *Ethereum) AddPeer(conn net.Conn) {
|
||||||
peer := NewPeer(conn, s, true)
|
peer := NewPeer(conn, s, true)
|
||||||
|
|
||||||
@ -370,6 +383,7 @@ func (s *Ethereum) ReapDeadPeerHandler() {
|
|||||||
// Start the ethereum
|
// Start the ethereum
|
||||||
func (s *Ethereum) Start(seed bool) {
|
func (s *Ethereum) Start(seed bool) {
|
||||||
s.reactor.Start()
|
s.reactor.Start()
|
||||||
|
s.blockPool.Start()
|
||||||
// Bind to addr and port
|
// Bind to addr and port
|
||||||
ln, err := net.Listen("tcp", ":"+s.Port)
|
ln, err := net.Listen("tcp", ":"+s.Port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -2,6 +2,7 @@ package ethutil
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -29,6 +30,10 @@ func EmptyList() *List {
|
|||||||
|
|
||||||
// Get N element from the embedded slice. Returns nil if OOB.
|
// Get N element from the embedded slice. Returns nil if OOB.
|
||||||
func (self *List) Get(i int) interface{} {
|
func (self *List) Get(i int) interface{} {
|
||||||
|
if self.list.Len() == 3 {
|
||||||
|
fmt.Println("get", i, self.list.Index(i).Interface())
|
||||||
|
}
|
||||||
|
|
||||||
if self.list.Len() > i {
|
if self.list.Len() > i {
|
||||||
return self.list.Index(i).Interface()
|
return self.list.Index(i).Interface()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user