From 8704d7179274fa6df39a39ca4d51380231289ff0 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Fri, 22 Mar 2024 13:29:37 +0100 Subject: [PATCH] Fixes #376 This isn't ideal, but should at least make it work for Ogmios. Ideally, the problem should be fixed in the core consensus code, but the time for this to happen and make it into a node release may be quite significant. So in the meantime, we will cope with it directly in Ogmios at the expense of a minor performance degradation (since we now need 4 requests to provide a true _False_ instead of just one). --- CHANGELOG.md | 2 +- server/src/Ogmios/App/Protocol.hs | 3 +- server/src/Ogmios/App/Protocol/TxMonitor.hs | 72 +++++++++++++++++-- server/src/Ogmios/App/Server/WebSocket.hs | 6 +- server/src/Ogmios/Data/Json.hs | 7 +- server/src/Ogmios/Data/Json/Orphans.hs | 5 -- server/src/Ogmios/Data/Json/Query.hs | 9 +-- server/src/Ogmios/Data/Protocol/TxMonitor.hs | 9 +-- .../unit/Ogmios/App/Protocol/TxMonitorSpec.hs | 26 +++++-- server/test/unit/Ogmios/Data/JsonSpec.hs | 14 ++-- server/test/unit/Test/Generators.hs | 13 +++- .../vectors/NextTransactionResponse/002.json | 2 +- .../vectors/NextTransactionResponse/003.json | 2 +- .../vectors/NextTransactionResponse/004.json | 2 +- .../vectors/NextTransactionResponse/005.json | 2 +- .../vectors/NextTransactionResponse/006.json | 2 +- .../SubmitTransactionResponse/147.json | 2 +- .../SubmitTransactionResponse/172.json | 2 +- .../SubmitTransactionResponse/186.json | 2 +- 19 files changed, 131 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c10a06045..bfd251bc1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ pre: "5. " #### Changed -- N/A +- Retry `HasTx` on false with id wrapped in different eras, to cope with the hard-fork combinator inability to compare transaction id across eras. See also [#376](https://github.com/CardanoSolutions/ogmios/issues/376). #### Removed diff --git a/server/src/Ogmios/App/Protocol.hs b/server/src/Ogmios/App/Protocol.hs index 0c9ab92c5d..0cf8bf8823 100644 --- a/server/src/Ogmios/App/Protocol.hs +++ b/server/src/Ogmios/App/Protocol.hs @@ -47,7 +47,6 @@ import Ogmios.Data.Protocol.StateQuery ) import Ogmios.Data.Protocol.TxMonitor ( AcquireMempool - , GenTxId , HasTransaction , NextTransaction , ReleaseMempool @@ -105,8 +104,8 @@ onUnmatchedMessage ( FromJSON (MultiEraDecoder (SerializedTransaction block)) , FromJSON (QueryLedgerState block) , FromJSON (Point block) - , FromJSON (GenTxId block) , FromJSON (MultiEraUTxO block) + , Crypto (BlockCrypto block) ) => Rpc.Options -> ByteString diff --git a/server/src/Ogmios/App/Protocol/TxMonitor.hs b/server/src/Ogmios/App/Protocol/TxMonitor.hs index 9a05e63fe8..17fa8e1076 100644 --- a/server/src/Ogmios/App/Protocol/TxMonitor.hs +++ b/server/src/Ogmios/App/Protocol/TxMonitor.hs @@ -48,6 +48,9 @@ import Ogmios.Prelude hiding import Ogmios.Control.MonadSTM ( MonadSTM (..) ) +import Ogmios.Data.EraTranslation + ( MostRecentEra + ) import Ogmios.Data.Json ( Json ) @@ -69,21 +72,32 @@ import Ogmios.Data.Protocol.TxMonitor , TxMonitorCodecs (..) , TxMonitorMessage (..) ) +import Ouroboros.Consensus.Cardano + ( CardanoBlock + ) +import Ouroboros.Consensus.Cardano.Block + ( TxId (..) + ) import Ouroboros.Consensus.Ledger.SupportsMempool ( HasTxId (..) ) +import Ouroboros.Consensus.Shelley.Ledger.Mempool + ( TxId (..) + ) import Ouroboros.Network.Protocol.LocalTxMonitor.Client ( ClientStAcquired (..) , ClientStIdle (..) , LocalTxMonitorClient (..) ) +import qualified Cardano.Ledger.TxIn as Ledger import qualified Codec.Json.Rpc as Rpc mkTxMonitorClient - :: forall m block. + :: forall m block crypto. ( MonadSTM m , HasTxId (GenTx block) + , block ~ CardanoBlock crypto ) => (forall a r. m a -> (Json -> m ()) -> Rpc.ToResponse r -> m a -> m a) -- ^ A default response handler to catch errors. @@ -141,9 +155,38 @@ mkTxMonitorClient defaultWithInternalError TxMonitorCodecs{..} queue yield = clientStAcquired MsgHasTransaction HasTransaction{id} toResponse -> defaultWithInternalError clientStAcquired yield toResponse $ do - pure $ SendMsgHasTx id $ \has -> do - yield $ encodeHasTransactionResponse $ toResponse $ HasTransactionResponse{has} - clientStAcquired + -- NOTE: + -- + -- Unfortunately here, we can't reliably ask the node for a + -- transaction id because it performs equality on the GenTxId NS + -- wrapper instead of the inner transaction id bytes. + -- + -- As a consequence, sending a transaction id wrapped as a + -- GenTxIdAlonzo will not match the same transaction id wrapped + -- as a GenTxIdBabbage. + -- + -- Yet, we cannot know upfront in what era those ids are wrapped + -- in the mempool although we do commit to a specific NS summand + -- when we deserialize it. So we have no other choice than + -- retrying the request on `False` with ids wrapped in different + -- eras. + -- + -- To be removed once the following issue is addressed: + -- + -- https://github.com/IntersectMBO/ouroboros-consensus/issues/1009 + loop (inMultipleEras id) + where + done has = do + yield $ encodeHasTransactionResponse $ toResponse $ HasTransactionResponse{has} + clientStAcquired + + loop = \case + [] -> done False + genId:rest -> do + pure $ SendMsgHasTx genId $ \case + True -> done True + False -> loop rest + MsgSizeOfMempool SizeOfMempool toResponse -> defaultWithInternalError clientStAcquired yield toResponse $ do pure $ SendMsgGetSizes $ \mempool -> do @@ -154,3 +197,24 @@ mkTxMonitorClient defaultWithInternalError TxMonitorCodecs{..} queue yield = pure $ SendMsgRelease $ do yield $ encodeReleaseMempoolResponse $ toResponse Released clientStIdle + +inMultipleEras + :: forall crypto constraint. + ( constraint ~ (MostRecentEra (CardanoBlock crypto) ~ ConwayEra crypto) + ) + => Ledger.TxId crypto + -> [GenTxId (CardanoBlock crypto)] +inMultipleEras id = + -- The list is ordered from the "most probable era", down to the least + -- probable. This hopefully ensures that we do a minimum number of loops + -- for the happy path. + [ GenTxIdBabbage (ShelleyTxId id) + , GenTxIdConway (ShelleyTxId id) + , GenTxIdAlonzo (ShelleyTxId id) + , GenTxIdMary (ShelleyTxId id) + ] + where + -- This line exists as a reminder. It will generate a compiler error + -- when a new era becomes available. From there, one should update + -- the list above to contain that latest era. + _compilerWarning = keepRedundantConstraint (Proxy @constraint) diff --git a/server/src/Ogmios/App/Server/WebSocket.hs b/server/src/Ogmios/App/Server/WebSocket.hs index 7e737d15e0..410c68a198 100644 --- a/server/src/Ogmios/App/Server/WebSocket.hs +++ b/server/src/Ogmios/App/Server/WebSocket.hs @@ -118,11 +118,11 @@ import Ogmios.Data.Json , encodeDeserialisationFailure , encodeEvaluationError , encodeExUnits + , encodeGenTxId , encodePoint , encodeSubmitTransactionError , encodeTip , encodeTx - , encodeTxId , jsonToByteString ) import Ogmios.Data.Json.Ledger.PredicateFailure @@ -219,12 +219,12 @@ newWebSocketApp tr unliftIO = do , mkTxMonitorCodecs opts - encodeTxId + encodeGenTxId (encodeTx (metadataFormat, includeCbor)) , mkTxSubmissionCodecs opts - encodeTxId + encodeGenTxId encodeScriptPurposeIndexInAnyEra encodeExUnits encodeEvaluationError diff --git a/server/src/Ogmios/Data/Json.hs b/server/src/Ogmios/Data/Json.hs index b07e3168be..2732a96f68 100644 --- a/server/src/Ogmios/Data/Json.hs +++ b/server/src/Ogmios/Data/Json.hs @@ -27,7 +27,8 @@ module Ogmios.Data.Json , encodeSubmitTransactionError , encodeTip , encodeTx - , encodeTxId + , encodeGenTxId + , Shelley.encodeTxId , Shelley.encodeTxIn -- * Decoders @@ -264,11 +265,11 @@ encodeTx opts = \case GenTxByron _ -> error "encodeTx: unsupported Byron transaction." -encodeTxId +encodeGenTxId :: Crypto crypto => GenTxId (CardanoBlock crypto) -> Json -encodeTxId = encodeObject . \case +encodeGenTxId = encodeObject . \case GenTxIdConway (ShelleyTxId x) -> Shelley.encodeTxId x GenTxIdBabbage (ShelleyTxId x) -> diff --git a/server/src/Ogmios/Data/Json/Orphans.hs b/server/src/Ogmios/Data/Json/Orphans.hs index f71a2b8f99..d8ecba4dbb 100644 --- a/server/src/Ogmios/Data/Json/Orphans.hs +++ b/server/src/Ogmios/Data/Json/Orphans.hs @@ -17,7 +17,6 @@ import Cardano.Ledger.Shelley.UTxO ) import Cardano.Network.Protocol.NodeToClient ( GenTx - , GenTxId ) import Cardano.Network.Protocol.NodeToClient.Trace ( TraceClient @@ -30,7 +29,6 @@ import Ogmios.Data.Json ( decodePoint , decodeSerializedTransaction , decodeTip - , decodeTxId , decodeUtxo , encodeSerializedTransaction , encodeSubmitTransactionError @@ -97,9 +95,6 @@ instance parseJSON = Json.withObject "CBOR" $ \o -> o .: "cbor" >>= decodeSerializedTransaction -instance PraosCrypto crypto => FromJSON (GenTxId (CardanoBlock crypto)) where - parseJSON = decodeTxId - instance Crypto crypto => FromJSON (MultiEraUTxO (CardanoBlock crypto)) where parseJSON = decodeUtxo diff --git a/server/src/Ogmios/Data/Json/Query.hs b/server/src/Ogmios/Data/Json/Query.hs index 5c0dd5d699..960e8c9b09 100644 --- a/server/src/Ogmios/Data/Json/Query.hs +++ b/server/src/Ogmios/Data/Json/Query.hs @@ -130,7 +130,6 @@ import Cardano.Ledger.Shelley.Genesis ) import Cardano.Network.Protocol.NodeToClient ( GenTx - , GenTxId , SerializedTransaction ) import Cardano.Slotting.Block @@ -164,7 +163,6 @@ import Ouroboros.Consensus.Cardano.Block ( BlockQuery (..) , CardanoBlock , GenTx (..) - , TxId (..) ) import Ouroboros.Consensus.HardFork.Combinator ( MismatchEraInfo @@ -197,9 +195,6 @@ import Ouroboros.Consensus.Shelley.Ledger.Block ( ShelleyBlock (..) , ShelleyHash (..) ) -import Ouroboros.Consensus.Shelley.Ledger.Mempool - ( TxId (..) - ) import Ouroboros.Consensus.Shelley.Ledger.Query ( BlockQuery (..) , NonMyopicMemberRewards (..) @@ -1818,14 +1813,14 @@ decodeTip json = decodeTxId :: forall crypto. Crypto crypto => Json.Value - -> Json.Parser (GenTxId (CardanoBlock crypto)) + -> Json.Parser (Ledger.TxId crypto) decodeTxId = Json.withText "TxId" $ \(encodeUtf8 -> utf8) -> do bytes <- decodeBase16 utf8 case hashFromBytes bytes of Nothing -> fail "couldn't interpret bytes as blake2b-256 digest" Just h -> - pure $ GenTxIdAlonzo $ ShelleyTxId $ Ledger.TxId (Ledger.unsafeMakeSafeHash h) + pure $ Ledger.TxId (Ledger.unsafeMakeSafeHash h) decodeTxIn :: forall crypto. (Crypto crypto) diff --git a/server/src/Ogmios/Data/Protocol/TxMonitor.hs b/server/src/Ogmios/Data/Protocol/TxMonitor.hs index 0759b71506..c4935715db 100644 --- a/server/src/Ogmios/Data/Protocol/TxMonitor.hs +++ b/server/src/Ogmios/Data/Protocol/TxMonitor.hs @@ -79,6 +79,7 @@ import Ouroboros.Network.Protocol.LocalTxMonitor.Type ( MempoolSizeAndCapacity (..) ) +import qualified Cardano.Ledger.TxIn as Ledger import qualified Codec.Json.Rpc as Rpc import qualified Data.Aeson as Json import qualified Data.Aeson.Encoding as Json @@ -122,7 +123,7 @@ data TxMonitorCodecs block = TxMonitorCodecs } mkTxMonitorCodecs - :: (FromJSON (GenTxId block)) + :: (FromJSON (Ledger.TxId (BlockCrypto block))) => Rpc.Options -> (GenTxId block -> Json) -> (GenTx block -> Json) @@ -295,14 +296,14 @@ _encodeNextTransactionResponse opts encodeTxId encodeTx = -- HasTransaction -- data HasTransaction block - = HasTransaction { id :: GenTxId block } + = HasTransaction { id :: Ledger.TxId (BlockCrypto block) } deriving (Generic) deriving instance Show (GenTxId block) => Show (HasTransaction block) deriving instance Eq (GenTxId block) => Eq (HasTransaction block) _encodeHasTransaction :: forall block. () - => (GenTxId block -> Json) + => (Ledger.TxId (BlockCrypto block) -> Json) -> Rpc.Request (HasTransaction block) -> Json _encodeHasTransaction encodeTxId = @@ -311,7 +312,7 @@ _encodeHasTransaction encodeTxId = encodeTxId id _decodeHasTransaction - :: forall block. (FromJSON (GenTxId block)) + :: forall block. (FromJSON (Ledger.TxId (BlockCrypto block))) => Json.Value -> Json.Parser (Rpc.Request (HasTransaction block)) _decodeHasTransaction = diff --git a/server/test/unit/Ogmios/App/Protocol/TxMonitorSpec.hs b/server/test/unit/Ogmios/App/Protocol/TxMonitorSpec.hs index e7d956a380..c768d3cc61 100644 --- a/server/test/unit/Ogmios/App/Protocol/TxMonitorSpec.hs +++ b/server/test/unit/Ogmios/App/Protocol/TxMonitorSpec.hs @@ -63,8 +63,8 @@ import Ogmios.Control.MonadSTM ) import Ogmios.Data.Json ( Json + , encodeGenTxId , encodeTx - , encodeTxId ) import Ogmios.Data.Json.Orphans () @@ -84,9 +84,15 @@ import Ogmios.Data.Protocol.TxMonitor , TxMonitorMessage (..) , mkTxMonitorCodecs ) +import Ouroboros.Consensus.Cardano.Block + ( TxId (..) + ) import Ouroboros.Consensus.Ledger.SupportsMempool ( HasTxId (..) ) +import Ouroboros.Consensus.Shelley.Ledger + ( TxId (ShelleyTxId) + ) import Ouroboros.Network.Protocol.LocalTxMonitor.Type ( ClientHasAgency (..) , LocalTxMonitor (..) @@ -138,6 +144,7 @@ import Test.QuickCheck , vectorOf ) +import qualified Cardano.Ledger.TxIn as Ledger import qualified Codec.Json.Rpc as Rpc import qualified Codec.Json.Rpc.Handler as Rpc import qualified Data.Aeson as Json @@ -213,7 +220,7 @@ withTxMonitorClient withTxMonitorClient action seed = do (recvQ, sendQ) <- atomically $ (,) <$> newTQueue <*> newTQueue let opts = Rpc.defaultOptions - let innerCodecs = mkTxMonitorCodecs opts encodeTxId (encodeTx (MetadataNoSchema, omitOptionalCbor)) + let innerCodecs = mkTxMonitorCodecs opts encodeGenTxId (encodeTx (MetadataNoSchema, omitOptionalCbor)) let client = mkTxMonitorClient (defaultWithInternalError opts) innerCodecs recvQ (atomically . writeTQueue sendQ) let codec = codecs defaultSlotsPerEpoch nodeToClientV_Latest & cTxMonitorCodec withMockChannel (txMonitorMockPeer seed codec) $ \channel -> do @@ -365,8 +372,17 @@ maxCapacity = 10 plausibleTxs :: [GenTx Block] plausibleTxs = generateWith (vectorOf (2 * maxCapacity) genTx) 42 -plausibleTxsIds :: [GenTxId Block] -plausibleTxsIds = txId <$> plausibleTxs +plausibleTxsIds :: [Ledger.TxId StandardCrypto] +plausibleTxsIds = unGenTxId . txId <$> plausibleTxs + where + unGenTxId = \case + GenTxIdConway (ShelleyTxId x) -> x + GenTxIdBabbage (ShelleyTxId x) -> x + GenTxIdAlonzo (ShelleyTxId x) -> x + GenTxIdMary (ShelleyTxId x) -> x + GenTxIdAllegra (ShelleyTxId x) -> x + GenTxIdShelley (ShelleyTxId x) -> x + GenTxIdByron _ -> error "GenTxIdByron" genServerAction :: [tx] -> Gen ServerAction genServerAction xs = frequency $ mconcat @@ -427,7 +443,7 @@ isNextTxResponse :: ResponsePredicate isNextTxResponse = ResponsePredicate $ \v -> ("method" `at` v) == Just (toJSON @Text "nextTransaction") -hasTx :: Rpc.Mirror -> GenTxId Block -> TxMonitorMessage Block +hasTx :: Rpc.Mirror -> Ledger.TxId StandardCrypto -> TxMonitorMessage Block hasTx mirror tx = MsgHasTransaction (HasTransaction tx) (Rpc.Response method mirror) where diff --git a/server/test/unit/Ogmios/Data/JsonSpec.hs b/server/test/unit/Ogmios/Data/JsonSpec.hs index 4a8714ba70..91bc09d73c 100644 --- a/server/test/unit/Ogmios/Data/JsonSpec.hs +++ b/server/test/unit/Ogmios/Data/JsonSpec.hs @@ -54,6 +54,8 @@ import Ogmios.Data.Json , encodeDeserialisationFailure , encodeEvaluationError , encodeExUnits + , encodeGenTxId + , encodeObject , encodePoint , encodeSubmitTransactionError , encodeTip @@ -185,6 +187,7 @@ import Test.Generators , genData , genEpochResult , genEvaluateTransactionResponse + , genGenTxId , genGenesisConfig , genHardForkApplyTxErr , genInterpreterResult @@ -204,7 +207,6 @@ import Test.Generators , genTip , genTipNoGenesis , genTx - , genTxId , genUTxOResult , genUtxoBabbage , genWithOrigin @@ -461,7 +463,7 @@ spec = do (arbitrary @(Rpc.Response (SubmitTransactionResponse Block))) (_encodeSubmitTransactionResponse (Proxy @Block) Rpc.defaultOptions - encodeTxId + encodeGenTxId encodeSubmitTransactionError encodeDeserialisationFailure ) @@ -501,19 +503,19 @@ spec = do validateToJSON (arbitrary @(Rpc.Response (NextTransactionResponse Block))) - (_encodeNextTransactionResponse Rpc.defaultOptions encodeTxId (encodeTx (MetadataNoSchema, omitOptionalCbor))) + (_encodeNextTransactionResponse Rpc.defaultOptions encodeGenTxId (encodeTx (MetadataNoSchema, omitOptionalCbor))) (10, "NextTransactionResponse") "ogmios.json#/properties/NextTransactionResponse" validateToJSON (arbitrary @(Rpc.Response (NextTransactionResponse Block))) - (_encodeNextTransactionResponse Rpc.defaultOptions encodeTxId (encodeTx (MetadataDetailedSchema, omitOptionalCbor))) + (_encodeNextTransactionResponse Rpc.defaultOptions encodeGenTxId (encodeTx (MetadataDetailedSchema, omitOptionalCbor))) (10, "NextTransactionResponse") "ogmios.json#/properties/NextTransactionResponse" validateFromJSON (arbitrary @(Rpc.Request (HasTransaction Block))) - (_encodeHasTransaction encodeTxId, _decodeHasTransaction) + (_encodeHasTransaction (encodeObject . encodeTxId), _decodeHasTransaction) (10, "HasTransaction") "ogmios.json#/properties/HasTransaction" @@ -881,7 +883,7 @@ instance Arbitrary (GenTx Block) where arbitrary = genTx instance Arbitrary (GenTxId Block) where - arbitrary = genTxId + arbitrary = genGenTxId instance Arbitrary MempoolSizeAndCapacity where arbitrary = genMempoolSizeAndCapacity diff --git a/server/test/unit/Test/Generators.hs b/server/test/unit/Test/Generators.hs index 7ea425f8b0..bc6b2b06e0 100644 --- a/server/test/unit/Test/Generators.hs +++ b/server/test/unit/Test/Generators.hs @@ -164,6 +164,7 @@ import qualified Cardano.Ledger.PoolDistr as Ledger import qualified Cardano.Ledger.Shelley.API.Wallet as Sh.Api import qualified Cardano.Ledger.Shelley.PParams as Sh import qualified Cardano.Ledger.Shelley.UTxO as Sh +import qualified Cardano.Ledger.TxIn as Ledger genBlock :: Gen Block genBlock = oneof @@ -224,9 +225,15 @@ genBlock = oneof ) ] -genTxId :: Gen (GenTxId Block) -genTxId = - GenTxIdAlonzo . ShelleyTxId <$> arbitrary +genTxId :: Gen (Ledger.TxId StandardCrypto) +genTxId = arbitrary + +genGenTxId :: Gen (GenTxId Block) +genGenTxId = oneof + [ GenTxIdConway . ShelleyTxId <$> genTxId + , GenTxIdBabbage . ShelleyTxId <$> genTxId + , GenTxIdAlonzo . ShelleyTxId <$> genTxId + ] genTx :: Gen (GenTx Block) genTx = oneof diff --git a/server/test/vectors/NextTransactionResponse/002.json b/server/test/vectors/NextTransactionResponse/002.json index 49d0ed7509..4dbb5f5b10 100644 --- a/server/test/vectors/NextTransactionResponse/002.json +++ b/server/test/vectors/NextTransactionResponse/002.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"5241c22b8eb02fb1443c7c9b806655b5c9fef5e84b80dbacf8e9898b2c84c6fe"}},"id":"FN46wUpZUZXP"} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"39ce2a8b0682400153616f13df490a56807a0577231cb38a358dbf3dd8305581"}},"id":"FN46wUpZUZXP"} \ No newline at end of file diff --git a/server/test/vectors/NextTransactionResponse/003.json b/server/test/vectors/NextTransactionResponse/003.json index 4a34870089..e2c1a7311f 100644 --- a/server/test/vectors/NextTransactionResponse/003.json +++ b/server/test/vectors/NextTransactionResponse/003.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"86ae01af71ee07a1fdb24703b42b7d3dcac8fa659dcedcd1096e2005b8aa4de6"}},"id":"2rw187OkJXf2"} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"9edbc6ea6ba5111b856536171e5fb024537e180303b5bbf34f4f83e479da3527"}},"id":"2rw187OkJXf2"} \ No newline at end of file diff --git a/server/test/vectors/NextTransactionResponse/004.json b/server/test/vectors/NextTransactionResponse/004.json index 5c210d1d7b..9a5e9a7e60 100644 --- a/server/test/vectors/NextTransactionResponse/004.json +++ b/server/test/vectors/NextTransactionResponse/004.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"0e769695e2b5c45dc7ab442816fc36e8e919ae658837d830527bcd15efd1f017"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"bcc5cb32714eff126402cb7d7e93d0641351e89559b18b2085bdeab3ceed79bb"}},"id":null} \ No newline at end of file diff --git a/server/test/vectors/NextTransactionResponse/005.json b/server/test/vectors/NextTransactionResponse/005.json index 2f87a02ab9..1dee2a94bc 100644 --- a/server/test/vectors/NextTransactionResponse/005.json +++ b/server/test/vectors/NextTransactionResponse/005.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"195add629f6743a07a41f31fa846f459599598c2ce13a1c9f7a8461d56a6be29"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"08838ee3833ff5b9b5b7b54936e9d678e80d83f7e0c0d6e03f220ba08371e1d2"}},"id":null} \ No newline at end of file diff --git a/server/test/vectors/NextTransactionResponse/006.json b/server/test/vectors/NextTransactionResponse/006.json index 2b5df5a610..a6662615f0 100644 --- a/server/test/vectors/NextTransactionResponse/006.json +++ b/server/test/vectors/NextTransactionResponse/006.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"f7ee4aa58b21b20d624de9c2229fa326c7b4b5ae42943e89430c2dcc1ef96774"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"15f25f4b60f82fb982a7ef2710d2c02435da6a191615b75628cbebeb1d76b7f0"}},"id":null} \ No newline at end of file diff --git a/server/test/vectors/SubmitTransactionResponse/147.json b/server/test/vectors/SubmitTransactionResponse/147.json index ad63649121..cfd27c5701 100644 --- a/server/test/vectors/SubmitTransactionResponse/147.json +++ b/server/test/vectors/SubmitTransactionResponse/147.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"99cafc4b87787cd17b1a4b2855ea70169af681e65f91f7e343aca8e93bfe1664"}},"id":"wwcCZ6ce7lrH"} \ No newline at end of file +{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"0c087171a3245c20d73ba13840c0c700ebb63d626a51cab768bd19e4bf906abb"}},"id":"wwcCZ6ce7lrH"} \ No newline at end of file diff --git a/server/test/vectors/SubmitTransactionResponse/172.json b/server/test/vectors/SubmitTransactionResponse/172.json index ec8470c1af..501d0a6110 100644 --- a/server/test/vectors/SubmitTransactionResponse/172.json +++ b/server/test/vectors/SubmitTransactionResponse/172.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"41dd7fbc15186d5712e48036525c25e20e0a22dd3412afe91fe12f81755359fd"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"1d023d6210da0652f6c63c688e0591e8346ca5cfd43bff01677e5c8351ba6b7e"}},"id":null} \ No newline at end of file diff --git a/server/test/vectors/SubmitTransactionResponse/186.json b/server/test/vectors/SubmitTransactionResponse/186.json index e37fc209e2..5437017bb6 100644 --- a/server/test/vectors/SubmitTransactionResponse/186.json +++ b/server/test/vectors/SubmitTransactionResponse/186.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"182d356d006a10567c2c827c7c01cc0e14ee90e21ce385f98a123baa9ef7d6f4"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"94ed71433d1c40eba224b2c988d12030d53e58f114d5901884129227a847ad85"}},"id":null} \ No newline at end of file