Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/vmquery with block coordinates #5512

Merged
merged 20 commits into from
Aug 25, 2023
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
bbbf244
added support for block coordinates on vm query API
sstanculeanu Jul 21, 2023
fa303bf
added functionality on accountsDBApi RecreateTrie
sstanculeanu Jul 24, 2023
b3897a1
added new chain handler for api
sstanculeanu Jul 25, 2023
11c4e9f
fixed tests
sstanculeanu Jul 26, 2023
923be2c
fixes after review
sstanculeanu Aug 4, 2023
a715d61
added block info on vm query response
sstanculeanu Aug 4, 2023
a92a5d6
fix tests
sstanculeanu Aug 7, 2023
6ebc69b
fixed get header hash
sstanculeanu Aug 7, 2023
36d361d
fixed more tests
sstanculeanu Aug 7, 2023
2d20a97
fixes after review
sstanculeanu Aug 7, 2023
7256aaf
fixes after review
sstanculeanu Aug 16, 2023
6a07d6c
Merge branch 'feat/vmquery_with_block_coordinates' into block_coordin…
sstanculeanu Aug 16, 2023
342c99b
fix after review
sstanculeanu Aug 21, 2023
59ebb58
Merge pull request #5447 from multiversx/block_coordinates_on_vm_query
sstanculeanu Aug 22, 2023
3156f0e
Merge branch 'rc/v1.6.0' of https://github.com/multiversx/mx-chain-go…
sstanculeanu Aug 22, 2023
0697e6b
Merge pull request #5515 from multiversx/merge_rc160_into_feat_vmquer…
sstanculeanu Aug 22, 2023
3003894
Merge branch 'rc/v1.6.0' of https://github.com/multiversx/mx-chain-go…
sstanculeanu Aug 25, 2023
5606764
Merge pull request #5527 from multiversx/merge_rc160_into_feat_vmquer…
sstanculeanu Aug 25, 2023
82915f0
add missing param initialization causing
sstanculeanu Aug 25, 2023
e4add87
Merge pull request #5528 from multiversx/fix_vm_long_tests
sstanculeanu Aug 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 34 additions & 13 deletions api/groups/vmValuesGroup.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ import (
"sync"

"github.com/gin-gonic/gin"
"github.com/multiversx/mx-chain-core-go/core"
"github.com/multiversx/mx-chain-core-go/core/check"
apiData "github.com/multiversx/mx-chain-core-go/data/api"
"github.com/multiversx/mx-chain-core-go/data/vm"
"github.com/multiversx/mx-chain-go/api/errors"
"github.com/multiversx/mx-chain-go/api/shared"
Expand All @@ -25,7 +27,7 @@ const (

// vmValuesFacadeHandler defines the methods to be implemented by a facade for vm-values requests
type vmValuesFacadeHandler interface {
ExecuteSCQuery(*process.SCQuery) (*vm.VMOutputApi, error)
ExecuteSCQuery(*process.SCQuery) (*vm.VMOutputApi, apiData.BlockInfo, error)
DecodeAddressPubkey(pk string) ([]byte, error)
IsInterfaceNil() bool
}
Expand Down Expand Up @@ -101,7 +103,7 @@ func (vvg *vmValuesGroup) getInt(context *gin.Context) {
}

func (vvg *vmValuesGroup) doGetVMValue(context *gin.Context, asType vm.ReturnDataKind) {
vmOutput, execErrMsg, err := vvg.doExecuteQuery(context)
vmOutput, execErrMsg, blockInfo, err := vvg.doExecuteQuery(context)

if err != nil {
vvg.returnBadRequest(context, "doGetVMValue", err)
Expand All @@ -113,43 +115,62 @@ func (vvg *vmValuesGroup) doGetVMValue(context *gin.Context, asType vm.ReturnDat
execErrMsg += " " + err.Error()
}

vvg.returnOkResponse(context, returnData, execErrMsg)
vvg.returnOkResponse(context, returnData, execErrMsg, blockInfo)
}

// executeQuery returns the data as string
func (vvg *vmValuesGroup) executeQuery(context *gin.Context) {
vmOutput, execErrMsg, err := vvg.doExecuteQuery(context)
vmOutput, execErrMsg, blockInfo, err := vvg.doExecuteQuery(context)
if err != nil {
vvg.returnBadRequest(context, "executeQuery", err)
return
}

vvg.returnOkResponse(context, vmOutput, execErrMsg)
vvg.returnOkResponse(context, vmOutput, execErrMsg, blockInfo)
}

func (vvg *vmValuesGroup) doExecuteQuery(context *gin.Context) (*vm.VMOutputApi, string, error) {
func (vvg *vmValuesGroup) doExecuteQuery(context *gin.Context) (*vm.VMOutputApi, string, apiData.BlockInfo, error) {
request := VMValueRequest{}
err := context.ShouldBindJSON(&request)
if err != nil {
return nil, "", errors.ErrInvalidJSONRequest
return nil, "", apiData.BlockInfo{}, errors.ErrInvalidJSONRequest
}

command, err := vvg.createSCQuery(&request)
if err != nil {
return nil, "", err
return nil, "", apiData.BlockInfo{}, err
}

vmOutputApi, err := vvg.getFacade().ExecuteSCQuery(command)
command.BlockNonce, command.BlockHash, err = extractBlockCoordinates(context)
if err != nil {
return nil, "", err
return nil, "", apiData.BlockInfo{}, err
}

vmOutputApi, blockInfo, err := vvg.getFacade().ExecuteSCQuery(command)
if err != nil {
return nil, "", apiData.BlockInfo{}, err
}

vmExecErrMsg := ""
if len(vmOutputApi.ReturnCode) > 0 && vmOutputApi.ReturnCode != vmcommon.Ok.String() {
vmExecErrMsg = vmOutputApi.ReturnCode + ":" + vmOutputApi.ReturnMessage
}

return vmOutputApi, vmExecErrMsg, nil
return vmOutputApi, vmExecErrMsg, blockInfo, nil
}

func extractBlockCoordinates(context *gin.Context) (core.OptionalUint64, []byte, error) {
blockNonce, err := parseUint64UrlParam(context, urlParamBlockNonce)
if err != nil {
return core.OptionalUint64{}, nil, fmt.Errorf("%w for block nonce", err)
}

blockHash, err := parseHexBytesUrlParam(context, urlParamBlockHash)
if err != nil {
return core.OptionalUint64{}, nil, fmt.Errorf("%w for block hash", err)
}

return blockNonce, blockHash, nil
}

func (vvg *vmValuesGroup) createSCQuery(request *VMValueRequest) (*process.SCQuery, error) {
Expand Down Expand Up @@ -209,11 +230,11 @@ func (vvg *vmValuesGroup) returnBadRequest(context *gin.Context, errScope string
)
}

func (vvg *vmValuesGroup) returnOkResponse(context *gin.Context, data interface{}, errorMsg string) {
func (vvg *vmValuesGroup) returnOkResponse(context *gin.Context, data interface{}, errorMsg string, blockInfo apiData.BlockInfo) {
context.JSON(
http.StatusOK,
shared.GenericAPIResponse{
Data: gin.H{"data": data},
Data: gin.H{"data": data, "blockInfo": blockInfo},
Error: errorMsg,
Code: shared.ReturnCodeSuccess,
},
Expand Down
Loading