87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package vm
 | 
						|
 | 
						|
import "math/big"
 | 
						|
 | 
						|
type req struct {
 | 
						|
	stack int
 | 
						|
	gas   *big.Int
 | 
						|
}
 | 
						|
 | 
						|
var _baseCheck = map[OpCode]req{
 | 
						|
	//       Req stack  Gas price
 | 
						|
	ADD:          {2, GasFastestStep},
 | 
						|
	LT:           {2, GasFastestStep},
 | 
						|
	GT:           {2, GasFastestStep},
 | 
						|
	SLT:          {2, GasFastestStep},
 | 
						|
	SGT:          {2, GasFastestStep},
 | 
						|
	EQ:           {2, GasFastestStep},
 | 
						|
	ISZERO:       {1, GasFastestStep},
 | 
						|
	SUB:          {2, GasFastestStep},
 | 
						|
	AND:          {2, GasFastestStep},
 | 
						|
	OR:           {2, GasFastestStep},
 | 
						|
	XOR:          {2, GasFastestStep},
 | 
						|
	NOT:          {1, GasFastestStep},
 | 
						|
	BYTE:         {2, GasFastestStep},
 | 
						|
	CALLDATALOAD: {1, GasFastestStep},
 | 
						|
	CALLDATACOPY: {3, GasFastestStep},
 | 
						|
	MLOAD:        {1, GasFastestStep},
 | 
						|
	MSTORE:       {2, GasFastestStep},
 | 
						|
	MSTORE8:      {2, GasFastestStep},
 | 
						|
	CODECOPY:     {3, GasFastestStep},
 | 
						|
	MUL:          {2, GasFastStep},
 | 
						|
	DIV:          {2, GasFastStep},
 | 
						|
	SDIV:         {2, GasFastStep},
 | 
						|
	MOD:          {2, GasFastStep},
 | 
						|
	SMOD:         {2, GasFastStep},
 | 
						|
	SIGNEXTEND:   {2, GasFastStep},
 | 
						|
	ADDMOD:       {3, GasMidStep},
 | 
						|
	MULMOD:       {3, GasMidStep},
 | 
						|
	JUMP:         {1, GasMidStep},
 | 
						|
	JUMPI:        {2, GasSlowStep},
 | 
						|
	EXP:          {2, GasSlowStep},
 | 
						|
	ADDRESS:      {0, GasQuickStep},
 | 
						|
	ORIGIN:       {0, GasQuickStep},
 | 
						|
	CALLER:       {0, GasQuickStep},
 | 
						|
	CALLVALUE:    {0, GasQuickStep},
 | 
						|
	CODESIZE:     {0, GasQuickStep},
 | 
						|
	GASPRICE:     {0, GasQuickStep},
 | 
						|
	COINBASE:     {0, GasQuickStep},
 | 
						|
	TIMESTAMP:    {0, GasQuickStep},
 | 
						|
	NUMBER:       {0, GasQuickStep},
 | 
						|
	CALLDATASIZE: {0, GasQuickStep},
 | 
						|
	DIFFICULTY:   {0, GasQuickStep},
 | 
						|
	GASLIMIT:     {0, GasQuickStep},
 | 
						|
	POP:          {0, GasQuickStep},
 | 
						|
	PC:           {0, GasQuickStep},
 | 
						|
	MSIZE:        {0, GasQuickStep},
 | 
						|
	GAS:          {0, GasQuickStep},
 | 
						|
	BLOCKHASH:    {1, GasExtStep},
 | 
						|
	BALANCE:      {0, GasExtStep},
 | 
						|
	EXTCODESIZE:  {1, GasExtStep},
 | 
						|
	EXTCODECOPY:  {4, GasExtStep},
 | 
						|
	SLOAD:        {1, GasStorageGet},
 | 
						|
	SSTORE:       {2, Zero},
 | 
						|
	SHA3:         {1, GasSha3Base},
 | 
						|
	CREATE:       {3, GasCreate},
 | 
						|
	CALL:         {7, GasCall},
 | 
						|
	CALLCODE:     {7, GasCall},
 | 
						|
	JUMPDEST:     {0, GasJumpDest},
 | 
						|
	SUICIDE:      {1, Zero},
 | 
						|
	RETURN:       {2, Zero},
 | 
						|
}
 | 
						|
 | 
						|
func baseCheck(op OpCode, stack *stack, gas *big.Int) {
 | 
						|
	if r, ok := _baseCheck[op]; ok {
 | 
						|
		stack.require(r.stack)
 | 
						|
 | 
						|
		gas.Add(gas, r.gas)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func toWordSize(size *big.Int) *big.Int {
 | 
						|
	tmp := new(big.Int)
 | 
						|
	tmp.Add(size, u256(31))
 | 
						|
	tmp.Div(tmp, u256(32))
 | 
						|
	return tmp
 | 
						|
}
 |