Skip to content

Commit

Permalink
Merge pull request #442 from multiversx/fix_process_status_on_relayed_v1
Browse files Browse the repository at this point in the history
fixed process-status on relayed v1 with move balance
  • Loading branch information
sstanculeanu committed May 30, 2024
2 parents 7dc1b4f + 79e98bc commit ebebce0
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 190 deletions.
101 changes: 101 additions & 0 deletions process/testdata/finishedOkRelayedTxCrossShardMoveBalance.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
{
"transaction": {
"type": "normal",
"processingTypeOnSource": "RelayedTx",
"processingTypeOnDestination": "RelayedTx",
"hash": "4dd5faec9431b8111e96ac01e592b66be50a1454eb2d008ce941323d49715ca9",
"nonce": 159,
"round": 17813271,
"epoch": 1236,
"value": "0",
"receiver": "erd13mfn9qksaq03c0nltpg23lqca67lhup544a56z0j4vlrhgu90lxq7hpjgw",
"sender": "erd16mpvgjpfgj8fd8h2stw9zxqx2n0prmmqsan02ash93jdrp6m7fqswke499",
"gasPrice": 1000000000,
"gasLimit": 1084000,
"gasUsed": 1084000,
"data": "cmVsYXllZFR4QDdiMjI2ZTZmNmU2MzY1MjIzYTMwMmMyMjc2NjE2Yzc1NjUyMjNhMzMzMzM3MzQzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMmMyMjcyNjU2MzY1Njk3NjY1NzIyMjNhMjIzMTczNGM0NTUzNDM2YzQ1NmE3MDYxNjUzNjZmNGM2MzU1NTI2NzQ3NTY0ZTM0NTIzNzMyNDM0ODVhNzY1NjMyNDY3OTc4NmIzMDU5NjQ2MjM4NmI0NTNkMjIyYzIyNzM2NTZlNjQ2NTcyMjIzYTIyNmE3NDRkNzk2Nzc0NDQ2ZjQ4Nzg3NzJiNjYzMTY4NTE3MTUwNzc1OTM3NzIzMzM3Mzg0NDUzNzQ2NTMwMzA0YTM4NzE3MzJiNGYzNjRmNDY2NjM4NzczZDIyMmMyMjY3NjE3MzUwNzI2OTYzNjUyMjNhMzEzMDMwMzAzMDMwMzAzMDMwMzAyYzIyNjc2MTczNGM2OTZkNjk3NDIyM2EzNTMwMzAzMDMwMmMyMjYzNjg2MTY5NmU0OTQ0MjIzYTIyNGQ1MTNkM2QyMjJjMjI3NjY1NzI3MzY5NmY2ZTIyM2EzMTJjMjI3MzY5Njc2ZTYxNzQ3NTcyNjUyMjNhMjI2OTcwNjU2YzY2NWE0ODc1NDE0NTMzMzI2ZTcxMzAyZjU2NDc0ZDZhNjYzNzRhNTQ1NTQ1NTA1NTc3NjQzMjQ4NTA0ZjY1MzU2ZTZhNDMzMDM2MmI0MjcwMzAzMzZiMzAzODZlNTA2YTMxNjMzOTM3NTE1MTQzNzI1OTQ4Nzc1MzQ0NTU1YTZiNDg1MzY1NDk3MTczMmY3YTMyNTE1NTRkNGU2ZTQxNDc0MTQxM2QzZDIyN2Q=",
"signature": "b0a477a7db6820ccd99291e92a7f8f32f3901e54eec99cf143ae7151a51bfbc219853069d4ad515ee5179175937d673efd4549a53ed30f00beb07f3ead68b00c",
"sourceShard": 1,
"destinationShard": 0,
"blockNonce": 17806968,
"blockHash": "52a92fd2b486cf0710e646bc0e91da429d617e47a1f34380c0f890e3f218a072",
"notarizedAtSourceInMetaNonce": 17792304,
"NotarizedAtSourceInMetaHash": "4e82f772d8415d23934693c787a08e75862841a8116682f66c8739f32afb5033",
"notarizedAtDestinationInMetaNonce": 17792308,
"notarizedAtDestinationInMetaHash": "7baa2ddbc7200d0cb20bb445eb9d80f946b5daf7a24a7c6069038d97fd7354e2",
"miniblockType": "TxBlock",
"miniblockHash": "53a543f844b67bea604d5ca90b3c363bb60ae09ec54451fff115ecadcdb946f3",
"hyperblockNonce": 17792308,
"hyperblockHash": "7baa2ddbc7200d0cb20bb445eb9d80f946b5daf7a24a7c6069038d97fd7354e2",
"timestamp": 1702997226,
"smartContractResults": [
{
"hash": "8cc84367ffe898d922c82d23e7557c4b735c4ef1e93e563a1dfa36839bdfdaa4",
"nonce": 0,
"value": 337400000000000000,
"receiver": "erd16mpvgjpfgj8fd8h2stw9zxqx2n0prmmqsan02ash93jdrp6m7fqswke499",
"sender": "erd13mfn9qksaq03c0nltpg23lqca67lhup544a56z0j4vlrhgu90lxq7hpjgw",
"relayerAddress": "erd16mpvgjpfgj8fd8h2stw9zxqx2n0prmmqsan02ash93jdrp6m7fqswke499",
"relayedValue": 0,
"prevTxHash": "4dd5faec9431b8111e96ac01e592b66be50a1454eb2d008ce941323d49715ca9",
"originalTxHash": "4dd5faec9431b8111e96ac01e592b66be50a1454eb2d008ce941323d49715ca9",
"gasLimit": 0,
"gasPrice": 1000000000,
"callType": 0,
"operation": "transfer"
}
],
"status": "success",
"receivers": [
"erd16mpvgjpfgj8fd8h2stw9zxqx2n0prmmqsan02ash93jdrp6m7fqswke499"
],
"receiversShardIDs": [
1
],
"operation": "transfer",
"initiallyPaidFee": "1034500000000000",
"fee": "1034500000000000",
"isRelayed": true,
"chainID": "1",
"version": 1,
"options": 0
},
"scrs": [
{
"type": "unsigned",
"processingTypeOnSource": "MoveBalance",
"processingTypeOnDestination": "MoveBalance",
"hash": "8cc84367ffe898d922c82d23e7557c4b735c4ef1e93e563a1dfa36839bdfdaa4",
"nonce": 0,
"round": 17813275,
"epoch": 1236,
"value": "337400000000000000",
"receiver": "erd16mpvgjpfgj8fd8h2stw9zxqx2n0prmmqsan02ash93jdrp6m7fqswke499",
"sender": "erd13mfn9qksaq03c0nltpg23lqca67lhup544a56z0j4vlrhgu90lxq7hpjgw",
"gasPrice": 1000000000,
"gasUsed": 50000,
"previousTransactionHash": "4dd5faec9431b8111e96ac01e592b66be50a1454eb2d008ce941323d49715ca9",
"originalTransactionHash": "4dd5faec9431b8111e96ac01e592b66be50a1454eb2d008ce941323d49715ca9",
"sourceShard": 0,
"destinationShard": 1,
"blockNonce": 17800066,
"blockHash": "cdeff6a0d8da1eae1de2a434b4834ee23bea45c64d43e3f303b3b862fdc5028b",
"notarizedAtSourceInMetaNonce": 17792308,
"NotarizedAtSourceInMetaHash": "7baa2ddbc7200d0cb20bb445eb9d80f946b5daf7a24a7c6069038d97fd7354e2",
"notarizedAtDestinationInMetaNonce": 17792312,
"notarizedAtDestinationInMetaHash": "0316c2b4a03ad3172ce3ce975447cace67d30b5002b1e00d40ca44dd43768219",
"miniblockType": "SmartContractResultBlock",
"miniblockHash": "daa45fb36173df935d0786c43afe4085e8a9a20b53aab3b602bd8d8ec3cd1880",
"hyperblockNonce": 17792312,
"hyperblockHash": "0316c2b4a03ad3172ce3ce975447cace67d30b5002b1e00d40ca44dd43768219",
"timestamp": 1702997250,
"status": "success",
"operation": "transfer",
"fee": "0",
"callType": "directCall",
"relayerAddress": "erd16mpvgjpfgj8fd8h2stw9zxqx2n0prmmqsan02ash93jdrp6m7fqswke499",
"relayedValue": "0",
"options": 0
}
]
}
84 changes: 4 additions & 80 deletions process/transactionProcessor.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"fmt"
"math/big"
"net/http"
"strings"

