Skip to content

Commit

Permalink
Merge pull request #5512 from multiversx/feat/vmquery_with_block_coor…
Browse files Browse the repository at this point in the history
…dinates

Feat/vmquery with block coordinates
  • Loading branch information
AdoAdoAdo authored Aug 25, 2023
2 parents 97147ef + e4add87 commit fce29e5
Show file tree
Hide file tree
Showing 70 changed files with 1,510 additions and 532 deletions.
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

0 comments on commit fce29e5

Please sign in to comment.