github.com/bytom/bytom@v1.1.2-0.20221014091027-bbcba3df6075/protocol/vm/introspection.go (about)

     1  package vm
     2  
     3  import (
     4  	"github.com/holiman/uint256"
     5  )
     6  
     7  func opCheckOutput(vm *virtualMachine) error {
     8  	if err := vm.applyCost(16); err != nil {
     9  		return err
    10  	}
    11  
    12  	code, err := vm.pop(true)
    13  	if err != nil {
    14  		return err
    15  	}
    16  
    17  	vmVersion, err := vm.popBigInt(true)
    18  	if err != nil {
    19  		return err
    20  	}
    21  
    22  	assetID, err := vm.pop(true)
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	amountInt, err := vm.popBigInt(true)
    28  	if err != nil {
    29  		return err
    30  	}
    31  
    32  	amount, overflow := amountInt.Uint64WithOverflow()
    33  	if overflow {
    34  		return ErrBadValue
    35  	}
    36  
    37  	index, err := vm.popBigInt(true)
    38  	if err != nil {
    39  		return err
    40  	}
    41  
    42  	if vm.context.CheckOutput == nil {
    43  		return ErrContext
    44  	}
    45  
    46  	ok, err := vm.context.CheckOutput(uint64(index.Uint64()), amount, assetID, uint64(vmVersion.Uint64()), code, vm.altStack, vm.expansionReserved)
    47  	if err != nil {
    48  		return err
    49  	}
    50  	return vm.pushBool(ok, true)
    51  }
    52  
    53  func opAsset(vm *virtualMachine) error {
    54  	if err := vm.applyCost(1); err != nil {
    55  		return err
    56  	}
    57  
    58  	if vm.context.AssetID == nil {
    59  		return ErrContext
    60  	}
    61  	return vm.pushDataStack(*vm.context.AssetID, true)
    62  }
    63  
    64  func opAmount(vm *virtualMachine) error {
    65  	if err := vm.applyCost(1); err != nil {
    66  		return err
    67  	}
    68  
    69  	if vm.context.Amount == nil {
    70  		return ErrContext
    71  	}
    72  
    73  	return vm.pushBigInt(uint256.NewInt(*vm.context.Amount), true)
    74  }
    75  
    76  func opProgram(vm *virtualMachine) error {
    77  	if err := vm.applyCost(1); err != nil {
    78  		return err
    79  	}
    80  
    81  	return vm.pushDataStack(vm.context.Code, true)
    82  }
    83  
    84  func opIndex(vm *virtualMachine) error {
    85  	if err := vm.applyCost(1); err != nil {
    86  		return err
    87  	}
    88  
    89  	if vm.context.DestPos == nil {
    90  		return ErrContext
    91  	}
    92  
    93  	return vm.pushBigInt(uint256.NewInt(*vm.context.DestPos), true)
    94  }
    95  
    96  func opEntryID(vm *virtualMachine) error {
    97  	if err := vm.applyCost(1); err != nil {
    98  		return err
    99  	}
   100  	return vm.pushDataStack(vm.context.EntryID, true)
   101  }
   102  
   103  func opOutputID(vm *virtualMachine) error {
   104  	if err := vm.applyCost(1); err != nil {
   105  		return err
   106  	}
   107  
   108  	if vm.context.SpentOutputID == nil {
   109  		return ErrContext
   110  	}
   111  	return vm.pushDataStack(*vm.context.SpentOutputID, true)
   112  }
   113  
   114  func opBlockHeight(vm *virtualMachine) error {
   115  	if err := vm.applyCost(1); err != nil {
   116  		return err
   117  	}
   118  
   119  	if vm.context.BlockHeight == nil {
   120  		return ErrContext
   121  	}
   122  
   123  	return vm.pushBigInt(uint256.NewInt(*vm.context.BlockHeight), true)
   124  }