Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Agile Coretime #1

Merged
merged 47 commits into from
Aug 11, 2023
Merged
Changes from 5 commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
c94858e
RFC-0001
gavofyork Jun 29, 2023
72d2787
Typo
gavofyork Jun 30, 2023
5ec35d1
Typo
gavofyork Jun 30, 2023
ef71a4b
Detail on migrations
gavofyork Jun 30, 2023
4c907f2
Merge branch 'gav-agile-coretime' of https://github.com/polkadot-fell…
gavofyork Jun 30, 2023
f1c3ce4
Update RFC-0001-Agile Coretime.md
gavofyork Jul 4, 2023
f84d030
Update RFC-0001-Agile Coretime.md
gavofyork Jul 4, 2023
e020237
Update RFC-0001-Agile Coretime.md
gavofyork Jul 4, 2023
2bfc3de
Update RFC-0001-Agile Coretime.md
gavofyork Jul 4, 2023
6a07faf
Address some grumbles
gavofyork Jul 4, 2023
814c44b
Merge branch 'gav-agile-coretime' of https://github.com/polkadot-fell…
gavofyork Jul 4, 2023
eb8a681
Weighted allocations
gavofyork Jul 4, 2023
2538bb0
Relay-chain API
gavofyork Jul 4, 2023
e95b2e9
Bitmapping
gavofyork Jul 6, 2023
015f92a
Core Parts
gavofyork Jul 7, 2023
e6654fd
Rename
gavofyork Jul 7, 2023
71c5c47
Typo
gavofyork Jul 7, 2023
591b62a
Much more efficient schema
gavofyork Jul 8, 2023
562ef32
mention RFC-5
gavofyork Jul 8, 2023
642782d
Details
gavofyork Jul 9, 2023
cbbf41e
typo
gavofyork Jul 9, 2023
3117eb2
Intro PUC
gavofyork Jul 9, 2023
9a97546
Bulktime definitions
gavofyork Jul 9, 2023
d4cdf69
Correct example price setting algo
gavofyork Jul 9, 2023
bc4235c
Update sale period/renewas
gavofyork Jul 10, 2023
ececc83
Explanation
gavofyork Jul 10, 2023
7c92da0
Update text/0001-agile-coretime.md
gavofyork Jul 17, 2023
38a0189
Update text/0001-agile-coretime.md
gavofyork Jul 17, 2023
6213a2c
Update with insights from implementation
gavofyork Jul 18, 2023
56c2bf4
Update example pricing with sellout price and edge cases
gavofyork Jul 18, 2023
34a9581
Use Mask terminology
gavofyork Jul 18, 2023
36ee156
Update text/0001-agile-coretime.md
gavofyork Jul 25, 2023
0c3121f
Update text/0001-agile-coretime.md
gavofyork Jul 25, 2023
f939d75
Update text/0001-agile-coretime.md
gavofyork Jul 25, 2023
056cc23
Update text/0001-agile-coretime.md
gavofyork Jul 25, 2023
fae6b26
Update text/0001-agile-coretime.md
gavofyork Jul 25, 2023
532cead
Update text/0001-agile-coretime.md
gavofyork Jul 25, 2023
5fd1c37
Address grumbles.
gavofyork Jul 25, 2023
13166ea
Update text/0001-agile-coretime.md
gavofyork Jul 31, 2023
e50e717
Renewal price is only a cap
gavofyork Jul 31, 2023
1b01ee6
Merge branch 'gav-agile-coretime' of https://github.com/polkadot-fell…
gavofyork Jul 31, 2023
b39e7f8
Better wording
gavofyork Jul 31, 2023
c9ae929
Better wording
gavofyork Jul 31, 2023
28aed69
Typo
gavofyork Jul 31, 2023
b756283
Typo
gavofyork Jul 31, 2023
095884e
Add reference
gavofyork Aug 1, 2023
6f29561
Rephrase according to comment
gavofyork Aug 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
291 changes: 291 additions & 0 deletions RFC-0001-Agile Coretime.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,291 @@
# RFC-1: Agile Coretime

