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

Block coordinates on vm query #5447

Merged
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
}
bogdan-rosianu marked this conversation as resolved.
Show resolved Hide resolved

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