From 9368e90380636880b63ebce6c2863b76be5d3cd8 Mon Sep 17 00:00:00 2001 From: Meng-Ying Yang Date: Mon, 6 May 2019 08:35:00 +0800 Subject: core: vm: sqlvm: apply gas computation through built-in functions --- core/vm/sqlvm/runtime/functions.go | 18 ++++++++++++ core/vm/sqlvm/runtime/functions_test.go | 50 ++++++++++++++++++++++++--------- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/core/vm/sqlvm/runtime/functions.go b/core/vm/sqlvm/runtime/functions.go index 1dc9e76ba..5d41fb986 100644 --- a/core/vm/sqlvm/runtime/functions.go +++ b/core/vm/sqlvm/runtime/functions.go @@ -160,6 +160,8 @@ func fnBlockHash(ctx *common.Context, in Instruction, length uint64) (result *Op result.Data[i] = Tuple{r} } } + + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -169,6 +171,7 @@ func fnBlockNumber(ctx *common.Context, in Instruction, length uint64) (result * []ast.DataType{ast.ComposeDataType(ast.DataTypeMajorUint, 31)}, r.clone, length, ) + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -178,6 +181,7 @@ func fnBlockTimestamp(ctx *common.Context, in Instruction, length uint64) (resul []ast.DataType{ast.ComposeDataType(ast.DataTypeMajorUint, 31)}, r.clone, length, ) + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -187,6 +191,7 @@ func fnBlockCoinBase(ctx *common.Context, in Instruction, length uint64) (result []ast.DataType{ast.ComposeDataType(ast.DataTypeMajorAddress, 0)}, r.clone, length, ) + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -204,6 +209,7 @@ func fnBlockGasLimit(ctx *common.Context, in Instruction, length uint64) (result []ast.DataType{ast.ComposeDataType(ast.DataTypeMajorUint, 7)}, r.clone, length, ) + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -213,6 +219,7 @@ func fnMsgSender(ctx *common.Context, in Instruction, length uint64) (result *Op []ast.DataType{ast.ComposeDataType(ast.DataTypeMajorAddress, 0)}, r.clone, length, ) + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -222,6 +229,7 @@ func fnMsgData(ctx *common.Context, in Instruction, length uint64) (result *Oper []ast.DataType{ast.ComposeDataType(ast.DataTypeMajorDynamicBytes, 0)}, r.clone, length, ) + err = applyGas(ctx, in.GasFunc, result.bytesCount()) return } @@ -231,6 +239,7 @@ func fnTxOrigin(ctx *common.Context, in Instruction, length uint64) (result *Ope []ast.DataType{ast.ComposeDataType(ast.DataTypeMajorAddress, 0)}, r.clone, length, ) + err = applyGas(ctx, in.GasFunc, result.bytesCount()) return } @@ -259,6 +268,7 @@ func fnRand(ctx *common.Context, in Instruction, length uint64) (result *Operand []ast.DataType{ast.ComposeDataType(ast.DataTypeMajorUint, 31)}, fn, length, ) + err = applyGas(ctx, in.GasFunc, result.bytesCount()) return } @@ -351,6 +361,7 @@ func fnBitAnd(ctx *common.Context, in Instruction, length uint64) (result *Opera func(b1, b2 byte) byte { return b1 & b2 }, ) } + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -395,6 +406,7 @@ func fnBitOr(ctx *common.Context, in Instruction, length uint64) (result *Operan func(b1, b2 byte) byte { return b1 | b2 }, ) } + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -413,6 +425,7 @@ func fnBitXor(ctx *common.Context, in Instruction, length uint64) (result *Opera func(b1, b2 byte) byte { return b1 ^ b2 }, ) } + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -438,6 +451,7 @@ func fnBitNot(ctx *common.Context, in Instruction, length uint64) (result *Opera func(b byte) byte { return ^b }, ) } + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -492,6 +506,8 @@ func fnOctetLength(ctx *common.Context, in Instruction, length uint64) (result * result.Data[i][j] = &Raw{Value: decimal.New(int64(len(op.Data[i][j].Bytes)), 0)} } } + + err = applyGas(ctx, in.GasFunc, result.elementCount()) return } @@ -553,5 +569,7 @@ func fnSubString(ctx *common.Context, in Instruction, length uint64) (result *Op result.Data[i][j] = &Raw{Bytes: op.Data[i][j].Bytes[start : start+end]} } } + + err = applyGas(ctx, in.GasFunc, result.bytesCount()) return } diff --git a/core/vm/sqlvm/runtime/functions_test.go b/core/vm/sqlvm/runtime/functions_test.go index 29a67e10f..66d570477 100644 --- a/core/vm/sqlvm/runtime/functions_test.go +++ b/core/vm/sqlvm/runtime/functions_test.go @@ -65,9 +65,13 @@ func (s *FunctionSuite) TestFnBlockHash() { Context: vm.Context{ GetHash: mockGetHashFunc, BlockNumber: c.Cur, + GasLimit: math.MaxUint64, }, }, - Instruction{Input: c.Ops}, + Instruction{ + Input: c.Ops, + GasFunc: fnTable[BLOCKHASH].GasFunc, + }, c.Length, ) } @@ -115,9 +119,12 @@ func (s *FunctionSuite) TestFnBlockNumber() { callFn := func(c blockNumberCase) (*Operand, error) { return fnBlockNumber( &common.Context{ - Context: vm.Context{BlockNumber: c.RawNum}, + Context: vm.Context{ + BlockNumber: c.RawNum, + GasLimit: math.MaxUint64, + }, }, - Instruction{}, + Instruction{GasFunc: fnTable[BLOCKNUMBER].GasFunc}, c.Length) } @@ -171,9 +178,12 @@ func (s *FunctionSuite) TestFnBlockTimestamp() { callFn := func(c blockTimestampCase) (*Operand, error) { return fnBlockTimestamp( &common.Context{ - Context: vm.Context{Time: c.Timestamp}, + Context: vm.Context{ + Time: c.Timestamp, + GasLimit: math.MaxUint64, + }, }, - Instruction{}, + Instruction{GasFunc: fnTable[BLOCKTIMESTAMP].GasFunc}, c.Length) } @@ -231,9 +241,12 @@ func (s *FunctionSuite) TestFnCoinBase() { callFn := func(c blockCoinBaseCase) (*Operand, error) { return fnBlockCoinBase( &common.Context{ - Context: vm.Context{Coinbase: c.Address}, + Context: vm.Context{ + Coinbase: c.Address, + GasLimit: math.MaxUint64, + }, }, - Instruction{}, + Instruction{GasFunc: fnTable[BLOCKCOINBASE].GasFunc}, c.Length) } @@ -279,7 +292,7 @@ func (s *FunctionSuite) TestFnGasLimit() { &common.Context{ Context: vm.Context{GasLimit: c.Limit}, }, - Instruction{}, + Instruction{GasFunc: fnTable[BLOCKGASLIMIT].GasFunc}, c.Length) } @@ -330,9 +343,10 @@ func (s *FunctionSuite) TestFnMsgSender() { callFn := func(c txMsgSenderCase) (*Operand, error) { return fnMsgSender( &common.Context{ + Context: vm.Context{GasLimit: math.MaxUint64}, Contract: &vm.Contract{CallerAddress: c.Address}, }, - Instruction{}, + Instruction{GasFunc: fnTable[MSGSENDER].GasFunc}, c.Length) } @@ -381,9 +395,10 @@ func (s *FunctionSuite) TestFnMsgData() { callFn := func(c txMsgDataCase) (*Operand, error) { return fnMsgData( &common.Context{ + Context: vm.Context{GasLimit: math.MaxUint64}, Contract: &vm.Contract{Input: c.Res}, }, - Instruction{}, + Instruction{GasFunc: fnTable[MSGDATA].GasFunc}, c.Length) } @@ -434,9 +449,12 @@ func (s *FunctionSuite) TestFnTxOrigin() { callFn := func(c blockTxOriginCase) (*Operand, error) { return fnTxOrigin( &common.Context{ - Context: vm.Context{Origin: c.Address}, + Context: vm.Context{ + Origin: c.Address, + GasLimit: math.MaxUint64, + }, }, - Instruction{}, + Instruction{GasFunc: fnTable[TXORIGIN].GasFunc}, c.Length) } @@ -485,10 +503,14 @@ func (s *FunctionSuite) TestFnRand() { callFn := func(c blockRandCase) (*Operand, error) { return fnRand( &common.Context{ - Context: vm.Context{Origin: c.Origin, Randomness: res}, + Context: vm.Context{ + Origin: c.Origin, + Randomness: res, + GasLimit: math.MaxUint64, + }, Storage: newStorage(), }, - Instruction{}, + Instruction{GasFunc: fnTable[RAND].GasFunc}, c.Length) } -- cgit v1.2.3