"github.com/multiversx/mx-chain-core-go/core"
"github.com/multiversx/mx-chain-core-go/core/check"
Expand Down Expand Up @@ -552,12 +551,12 @@ func (tp *TransactionProcessor) handleIntraShardRelayedMoveBalanceTransactions(
allScrs []*transaction.ApiTransactionResult,
) ([]*transaction.ApiLogs, error) {
var newLogs []*transaction.ApiLogs
isIntraShardRelayedV1MoveBalanceTransaction, err := tp.isIntraShardRelayedMoveBalanceTransaction(tx, allScrs)
isRelayedMoveBalanceTransaction, err := tp.isRelayedMoveBalanceTransaction(tx, allScrs)
if err != nil {
return newLogs, err
}

if isIntraShardRelayedV1MoveBalanceTransaction {
if isRelayedMoveBalanceTransaction {
newLogs = append(newLogs, &transaction.ApiLogs{
Address: tx.Sender,
Events: []*transaction.Events{
Expand All @@ -572,7 +571,7 @@ func (tp *TransactionProcessor) handleIntraShardRelayedMoveBalanceTransactions(
return newLogs, nil
}

func (tp *TransactionProcessor) isIntraShardRelayedMoveBalanceTransaction(
func (tp *TransactionProcessor) isRelayedMoveBalanceTransaction(
tx *transaction.ApiTransactionResult,
allScrs []*transaction.ApiTransactionResult,
) (bool, error) {
Expand All @@ -595,83 +594,8 @@ func (tp *TransactionProcessor) isIntraShardRelayedMoveBalanceTransaction(

firstScr := allScrs[0]
innerIsMoveBalance := firstScr.ProcessingTypeOnSource == moveBalanceDescriptor && firstScr.ProcessingTypeOnDestination == moveBalanceDescriptor
if !innerIsMoveBalance {
return false, nil
}

senderAddress, err := tp.pubKeyConverter.Decode(tx.Sender)
if err != nil {
return false, err
}
receiverAddress, err := tp.pubKeyConverter.Decode(tx.Receiver)
if err != nil {
return false, err
}

isSameShardOnRelayed := tp.proc.GetShardCoordinator().SameShard(senderAddress, receiverAddress)
isInnerTxSameShard, err := tp.isSameShardSenderReceiverOfInnerTx(senderAddress, tx)

return isSameShardOnRelayed && isInnerTxSameShard, err
}

func (tp *TransactionProcessor) isSameShardSenderReceiverOfInnerTx(
relayedSender []byte,
relayedTx *transaction.ApiTransactionResult,
) (bool, error) {
if relayedTx.ProcessingTypeOnSource == relayedV1TransactionDescriptor {
return tp.isSameShardSenderReceiverOfInnerTxV1(relayedSender, relayedTx)
}

return tp.isSameShardSenderReceiverOfInnerTxV2(relayedSender, relayedTx)
}

func (tp *TransactionProcessor) isSameShardSenderReceiverOfInnerTxV1(
relayedSender []byte,
relayedTx *transaction.ApiTransactionResult,
) (bool, error) {
relayedDataField := string(relayedTx.Data)
if strings.Index(relayedDataField, relayedTxV1DataMarker) != 0 {
return false, fmt.Errorf("wrong relayed v1 data marker position")
}

hexedInnerTxData := relayedDataField[len(relayedTxV1DataMarker):]
innerTxData, err := hex.DecodeString(hexedInnerTxData)
if err != nil {
return false, err
}

innerTx := &transaction.Transaction{}
err = tp.relayedTxsMarshaller.Unmarshal(innerTx, innerTxData)
if err != nil {
return false, err
}

isSameShardOnInnerForReceiver := tp.proc.GetShardCoordinator().SameShard(relayedSender, innerTx.RcvAddr)
isSameShardOnInnerForSender := tp.proc.GetShardCoordinator().SameShard(relayedSender, innerTx.SndAddr)

return isSameShardOnInnerForReceiver && isSameShardOnInnerForSender, nil
}

func (tp *TransactionProcessor) isSameShardSenderReceiverOfInnerTxV2(
relayedSender []byte,
relayedTx *transaction.ApiTransactionResult,
) (bool, error) {
relayedDataField := string(relayedTx.Data)
if strings.Index(relayedDataField, relayedTxV2DataMarker) != 0 {
return false, fmt.Errorf("wrong relayed v2 data marker position")
}
arguments := strings.Split(relayedDataField, argumentsSeparator)
if len(arguments) < 2 {
return false, fmt.Errorf("wrong relayed v2 formatted data field")
}

hexedReceiver := arguments[1]
receiver, err := hex.DecodeString(hexedReceiver)
if err != nil {
return false, err
}

return tp.proc.GetShardCoordinator().SameShard(relayedSender, receiver), nil
return innerIsMoveBalance, nil
}

func findIdentifierInLogs(logs []*transaction.ApiLogs, identifier string) (bool, string) {
Expand Down
119 changes: 9 additions & 110 deletions process/transactionProcessor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1961,6 +1961,15 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) {
testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKRelayedTxWithSCCall.json")
tp := createTestProcessorFromScenarioData(testData)

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(transaction.TxStatusSuccess), status.Status)
})
t.Run("tx move balance cross ok", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOkRelayedTxCrossShardMoveBalance.json")
tp := createTestProcessorFromScenarioData(testData)

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(transaction.TxStatusSuccess), status.Status)
})
Expand All @@ -1983,116 +1992,6 @@ func TestTransactionProcessor_computeTransactionStatus(t *testing.T) {
status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(transaction.TxStatusFail), status.Status)
})
t.Run("malformed transactions", func(t *testing.T) {
t.Parallel()

t.Run("malformed relayed v1 inner transaction - wrong sender", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKRelayedTxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

testData.Transaction.Sender = "not a sender"

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
t.Run("malformed relayed v1 inner transaction - wrong receiver", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKRelayedTxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

testData.Transaction.Receiver = "not a sender"

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
t.Run("malformed relayed v1 - relayed v1 marker on wrong position", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKRelayedTxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

testData.Transaction.Data = append([]byte("A"), testData.Transaction.Data...)

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
t.Run("malformed relayed v2 - missing marker", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKRelayedV2TxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

testData.Transaction.Data = []byte("aa")

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
t.Run("malformed relayed v2 - not enough arguments", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKRelayedV2TxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

testData.Transaction.Data = []byte(process.RelayedTxV2DataMarker)

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
t.Run("malformed relayed v1 - not a hex character after the marker", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKRelayedTxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

testData.Transaction.Data[45] = byte('T')

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
t.Run("malformed relayed v1 - marshaller will fail", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKRelayedTxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

testData.Transaction.Data = append(testData.Transaction.Data, []byte("aaaaaa")...)

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
t.Run("malformed relayed v1 - missing scrs", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/finishedOKRelayedTxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

testData.SCRs = nil

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
t.Run("malformed relayed v1 - no scr generated", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/malformedRelayedTxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
t.Run("malformed relayed v2 - no scr generated", func(t *testing.T) {
t.Parallel()

testData := loadJsonIntoTxAndScrs(t, "./testdata/malformedRelayedV2TxIntraShard.json")
tp := createTestProcessorFromScenarioData(testData)

status := tp.ComputeTransactionStatus(testData.Transaction, withResults)
require.Equal(t, string(data.TxStatusUnknown), status.Status)
})
})
}

func TestTransactionProcessor_GetProcessedTransactionStatus(t *testing.T) {
Expand Down

0 comments on commit ebebce0

Please sign in to comment.