| | |
| --------------- | ------------------------------------------------------------------------------------------- |
| **Status** | Draft Proposal |
| **Areas** | General |
| **Description** | Agile periodic-sale-based model for assigning Coretime on the Polkadot Ubiquitous Computer. |
| **Issues** | n/a |
| **Authors** | Gavin Wood |
| **Reviewers** | None |


## Summary

This proposes a periodic, sale-based method for assigning and Polkadot Coretime. The method takes into account the need for long-term capital expenditure planning for teams building on Polkadot, yet also provides a means to allow Polkadot to capture long-term value in the resource which it sells. It supports the possibility of building secondary markets to make resource allocation more efficient and largely avoids the need for parameterisation.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

## Motivation

### Present System

The present system of allocating time for parachains on the cores of the Polkadot Ubiquitous Computer (aka "Polkadot") is through a process known as *slot auctions*. These are on-chain candle auctions which proceed for several days and result in a core being assigned to a single parachain for six months at a time up to 18 months in advance. Practically speaking, we only see two year periods being bid upon and leased.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

Funds behind the bids made in the slot auctions are merely locked, not consumed or paid and become unlocked and returned to the bidder on expirt of the lease period. A means of sharing the deposit trustlessly known as a *crowdloan* is available allowing token holders to contribute to the overall deposit of a chain without any counterparty risk.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Funds behind the bids made in the slot auctions are merely locked, not consumed or paid

This wording and multiple other references to sales/ purchase suggest that Bulk coretime will be paid for in DOT, in contrast to currently where it's simply locked and the "cost" is the opportunity cost of not staking - it should be explicit if this is the case.

It would also be useful to understand - if this is the case - where those DOT are sent, i.e. who is paid? Is it validators? Is it burned? If validators, would high reward rates through demand for blockspace impact inflation that currently forms the vast majority of their revenue?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bulk coretime will be paid for in DOT

That's right.

Any DOT recuperated for sales of system resources (Coretime, in this case) would by default be placed in the treasury. Governance would be able to determine what to do with it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe its better to burn the DOT instead of diverting them to Treasury. There are a few reasons for that:

  1. In the absence of 2y locks on DOT, the system might benefit from a permanent sink for DOTs. We also might consider to increase the ideal staking rate. Non-interactive staking might serve well here, too.
  2. Inflow from coretime usage might, especially in the short-term, be very volatile. The Treasury conceptually benefits from predictable inflow, allowing for long-term budgeting. Inflation is the best way to do that. We'd counter that with burning for coretime.
  3. This mechanism would lead to high inflow in times with high coretime usage and low inflow in times of low usage. It seems to me that, if anything, it should be the opposite. With a steady inflow the Treasury would always have enough funds to respond to demand shocks in coretime when necessary (by funding good projects / initiatives).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I totally agree with @jonasW3F , DOT from Coretime sales should be instantly burnt in order to slow down inflation.

Copy link
Contributor Author

@gavofyork gavofyork Jul 13, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no objection, though I would prefer to leave the specific economics (including this and the price adaption) for other RFCs so that we can document the motivations properly. The implementation of RFC-1 can (and indeed does) just provide a OnUnbalanced<Credit> endpoint which can just as easily burn as send to the treasury.

@jonasW3F perhaps you can write a short RFC expanding out your points above.


### Problems

The present system is based on a model of one-core-per-parachain. This is a legacy interpretation of the Polkadot platform and is not a reflection of its present capabilities. By restricting ownership and usage to this model, more dynamic and resource-efficient means of utilising the Polkadot Ubiquitous Computer is lost.

More specifically, it is impossible to lease out cores at anything less than six months, and apparently unrealistic to do so at anything less than two years. This cuts out the ability to dynamically manage the underlying resource, and generally experimentation, iteratation and innovation are hampered. It bakes into the platform an assumption of permanence for anything deployed into it and restricts the market's ability to find a more optimal allocation of the finite resource.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

