|
|
@ -1,21 +1,26 @@ |
|
|
|
|
|
|
|
|
|
|
|
// Blocks, blocks will have transactions.
|
|
|
|
|
|
|
|
// Transactions/contracts are updated in goroutines
|
|
|
|
|
|
|
|
// Each contract should send a message on a channel with usage statistics
|
|
|
|
|
|
|
|
// The statics can be used for fee calculation within the block update method
|
|
|
|
|
|
|
|
// Statistics{transaction, /* integers */ normal_ops, store_load, extro_balance, crypto, steps}
|
|
|
|
|
|
|
|
// The block updater will wait for all goroutines to be finished and update the block accordingly
|
|
|
|
|
|
|
|
// in one go and should use minimal IO overhead.
|
|
|
|
|
|
|
|
// The actual block updating will happen within a goroutine as well so normal operation may continue
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package main |
|
|
|
package main |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"fmt" |
|
|
|
"fmt" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type BlockChain struct { |
|
|
|
|
|
|
|
lastBlock *Block |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
genesisBlock *Block |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func NewBlockChain() *BlockChain { |
|
|
|
|
|
|
|
bc := &BlockChain{} |
|
|
|
|
|
|
|
bc.genesisBlock = NewBlock( Encode(Genesis) ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return bc |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
type BlockManager struct { |
|
|
|
type BlockManager struct { |
|
|
|
vm *Vm |
|
|
|
vm *Vm |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
blockChain *BlockChain |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func NewBlockManager() *BlockManager { |
|
|
|
func NewBlockManager() *BlockManager { |
|
|
@ -26,6 +31,11 @@ func NewBlockManager() *BlockManager { |
|
|
|
|
|
|
|
|
|
|
|
// Process a block.
|
|
|
|
// Process a block.
|
|
|
|
func (bm *BlockManager) ProcessBlock(block *Block) error { |
|
|
|
func (bm *BlockManager) ProcessBlock(block *Block) error { |
|
|
|
|
|
|
|
// TODO Validation (Or move to other part of the application)
|
|
|
|
|
|
|
|
if err := bm.ValidateBlock(block); err != nil { |
|
|
|
|
|
|
|
return err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Get the tx count. Used to create enough channels to 'join' the go routines
|
|
|
|
// Get the tx count. Used to create enough channels to 'join' the go routines
|
|
|
|
txCount := len(block.transactions) |
|
|
|
txCount := len(block.transactions) |
|
|
|
// Locking channel. When it has been fully buffered this method will return
|
|
|
|
// Locking channel. When it has been fully buffered this method will return
|
|
|
@ -50,6 +60,10 @@ func (bm *BlockManager) ProcessBlock(block *Block) error { |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (bm *BlockManager) ValidateBlock(block *Block) error { |
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (bm *BlockManager) ProcessContract(tx *Transaction, block *Block, lockChan chan bool) { |
|
|
|
func (bm *BlockManager) ProcessContract(tx *Transaction, block *Block, lockChan chan bool) { |
|
|
|
// Recovering function in case the VM had any errors
|
|
|
|
// Recovering function in case the VM had any errors
|
|
|
|
defer func() { |
|
|
|
defer func() { |
|
|
|