diff options
author | obscuren <geffobscura@gmail.com> | 2014-07-10 23:58:16 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-07-10 23:58:16 +0800 |
commit | 04561c4ddc363189bdb7377a271d6a734f09eae1 (patch) | |
tree | 0c2bc6ac9b5ef3563b527ab4bd2da9bba7f4ea47 /ethchain/vm.go | |
parent | 9688ebef523fdd368f7d0596f4529b7e3bc26775 (diff) | |
download | dexon-04561c4ddc363189bdb7377a271d6a734f09eae1.tar dexon-04561c4ddc363189bdb7377a271d6a734f09eae1.tar.gz dexon-04561c4ddc363189bdb7377a271d6a734f09eae1.tar.bz2 dexon-04561c4ddc363189bdb7377a271d6a734f09eae1.tar.lz dexon-04561c4ddc363189bdb7377a271d6a734f09eae1.tar.xz dexon-04561c4ddc363189bdb7377a271d6a734f09eae1.tar.zst dexon-04561c4ddc363189bdb7377a271d6a734f09eae1.zip |
Updated VM & added helper methods to state
* VM BALANCE opcode updated to pop 1 item and use that to retrieve the
address' balance
* GetBalance and GetNonce on state that'll always return something valid
Diffstat (limited to 'ethchain/vm.go')
-rw-r--r-- | ethchain/vm.go | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/ethchain/vm.go b/ethchain/vm.go index c63b5392f..f57d6a751 100644 --- a/ethchain/vm.go +++ b/ethchain/vm.go @@ -452,13 +452,26 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) { data := ethcrypto.Sha3Bin(mem.Get(offset.Int64(), size.Int64())) stack.Push(ethutil.BigD(data)) + + vm.Printf(" => %x", data) // 0x30 range case ADDRESS: stack.Push(ethutil.BigD(closure.Object().Address())) + + vm.Printf(" => %x", closure.Object().Address()) case BALANCE: - stack.Push(closure.object.Amount) + require(1) + + addr := stack.Pop().Bytes() + balance := vm.state.GetBalance(addr) + + stack.Push(balance) + + vm.Printf(" => %v (%x)", balance, addr) case ORIGIN: stack.Push(ethutil.BigD(vm.vars.Origin)) + + vm.Printf(" => %v", vm.vars.Origin) case CALLER: caller := closure.caller.Address() stack.Push(ethutil.BigD(caller)) @@ -712,7 +725,7 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) { stack.Push(ethutil.BigFalse) } else { - //snapshot := vm.state.Copy() + snapshot := vm.state.Copy() stateObject := vm.state.GetOrNewStateObject(addr.Bytes()) @@ -728,8 +741,7 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) { vmlogger.Debugf("Closure execution failed. %v\n", err) - //vm.state.Set(snapshot) - vm.state.ResetStateObject(stateObject) + vm.state.Set(snapshot) } else { stack.Push(ethutil.BigTrue) |