Skip to content
  • Alexandru Vasile's avatar
    rpc-v2/tx: Implement `transaction_unstable_broadcast` and `transaction_unstable_stop` (#3079) · bde0bbe5
    Alexandru Vasile authored
    
    
    This PR implements the
    [transaction_unstable_broadcast](https://github.com/paritytech/json-rpc-interface-spec/blob/main/src/api/transaction_unstable_broadcast.md)
    and
    [transaction_unstable_stop](https://github.com/paritytech/json-rpc-interface-spec/blob/main/src/api/transaction_unstable_stop.md).
    
    
    The
    [transaction_unstable_broadcast](https://github.com/paritytech/json-rpc-interface-spec/blob/main/src/api/transaction_unstable_broadcast.md)
    submits the provided transaction at the best block of the chain.
    If the transaction is dropped or declared invalid, the API tries to
    resubmit the transaction at the next available best block.
    
    ### Broadcasting 
    The broadcasting operation continues until either:
    
    - the user called `transaction_unstable_stop` with the operation ID that
    identifies the broadcasting operation
    - the transaction state is one of the following: 
      - Finalized: the transaction is part of the chain
    - FinalizedTimeout: we have waited for 256 finalized blocks and timedout
      - Usurped the transaction has been replaced in the tx pool
      
    The broadcasting retires to submit the transaction when the transaction
    state is:
    - Invalid: the transaction might become valid at a later time
    - Dropped: the transaction pool's capacity is full at the moment, but
    might clear when other transactions are finalized/dropped
    
    ### Stopping
    
    The `transaction_unstable_broadcast` spawns an abortable future and
    tracks the abort handler.
    When the
    [transaction_unstable_stop](https://github.com/paritytech/json-rpc-interface-spec/blob/main/src/api/transaction_unstable_stop.md)
    is called with a valid operation ID; the abort handler of the
    corresponding `transaction_unstable_broadcast` future is called. This
    behavior ensures the broadcast future is finishes on the next polling.
    When the `transaction_unstable_stop` is called with an invalid operation
    ID, an invalid jsonrpc specific error object is returned.
    
    
    ### Testing
    
    This PR adds the testing harness of the transaction API and validates
    two basic scenarios:
    - transaction enters and exits the transaction pool
    - transaction stop returns appropriate values when called with valid and
    invalid operation IDs
    
    
    Closes: https://github.com/paritytech/polkadot-sdk/issues/3039
    
    Note that the API should be enabled after:
    https://github.com/paritytech/polkadot-sdk/issues/3084.
    
    cc @paritytech/subxt-team
    
    ---------
    
    Signed-off-by: default avatarAlexandru Vasile <[email protected]>
    Co-authored-by: default avatarSebastian Kunert <[email protected]>
    bde0bbe5