There is no ability to determine capital requirements for hosting a parachain beyond two years from the point of its initial deployment onto Polkadot. While it would be unreasonable to have perfect and indefinite cost predictions for any real-world platform, not having any clarity whatsoever beyond "market rates" two years hence can be a very off-putting prospect for teams to buy into.

However, quite possibly the most substantial problem is both a perceived and often real high barrier to entry of the Polkadot ecosystem. By forcing innovators to either raise 7-figure sums through investors or appeal to the wider token-holding community, Polkadot makes it essentially difficult for a small band of innovators from deploying their technology into Polkadot. While not being actually permissioned, it is also far from the barrierless, permissionless ideal which an innovation platform such as Polkadot should be striving for.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

## Stakeholders

Primary stakeholder sets are:

- Protocol researchers and developers, largely represented by the Polkadot Fellowship and Parity Technologies' Engineering division.
- Polkadot Parachain teams both present and future, and their users.
- Polkadot DOT token holders.

_Facilitator:_

Parity Technologies' Ecosystem division.

_Reviewers:_

None.

_Consulted:_
- Alistair
- Jonas
- Bjorn
- Rob H
- Rob K

_Socialization:_

This RFC was presented at Polkadot Decoded 2023 Copenhagen on the Main Stage. A small amount of socialisation at the Parachain Summit preceeded it and some substantial discussion followed it. Parity Ecosystem team is currently soliciting views from ecosystem teams who would be key stakeholders.

## Requirements

There are six main requirements:

1. The solution MUST provide an acceptable value-capture mechanism for the Polkadot network.
2. The solution SHOULD allow parachains and other projects deployed on to the Polkadot UC to make long-term capital expenditure predictions.
3. The solution SHOULD minimize the barriers to entry in the ecosystem.
4. The solution SHOULD maximize the value which the Polkadot UC provides by allocating its limited resources optimally.
5. The design MUST work with a limited set of resources (cores on the Polkadot UC) whose properties and number may evolve over time.
6. The design MUST avoid creating additional dependency on functionality which the Relay-chain need not strictly provide for the delivery of the Polkadot UC. This includes any dependency on the Relay-chain hosting a DOT token.

Furthermore, the design SHOULD be implementable and deployable in a timely fashion; three months from the acceptance of this RFC would seem reasonable.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems optimistic, especially on the "deployable" part given the Root track takes one month and would eat into a third of this. Perhaps deployable to testnet with concrete migration path proposed for existing parachains?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't the fellowship be able to whitelist this upgrade?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes but the track is still 28 days. And even though it is less restrictive to pass earlier on that track, a lot of parachain teams have expressed that they prefer a set block number (i.e. At over After) for runtime upgrades so that they can prepare for any breaking changes.

Copy link
Contributor Author

@gavofyork gavofyork Jul 4, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We'll see. As long as the Relay-chain support for core-assignment exists, then this really shouldn't be a big change. Three months should be notionally possible, even if it ends up being missed due to of factors outside of the scope of this RFC.


## Parameters

This proposal includes a number of parameters which need not necessarily be fixed. They are stated here along with a value, either *suggested* in which case it is non-binding and the proposal should not be judged on the value since the governance mechanism of Polkadot is expected to specify/maintain it; or *specified* in which case the proposal should be judged on the merit of the value as-is.

| Name | Value |
| ------------------- | ---------------------------- |
| `BULK_PERIOD` | `28 * DAYS` |
| `TIMESLICE` | `10 * MINUTES` |
| `BULK_TARGET` | `30` |
| `BULK_LIMIT` | `45` |
| `LEADIN_PERIOD` | `14 * DAYS` |
| `RENEWAL_PRICE_CAP` | `Perbill::from_percent(2)` |


## Design

### Overview

