OSDN Git Service

Merge pull request #201 from Bytom/v0.1
[bytom/vapor.git] / vendor / github.com / bytom / protocol / vm / introspection.go
diff --git a/vendor/github.com/bytom/protocol/vm/introspection.go b/vendor/github.com/bytom/protocol/vm/introspection.go
new file mode 100644 (file)
index 0000000..72aaab0
--- /dev/null
@@ -0,0 +1,125 @@
+package vm
+
+func opCheckOutput(vm *virtualMachine) error {
+       err := vm.applyCost(16)
+       if err != nil {
+               return err
+       }
+
+       code, err := vm.pop(true)
+       if err != nil {
+               return err
+       }
+       vmVersion, err := vm.popInt64(true)
+       if err != nil {
+               return err
+       }
+       if vmVersion < 0 {
+               return ErrBadValue
+       }
+       assetID, err := vm.pop(true)
+       if err != nil {
+               return err
+       }
+       amount, err := vm.popInt64(true)
+       if err != nil {
+               return err
+       }
+       if amount < 0 {
+               return ErrBadValue
+       }
+       index, err := vm.popInt64(true)
+       if err != nil {
+               return err
+       }
+       if index < 0 {
+               return ErrBadValue
+       }
+
+       if vm.context.CheckOutput == nil {
+               return ErrContext
+       }
+
+       ok, err := vm.context.CheckOutput(uint64(index), uint64(amount), assetID, uint64(vmVersion), code, vm.expansionReserved)
+       if err != nil {
+               return err
+       }
+       return vm.pushBool(ok, true)
+}
+
+func opAsset(vm *virtualMachine) error {
+       err := vm.applyCost(1)
+       if err != nil {
+               return err
+       }
+
+       if vm.context.AssetID == nil {
+               return ErrContext
+       }
+       return vm.push(*vm.context.AssetID, true)
+}
+
+func opAmount(vm *virtualMachine) error {
+       err := vm.applyCost(1)
+       if err != nil {
+               return err
+       }
+
+       if vm.context.Amount == nil {
+               return ErrContext
+       }
+       return vm.pushInt64(int64(*vm.context.Amount), true)
+}
+
+func opProgram(vm *virtualMachine) error {
+       err := vm.applyCost(1)
+       if err != nil {
+               return err
+       }
+
+       return vm.push(vm.context.Code, true)
+}
+
+func opIndex(vm *virtualMachine) error {
+       err := vm.applyCost(1)
+       if err != nil {
+               return err
+       }
+
+       if vm.context.DestPos == nil {
+               return ErrContext
+       }
+       return vm.pushInt64(int64(*vm.context.DestPos), true)
+}
+
+func opEntryID(vm *virtualMachine) error {
+       err := vm.applyCost(1)
+       if err != nil {
+               return err
+       }
+       return vm.push(vm.context.EntryID, true)
+}
+
+func opOutputID(vm *virtualMachine) error {
+       err := vm.applyCost(1)
+       if err != nil {
+               return err
+       }
+
+       if vm.context.SpentOutputID == nil {
+               return ErrContext
+       }
+       return vm.push(*vm.context.SpentOutputID, true)
+}
+
+func opBlockHeight(vm *virtualMachine) error {
+       err := vm.applyCost(1)
+       if err != nil {
+               return err
+       }
+
+       if vm.context.BlockHeight == nil {
+               return ErrContext
+       }
+       return vm.pushInt64(int64(*vm.context.BlockHeight), true)
+}