# Bounce: A High Performance Satellite-Based Blockchain System
## 4 Slot Protocol
### Core Bounce Blockchain Protocol  
**Step 1 (Before slot \(i\) begins) Each Sending Station that wishes to participate in the slot assembles one or more Merkle trees for slot \(i\):** A Sending Station adds each submitted transaction to some list \(L\). If the clock time is at \(d\) seconds before the beginning of slot \(i\), the Sending Station for that slot builds a Merkle tree \(T\) using the transactions in \(L\). The Merkle tree \(T\) is then sent to at least \(f+1\) Broadcast Ground Stations (step 1 in Figure 2 and detailed in Algorithm 1). Each Broadcast Ground Station computes the Merkle root from the Merkle tree and sends the signed root back to the Sending Station as well as to user nodes. User nodes will store that Merkle Tree but will process the contained transactions only after receiving a Commit Record containing the corresponding Merkle Tree root. (step 1\({}^{\prime}\) in Figure 2). The Sending Station then aggregates the \(f+1\) signatures to a single multisignature as described in Algorithm 2. In our experiments, we set \(d\) to one second and \(f+1\) to be 80% of the Broadcast Ground Stations as you can see in Section 6. **After the end of slot \(i-1\), Broadcast Ground Stations multisign the Commit Record for slot \(i-1\):** Separately and possibly concurrently with Merkle Tree construction, \(f+1\) Broadcast Ground Stations form a multisignature of the Commit Record of slot \(i-1\). That happens as follows: when a Satellite sends the Commit Record for slot \(i-1\) to a set of Broadcast Ground Stations (step 2 in Figure 2), each receiving Broadcast Ground Station \(G\) broadcasts the Commit Record to at least \(f\) other Broadcast Ground Stations. Each receiving Broadcast Ground Station signs the Commit Record and sends it back to \(G\). The Broadcast Ground Station \(G\) then aggregates at least \(f\) other signatures and its own signature for the Commit Record for slot \(i-1\) into a single multisignature. Then, the Broadcast Ground Station \(G\) sends the multisignature to all possible Sending Stations for slot \(i\) (step 2\({}^{\prime}\) in Figure 2) as well as to User nodes. Several Broadcast Ground Stations may duplicate this effort for fault tolerance reasons. **Sending Station sends Sending Station message (step 3 in Figure 2):** At the beginning of slot \(i\), each Sending Station that wants to participate in slot \(i\) creates a Sending Station message including both a multisigned Commit Record for slot \(i-1\) and the multisigned Merkle tree root (as described in Algorithm 3). It sends the Sending Station message to the Satellite that is responsible for slot \(i\). There could be multiple Sending Stations creating and sending the Sending Station messages to the same satellite for each slot \(i\). **Satellite creates Commit Record and broadcasts (step 4 in Figure 2):** When a Satellite for slot \(i\) receives a Sending Station message for that slot, it (a) tests that the signature is indeed signed by the Sending Station, (b) checks the identifier in the Sending Station message is \(i\), (c) validates the multisignature on the Commit Record for slot \(i-1\), (d) the Commit Record is for slot \(i-1\) and Commit flag set to True, (e) validates the multisignature on the Merkle root (by checking the public keys of the Broadcast Ground Stations). If all the tests succeed, the Satellite keeps the Sending Station message in a buffer holding the set of valid Sending Station messages. At the beginning of the slot \(i\), the Satellite selects all of the valid Sending Station messages and creates a positive Commit Record with the Merkle Tree root in those Sending Station messages. Even if none of the sending station messages contains a Merkle Tree root, the satellite can still create a positive Commit Record if any valid Sending Station message contains the previous Commit Record. If the satellite does not receive a previous Commit Record, however, it creates a negative Commit Record saying effectively that the Commit Record for slot \(i-1\) is unavailable.