# Step-by-Step User Journey on Arch

1. Users can invoke a program by preparing, signing, and sending a transaction to the Arch Network without having to use anything but their Bitcoin wallets (ie, no bridging). \
   \
   They send this message through an RPC call passing essential information for execution, including State UTXOs, the related programs to execute, and custom program inputs (Bitcoin PSBTs).
2. A leader node, selected from the pool of validators, receives the RuntimeTransaction and initiates the process by proposing a new block. The transaction is then gossiped throughout the network whereby each validator will validate and process the transaction asynchronously.
3. Execution results are shared back with the leader node and, once a signature threshold is reached, the leader will aggregate the signatures and sends a fully-signed Bitcoin transaction to the Bitcoin network, including state transitions and asset transfers from the execution (this guarantees that you can’t have the asset transfer happen without the state transition also occurring, or vice versa).
4. The user, or dapp, can then poll the network to retrieve the result of the transaction.

<figure><img src="/files/Ltv91PrNB2us3bf8Y4F8" alt=""><figcaption></figcaption></figure>

#### Sample data structures

{% code title="" overflow="wrap" %}

```rust
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, BorshDeserialize, BorshSerialize)]
pub struct RuntimeTransaction {
    pub version: u32,
    pub signatures: Vec<Signature>,
    pub message: Message,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, BorshSerialize, BorshDeserialize)]
pub struct Message {
    pub signers: Vec<Pubkey>,
    pub instructions: Vec<Instruction>,
}

#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize)]
pub struct Instruction {
    pub program_id: Pubkey,
    pub accounts: Vec<AccountMeta>,
    pub data: Vec<u8>,
}

```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://arch-network.gitbook.io/arch-documentation/fundamentals/step-by-step-user-journey-on-arch.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