Upon implementation of this proposal, slot auctions and associated crowdloans cease. Instead, Coretime on the Polkadot UC is sold by the Polkadot System in two separate formats: *Bulk* and *Instantaneous*. This proposal only mandates the implementation of *Bulk Coretime*; any mentions of *Instantaneous Coretime* should be treated only in terms of recommendation.

*Bulk Coretime* is sold periodically and allocated any time in advance of its usage, whereas *Instantaneous Coretime* is sold immediately prior to usage on a block-by-block basis with an explicit allocation at the time of purchase.

All Bulk Coretime sold by Polkadot is done so on a new system parachain known as the *Broker-chain*. Owners of Bulk Coretime are tracked on this chain and the ownership status and properties (i.e. the specific period) of the owned Coretime are exposed over XCM as a non-fungible asset.

At the request of the owner, the Broker-chain allows Bulk Coretime to be:

1. Transferred in ownership.
2. Split into quantized, non-overlapping segments of Bulk Coretime with the same ownership.
3. Consumed in exchange for the allocation of a Core during its period.
4. Consumed in exchange for a pro-rata amount of the revenue from Instantaneous Core sales over its period.

Pre-existing leases SHALL be recorded in the Broker-chain and cores reserved for them.

Sales of Instantaneous Coretime is expected to happen on the Polkadot Relay-chain. The Relay-chain is expected to be responsible for:

- holding non-transferable, non-refundable DOT balance information for collators.
- setting and adjusting the price of Instantaneous Coretime based on usage.
- allowing collators to consume their DOT balance in exchange for the ability to schedule one PoV for near-immediate usage.
- ensuring the Broker-chain has timely book-keeping information on Coretime sales revenue. This should include a total instantaneous revenue amount for each block number.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

### Broker-chain

The Broker-chain is a new system parachain. It has the responsibility of providing the Relay-chain via UMP with scheduling information of:

- How many cores which should be made available during the next session.
- Which cores should be allocated to which para IDs.

Any cores left unallocated are assumed by the Broker-chain to be used for Instantaneous Coretime sales.

It is also expected to receive information from the Relay-chain on total revenue from instantaneous coretime sales on a per-block basis.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

### Bulk Sales

There is a periodic sale of Coretime happening at a period of `BULK_PERIOD`. A number of instances of Coretime spanning from `LEADIN_PERIOD` in the future to `LEADIN_PERIOD + BULK_PERIOD` in the future of a single Polkadot UC Core is offered by the Polkadot System at a fixed price.

These instances which are owned by purchaser are called *regions*. This sale happens on the Broker-chain. Regions are quantized into atomic periods of `TIMESLICE`, into which `BULK_PERIOD` divides a whole number of times. The `Timeslice` type is a `u16` which can be multiplied by `TIMESLICE` to give a `BlockNumber` value indicating the same period in times of (Relay-chain) blocks.

The Broker-chain aims to sell some `BULK_TARGET` of Cores, up to some `BULK_LIMIT`. It makes this sale in a single batch `LEADIN_PERIOD` prior to the beginning of the period being sold. The Broker chain publishes a price for this batch of sales for the `BULK_TARGET` period prior to the sale execution.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

Accounts may call a `purchase` function with the appropriate funds in place to have their funds reserved and signal an intention to purchase Bulk Coretime for the forthcoming period. One account may have only one pending purchase. Any number of accounts may attempt to `purchase` Bulk Coretime for the forthcoming period, but the order is recorded.

If there are more purchase requests than available cores for purchase in this period, then requests are processed in incoming order. Any additional purchase orders are carried over but marked as such. A purchase is only cancellable if it was carried over.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

When a region of Bulk Coretime is initially issued through this purchase, the price it was purchased for is recorded, in addition to the beginning and end Relay-chain block numbers to which it corresponds.

The Broker-chain SHALL record this information in a storage double-map called Regions, keyed first by the current bulk `SaleIndex` (a `u16` starting at zero and incrementing with each sale), then secondarily by a `RegionId`. It shall map into a value of `RegionRecord`:

