|
|
@ -64,10 +64,7 @@ type Vm struct { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func NewVm() *Vm { |
|
|
|
func NewVm() *Vm { |
|
|
|
fmt.Println("init Ethereum VM") |
|
|
|
//stackSize := uint(256)
|
|
|
|
|
|
|
|
|
|
|
|
stackSize := uint(256) |
|
|
|
|
|
|
|
fmt.Println("stack size =", stackSize) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return &Vm{ |
|
|
|
return &Vm{ |
|
|
|
stack: make(map[string]string), |
|
|
|
stack: make(map[string]string), |
|
|
@ -76,10 +73,12 @@ func NewVm() *Vm { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (vm *Vm) RunTransaction(tx *Transaction, cb TxCallback) { |
|
|
|
func (vm *Vm) RunTransaction(tx *Transaction, cb TxCallback) { |
|
|
|
|
|
|
|
if Debug { |
|
|
|
fmt.Printf(` |
|
|
|
fmt.Printf(` |
|
|
|
# processing Tx (%v) |
|
|
|
# processing Tx (%v) |
|
|
|
# fee = %f, ops = %d, sender = %s, value = %d |
|
|
|
# fee = %f, ops = %d, sender = %s, value = %d |
|
|
|
`, tx.addr, float32(tx.fee) / 1e8, len(tx.data), tx.sender, tx.value) |
|
|
|
`, tx.addr, float32(tx.fee) / 1e8, len(tx.data), tx.sender, tx.value) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
vm.stack = make(map[string]string) |
|
|
|
vm.stack = make(map[string]string) |
|
|
|
vm.stack["0"] = tx.sender |
|
|
|
vm.stack["0"] = tx.sender |
|
|
@ -102,7 +101,9 @@ out: |
|
|
|
// XXX Should Instr return big int slice instead of string slice?
|
|
|
|
// XXX Should Instr return big int slice instead of string slice?
|
|
|
|
op, args, _ := Instr(tx.data[stPtr]) |
|
|
|
op, args, _ := Instr(tx.data[stPtr]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if Debug { |
|
|
|
fmt.Printf("%-3d %d %v\n", stPtr, op, args) |
|
|
|
fmt.Printf("%-3d %d %v\n", stPtr, op, args) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
opType := OpType(tNorm) |
|
|
|
opType := OpType(tNorm) |
|
|
|
// Determine the op type (used for calculating fees by the block manager)
|
|
|
|
// Determine the op type (used for calculating fees by the block manager)
|
|
|
@ -178,8 +179,7 @@ out: |
|
|
|
stPtr++ |
|
|
|
stPtr++ |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
stPtr = nptr |
|
|
|
stPtr = nptr |
|
|
|
fmt.Println("... JMP", nptr, "...") |
|
|
|
if Debug { fmt.Println("... JMP", nptr, "...") } |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
fmt.Println("# finished processing Tx\n") |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|