debugging code
This commit is contained in:
parent
9509322ecd
commit
75ee3b3f08
@ -316,9 +316,9 @@ out:
|
|||||||
if len(blocks) > 0 {
|
if len(blocks) > 0 {
|
||||||
chainManager := self.eth.ChainManager()
|
chainManager := self.eth.ChainManager()
|
||||||
// Test and import
|
// Test and import
|
||||||
chain := chain.NewChain(blocks)
|
bchain := chain.NewChain(blocks)
|
||||||
_, err := chainManager.TestChain(chain)
|
_, err := chainManager.TestChain(bchain)
|
||||||
if err != nil {
|
if err != nil && !chain.IsTDError(err) {
|
||||||
poollogger.Debugln(err)
|
poollogger.Debugln(err)
|
||||||
|
|
||||||
self.Reset()
|
self.Reset()
|
||||||
@ -330,7 +330,7 @@ out:
|
|||||||
self.td = ethutil.Big0
|
self.td = ethutil.Big0
|
||||||
self.peer = nil
|
self.peer = nil
|
||||||
} else {
|
} else {
|
||||||
chainManager.InsertChain(chain)
|
chainManager.InsertChain(bchain)
|
||||||
for _, block := range blocks {
|
for _, block := range blocks {
|
||||||
self.Remove(block.Hash())
|
self.Remove(block.Hash())
|
||||||
}
|
}
|
||||||
|
@ -159,7 +159,9 @@ done:
|
|||||||
|
|
||||||
txGas.Sub(txGas, st.gas)
|
txGas.Sub(txGas, st.gas)
|
||||||
cumulative := new(big.Int).Set(totalUsedGas.Add(totalUsedGas, txGas))
|
cumulative := new(big.Int).Set(totalUsedGas.Add(totalUsedGas, txGas))
|
||||||
receipt := &Receipt{ethutil.CopyBytes(state.Root().([]byte)), cumulative, LogsBloom(state.Logs()).Bytes(), state.Logs()}
|
bloom := ethutil.LeftPadBytes(LogsBloom(state.Logs()).Bytes(), 64)
|
||||||
|
receipt := &Receipt{ethutil.CopyBytes(state.Root()), cumulative, bloom, state.Logs()}
|
||||||
|
//fmt.Println(receipt)
|
||||||
|
|
||||||
// Notify all subscribers
|
// Notify all subscribers
|
||||||
go self.eth.EventMux().Post(TxPostEvent{tx})
|
go self.eth.EventMux().Post(TxPostEvent{tx})
|
||||||
@ -213,13 +215,15 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
block.SetReceipts(receipts)
|
//block.SetReceipts(receipts)
|
||||||
|
|
||||||
txSha := DeriveSha(block.transactions)
|
/*
|
||||||
if bytes.Compare(txSha, block.TxSha) != 0 {
|
txSha := DeriveSha(block.transactions)
|
||||||
err = fmt.Errorf("Error validating transaction sha. Received %x, got %x", block.TxSha, txSha)
|
if bytes.Compare(txSha, block.TxSha) != 0 {
|
||||||
return
|
err = fmt.Errorf("Error validating transaction sha. Received %x, got %x", block.TxSha, txSha)
|
||||||
}
|
return
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
receiptSha := DeriveSha(receipts)
|
receiptSha := DeriveSha(receipts)
|
||||||
if bytes.Compare(receiptSha, block.ReceiptSha) != 0 {
|
if bytes.Compare(receiptSha, block.ReceiptSha) != 0 {
|
||||||
@ -255,13 +259,18 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me
|
|||||||
// Sync the current block's state to the database and cancelling out the deferred Undo
|
// Sync the current block's state to the database and cancelling out the deferred Undo
|
||||||
state.Sync()
|
state.Sync()
|
||||||
|
|
||||||
// TODO at this point we should also insert LOGS in to a database
|
|
||||||
|
|
||||||
sm.transState = state.Copy()
|
|
||||||
|
|
||||||
messages := state.Manifest().Messages
|
messages := state.Manifest().Messages
|
||||||
state.Manifest().Reset()
|
state.Manifest().Reset()
|
||||||
|
|
||||||
|
/*
|
||||||
|
sm.eth.ChainManager().SetTotalDifficulty(td)
|
||||||
|
sm.eth.ChainManager().add(block)
|
||||||
|
sm.eth.EventMux().Post(NewBlockEvent{block})
|
||||||
|
sm.eth.EventMux().Post(messages)
|
||||||
|
*/
|
||||||
|
|
||||||
|
sm.transState = state.Copy()
|
||||||
|
|
||||||
sm.eth.TxPool().RemoveSet(block.Transactions())
|
sm.eth.TxPool().RemoveSet(block.Transactions())
|
||||||
|
|
||||||
return td, messages, nil
|
return td, messages, nil
|
||||||
|
@ -337,6 +337,7 @@ func (self *ChainManager) InsertChain(chain *BlockChain) {
|
|||||||
|
|
||||||
func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) {
|
func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) {
|
||||||
self.workingChain = chain
|
self.workingChain = chain
|
||||||
|
defer func() { self.workingChain = nil }()
|
||||||
|
|
||||||
for e := chain.Front(); e != nil; e = e.Next() {
|
for e := chain.Front(); e != nil; e = e.Next() {
|
||||||
var (
|
var (
|
||||||
|
65
chain/receipt.go
Normal file
65
chain/receipt.go
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package chain
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"math/big"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/ethutil"
|
||||||
|
"github.com/ethereum/go-ethereum/state"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Receipt struct {
|
||||||
|
PostState []byte
|
||||||
|
CumulativeGasUsed *big.Int
|
||||||
|
Bloom []byte
|
||||||
|
logs state.Logs
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRecieptFromValue(val *ethutil.Value) *Receipt {
|
||||||
|
r := &Receipt{}
|
||||||
|
r.RlpValueDecode(val)
|
||||||
|
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *Receipt) RlpValueDecode(decoder *ethutil.Value) {
|
||||||
|
self.PostState = decoder.Get(0).Bytes()
|
||||||
|
self.CumulativeGasUsed = decoder.Get(1).BigInt()
|
||||||
|
self.Bloom = decoder.Get(2).Bytes()
|
||||||
|
|
||||||
|
it := decoder.Get(3).NewIterator()
|
||||||
|
for it.Next() {
|
||||||
|
self.logs = append(self.logs, state.NewLogFromValue(it.Value()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *Receipt) RlpData() interface{} {
|
||||||
|
fmt.Println(self.logs.RlpData())
|
||||||
|
return []interface{}{self.PostState, self.CumulativeGasUsed, self.Bloom, self.logs.RlpData()}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *Receipt) RlpEncode() []byte {
|
||||||
|
return ethutil.Encode(self.RlpData())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *Receipt) Cmp(other *Receipt) bool {
|
||||||
|
if bytes.Compare(self.PostState, other.PostState) != 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *Receipt) String() string {
|
||||||
|
return fmt.Sprintf(`Receipt: %x
|
||||||
|
cumulative gas: %v
|
||||||
|
bloom: %x
|
||||||
|
logs: %v
|
||||||
|
rlp: %x`, self.PostState, self.CumulativeGasUsed, self.Bloom, self.logs, self.RlpEncode())
|
||||||
|
}
|
||||||
|
|
||||||
|
type Receipts []*Receipt
|
||||||
|
|
||||||
|
func (self Receipts) Len() int { return len(self) }
|
||||||
|
func (self Receipts) GetRlp(i int) []byte { return ethutil.Rlp(self[i]) }
|
@ -1,7 +1,6 @@
|
|||||||
package chain
|
package chain
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
@ -201,52 +200,6 @@ func (tx *Transaction) String() string {
|
|||||||
tx.s)
|
tx.s)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Receipt struct {
|
|
||||||
PostState []byte
|
|
||||||
CumulativeGasUsed *big.Int
|
|
||||||
Bloom []byte
|
|
||||||
logs state.Logs
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewRecieptFromValue(val *ethutil.Value) *Receipt {
|
|
||||||
r := &Receipt{}
|
|
||||||
r.RlpValueDecode(val)
|
|
||||||
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
func (self *Receipt) RlpValueDecode(decoder *ethutil.Value) {
|
|
||||||
self.PostState = decoder.Get(0).Bytes()
|
|
||||||
self.CumulativeGasUsed = decoder.Get(1).BigInt()
|
|
||||||
self.Bloom = decoder.Get(2).Bytes()
|
|
||||||
|
|
||||||
it := decoder.Get(3).NewIterator()
|
|
||||||
for it.Next() {
|
|
||||||
self.logs = append(self.logs, state.NewLogFromValue(it.Value()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (self *Receipt) RlpData() interface{} {
|
|
||||||
return []interface{}{self.PostState, self.CumulativeGasUsed, self.Bloom, self.logs.RlpData()}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (self *Receipt) RlpEncode() []byte {
|
|
||||||
return ethutil.Encode(self.RlpData())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (self *Receipt) Cmp(other *Receipt) bool {
|
|
||||||
if bytes.Compare(self.PostState, other.PostState) != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
type Receipts []*Receipt
|
|
||||||
|
|
||||||
func (self Receipts) Len() int { return len(self) }
|
|
||||||
func (self Receipts) GetRlp(i int) []byte { return ethutil.Rlp(self[i]) }
|
|
||||||
|
|
||||||
// Transaction slice type for basic sorting
|
// Transaction slice type for basic sorting
|
||||||
type Transactions []*Transaction
|
type Transactions []*Transaction
|
||||||
|
|
||||||
|
19
state/log.go
19
state/log.go
@ -1,6 +1,11 @@
|
|||||||
package state
|
package state
|
||||||
|
|
||||||
import "github.com/ethereum/go-ethereum/ethutil"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/ethutil"
|
||||||
|
)
|
||||||
|
|
||||||
type Log struct {
|
type Log struct {
|
||||||
Address []byte
|
Address []byte
|
||||||
@ -26,6 +31,10 @@ func (self Log) RlpData() interface{} {
|
|||||||
return []interface{}{self.Address, ethutil.ByteSliceToInterface(self.Topics), self.Data}
|
return []interface{}{self.Address, ethutil.ByteSliceToInterface(self.Topics), self.Data}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self Log) String() string {
|
||||||
|
return fmt.Sprintf(`log: %x %x %x`, self.Address, self.Topics, self.Data)
|
||||||
|
}
|
||||||
|
|
||||||
type Logs []Log
|
type Logs []Log
|
||||||
|
|
||||||
func (self Logs) RlpData() interface{} {
|
func (self Logs) RlpData() interface{} {
|
||||||
@ -36,3 +45,11 @@ func (self Logs) RlpData() interface{} {
|
|||||||
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self Logs) String() string {
|
||||||
|
var logs []string
|
||||||
|
for _, log := range self {
|
||||||
|
logs = append(logs, log.String())
|
||||||
|
}
|
||||||
|
return "[ " + strings.Join(logs, ", ") + " ]"
|
||||||
|
}
|
||||||
|
@ -62,7 +62,7 @@ func (self *State) Refund(addr []byte, gas, price *big.Int) {
|
|||||||
self.refund[string(addr)] = new(big.Int)
|
self.refund[string(addr)] = new(big.Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.refund[string(addr)] = new(big.Int).Add(self.refund[string(addr)], amount)
|
self.refund[string(addr)].Add(self.refund[string(addr)], amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *State) AddBalance(addr []byte, amount *big.Int) {
|
func (self *State) AddBalance(addr []byte, amount *big.Int) {
|
||||||
@ -237,8 +237,8 @@ func (self *State) Set(state *State) {
|
|||||||
self.logs = state.logs
|
self.logs = state.logs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *State) Root() interface{} {
|
func (s *State) Root() []byte {
|
||||||
return s.Trie.Root
|
return s.Trie.GetRoot()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resets the trie and all siblings
|
// Resets the trie and all siblings
|
||||||
|
Loading…
Reference in New Issue
Block a user