```rust
type SaleIndex = u16;
struct RegionId {
core: CoreIndex, // A `u16`.
begin: Timeslice, // A `u16`.
}
struct RegionRecord {
owner: AccountId,
end: Timeslice,
price: Option<Balance>,
allocation: Option<Vec<ParaId>>, // begins set to `None`
gavofyork marked this conversation as resolved.
Show resolved Hide resolved
}
```

This map functions essentially as a linked list. With one region's `end` field functioning as the next region's key's `begin` field. It is keyyed by the sale index in order to allow the following sale period's Coretime to be manipulated during the `LEADIN_PERIOD` prior to it becoming allocatable.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

An additional storage map is maintained to keep the "heads" of this linked list. It is called `NextRegion` and it maps `CoreIndex` to `Timeslice`, to indicate the earliest stored region of the given core.

Notably, if a region is split or transferred, then the `price` is reset to `None`, which has the effect of disallowing a price-increase-capped renewal.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

The Broker-chain provides feedback to the Relay-chain on which `ParaId` sets should be serviced on which cores, and does so as they change. Each block, the Broker-chain checks if the period of a `Timeslice` has elapsed. If so, it checks to see if any cores have a newly active `RegionRecord` value in the `Regions` map. If they do, it MUST notify the Relay-chain of the new responsibilities of the relevant `core`. In this case, it MUST remove the item from the `Regions` map and update the `NextRegion` map so it maps the relevant core to the value of removed record's `end` field.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

If the `RegionRecord` value for an elapsed `RegionId` has an `allocation` of `None`, then the item is not removed and the Relay-chain is instructed to place the core for instantaneous use.

### Specific functions of the Broker-chain

Several functions of the Broker-chain SHALL be exposed through dispatchables and/or a `nonfungible` trait implementation integrated into XCM:

#### 1. Transfer of ownership

A `transfer(region: RegionId, new_owner: AccountId)` dispatchable SHALL have the effect of altering the current `owner` field of `region` in the `Regions` map from the signed origin to `new_owner`.

An implementation of the `nonfungible` trait SHOULD include equivalent functionality. `RegionId` SHOULD be used for the `AssetInstance` value.

In both cases, the `price` field SHALL become `None`.

#### 2. Split into segments

A `split(region: RegionId, pivot: Timeslice)` dispatchable SHALL have the effect of mutating the Regions entry of key `region` so that the `end` field becomes `pivot` and create a new Regions entry of the same `core` but a `begin` equal to `pivot` whose `RegionRecord` has the same `owner`, `end` and `allocation` fields as the origin value of `region`.

`price` in both records is/becomes `None`.

Also:
- `owner` field of `region` must the equal to the Signed origin.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved
- `pivot` must equal neither the `begin` nor `end` fields of the `region`.

#### 3. Consumed in exchange for allocation

A dispatchable `allocate(region: RegionId, target: Vec<ParaId>)` SHALL be provided corresponding to the `allocate` function described above.

It MUST be called with a Signed origin equal to the `owner` field of the value of the Regions map for the `region` key. The `allocation` field of this value MUST be `None` (a region may not be re-allocated).
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

On success, the `allocation` value is changed to `Some` whose inner value is equal to `target`.

If the `begin` field of the `region` parameter is less than the current `Timeslice` value, then it is removed and re-entered with the current `Timeslice` value plus one, unless this would be equal to or greater than the `end` field of the corresponding `RegionRecord` value.

Initially `target` values with only one item MAY be supported.

If the `RegionRecord`'s `price` field is `Some` (indicating that the Region is freshly purchased), then the Broker-chain SHALL record an entry in a storage map called AllowedRenewals. This maps a `CoreIndex` to a struct `RenewalRecord`:

```rust
struct RenewalRecord {
target: Vec<ParaId>,
price: Balance,
sale: SaleIndex,
}
```

#### 4. Renewals

A dispatchable `renew(core: CoreIndex)` SHALL be provided. Any account may call `renew` to purchase Bulk Coretime and renew an active allocation for the given `core`.

