Commit 055407c8 authored by obscuren's avatar obscuren

VM Recovery

parent 78d18b13
......@@ -11,7 +11,7 @@
package main
import (
_"fmt"
"fmt"
)
type BlockManager struct {
......@@ -33,7 +33,13 @@ func (bm *BlockManager) ProcessBlock(block *Block) error {
// Process each transaction/contract
for _, tx := range block.transactions {
go bm.ProcessTransaction(tx, block, lockChan)
// If there's no recipient, it's a contract
if tx.recipient == "" {
go bm.ProcessContract(tx, block, lockChan)
} else {
// "finish" tx which isn't a contract
lockChan <- true
}
}
// Wait for all Tx to finish processing
......@@ -44,8 +50,18 @@ func (bm *BlockManager) ProcessBlock(block *Block) error {
return nil
}
func (bm *BlockManager) ProcessTransaction(tx *Transaction, block *Block, lockChan chan bool) {
bm.vm.RunTransaction(tx, block, func(opType OpType) bool {
func (bm *BlockManager) ProcessContract(tx *Transaction, block *Block, lockChan chan bool) {
// Recovering function in case the VM had any errors
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from VM execution with err =", r)
// Let the channel know where done even though it failed (so the execution may resume normally)
lockChan <- true
}
}()
// Process contract
bm.vm.ProcContract(tx, block, func(opType OpType) bool {
// TODO calculate fees
return true // Continue
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment