Begin of moving objects to types package
* Block(s) * Transaction(s)
This commit is contained in:
		
							parent
							
								
									62cd9946ee
								
							
						
					
					
						commit
						a1b6a9ac29
					
				| @ -10,6 +10,7 @@ import ( | |||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/chain" | 	"github.com/ethereum/go-ethereum/chain" | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| 	"github.com/ethereum/go-ethereum/wire" | 	"github.com/ethereum/go-ethereum/wire" | ||||||
| @ -20,7 +21,7 @@ var poollogger = logger.NewLogger("BPOOL") | |||||||
| type block struct { | type block struct { | ||||||
| 	from      *Peer | 	from      *Peer | ||||||
| 	peer      *Peer | 	peer      *Peer | ||||||
| 	block     *chain.Block | 	block     *types.Block | ||||||
| 	reqAt     time.Time | 	reqAt     time.Time | ||||||
| 	requested int | 	requested int | ||||||
| } | } | ||||||
| @ -73,7 +74,7 @@ func (self *BlockPool) HasCommonHash(hash []byte) bool { | |||||||
| 	return self.eth.ChainManager().GetBlock(hash) != nil | 	return self.eth.ChainManager().GetBlock(hash) != nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *BlockPool) Blocks() (blocks chain.Blocks) { | func (self *BlockPool) Blocks() (blocks types.Blocks) { | ||||||
| 	for _, item := range self.pool { | 	for _, item := range self.pool { | ||||||
| 		if item.block != nil { | 		if item.block != nil { | ||||||
| 			blocks = append(blocks, item.block) | 			blocks = append(blocks, item.block) | ||||||
| @ -123,15 +124,15 @@ func (self *BlockPool) AddHash(hash []byte, peer *Peer) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *BlockPool) Add(b *chain.Block, peer *Peer) { | func (self *BlockPool) Add(b *types.Block, peer *Peer) { | ||||||
| 	self.addBlock(b, peer, false) | 	self.addBlock(b, peer, false) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *BlockPool) AddNew(b *chain.Block, peer *Peer) { | func (self *BlockPool) AddNew(b *types.Block, peer *Peer) { | ||||||
| 	self.addBlock(b, peer, true) | 	self.addBlock(b, peer, true) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *BlockPool) addBlock(b *chain.Block, peer *Peer, newBlock bool) { | func (self *BlockPool) addBlock(b *types.Block, peer *Peer, newBlock bool) { | ||||||
| 	self.mut.Lock() | 	self.mut.Lock() | ||||||
| 	defer self.mut.Unlock() | 	defer self.mut.Unlock() | ||||||
| 
 | 
 | ||||||
| @ -283,7 +284,7 @@ out: | |||||||
| 			break out | 			break out | ||||||
| 		case <-procTimer.C: | 		case <-procTimer.C: | ||||||
| 			blocks := self.Blocks() | 			blocks := self.Blocks() | ||||||
| 			chain.BlockBy(chain.Number).Sort(blocks) | 			types.BlockBy(types.Number).Sort(blocks) | ||||||
| 
 | 
 | ||||||
| 			// Find common block
 | 			// Find common block
 | ||||||
| 			for i, block := range blocks { | 			for i, block := range blocks { | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ import ( | |||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/event" | 	"github.com/ethereum/go-ethereum/event" | ||||||
| @ -69,7 +70,7 @@ type BlockManager struct { | |||||||
| 	// The last attempted block is mainly used for debugging purposes
 | 	// The last attempted block is mainly used for debugging purposes
 | ||||||
| 	// This does not have to be a valid block and will be set during
 | 	// This does not have to be a valid block and will be set during
 | ||||||
| 	// 'Process' & canonical validation.
 | 	// 'Process' & canonical validation.
 | ||||||
| 	lastAttemptedBlock *Block | 	lastAttemptedBlock *types.Block | ||||||
| 
 | 
 | ||||||
| 	events event.Subscription | 	events event.Subscription | ||||||
| } | } | ||||||
| @ -117,11 +118,11 @@ func (sm *BlockManager) ChainManager() *ChainManager { | |||||||
| 	return sm.bc | 	return sm.bc | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *BlockManager) ProcessTransactions(coinbase *state.StateObject, state *state.State, block, parent *Block, txs Transactions) (Receipts, Transactions, Transactions, Transactions, error) { | func (self *BlockManager) ProcessTransactions(coinbase *state.StateObject, state *state.State, block, parent *types.Block, txs types.Transactions) (types.Receipts, types.Transactions, types.Transactions, types.Transactions, error) { | ||||||
| 	var ( | 	var ( | ||||||
| 		receipts           Receipts | 		receipts           types.Receipts | ||||||
| 		handled, unhandled Transactions | 		handled, unhandled types.Transactions | ||||||
| 		erroneous          Transactions | 		erroneous          types.Transactions | ||||||
| 		totalUsedGas       = big.NewInt(0) | 		totalUsedGas       = big.NewInt(0) | ||||||
| 		err                error | 		err                error | ||||||
| 	) | 	) | ||||||
| @ -159,8 +160,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()), cumulative, nil /*bloom*/, state.Logs()} | 		receipt := types.NewReceipt(state.Root(), cumulative) | ||||||
| 		receipt.Bloom = CreateBloom(Receipts{receipt}) | 		receipt.SetLogs(state.Logs()) | ||||||
|  | 		receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) | ||||||
| 
 | 
 | ||||||
| 		// Notify all subscribers
 | 		// Notify all subscribers
 | ||||||
| 		go self.eth.EventMux().Post(TxPostEvent{tx}) | 		go self.eth.EventMux().Post(TxPostEvent{tx}) | ||||||
| @ -178,7 +180,7 @@ done: | |||||||
| 	return receipts, handled, unhandled, erroneous, err | 	return receipts, handled, unhandled, erroneous, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (sm *BlockManager) Process(block *Block) (td *big.Int, msgs state.Messages, err error) { | func (sm *BlockManager) Process(block *types.Block) (td *big.Int, msgs state.Messages, err error) { | ||||||
| 	// Processing a blocks may never happen simultaneously
 | 	// Processing a blocks may never happen simultaneously
 | ||||||
| 	sm.mutex.Lock() | 	sm.mutex.Lock() | ||||||
| 	defer sm.mutex.Unlock() | 	defer sm.mutex.Unlock() | ||||||
| @ -195,7 +197,7 @@ func (sm *BlockManager) Process(block *Block) (td *big.Int, msgs state.Messages, | |||||||
| 	return sm.ProcessWithParent(block, parent) | 	return sm.ProcessWithParent(block, parent) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, messages state.Messages, err error) { | func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.Int, messages state.Messages, err error) { | ||||||
| 	sm.lastAttemptedBlock = block | 	sm.lastAttemptedBlock = block | ||||||
| 
 | 
 | ||||||
| 	state := parent.State().Copy() | 	state := parent.State().Copy() | ||||||
| @ -215,13 +217,13 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	txSha := DeriveSha(block.transactions) | 	txSha := types.DeriveSha(block.Transactions()) | ||||||
| 	if bytes.Compare(txSha, block.TxSha) != 0 { | 	if bytes.Compare(txSha, block.TxSha) != 0 { | ||||||
| 		err = fmt.Errorf("validating transaction root. received=%x got=%x", block.TxSha, txSha) | 		err = fmt.Errorf("validating transaction root. received=%x got=%x", block.TxSha, txSha) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	receiptSha := DeriveSha(receipts) | 	receiptSha := types.DeriveSha(receipts) | ||||||
| 	if bytes.Compare(receiptSha, block.ReceiptSha) != 0 { | 	if bytes.Compare(receiptSha, block.ReceiptSha) != 0 { | ||||||
| 		err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha) | 		err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha) | ||||||
| 		return | 		return | ||||||
| @ -238,8 +240,8 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	block.receipts = receipts // although this isn't necessary it be in the future
 | 	//block.receipts = receipts // although this isn't necessary it be in the future
 | ||||||
| 	rbloom := CreateBloom(receipts) | 	rbloom := types.CreateBloom(receipts) | ||||||
| 	if bytes.Compare(rbloom, block.LogsBloom) != 0 { | 	if bytes.Compare(rbloom, block.LogsBloom) != 0 { | ||||||
| 		err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom) | 		err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom) | ||||||
| 		return | 		return | ||||||
| @ -272,7 +274,7 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (sm *BlockManager) ApplyDiff(state *state.State, parent, block *Block) (receipts Receipts, err error) { | func (sm *BlockManager) ApplyDiff(state *state.State, parent, block *types.Block) (receipts types.Receipts, err error) { | ||||||
| 	coinbase := state.GetOrNewStateObject(block.Coinbase) | 	coinbase := state.GetOrNewStateObject(block.Coinbase) | ||||||
| 	coinbase.SetGasPool(block.CalcGasLimit(parent)) | 	coinbase.SetGasPool(block.CalcGasLimit(parent)) | ||||||
| 
 | 
 | ||||||
| @ -285,7 +287,7 @@ func (sm *BlockManager) ApplyDiff(state *state.State, parent, block *Block) (rec | |||||||
| 	return receipts, nil | 	return receipts, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (sm *BlockManager) CalculateTD(block *Block) (*big.Int, bool) { | func (sm *BlockManager) CalculateTD(block *types.Block) (*big.Int, bool) { | ||||||
| 	uncleDiff := new(big.Int) | 	uncleDiff := new(big.Int) | ||||||
| 	for _, uncle := range block.Uncles { | 	for _, uncle := range block.Uncles { | ||||||
| 		uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty) | 		uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty) | ||||||
| @ -311,7 +313,7 @@ func (sm *BlockManager) CalculateTD(block *Block) (*big.Int, bool) { | |||||||
| // Validates the current block. Returns an error if the block was invalid,
 | // Validates the current block. Returns an error if the block was invalid,
 | ||||||
| // an uncle or anything that isn't on the current block chain.
 | // an uncle or anything that isn't on the current block chain.
 | ||||||
| // Validation validates easy over difficult (dagger takes longer time = difficult)
 | // Validation validates easy over difficult (dagger takes longer time = difficult)
 | ||||||
| func (sm *BlockManager) ValidateBlock(block, parent *Block) error { | func (sm *BlockManager) ValidateBlock(block, parent *types.Block) error { | ||||||
| 	expd := CalcDifficulty(block, parent) | 	expd := CalcDifficulty(block, parent) | ||||||
| 	if expd.Cmp(block.Difficulty) < 0 { | 	if expd.Cmp(block.Difficulty) < 0 { | ||||||
| 		return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd) | 		return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd) | ||||||
| @ -337,7 +339,7 @@ func (sm *BlockManager) ValidateBlock(block, parent *Block) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (sm *BlockManager) AccumelateRewards(state *state.State, block, parent *Block) error { | func (sm *BlockManager) AccumelateRewards(state *state.State, block, parent *types.Block) error { | ||||||
| 	reward := new(big.Int).Set(BlockReward) | 	reward := new(big.Int).Set(BlockReward) | ||||||
| 
 | 
 | ||||||
| 	knownUncles := ethutil.Set(parent.Uncles) | 	knownUncles := ethutil.Set(parent.Uncles) | ||||||
| @ -380,7 +382,7 @@ func (sm *BlockManager) AccumelateRewards(state *state.State, block, parent *Blo | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (sm *BlockManager) GetMessages(block *Block) (messages []*state.Message, err error) { | func (sm *BlockManager) GetMessages(block *types.Block) (messages []*state.Message, err error) { | ||||||
| 	if !sm.bc.HasBlock(block.PrevHash) { | 	if !sm.bc.HasBlock(block.PrevHash) { | ||||||
| 		return nil, ParentError(block.PrevHash) | 		return nil, ParentError(block.PrevHash) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"math/big" | 	"math/big" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| @ -13,7 +14,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| var chainlogger = logger.NewLogger("CHAIN") | var chainlogger = logger.NewLogger("CHAIN") | ||||||
| 
 | 
 | ||||||
| func AddTestNetFunds(block *Block) { | func AddTestNetFunds(block *types.Block) { | ||||||
| 	for _, addr := range []string{ | 	for _, addr := range []string{ | ||||||
| 		"51ba59315b3a95761d0863b05ccc7a7f54703d99", | 		"51ba59315b3a95761d0863b05ccc7a7f54703d99", | ||||||
| 		"e4157b34ea9615cfbde6b4fda419828124b70c78", | 		"e4157b34ea9615cfbde6b4fda419828124b70c78", | ||||||
| @ -25,13 +26,13 @@ func AddTestNetFunds(block *Block) { | |||||||
| 		"1a26338f0d905e295fccb71fa9ea849ffa12aaf4", | 		"1a26338f0d905e295fccb71fa9ea849ffa12aaf4", | ||||||
| 	} { | 	} { | ||||||
| 		codedAddr := ethutil.Hex2Bytes(addr) | 		codedAddr := ethutil.Hex2Bytes(addr) | ||||||
| 		account := block.state.GetAccount(codedAddr) | 		account := block.State().GetAccount(codedAddr) | ||||||
| 		account.SetBalance(ethutil.Big("1606938044258990275541962092341162602522202993782792835301376")) //ethutil.BigPow(2, 200)
 | 		account.SetBalance(ethutil.Big("1606938044258990275541962092341162602522202993782792835301376")) //ethutil.BigPow(2, 200)
 | ||||||
| 		block.state.UpdateStateObject(account) | 		block.State().UpdateStateObject(account) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func CalcDifficulty(block, parent *Block) *big.Int { | func CalcDifficulty(block, parent *types.Block) *big.Int { | ||||||
| 	diff := new(big.Int) | 	diff := new(big.Int) | ||||||
| 
 | 
 | ||||||
| 	adjust := new(big.Int).Rsh(parent.Difficulty, 10) | 	adjust := new(big.Int).Rsh(parent.Difficulty, 10) | ||||||
| @ -45,36 +46,41 @@ func CalcDifficulty(block, parent *Block) *big.Int { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type ChainManager struct { | type ChainManager struct { | ||||||
| 	eth          EthManager | 	//eth          EthManager
 | ||||||
| 	genesisBlock *Block | 	processor    types.BlockProcessor | ||||||
|  | 	genesisBlock *types.Block | ||||||
| 	// Last known total difficulty
 | 	// Last known total difficulty
 | ||||||
| 	TD *big.Int | 	TD *big.Int | ||||||
| 
 | 
 | ||||||
| 	LastBlockNumber uint64 | 	LastBlockNumber uint64 | ||||||
| 
 | 
 | ||||||
| 	CurrentBlock  *Block | 	CurrentBlock  *types.Block | ||||||
| 	LastBlockHash []byte | 	LastBlockHash []byte | ||||||
| 
 | 
 | ||||||
| 	workingChain *BlockChain | 	workingChain *BlockChain | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewChainManager(ethereum EthManager) *ChainManager { | func NewChainManager() *ChainManager { | ||||||
| 	bc := &ChainManager{} | 	bc := &ChainManager{} | ||||||
| 	bc.genesisBlock = NewBlockFromBytes(ethutil.Encode(Genesis)) | 	bc.genesisBlock = types.NewBlockFromBytes(ethutil.Encode(Genesis)) | ||||||
| 	bc.eth = ethereum | 	//bc.eth = ethereum
 | ||||||
| 
 | 
 | ||||||
| 	bc.setLastBlock() | 	bc.setLastBlock() | ||||||
| 
 | 
 | ||||||
| 	return bc | 	return bc | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (self *ChainManager) SetProcessor(proc types.BlockProcessor) { | ||||||
|  | 	self.processor = proc | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (bc *ChainManager) setLastBlock() { | func (bc *ChainManager) setLastBlock() { | ||||||
| 	data, _ := ethutil.Config.Db.Get([]byte("LastBlock")) | 	data, _ := ethutil.Config.Db.Get([]byte("LastBlock")) | ||||||
| 	if len(data) != 0 { | 	if len(data) != 0 { | ||||||
| 		// Prep genesis
 | 		// Prep genesis
 | ||||||
| 		AddTestNetFunds(bc.genesisBlock) | 		AddTestNetFunds(bc.genesisBlock) | ||||||
| 
 | 
 | ||||||
| 		block := NewBlockFromBytes(data) | 		block := types.NewBlockFromBytes(data) | ||||||
| 		bc.CurrentBlock = block | 		bc.CurrentBlock = block | ||||||
| 		bc.LastBlockHash = block.Hash() | 		bc.LastBlockHash = block.Hash() | ||||||
| 		bc.LastBlockNumber = block.Number.Uint64() | 		bc.LastBlockNumber = block.Number.Uint64() | ||||||
| @ -89,7 +95,7 @@ func (bc *ChainManager) setLastBlock() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Block creation & chain handling
 | // Block creation & chain handling
 | ||||||
| func (bc *ChainManager) NewBlock(coinbase []byte) *Block { | func (bc *ChainManager) NewBlock(coinbase []byte) *types.Block { | ||||||
| 	var root interface{} | 	var root interface{} | ||||||
| 	hash := ZeroHash256 | 	hash := ZeroHash256 | ||||||
| 
 | 
 | ||||||
| @ -98,7 +104,7 @@ func (bc *ChainManager) NewBlock(coinbase []byte) *Block { | |||||||
| 		hash = bc.LastBlockHash | 		hash = bc.LastBlockHash | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	block := CreateBlock( | 	block := types.CreateBlock( | ||||||
| 		root, | 		root, | ||||||
| 		hash, | 		hash, | ||||||
| 		coinbase, | 		coinbase, | ||||||
| @ -122,7 +128,7 @@ func (bc *ChainManager) NewBlock(coinbase []byte) *Block { | |||||||
| func (bc *ChainManager) Reset() { | func (bc *ChainManager) Reset() { | ||||||
| 	AddTestNetFunds(bc.genesisBlock) | 	AddTestNetFunds(bc.genesisBlock) | ||||||
| 
 | 
 | ||||||
| 	bc.genesisBlock.state.Trie.Sync() | 	bc.genesisBlock.Trie().Sync() | ||||||
| 	// Prepare the genesis block
 | 	// Prepare the genesis block
 | ||||||
| 	bc.add(bc.genesisBlock) | 	bc.add(bc.genesisBlock) | ||||||
| 	bc.CurrentBlock = bc.genesisBlock | 	bc.CurrentBlock = bc.genesisBlock | ||||||
| @ -134,7 +140,7 @@ func (bc *ChainManager) Reset() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Add a block to the chain and record addition information
 | // Add a block to the chain and record addition information
 | ||||||
| func (bc *ChainManager) add(block *Block) { | func (bc *ChainManager) add(block *types.Block) { | ||||||
| 	bc.writeBlockInfo(block) | 	bc.writeBlockInfo(block) | ||||||
| 
 | 
 | ||||||
| 	bc.CurrentBlock = block | 	bc.CurrentBlock = block | ||||||
| @ -148,7 +154,7 @@ func (bc *ChainManager) add(block *Block) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Accessors
 | // Accessors
 | ||||||
| func (bc *ChainManager) Genesis() *Block { | func (bc *ChainManager) Genesis() *types.Block { | ||||||
| 	return bc.genesisBlock | 	return bc.genesisBlock | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -179,7 +185,7 @@ func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *ChainManager) GetBlock(hash []byte) *Block { | func (self *ChainManager) GetBlock(hash []byte) *types.Block { | ||||||
| 	data, _ := ethutil.Config.Db.Get(hash) | 	data, _ := ethutil.Config.Db.Get(hash) | ||||||
| 	if len(data) == 0 { | 	if len(data) == 0 { | ||||||
| 		if self.workingChain != nil { | 		if self.workingChain != nil { | ||||||
| @ -194,10 +200,10 @@ func (self *ChainManager) GetBlock(hash []byte) *Block { | |||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return NewBlockFromBytes(data) | 	return types.NewBlockFromBytes(data) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *ChainManager) GetBlockByNumber(num uint64) *Block { | func (self *ChainManager) GetBlockByNumber(num uint64) *types.Block { | ||||||
| 	block := self.CurrentBlock | 	block := self.CurrentBlock | ||||||
| 	for ; block != nil; block = self.GetBlock(block.PrevHash) { | 	for ; block != nil; block = self.GetBlock(block.PrevHash) { | ||||||
| 		if block.Number.Uint64() == num { | 		if block.Number.Uint64() == num { | ||||||
| @ -217,7 +223,7 @@ func (bc *ChainManager) SetTotalDifficulty(td *big.Int) { | |||||||
| 	bc.TD = td | 	bc.TD = td | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *ChainManager) CalcTotalDiff(block *Block) (*big.Int, error) { | func (self *ChainManager) CalcTotalDiff(block *types.Block) (*big.Int, error) { | ||||||
| 	parent := self.GetBlock(block.PrevHash) | 	parent := self.GetBlock(block.PrevHash) | ||||||
| 	if parent == nil { | 	if parent == nil { | ||||||
| 		return nil, fmt.Errorf("Unable to calculate total diff without known parent %x", block.PrevHash) | 		return nil, fmt.Errorf("Unable to calculate total diff without known parent %x", block.PrevHash) | ||||||
| @ -237,8 +243,8 @@ func (self *ChainManager) CalcTotalDiff(block *Block) (*big.Int, error) { | |||||||
| 	return td, nil | 	return td, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (bc *ChainManager) BlockInfo(block *Block) BlockInfo { | func (bc *ChainManager) BlockInfo(block *types.Block) types.BlockInfo { | ||||||
| 	bi := BlockInfo{} | 	bi := types.BlockInfo{} | ||||||
| 	data, _ := ethutil.Config.Db.Get(append(block.Hash(), []byte("Info")...)) | 	data, _ := ethutil.Config.Db.Get(append(block.Hash(), []byte("Info")...)) | ||||||
| 	bi.RlpDecode(data) | 	bi.RlpDecode(data) | ||||||
| 
 | 
 | ||||||
| @ -246,9 +252,9 @@ func (bc *ChainManager) 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 *ChainManager) writeBlockInfo(block *Block) { | func (bc *ChainManager) writeBlockInfo(block *types.Block) { | ||||||
| 	bc.LastBlockNumber++ | 	bc.LastBlockNumber++ | ||||||
| 	bi := BlockInfo{Number: bc.LastBlockNumber, Hash: block.Hash(), Parent: block.PrevHash, TD: bc.TD} | 	bi := types.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()) | ||||||
| @ -271,8 +277,8 @@ func (self *ChainManager) InsertChain(chain *BlockChain) { | |||||||
| 
 | 
 | ||||||
| 		self.add(link.block) | 		self.add(link.block) | ||||||
| 		self.SetTotalDifficulty(link.td) | 		self.SetTotalDifficulty(link.td) | ||||||
| 		self.eth.EventMux().Post(NewBlockEvent{link.block}) | 		//self.eth.EventMux().Post(NewBlockEvent{link.block})
 | ||||||
| 		self.eth.EventMux().Post(link.messages) | 		//self.eth.EventMux().Post(link.messages)
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	b, e := chain.Front(), chain.Back() | 	b, e := chain.Front(), chain.Back() | ||||||
| @ -299,7 +305,7 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		var messages state.Messages | 		var messages state.Messages | ||||||
| 		td, messages, err = self.eth.BlockManager().ProcessWithParent(block, parent) | 		td, messages, err = self.processor.ProcessWithParent(block, parent) //self.eth.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]) | ||||||
| @ -323,7 +329,7 @@ func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type link struct { | type link struct { | ||||||
| 	block    *Block | 	block    *types.Block | ||||||
| 	messages state.Messages | 	messages state.Messages | ||||||
| 	td       *big.Int | 	td       *big.Int | ||||||
| } | } | ||||||
| @ -332,7 +338,7 @@ type BlockChain struct { | |||||||
| 	*list.List | 	*list.List | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewChain(blocks Blocks) *BlockChain { | func NewChain(blocks types.Blocks) *BlockChain { | ||||||
| 	chain := &BlockChain{list.New()} | 	chain := &BlockChain{list.New()} | ||||||
| 
 | 
 | ||||||
| 	for _, block := range blocks { | 	for _, block := range blocks { | ||||||
| @ -353,10 +359,10 @@ func (self *BlockChain) RlpEncode() []byte { | |||||||
| 
 | 
 | ||||||
| type ChainIterator struct { | type ChainIterator struct { | ||||||
| 	cm    *ChainManager | 	cm    *ChainManager | ||||||
| 	block *Block // current block in the iterator
 | 	block *types.Block // current block in the iterator
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *ChainIterator) Prev() *Block { | func (self *ChainIterator) Prev() *types.Block { | ||||||
| 	self.block = self.cm.GetBlock(self.block.PrevHash) | 	self.block = self.cm.GetBlock(self.block.PrevHash) | ||||||
| 	return self.block | 	return self.block | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ import ( | |||||||
| 	"math/rand" | 	"math/rand" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| @ -15,7 +16,7 @@ import ( | |||||||
| var powlogger = logger.NewLogger("POW") | var powlogger = logger.NewLogger("POW") | ||||||
| 
 | 
 | ||||||
| type PoW interface { | type PoW interface { | ||||||
| 	Search(block *Block, stop <-chan struct{}) []byte | 	Search(block *types.Block, stop <-chan struct{}) []byte | ||||||
| 	Verify(hash []byte, diff *big.Int, nonce []byte) bool | 	Verify(hash []byte, diff *big.Int, nonce []byte) bool | ||||||
| 	GetHashrate() int64 | 	GetHashrate() int64 | ||||||
| 	Turbo(bool) | 	Turbo(bool) | ||||||
| @ -35,7 +36,7 @@ func (pow *EasyPow) Turbo(on bool) { | |||||||
| 	pow.turbo = on | 	pow.turbo = on | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (pow *EasyPow) Search(block *Block, stop <-chan struct{}) []byte { | func (pow *EasyPow) Search(block *types.Block, stop <-chan struct{}) []byte { | ||||||
| 	r := rand.New(rand.NewSource(time.Now().UnixNano())) | 	r := rand.New(rand.NewSource(time.Now().UnixNano())) | ||||||
| 	hash := block.HashNoNonce() | 	hash := block.HashNoNonce() | ||||||
| 	diff := block.Difficulty | 	diff := block.Difficulty | ||||||
|  | |||||||
| @ -1,10 +1,12 @@ | |||||||
| package chain | package chain | ||||||
| 
 | 
 | ||||||
|  | import "github.com/ethereum/go-ethereum/chain/types" | ||||||
|  | 
 | ||||||
| // TxPreEvent is posted when a transaction enters the transaction pool.
 | // TxPreEvent is posted when a transaction enters the transaction pool.
 | ||||||
| type TxPreEvent struct{ Tx *Transaction } | type TxPreEvent struct{ Tx *types.Transaction } | ||||||
| 
 | 
 | ||||||
| // TxPostEvent is posted when a transaction has been processed.
 | // TxPostEvent is posted when a transaction has been processed.
 | ||||||
| type TxPostEvent struct{ Tx *Transaction } | type TxPostEvent struct{ Tx *types.Transaction } | ||||||
| 
 | 
 | ||||||
| // NewBlockEvent is posted when a block has been imported.
 | // NewBlockEvent is posted when a block has been imported.
 | ||||||
| type NewBlockEvent struct{ Block *Block } | type NewBlockEvent struct{ Block *types.Block } | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ import ( | |||||||
| 	"math" | 	"math" | ||||||
| 	"math/big" | 	"math/big" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| ) | ) | ||||||
| @ -24,7 +25,7 @@ type Filter struct { | |||||||
| 
 | 
 | ||||||
| 	Altered []AccountChange | 	Altered []AccountChange | ||||||
| 
 | 
 | ||||||
| 	BlockCallback   func(*Block) | 	BlockCallback   func(*types.Block) | ||||||
| 	MessageCallback func(state.Messages) | 	MessageCallback func(state.Messages) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -171,11 +172,11 @@ func (self *Filter) FilterMessages(msgs []*state.Message) []*state.Message { | |||||||
| 	return messages | 	return messages | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *Filter) bloomFilter(block *Block) bool { | func (self *Filter) bloomFilter(block *types.Block) bool { | ||||||
| 	var fromIncluded, toIncluded bool | 	var fromIncluded, toIncluded bool | ||||||
| 	if len(self.from) > 0 { | 	if len(self.from) > 0 { | ||||||
| 		for _, from := range self.from { | 		for _, from := range self.from { | ||||||
| 			if BloomLookup(block.LogsBloom, from) { | 			if types.BloomLookup(block.LogsBloom, from) { | ||||||
| 				fromIncluded = true | 				fromIncluded = true | ||||||
| 				break | 				break | ||||||
| 			} | 			} | ||||||
| @ -186,7 +187,7 @@ func (self *Filter) bloomFilter(block *Block) bool { | |||||||
| 
 | 
 | ||||||
| 	if len(self.to) > 0 { | 	if len(self.to) > 0 { | ||||||
| 		for _, to := range self.to { | 		for _, to := range self.to { | ||||||
| 			if BloomLookup(block.LogsBloom, ethutil.U256(new(big.Int).Add(ethutil.Big1, ethutil.BigD(to))).Bytes()) { | 			if types.BloomLookup(block.LogsBloom, ethutil.U256(new(big.Int).Add(ethutil.Big1, ethutil.BigD(to))).Bytes()) { | ||||||
| 				toIncluded = true | 				toIncluded = true | ||||||
| 				break | 				break | ||||||
| 			} | 			} | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"math/big" | 	"math/big" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| 	"github.com/ethereum/go-ethereum/vm" | 	"github.com/ethereum/go-ethereum/vm" | ||||||
| ) | ) | ||||||
| @ -26,17 +27,17 @@ import ( | |||||||
|  */ |  */ | ||||||
| type StateTransition struct { | type StateTransition struct { | ||||||
| 	coinbase, receiver []byte | 	coinbase, receiver []byte | ||||||
| 	tx                 *Transaction | 	tx                 *types.Transaction | ||||||
| 	gas, gasPrice      *big.Int | 	gas, gasPrice      *big.Int | ||||||
| 	value              *big.Int | 	value              *big.Int | ||||||
| 	data               []byte | 	data               []byte | ||||||
| 	state              *state.State | 	state              *state.State | ||||||
| 	block              *Block | 	block              *types.Block | ||||||
| 
 | 
 | ||||||
| 	cb, rec, sen *state.StateObject | 	cb, rec, sen *state.StateObject | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewStateTransition(coinbase *state.StateObject, tx *Transaction, state *state.State, block *Block) *StateTransition { | func NewStateTransition(coinbase *state.StateObject, tx *types.Transaction, state *state.State, block *types.Block) *StateTransition { | ||||||
| 	return &StateTransition{coinbase.Address(), tx.Recipient, tx, new(big.Int), new(big.Int).Set(tx.GasPrice), tx.Value, tx.Data, state, block, coinbase, nil, nil} | 	return &StateTransition{coinbase.Address(), tx.Recipient, tx, new(big.Int), new(big.Int).Set(tx.GasPrice), tx.Value, tx.Data, state, block, coinbase, nil, nil} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -203,7 +204,7 @@ func (self *StateTransition) TransitionState() (err error) { | |||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	// Process the init code and create 'valid' contract
 | 	// Process the init code and create 'valid' contract
 | ||||||
| 	if IsContractAddr(self.receiver) { | 	if types.IsContractAddr(self.receiver) { | ||||||
| 		// 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.
 | ||||||
| @ -280,7 +281,7 @@ func (self *StateTransition) Eval(msg *state.Message, script []byte, context *st | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Converts an transaction in to a state object
 | // Converts an transaction in to a state object
 | ||||||
| func MakeContract(tx *Transaction, state *state.State) *state.StateObject { | func MakeContract(tx *types.Transaction, state *state.State) *state.StateObject { | ||||||
| 	addr := tx.CreationAddress(state) | 	addr := tx.CreationAddress(state) | ||||||
| 
 | 
 | ||||||
| 	contract := state.GetOrNewStateObject(addr) | 	contract := state.GetOrNewStateObject(addr) | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ import ( | |||||||
| 	"math/big" | 	"math/big" | ||||||
| 	"sync" | 	"sync" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| 	"github.com/ethereum/go-ethereum/wire" | 	"github.com/ethereum/go-ethereum/wire" | ||||||
| @ -16,7 +17,7 @@ var txplogger = logger.NewLogger("TXP") | |||||||
| 
 | 
 | ||||||
| const txPoolQueueSize = 50 | const txPoolQueueSize = 50 | ||||||
| 
 | 
 | ||||||
| type TxPoolHook chan *Transaction | type TxPoolHook chan *types.Transaction | ||||||
| type TxMsgTy byte | type TxMsgTy byte | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -26,21 +27,21 @@ const ( | |||||||
| var MinGasPrice = big.NewInt(10000000000000) | var MinGasPrice = big.NewInt(10000000000000) | ||||||
| 
 | 
 | ||||||
| type TxMsg struct { | type TxMsg struct { | ||||||
| 	Tx   *Transaction | 	Tx   *types.Transaction | ||||||
| 	Type TxMsgTy | 	Type TxMsgTy | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func EachTx(pool *list.List, it func(*Transaction, *list.Element) bool) { | func EachTx(pool *list.List, it func(*types.Transaction, *list.Element) bool) { | ||||||
| 	for e := pool.Front(); e != nil; e = e.Next() { | 	for e := pool.Front(); e != nil; e = e.Next() { | ||||||
| 		if it(e.Value.(*Transaction), e) { | 		if it(e.Value.(*types.Transaction), e) { | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func FindTx(pool *list.List, finder func(*Transaction, *list.Element) bool) *Transaction { | func FindTx(pool *list.List, finder func(*types.Transaction, *list.Element) bool) *types.Transaction { | ||||||
| 	for e := pool.Front(); e != nil; e = e.Next() { | 	for e := pool.Front(); e != nil; e = e.Next() { | ||||||
| 		if tx, ok := e.Value.(*Transaction); ok { | 		if tx, ok := e.Value.(*types.Transaction); ok { | ||||||
| 			if finder(tx, e) { | 			if finder(tx, e) { | ||||||
| 				return tx | 				return tx | ||||||
| 			} | 			} | ||||||
| @ -51,7 +52,7 @@ func FindTx(pool *list.List, finder func(*Transaction, *list.Element) bool) *Tra | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type TxProcessor interface { | type TxProcessor interface { | ||||||
| 	ProcessTransaction(tx *Transaction) | 	ProcessTransaction(tx *types.Transaction) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // The tx pool a thread safe transaction pool handler. In order to
 | // The tx pool a thread safe transaction pool handler. In order to
 | ||||||
| @ -65,7 +66,7 @@ type TxPool struct { | |||||||
| 	mutex sync.Mutex | 	mutex sync.Mutex | ||||||
| 	// Queueing channel for reading and writing incoming
 | 	// Queueing channel for reading and writing incoming
 | ||||||
| 	// transactions to
 | 	// transactions to
 | ||||||
| 	queueChan chan *Transaction | 	queueChan chan *types.Transaction | ||||||
| 	// Quiting channel
 | 	// Quiting channel
 | ||||||
| 	quit chan bool | 	quit chan bool | ||||||
| 	// The actual pool
 | 	// The actual pool
 | ||||||
| @ -79,14 +80,14 @@ type TxPool struct { | |||||||
| func NewTxPool(ethereum EthManager) *TxPool { | func NewTxPool(ethereum EthManager) *TxPool { | ||||||
| 	return &TxPool{ | 	return &TxPool{ | ||||||
| 		pool:      list.New(), | 		pool:      list.New(), | ||||||
| 		queueChan: make(chan *Transaction, txPoolQueueSize), | 		queueChan: make(chan *types.Transaction, txPoolQueueSize), | ||||||
| 		quit:      make(chan bool), | 		quit:      make(chan bool), | ||||||
| 		Ethereum:  ethereum, | 		Ethereum:  ethereum, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Blocking function. Don't use directly. Use QueueTransaction instead
 | // Blocking function. Don't use directly. Use QueueTransaction instead
 | ||||||
| func (pool *TxPool) addTransaction(tx *Transaction) { | func (pool *TxPool) addTransaction(tx *types.Transaction) { | ||||||
| 	pool.mutex.Lock() | 	pool.mutex.Lock() | ||||||
| 	defer pool.mutex.Unlock() | 	defer pool.mutex.Unlock() | ||||||
| 
 | 
 | ||||||
| @ -96,7 +97,7 @@ func (pool *TxPool) addTransaction(tx *Transaction) { | |||||||
| 	pool.Ethereum.Broadcast(wire.MsgTxTy, []interface{}{tx.RlpData()}) | 	pool.Ethereum.Broadcast(wire.MsgTxTy, []interface{}{tx.RlpData()}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (pool *TxPool) ValidateTransaction(tx *Transaction) error { | func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error { | ||||||
| 	// Get the last block so we can retrieve the sender and receiver from
 | 	// Get the last block so we can retrieve the sender and receiver from
 | ||||||
| 	// the merkle trie
 | 	// the merkle trie
 | ||||||
| 	block := pool.Ethereum.ChainManager().CurrentBlock | 	block := pool.Ethereum.ChainManager().CurrentBlock | ||||||
| @ -142,7 +143,7 @@ out: | |||||||
| 		select { | 		select { | ||||||
| 		case tx := <-pool.queueChan: | 		case tx := <-pool.queueChan: | ||||||
| 			hash := tx.Hash() | 			hash := tx.Hash() | ||||||
| 			foundTx := FindTx(pool.pool, func(tx *Transaction, e *list.Element) bool { | 			foundTx := FindTx(pool.pool, func(tx *types.Transaction, e *list.Element) bool { | ||||||
| 				return bytes.Compare(tx.Hash(), hash) == 0 | 				return bytes.Compare(tx.Hash(), hash) == 0 | ||||||
| 			}) | 			}) | ||||||
| 
 | 
 | ||||||
| @ -172,18 +173,18 @@ out: | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (pool *TxPool) QueueTransaction(tx *Transaction) { | func (pool *TxPool) QueueTransaction(tx *types.Transaction) { | ||||||
| 	pool.queueChan <- tx | 	pool.queueChan <- tx | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (pool *TxPool) CurrentTransactions() []*Transaction { | func (pool *TxPool) CurrentTransactions() []*types.Transaction { | ||||||
| 	pool.mutex.Lock() | 	pool.mutex.Lock() | ||||||
| 	defer pool.mutex.Unlock() | 	defer pool.mutex.Unlock() | ||||||
| 
 | 
 | ||||||
| 	txList := make([]*Transaction, pool.pool.Len()) | 	txList := make([]*types.Transaction, pool.pool.Len()) | ||||||
| 	i := 0 | 	i := 0 | ||||||
| 	for e := pool.pool.Front(); e != nil; e = e.Next() { | 	for e := pool.pool.Front(); e != nil; e = e.Next() { | ||||||
| 		tx := e.Value.(*Transaction) | 		tx := e.Value.(*types.Transaction) | ||||||
| 
 | 
 | ||||||
| 		txList[i] = tx | 		txList[i] = tx | ||||||
| 
 | 
 | ||||||
| @ -198,7 +199,7 @@ func (pool *TxPool) RemoveInvalid(state *state.State) { | |||||||
| 	defer pool.mutex.Unlock() | 	defer pool.mutex.Unlock() | ||||||
| 
 | 
 | ||||||
| 	for e := pool.pool.Front(); e != nil; e = e.Next() { | 	for e := pool.pool.Front(); e != nil; e = e.Next() { | ||||||
| 		tx := e.Value.(*Transaction) | 		tx := e.Value.(*types.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 { | ||||||
| @ -207,12 +208,12 @@ func (pool *TxPool) RemoveInvalid(state *state.State) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *TxPool) RemoveSet(txs Transactions) { | func (self *TxPool) RemoveSet(txs types.Transactions) { | ||||||
| 	self.mutex.Lock() | 	self.mutex.Lock() | ||||||
| 	defer self.mutex.Unlock() | 	defer self.mutex.Unlock() | ||||||
| 
 | 
 | ||||||
| 	for _, tx := range txs { | 	for _, tx := range txs { | ||||||
| 		EachTx(self.pool, func(t *Transaction, element *list.Element) bool { | 		EachTx(self.pool, func(t *types.Transaction, element *list.Element) bool { | ||||||
| 			if t == tx { | 			if t == tx { | ||||||
| 				self.pool.Remove(element) | 				self.pool.Remove(element) | ||||||
| 				return true // To stop the loop
 | 				return true // To stop the loop
 | ||||||
| @ -222,7 +223,7 @@ func (self *TxPool) RemoveSet(txs Transactions) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (pool *TxPool) Flush() []*Transaction { | func (pool *TxPool) Flush() []*types.Transaction { | ||||||
| 	txList := pool.CurrentTransactions() | 	txList := pool.CurrentTransactions() | ||||||
| 
 | 
 | ||||||
| 	// Recreate a new list all together
 | 	// Recreate a new list all together
 | ||||||
|  | |||||||
| @ -1 +0,0 @@ | |||||||
| package chain |  | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package chain | package types | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| @ -156,7 +156,7 @@ func (block *Block) State() *state.State { | |||||||
| 	return block.state | 	return block.state | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (block *Block) Transactions() []*Transaction { | func (block *Block) Transactions() Transactions { | ||||||
| 	return block.transactions | 	return block.transactions | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package chain | package types | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"math/big" | 	"math/big" | ||||||
| @ -1,7 +1,8 @@ | |||||||
| package chain | package types | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
							
								
								
									
										10
									
								
								chain/types/common.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								chain/types/common.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"math/big" | ||||||
|  | 	"github.com/ethereum/go-ethereum/state" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type BlockProcessor interface { | ||||||
|  | 	ProcessWithParent(*Block, *Block) (*big.Int, state.Messages, error) | ||||||
|  | } | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package chain | package types | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package chain | package types | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| @ -16,6 +16,10 @@ type Receipt struct { | |||||||
| 	logs              state.Logs | 	logs              state.Logs | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func NewReceipt(root []byte, cumalativeGasUsed *big.Int) *Receipt { | ||||||
|  | 	return &Receipt{PostState: ethutil.CopyBytes(root), CumulativeGasUsed: cumalativeGasUsed} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func NewRecieptFromValue(val *ethutil.Value) *Receipt { | func NewRecieptFromValue(val *ethutil.Value) *Receipt { | ||||||
| 	r := &Receipt{} | 	r := &Receipt{} | ||||||
| 	r.RlpValueDecode(val) | 	r.RlpValueDecode(val) | ||||||
| @ -23,6 +27,10 @@ func NewRecieptFromValue(val *ethutil.Value) *Receipt { | |||||||
| 	return r | 	return r | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (self *Receipt) SetLogs(logs state.Logs) { | ||||||
|  | 	self.logs = logs | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (self *Receipt) RlpValueDecode(decoder *ethutil.Value) { | func (self *Receipt) RlpValueDecode(decoder *ethutil.Value) { | ||||||
| 	self.PostState = decoder.Get(0).Bytes() | 	self.PostState = decoder.Get(0).Bytes() | ||||||
| 	self.CumulativeGasUsed = decoder.Get(1).BigInt() | 	self.CumulativeGasUsed = decoder.Get(1).BigInt() | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package chain | package types | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
							
								
								
									
										1
									
								
								chain/types/transaction_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								chain/types/transaction_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | package types | ||||||
| @ -3,17 +3,18 @@ package chain | |||||||
| import ( | import ( | ||||||
| 	"math/big" | 	"math/big" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| 	"github.com/ethereum/go-ethereum/vm" | 	"github.com/ethereum/go-ethereum/vm" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type VMEnv struct { | type VMEnv struct { | ||||||
| 	state *state.State | 	state *state.State | ||||||
| 	block *Block | 	block *types.Block | ||||||
| 	tx    *Transaction | 	tx    *types.Transaction | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewEnv(state *state.State, tx *Transaction, block *Block) *VMEnv { | func NewEnv(state *state.State, tx *types.Transaction, block *types.Block) *VMEnv { | ||||||
| 	return &VMEnv{ | 	return &VMEnv{ | ||||||
| 		state: state, | 		state: state, | ||||||
| 		block: block, | 		block: block, | ||||||
|  | |||||||
| @ -21,8 +21,7 @@ import ( | |||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"os" | 	"os" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 
 | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/chain" |  | ||||||
| 	"github.com/ethereum/go-ethereum/cmd/utils" | 	"github.com/ethereum/go-ethereum/cmd/utils" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| @ -106,7 +105,7 @@ func (self *Gui) DumpState(hash, path string) { | |||||||
| 	if len(hash) == 0 { | 	if len(hash) == 0 { | ||||||
| 		stateDump = self.eth.BlockManager().CurrentState().Dump() | 		stateDump = self.eth.BlockManager().CurrentState().Dump() | ||||||
| 	} else { | 	} else { | ||||||
| 		var block *chain.Block | 		var block *types.Block | ||||||
| 		if hash[0] == '#' { | 		if hash[0] == '#' { | ||||||
| 			i, _ := strconv.Atoi(hash[1:]) | 			i, _ := strconv.Atoi(hash[1:]) | ||||||
| 			block = self.eth.ChainManager().GetBlockByNumber(uint64(i)) | 			block = self.eth.ChainManager().GetBlockByNumber(uint64(i)) | ||||||
|  | |||||||
| @ -21,6 +21,7 @@ import ( | |||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/chain" | 	"github.com/ethereum/go-ethereum/chain" | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/event" | 	"github.com/ethereum/go-ethereum/event" | ||||||
| 	"github.com/ethereum/go-ethereum/javascript" | 	"github.com/ethereum/go-ethereum/javascript" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| @ -36,7 +37,7 @@ type AppContainer interface { | |||||||
| 	Window() *qml.Window | 	Window() *qml.Window | ||||||
| 	Engine() *qml.Engine | 	Engine() *qml.Engine | ||||||
| 
 | 
 | ||||||
| 	NewBlock(*chain.Block) | 	NewBlock(*types.Block) | ||||||
| 	NewWatcher(chan bool) | 	NewWatcher(chan bool) | ||||||
| 	Messages(state.Messages, string) | 	Messages(state.Messages, string) | ||||||
| 	Post(string, int) | 	Post(string, int) | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum" | 	"github.com/ethereum/go-ethereum" | ||||||
| 	"github.com/ethereum/go-ethereum/chain" | 	"github.com/ethereum/go-ethereum/chain" | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| @ -290,7 +291,7 @@ func (self *Gui) loadMergedMiningOptions() { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (gui *Gui) insertTransaction(window string, tx *chain.Transaction) { | func (gui *Gui) insertTransaction(window string, tx *types.Transaction) { | ||||||
| 	pipe := xeth.New(gui.eth) | 	pipe := xeth.New(gui.eth) | ||||||
| 	nameReg := pipe.World().Config().Get("NameReg") | 	nameReg := pipe.World().Config().Get("NameReg") | ||||||
| 	addr := gui.address() | 	addr := gui.address() | ||||||
| @ -340,7 +341,7 @@ func (gui *Gui) insertTransaction(window string, tx *chain.Transaction) { | |||||||
| func (gui *Gui) readPreviousTransactions() { | func (gui *Gui) readPreviousTransactions() { | ||||||
| 	it := gui.txDb.NewIterator() | 	it := gui.txDb.NewIterator() | ||||||
| 	for it.Next() { | 	for it.Next() { | ||||||
| 		tx := chain.NewTransactionFromBytes(it.Value()) | 		tx := types.NewTransactionFromBytes(it.Value()) | ||||||
| 
 | 
 | ||||||
| 		gui.insertTransaction("post", tx) | 		gui.insertTransaction("post", tx) | ||||||
| 
 | 
 | ||||||
| @ -348,7 +349,7 @@ func (gui *Gui) readPreviousTransactions() { | |||||||
| 	it.Release() | 	it.Release() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (gui *Gui) processBlock(block *chain.Block, initial bool) { | func (gui *Gui) processBlock(block *types.Block, initial bool) { | ||||||
| 	name := strings.Trim(gui.pipe.World().Config().Get("NameReg").Storage(block.Coinbase).Str(), "\x00") | 	name := strings.Trim(gui.pipe.World().Config().Get("NameReg").Storage(block.Coinbase).Str(), "\x00") | ||||||
| 	b := xeth.NewJSBlock(block) | 	b := xeth.NewJSBlock(block) | ||||||
| 	b.Name = name | 	b.Name = name | ||||||
|  | |||||||
| @ -26,8 +26,7 @@ import ( | |||||||
| 	"os" | 	"os" | ||||||
| 	"path" | 	"path" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 
 | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/chain" |  | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/javascript" | 	"github.com/ethereum/go-ethereum/javascript" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| @ -138,7 +137,7 @@ func (app *HtmlApplication) Window() *qml.Window { | |||||||
| 	return app.win | 	return app.win | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (app *HtmlApplication) NewBlock(block *chain.Block) { | func (app *HtmlApplication) NewBlock(block *types.Block) { | ||||||
| 	b := &xeth.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())} | 	b := &xeth.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())} | ||||||
| 	app.webView.Call("onNewBlockCb", b) | 	app.webView.Call("onNewBlockCb", b) | ||||||
| } | } | ||||||
|  | |||||||
| @ -20,8 +20,7 @@ package main | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"runtime" | 	"runtime" | ||||||
| 
 | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/chain" |  | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| 	"github.com/ethereum/go-ethereum/xeth" | 	"github.com/ethereum/go-ethereum/xeth" | ||||||
| @ -65,7 +64,7 @@ func (app *QmlApplication) NewWatcher(quitChan chan bool) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Events
 | // Events
 | ||||||
| func (app *QmlApplication) NewBlock(block *chain.Block) { | func (app *QmlApplication) NewBlock(block *types.Block) { | ||||||
| 	pblock := &xeth.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())} | 	pblock := &xeth.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())} | ||||||
| 	app.win.Call("onNewBlockCb", pblock) | 	app.win.Call("onNewBlockCb", pblock) | ||||||
| } | } | ||||||
|  | |||||||
| @ -26,6 +26,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum" | 	"github.com/ethereum/go-ethereum" | ||||||
| 	"github.com/ethereum/go-ethereum/chain" | 	"github.com/ethereum/go-ethereum/chain" | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/javascript" | 	"github.com/ethereum/go-ethereum/javascript" | ||||||
| @ -126,7 +127,7 @@ func (self *UiLib) PastPeers() *ethutil.List { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *UiLib) ImportTx(rlpTx string) { | func (self *UiLib) ImportTx(rlpTx string) { | ||||||
| 	tx := chain.NewTransactionFromBytes(ethutil.Hex2Bytes(rlpTx)) | 	tx := types.NewTransactionFromBytes(ethutil.Hex2Bytes(rlpTx)) | ||||||
| 	self.eth.TxPool().QueueTransaction(tx) | 	self.eth.TxPool().QueueTransaction(tx) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -228,7 +229,7 @@ func (self *UiLib) NewFilter(object map[string]interface{}) (id int) { | |||||||
| 
 | 
 | ||||||
| func (self *UiLib) NewFilterString(typ string) (id int) { | func (self *UiLib) NewFilterString(typ string) (id int) { | ||||||
| 	filter := chain.NewFilter(self.eth) | 	filter := chain.NewFilter(self.eth) | ||||||
| 	filter.BlockCallback = func(block *chain.Block) { | 	filter.BlockCallback = func(block *types.Block) { | ||||||
| 		if self.win != nil && self.win.Root() != nil { | 		if self.win != nil && self.win.Root() != nil { | ||||||
| 			self.win.Root().Call("invokeFilterCallback", "{}", id) | 			self.win.Root().Call("invokeFilterCallback", "{}", id) | ||||||
| 		} else { | 		} else { | ||||||
|  | |||||||
| @ -2,21 +2,20 @@ package utils | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"math/big" | 	"math/big" | ||||||
| 
 | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/chain" |  | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| 	"github.com/ethereum/go-ethereum/vm" | 	"github.com/ethereum/go-ethereum/vm" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type VMEnv struct { | type VMEnv struct { | ||||||
| 	state *state.State | 	state *state.State | ||||||
| 	block *chain.Block | 	block *types.Block | ||||||
| 
 | 
 | ||||||
| 	transactor []byte | 	transactor []byte | ||||||
| 	value      *big.Int | 	value      *big.Int | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewEnv(state *state.State, block *chain.Block, transactor []byte, value *big.Int) *VMEnv { | func NewEnv(state *state.State, block *types.Block, transactor []byte, value *big.Int) *VMEnv { | ||||||
| 	return &VMEnv{ | 	return &VMEnv{ | ||||||
| 		state:      state, | 		state:      state, | ||||||
| 		block:      block, | 		block:      block, | ||||||
|  | |||||||
| @ -129,8 +129,9 @@ func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *cr | |||||||
| 
 | 
 | ||||||
| 	ethereum.blockPool = NewBlockPool(ethereum) | 	ethereum.blockPool = NewBlockPool(ethereum) | ||||||
| 	ethereum.txPool = chain.NewTxPool(ethereum) | 	ethereum.txPool = chain.NewTxPool(ethereum) | ||||||
| 	ethereum.blockChain = chain.NewChainManager(ethereum) | 	ethereum.blockChain = chain.NewChainManager() | ||||||
| 	ethereum.blockManager = chain.NewBlockManager(ethereum) | 	ethereum.blockManager = chain.NewBlockManager(ethereum) | ||||||
|  | 	ethereum.blockChain.SetProcessor(ethereum.blockManager) | ||||||
| 
 | 
 | ||||||
| 	// Start the tx pool
 | 	// Start the tx pool
 | ||||||
| 	ethereum.txPool.Start() | 	ethereum.txPool.Start() | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum" | 	"github.com/ethereum/go-ethereum" | ||||||
| 	"github.com/ethereum/go-ethereum/chain" | 	"github.com/ethereum/go-ethereum/chain" | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/cmd/utils" | 	"github.com/ethereum/go-ethereum/cmd/utils" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/event" | 	"github.com/ethereum/go-ethereum/event" | ||||||
| @ -130,7 +131,7 @@ func (self *JSRE) dump(call otto.FunctionCall) otto.Value { | |||||||
| 	var state *state.State | 	var state *state.State | ||||||
| 
 | 
 | ||||||
| 	if len(call.ArgumentList) > 0 { | 	if len(call.ArgumentList) > 0 { | ||||||
| 		var block *chain.Block | 		var block *types.Block | ||||||
| 		if call.Argument(0).IsNumber() { | 		if call.Argument(0).IsNumber() { | ||||||
| 			num, _ := call.Argument(0).ToInteger() | 			num, _ := call.Argument(0).ToInteger() | ||||||
| 			block = self.ethereum.ChainManager().GetBlockByNumber(uint64(num)) | 			block = self.ethereum.ChainManager().GetBlockByNumber(uint64(num)) | ||||||
|  | |||||||
| @ -31,6 +31,7 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/chain" | 	"github.com/ethereum/go-ethereum/chain" | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/event" | 	"github.com/ethereum/go-ethereum/event" | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| 	"github.com/ethereum/go-ethereum/wire" | 	"github.com/ethereum/go-ethereum/wire" | ||||||
| @ -44,7 +45,7 @@ type LocalTx struct { | |||||||
| 	Value    string `json:"value"` | 	Value    string `json:"value"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *LocalTx) Sign(key []byte) *chain.Transaction { | func (self *LocalTx) Sign(key []byte) *types.Transaction { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -54,7 +55,7 @@ type Miner struct { | |||||||
| 	eth    *eth.Ethereum | 	eth    *eth.Ethereum | ||||||
| 	events event.Subscription | 	events event.Subscription | ||||||
| 
 | 
 | ||||||
| 	uncles    chain.Blocks | 	uncles    types.Blocks | ||||||
| 	localTxs  map[int]*LocalTx | 	localTxs  map[int]*LocalTx | ||||||
| 	localTxId int | 	localTxId int | ||||||
| 
 | 
 | ||||||
| @ -212,7 +213,7 @@ func (self *Miner) mine() { | |||||||
| 	nonce := self.pow.Search(block, self.powQuitCh) | 	nonce := self.pow.Search(block, self.powQuitCh) | ||||||
| 	if nonce != nil { | 	if nonce != nil { | ||||||
| 		block.Nonce = nonce | 		block.Nonce = nonce | ||||||
| 		lchain := chain.NewChain(chain.Blocks{block}) | 		lchain := chain.NewChain(types.Blocks{block}) | ||||||
| 		_, err := chainMan.TestChain(lchain) | 		_, err := chainMan.TestChain(lchain) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			minerlogger.Infoln(err) | 			minerlogger.Infoln(err) | ||||||
| @ -229,15 +230,15 @@ func (self *Miner) mine() { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *Miner) finiliseTxs() chain.Transactions { | func (self *Miner) finiliseTxs() types.Transactions { | ||||||
| 	// Sort the transactions by nonce in case of odd network propagation
 | 	// Sort the transactions by nonce in case of odd network propagation
 | ||||||
| 	var txs chain.Transactions | 	var txs types.Transactions | ||||||
| 
 | 
 | ||||||
| 	state := self.eth.BlockManager().TransState() | 	state := self.eth.BlockManager().TransState() | ||||||
| 	// XXX This has to change. Coinbase is, for new, same as key.
 | 	// XXX This has to change. Coinbase is, for new, same as key.
 | ||||||
| 	key := self.eth.KeyManager() | 	key := self.eth.KeyManager() | ||||||
| 	for _, ltx := range self.localTxs { | 	for _, ltx := range self.localTxs { | ||||||
| 		tx := chain.NewTransactionMessage(ltx.To, ethutil.Big(ltx.Value), ethutil.Big(ltx.Gas), ethutil.Big(ltx.GasPrice), ltx.Data) | 		tx := types.NewTransactionMessage(ltx.To, ethutil.Big(ltx.Value), ethutil.Big(ltx.Gas), ethutil.Big(ltx.GasPrice), ltx.Data) | ||||||
| 		tx.Nonce = state.GetNonce(self.Coinbase) | 		tx.Nonce = state.GetNonce(self.Coinbase) | ||||||
| 		state.SetNonce(self.Coinbase, tx.Nonce+1) | 		state.SetNonce(self.Coinbase, tx.Nonce+1) | ||||||
| 
 | 
 | ||||||
| @ -247,7 +248,7 @@ func (self *Miner) finiliseTxs() chain.Transactions { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	txs = append(txs, self.eth.TxPool().CurrentTransactions()...) | 	txs = append(txs, self.eth.TxPool().CurrentTransactions()...) | ||||||
| 	sort.Sort(chain.TxByNonce{txs}) | 	sort.Sort(types.TxByNonce{txs}) | ||||||
| 
 | 
 | ||||||
| 	return txs | 	return txs | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								peer.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								peer.go
									
									
									
									
									
								
							| @ -11,8 +11,7 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync/atomic" | 	"sync/atomic" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/chain" |  | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| 	"github.com/ethereum/go-ethereum/wire" | 	"github.com/ethereum/go-ethereum/wire" | ||||||
| @ -155,7 +154,7 @@ type Peer struct { | |||||||
| 	pingTime      time.Duration | 	pingTime      time.Duration | ||||||
| 	pingStartTime time.Time | 	pingStartTime time.Time | ||||||
| 
 | 
 | ||||||
| 	lastRequestedBlock *chain.Block | 	lastRequestedBlock *types.Block | ||||||
| 
 | 
 | ||||||
| 	protocolCaps *ethutil.Value | 	protocolCaps *ethutil.Value | ||||||
| } | } | ||||||
| @ -429,7 +428,7 @@ func (p *Peer) HandleInbound() { | |||||||
| 				// in the TxPool where it will undergo validation and
 | 				// in the TxPool where it will undergo validation and
 | ||||||
| 				// processing when a new block is found
 | 				// processing when a new block is found
 | ||||||
| 				for i := 0; i < msg.Data.Len(); i++ { | 				for i := 0; i < msg.Data.Len(); i++ { | ||||||
| 					tx := chain.NewTransactionFromValue(msg.Data.Get(i)) | 					tx := types.NewTransactionFromValue(msg.Data.Get(i)) | ||||||
| 					p.ethereum.TxPool().QueueTransaction(tx) | 					p.ethereum.TxPool().QueueTransaction(tx) | ||||||
| 				} | 				} | ||||||
| 			case wire.MsgGetPeersTy: | 			case wire.MsgGetPeersTy: | ||||||
| @ -535,7 +534,7 @@ func (p *Peer) HandleInbound() { | |||||||
| 
 | 
 | ||||||
| 					it := msg.Data.NewIterator() | 					it := msg.Data.NewIterator() | ||||||
| 					for it.Next() { | 					for it.Next() { | ||||||
| 						block := chain.NewBlockFromRlpValue(it.Value()) | 						block := types.NewBlockFromRlpValue(it.Value()) | ||||||
| 						blockPool.Add(block, p) | 						blockPool.Add(block, p) | ||||||
| 
 | 
 | ||||||
| 						p.lastBlockReceived = time.Now() | 						p.lastBlockReceived = time.Now() | ||||||
| @ -543,7 +542,7 @@ func (p *Peer) HandleInbound() { | |||||||
| 				case wire.MsgNewBlockTy: | 				case wire.MsgNewBlockTy: | ||||||
| 					var ( | 					var ( | ||||||
| 						blockPool = p.ethereum.blockPool | 						blockPool = p.ethereum.blockPool | ||||||
| 						block     = chain.NewBlockFromRlpValue(msg.Data.Get(0)) | 						block     = types.NewBlockFromRlpValue(msg.Data.Get(0)) | ||||||
| 						td        = msg.Data.Get(1).BigInt() | 						td        = msg.Data.Get(1).BigInt() | ||||||
| 					) | 					) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ import ( | |||||||
| 	"sync/atomic" | 	"sync/atomic" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/chain" | 	"github.com/ethereum/go-ethereum/chain" | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| @ -209,7 +210,7 @@ func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr | |||||||
| 		gas      = ethutil.Big(gasStr) | 		gas      = ethutil.Big(gasStr) | ||||||
| 		gasPrice = ethutil.Big(gasPriceStr) | 		gasPrice = ethutil.Big(gasPriceStr) | ||||||
| 		data     []byte | 		data     []byte | ||||||
| 		tx       *chain.Transaction | 		tx       *types.Transaction | ||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
| 	if ethutil.IsHex(codeStr) { | 	if ethutil.IsHex(codeStr) { | ||||||
| @ -219,9 +220,9 @@ func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if contractCreation { | 	if contractCreation { | ||||||
| 		tx = chain.NewContractCreationTx(value, gas, gasPrice, data) | 		tx = types.NewContractCreationTx(value, gas, gasPrice, data) | ||||||
| 	} else { | 	} else { | ||||||
| 		tx = chain.NewTransactionMessage(hash, value, gas, gasPrice, data) | 		tx = types.NewTransactionMessage(hash, value, gas, gasPrice, data) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	acc := self.obj.BlockManager().TransState().GetOrNewStateObject(keyPair.Address()) | 	acc := self.obj.BlockManager().TransState().GetOrNewStateObject(keyPair.Address()) | ||||||
| @ -240,7 +241,7 @@ func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *JSXEth) PushTx(txStr string) (*JSReceipt, error) { | func (self *JSXEth) PushTx(txStr string) (*JSReceipt, error) { | ||||||
| 	tx := chain.NewTransactionFromBytes(ethutil.Hex2Bytes(txStr)) | 	tx := types.NewTransactionFromBytes(ethutil.Hex2Bytes(txStr)) | ||||||
| 	self.obj.TxPool().QueueTransaction(tx) | 	self.obj.TxPool().QueueTransaction(tx) | ||||||
| 	return NewJSReciept(tx.CreatesContract(), tx.CreationAddress(self.World().State()), tx.Hash(), tx.Sender()), nil | 	return NewJSReciept(tx.CreatesContract(), tx.CreationAddress(self.World().State()), tx.Hash(), tx.Sender()), nil | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/chain" | 	"github.com/ethereum/go-ethereum/chain" | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| @ -14,7 +15,7 @@ import ( | |||||||
| // Block interface exposed to QML
 | // Block interface exposed to QML
 | ||||||
| type JSBlock struct { | type JSBlock struct { | ||||||
| 	//Transactions string `json:"transactions"`
 | 	//Transactions string `json:"transactions"`
 | ||||||
| 	ref          *chain.Block | 	ref          *types.Block | ||||||
| 	Size         string        `json:"size"` | 	Size         string        `json:"size"` | ||||||
| 	Number       int           `json:"number"` | 	Number       int           `json:"number"` | ||||||
| 	Hash         string        `json:"hash"` | 	Hash         string        `json:"hash"` | ||||||
| @ -31,7 +32,7 @@ type JSBlock struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Creates a new QML Block from a chain block
 | // Creates a new QML Block from a chain block
 | ||||||
| func NewJSBlock(block *chain.Block) *JSBlock { | func NewJSBlock(block *types.Block) *JSBlock { | ||||||
| 	if block == nil { | 	if block == nil { | ||||||
| 		return &JSBlock{} | 		return &JSBlock{} | ||||||
| 	} | 	} | ||||||
| @ -79,7 +80,7 @@ func (self *JSBlock) GetTransaction(hash string) *JSTransaction { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type JSTransaction struct { | type JSTransaction struct { | ||||||
| 	ref *chain.Transaction | 	ref *types.Transaction | ||||||
| 
 | 
 | ||||||
| 	Value           string `json:"value"` | 	Value           string `json:"value"` | ||||||
| 	Gas             string `json:"gas"` | 	Gas             string `json:"gas"` | ||||||
| @ -94,7 +95,7 @@ type JSTransaction struct { | |||||||
| 	Confirmations   int    `json:"confirmations"` | 	Confirmations   int    `json:"confirmations"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewJSTx(tx *chain.Transaction, state *state.State) *JSTransaction { | func NewJSTx(tx *types.Transaction, state *state.State) *JSTransaction { | ||||||
| 	hash := ethutil.Bytes2Hex(tx.Hash()) | 	hash := ethutil.Bytes2Hex(tx.Hash()) | ||||||
| 	receiver := ethutil.Bytes2Hex(tx.Recipient) | 	receiver := ethutil.Bytes2Hex(tx.Recipient) | ||||||
| 	if receiver == "0000000000000000000000000000000000000000" { | 	if receiver == "0000000000000000000000000000000000000000" { | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								xeth/pipe.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								xeth/pipe.go
									
									
									
									
									
								
							| @ -9,6 +9,7 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/chain" | 	"github.com/ethereum/go-ethereum/chain" | ||||||
|  | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/ethutil" | 	"github.com/ethereum/go-ethereum/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/logger" | 	"github.com/ethereum/go-ethereum/logger" | ||||||
| @ -72,7 +73,7 @@ func (self *XEth) ExecuteObject(object *Object, data []byte, value, gas, price * | |||||||
| 	return ret, err | 	return ret, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *XEth) Block(hash []byte) *chain.Block { | func (self *XEth) Block(hash []byte) *types.Block { | ||||||
| 	return self.blockChain.GetBlock(hash) | 	return self.blockChain.GetBlock(hash) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -115,7 +116,7 @@ func (self *XEth) Transact(key *crypto.KeyPair, rec []byte, value, gas, price *e | |||||||
| 		contractCreation = true | 		contractCreation = true | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var tx *chain.Transaction | 	var tx *types.Transaction | ||||||
| 	// Compile and assemble the given data
 | 	// Compile and assemble the given data
 | ||||||
| 	if contractCreation { | 	if contractCreation { | ||||||
| 		script, err := ethutil.Compile(string(data), false) | 		script, err := ethutil.Compile(string(data), false) | ||||||
| @ -123,7 +124,7 @@ func (self *XEth) Transact(key *crypto.KeyPair, rec []byte, value, gas, price *e | |||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		tx = chain.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), script) | 		tx = types.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), script) | ||||||
| 	} else { | 	} else { | ||||||
| 		data := ethutil.StringToByteFunc(string(data), func(s string) (ret []byte) { | 		data := ethutil.StringToByteFunc(string(data), func(s string) (ret []byte) { | ||||||
| 			slice := strings.Split(s, "\n") | 			slice := strings.Split(s, "\n") | ||||||
| @ -134,7 +135,7 @@ func (self *XEth) Transact(key *crypto.KeyPair, rec []byte, value, gas, price *e | |||||||
| 			return | 			return | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
| 		tx = chain.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data) | 		tx = types.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	acc := self.blockManager.TransState().GetOrNewStateObject(key.Address()) | 	acc := self.blockManager.TransState().GetOrNewStateObject(key.Address()) | ||||||
| @ -155,7 +156,7 @@ func (self *XEth) Transact(key *crypto.KeyPair, rec []byte, value, gas, price *e | |||||||
| 	return tx.Hash(), nil | 	return tx.Hash(), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *XEth) PushTx(tx *chain.Transaction) ([]byte, error) { | func (self *XEth) PushTx(tx *types.Transaction) ([]byte, error) { | ||||||
| 	self.obj.TxPool().QueueTransaction(tx) | 	self.obj.TxPool().QueueTransaction(tx) | ||||||
| 	if tx.Recipient == nil { | 	if tx.Recipient == nil { | ||||||
| 		addr := tx.CreationAddress(self.World().State()) | 		addr := tx.CreationAddress(self.World().State()) | ||||||
|  | |||||||
| @ -2,20 +2,19 @@ package xeth | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"math/big" | 	"math/big" | ||||||
| 
 | 	"github.com/ethereum/go-ethereum/chain/types" | ||||||
| 	"github.com/ethereum/go-ethereum/chain" |  | ||||||
| 	"github.com/ethereum/go-ethereum/state" | 	"github.com/ethereum/go-ethereum/state" | ||||||
| 	"github.com/ethereum/go-ethereum/vm" | 	"github.com/ethereum/go-ethereum/vm" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type VMEnv struct { | type VMEnv struct { | ||||||
| 	state  *state.State | 	state  *state.State | ||||||
| 	block  *chain.Block | 	block  *types.Block | ||||||
| 	value  *big.Int | 	value  *big.Int | ||||||
| 	sender []byte | 	sender []byte | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewEnv(state *state.State, block *chain.Block, value *big.Int, sender []byte) *VMEnv { | func NewEnv(state *state.State, block *types.Block, value *big.Int, sender []byte) *VMEnv { | ||||||
| 	return &VMEnv{ | 	return &VMEnv{ | ||||||
| 		state:  state, | 		state:  state, | ||||||
| 		block:  block, | 		block:  block, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user