This MUST be called during the `LEADIN_PERIOD` prior to a Bulk sale (exactly like `purchase`) and has the same effect as `purchase` followed by `allocate` containing the same `Vec<ParaId>`, except that:
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

1. The purchase always succeeds and as such must be processed prior to regular `purchase` orders.
2. The price of the purchase is the previous `price` incremented by `RENEWAL_PRICE_CAP` of itself or the regular price, whichever is lower.

AllowedRenewals map is updated with the new information ready for the following Bulk sale.

#### 5. Migrations from Legacy Slot Leases

It is intended that paras which hold a lease from the legacy slot auction system are able to seamlessly transition into the Agile Coretime framework.

A dispatchable `migrate(core: CoreIndex)` SHALL be provided. Any account may call `migrate` to purchase Bulk Coretime at the current price for the given `core`.

This MUST be called during the `LEADIN_PERIOD` prior to a Bulk sale (exactly like `purchase`) and has the same effect as `purchase` followed by `allocate` with a value of `Vec<ParaId>` containing just one item equal to `target`, except that:

1. The purchase always succeeds and as such MUST be processed prior to regular `purchase` orders.
2. There MUST be an ongoing legacy parachain lease whose parachain is assigned to `core` and which is due to expire during the Coretime period being purchased.

AllowedRenewals map is updated with this information ready for the following Bulk sale.

### Notes on Instantaneous Core Sales

For access to the Instantaneous Core sales we may include an `allocate_instantaneous` function. This should allocate the Coretime for usage by Polkadot to serve instantaneous requests and allow the `owner` to collect a pro-rata amount of total Instantaneous sales revenue.

For an efficient market to form around the provision of Bulk-purchased Cores into the pool of cores available for Instantaneous Coretime purchase, it is crucial to ensure that price changes for the purchase of Instantaneous Coretime are reflected well in the revenues of private Coretime providers during the same period.

In order to ensure this, then it is crucial that Instantaneous Coretime, once purchased, cannot be held indefinitely prior to eventual use since, if this were the case, a nefarious collator could purchase Coretime when cheap and utilize it some time later when expensive and deprive private Coretime providers of their revenue. It SHOULD therefore be assumed that Instantaneous Coretime, once purchased, has a definite and short "shelf-life", after which it becomes unusable. This incentivizes collators to avoid purchasing Coretime unless they expect to utilize it imminently and thus helps create an efficient market-feedback mechanism whereby a higher price will actually result in material revenues for private Coretime providers who contribute to the pool of Cores available to service Instantaneous Coretime purchases.
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

## Implementation

Implementation of this proposal comes in several phases:

1. Finalise the specifics of implementation; this may be done through a design document or through a well-documented prototype implementation.
2. Implement the design, including all associated aspects such as unit tests, benchmarks and any support software needed.
3. If any new parachain is required, launch of this.
4. Formal audit of the implementation and any manual testing.
5. Announcement to the various stakeholders of the imminent changes.
6. Software integration and release.
7. Governance upgrade proposal(s).
8. Monitoring of the upgrade process.

## Performance

This proposal has no immediate performance considerations.

## Ergonomics

This proposal makes no changes to the existing end-user experience.

## Backwards Compatibility

Parachains already deployed into the Polkadot UC MUST have a clear plan of action to migrate to an agile Coretime market.

## Security considerations

A regular security review SHOULD be conducted prior to deployment through a review by the Web3 Foundation economic research group.

Any final implementation MUST pass a professional external security audit.

## Privacy considerations

The proposal introduces no new privacy concerns.

## Testing

Regular testing through unit tests, integration tests, manual testnet tests, zombie-net tests and fuzzing SHOULD be conducted.

## Documentation

While this proposal does not introduce documentable features per se, adequate documentation must be provided to potential purchasers of Polkadot Coretime. This SHOULD include any alterations to the Polkadot-SDK software collection, most likely Cumulus.

## Drawbacks, alternatives, and unknowns

None at present.

## Prior art and references

None.