10 Million DOT for a Decentralized JAM
The Web3 Foundation is supporting implementations of the future of Polkadot with a total prize pool of 10 million DOT and 100,000 KSM.
About
The Paths to Implementation
There are three paths to prizes. In all paths the first milestone (M1, MN1, ML1) is the same.
In all paths third-party libraries for low-level primitives not specific to the JAM protocol are acceptable, such as:
- cryptographic primitives (erasure-coding, Bandersnatch, Ed25519)
- binary codec
- databases
- low-level networking stack (e.g. QUIC).
Following the accepted completion of each milestone, one developer may be promoted to the rank commensurate with their code and protocol contributions regardless of regular time requirements. The promotion should be in line with regular interpretation of the Manifesto except for the time requirements (which are disregarded). The maximum rank to be attained in this way shall be III Dan (Fellow).
Following completion of M1/MN1/ML1, evidence for Polkadot Fellowship rank-retentions (and, where applicable, promotions) may include regular, meaningful contributions to the project.
Please carefully review the full rules for submissions.
Validating Node Path:
This path involves the creation of a full validating, block-authoring implementation of JAM including a working and performant PVM.
Maximum prize
500,000 DOT + 5,000 KSM
Non-PVM Validating Node Path:
This path involves the creation of a full validating, block-authoring implementation of JAM including an original working PVM. For the purpose of performance testing, a third-party PVM implementation may be used to help achieve the required performance.
Maximum prize
350,000 DOT and 3,500 KSM*
*With an option for conversion
Light-node:
This path involves the creation of a low-resource JAM node not capable of block-authoring, but capable of servicing network requests, suitable for embedding in other program code (such as tooling and web pages) and an extremely low footprint and synchronisation time.
Maximum prize
250,000 DOT and 2,500 KSM
Language Sets
Unless otherwise stated, major language dialects are acceptable.
The language set of an implementation is determined as the language in which its business logic is written. Peripheral, performance-bottleneck components of an implementation may be written in a higher-performance language without any impact on the consideration of language set. A non-exhaustive list of such components include: PVM, Database, Erasure, (de-)coding
A: "Company code"
Maximum prize per milestone (dependent on path and judgment): 100,000 DOT + 1,000 KSM
Java, AspectJ, Kotlin, C#, Go
B: "Native code"
Maximum prize per milestone (dependent on path and judgment): 100,000 DOT + 1,000 KSM
C, C++, D, Rust, Swift, Zig, Carbon, Fortran
C: "Concise code"
Maximum prize per milestone (dependent on path and judgment): 100,000 DOT + 1,000 KSM
Scheme, Common Lisp, Prolog, Haskell, ML, Perl, Python, Ruby, Javascript, Groovy, Dart
D: "Correct code"
Maximum prize per milestone (dependent on path and judgment): 100,000 DOT + 1,000 KSM
Ada, Julia, Erlang/Elixir, Ocaml, Smalltalk, F#, Scala, APL
Z: "Mad"
Maximum prize per milestone (dependent on path and judgment): 5,000 KSM
Brainfuck, Whitespace, Minecraft Red-stone
Our Advice For Teams
The more milestones your team completes, the more competitive your submission will be. If you are unsure where to start, we recommend that teams begin in order:
- 1. Block/header data structures and serialization
- 2. State data structures and serialization
- 3. In-memory DB and Merklization
- 4. Non-PVM block execution/state-transition
- 5. PVM instancing, execution and host-functions
- 6. Block-import tests
FAQs
Clean room?
Cooperation between teams is essential but anything which goes beyond trivial misunderstandings of the graypaper should be documented, either as issues in the GP repo or as side notes of the implementation to be submitted at the time of milestone review. To stay safe, teams should stay away from the implementation specifics of other implementations and definitely not be sharing code.
It's ok to ruminate on high level approaches to solve problems or optimize, it's not so ok to be looking at some other implementation's specific solution. What the Fellowship will be looking out for is for undeclared collusion between teams. Code which appears to be a little too similar for it to have been independently written. A big red flag would be the same bug popping up in two implementations.
But this is not to detract from the fun of getting two cleanroom impls talking to each other. Of course this is a big part of it and you mustn't feel like it's not allowed.
Just be sure to document anything which you discover when working alongside another team so everyone can benefit.
This all sounds too risky for me. Can we not have something closer to a regular service agreement?
No.
Roughly how long will it take my developer/team to implement Milestone X?
How long is a piece of string? Seriously, read the Graypaper and decide for yourself. Every developer is different.
Does my implementation need to exploit JAM's asynchrony?
We don't explicitly state what code paths need to be asynchronous. It is up to implementations to decide this for themselves.
To clarify, for M2, nodes are expected to provide (and use) information in a timely fashion; this goes for all aspects of block authoring and production. Needless not providing an assurance or guarantee, or not using one which was provided is incorrect behaviour.