JAM is the anticipated future protocol for Polkadot, being implemented by multiple teams across different programming languages. The JAM Gray Paper outlines the protocol, and the Web3 Foundation has shared initial test vectors with participating teams here.
This repository serves as a collaborative space for teams to develop and test JAM Testnets independently and work towards cross-team compatibility in the JAM Toaster. See docs.jamcha.in.
To support testing in a wide variety of network sizes from "tiny" (V=6) to "full" (V=1023), we follow the W3F test vectors in having public secret keys derived deterministically from publicly known seeds for Ed25519, Bandersnatch, and BLS keys.
Using these seeds, secret and public keys can be programmatically generated, ensuring each JAM team can run the public testnet consistently. This is strictly for development purposes.
An open-source key
program is used to map seeds into Bandersnatch/Ed25519/BLS secret and public keys. See here showing how to map any seed.
See Dev Accounts 32-byte seeds.
Chain specs for 8 network sizes have been modeled and published.
Sharing excerpts of blockchain state and validating state transitions is a valuable prerequisite before 2 or more teams can set up a JAM Testnet.
By using a public genesis state, teams can collaborate by sharing state transitions (pre-state, block, post-state). This allows for verifying that different implementations can read key objects and perform the identical state transitions in accordance with the GP Spec and prepare to pass "M1 Import Blocks".
- blocks:
$epoch_$phase.json
$epoch_$phase.bin
-- follows w3f block test vectors - state_snapshots:
$epoch_$phase.json
$epoch_$phase.bin
-- JSON + Codec developer-friendly states following w3f STF test vectors - state_transitions:
$epoch_$phase.json
$epoch_$phase.bin
-- JSON + Codec machine-friendly state transitions
In Go:
type StateTransition struct {
PreState StateSnapshotRaw `json:"pre_state"`
Block Block `json:"block"`
PostState StateSnapshotRaw `json:"post_state"`
}
type StateSnapshotRaw struct {
StateRoot common.Hash `json:"state_root"`
KeyVals KeyVals `json:"keyvals"`
}
type KeyVals []KeyVal
type KeyVal [2][]byte
The combination of JSON + codec is useful for debugging purposes.
Here is a sample output:
# ls safrole/blocks/
407402_000.bin 407402_004.bin 407402_008.bin 407403_000.bin 407403_004.bin 407403_008.bin 407404_000.bin 407404_004.bin 407404_008.bin 407405_000.bin 407405_004.bin 407405_008.bin 407406_000.bin
407402_000.json 407402_004.json 407402_008.json 407403_000.json 407403_004.json 407403_008.json 407404_000.json 407404_004.json 407404_008.json 407405_000.json 407405_004.json 407405_008.json 407406_000.json
407402_001.bin 407402_005.bin 407402_009.bin 407403_001.bin 407403_005.bin 407403_009.bin 407404_001.bin 407404_005.bin 407404_009.bin 407405_001.bin 407405_005.bin 407405_009.bin 407406_001.bin
407402_001.json 407402_005.json 407402_009.json 407403_001.json 407403_005.json 407403_009.json 407404_001.json 407404_005.json 407404_009.json 407405_001.json 407405_005.json 407405_009.json 407406_001.json
407402_002.bin 407402_006.bin 407402_010.bin 407403_002.bin 407403_006.bin 407403_010.bin 407404_002.bin 407404_006.bin 407404_010.bin 407405_002.bin 407405_006.bin 407405_010.bin
407402_002.json 407402_006.json 407402_010.json 407403_002.json 407403_006.json 407403_010.json 407404_002.json 407404_006.json 407404_010.json 407405_002.json 407405_006.json 407405_010.json
407402_003.bin 407402_007.bin 407402_011.bin 407403_003.bin 407403_007.bin 407403_011.bin 407404_003.bin 407404_007.bin 407404_011.bin 407405_003.bin 407405_007.bin 407405_011.bin
407402_003.json 407402_007.json 407402_011.json 407403_003.json 407403_007.json 407403_011.json 407404_003.json 407404_007.json 407404_011.json 407405_003.json 407405_007.json 407405_011.json
# ls safrole/state_snapshots/
407402_000.bin 407402_004.bin 407402_008.bin 407403_000.bin 407403_004.bin 407403_008.bin 407404_000.bin 407404_004.bin 407404_008.bin 407405_000.bin 407405_004.bin 407405_008.bin 407406_000.bin
407402_000.json 407402_004.json 407402_008.json 407403_000.json 407403_004.json 407403_008.json 407404_000.json 407404_004.json 407404_008.json 407405_000.json 407405_004.json 407405_008.json 407406_000.json
407402_001.bin 407402_005.bin 407402_009.bin 407403_001.bin 407403_005.bin 407403_009.bin 407404_001.bin 407404_005.bin 407404_009.bin 407405_001.bin 407405_005.bin 407405_009.bin 407406_001.bin
407402_001.json 407402_005.json 407402_009.json 407403_001.json 407403_005.json 407403_009.json 407404_001.json 407404_005.json 407404_009.json 407405_001.json 407405_005.json 407405_009.json 407406_001.json
407402_002.bin 407402_006.bin 407402_010.bin 407403_002.bin 407403_006.bin 407403_010.bin 407404_002.bin 407404_006.bin 407404_010.bin 407405_002.bin 407405_006.bin 407405_010.bin
407402_002.json 407402_006.json 407402_010.json 407403_002.json 407403_006.json 407403_010.json 407404_002.json 407404_006.json 407404_010.json 407405_002.json 407405_006.json 407405_010.json
407402_003.bin 407402_007.bin 407402_011.bin 407403_003.bin 407403_007.bin 407403_011.bin 407404_003.bin 407404_007.bin 407404_011.bin 407405_003.bin 407405_007.bin 407405_011.bin
407402_003.json 407402_007.json 407402_011.json 407403_003.json 407403_007.json 407403_011.json 407404_003.json 407404_007.json 407404_011.json 407405_003.json 407405_007.json 407405_011.json
# ls safrole/state_transitions/
407402_000.bin 407402_004.bin 407402_008.bin 407403_000.bin 407403_004.bin 407403_008.bin 407404_000.bin 407404_004.bin 407404_008.bin 407405_000.bin 407405_004.bin 407405_008.bin 407406_000.bin
407402_000.json 407402_004.json 407402_008.json 407403_000.json 407403_004.json 407403_008.json 407404_000.json 407404_004.json 407404_008.json 407405_000.json 407405_004.json 407405_008.json 407406_000.json
407402_001.bin 407402_005.bin 407402_009.bin 407403_001.bin 407403_005.bin 407403_009.bin 407404_001.bin 407404_005.bin 407404_009.bin 407405_001.bin 407405_005.bin 407405_009.bin
407402_001.json 407402_005.json 407402_009.json 407403_001.json 407403_005.json 407403_009.json 407404_001.json 407404_005.json 407404_009.json 407405_001.json 407405_005.json 407405_009.json
407402_002.bin 407402_006.bin 407402_010.bin 407403_002.bin 407403_006.bin 407403_010.bin 407404_002.bin 407404_006.bin 407404_010.bin 407405_002.bin 407405_006.bin 407405_010.bin
407402_002.json 407402_006.json 407402_010.json 407403_002.json 407403_006.json 407403_010.json 407404_002.json 407404_006.json 407404_010.json 407405_002.json 407405_006.json 407405_010.json
407402_003.bin 407402_007.bin 407402_011.bin 407403_003.bin 407403_007.bin 407403_011.bin 407404_003.bin 407404_007.bin 407404_011.bin 407405_003.bin 407405_007.bin 407405_011.bin
407402_003.json 407402_007.json 407402_011.json 407403_003.json 407403_007.json 407403_011.json 407404_003.json 407404_007.json 407404_011.json 407405_003.json 407405_007.json 407405_011.json
Based on JAM0 - JAM Implementers Meetup @ sub0/Devcon 7 we built the following datasets:
- fallback -- The
fallback
mode does not involve any PVM execution or extrinsics. See Sealing Test Vectors. - safrole -- The
safrole
mode adds extrinsic tickets. Here is a draft of the shape ofmode=safrole
here: - assurances -- The
assurances
mode adds a few tiny services (bootstrap, fib) and requires E_G, E_A, E_P extrinsics as well as a basic PVM implementation with a few host functions implemented (new, write, read). - orderedaccumulation -- The
orderedaccumulation
mode uses both cores to run through simple cases of package dependencies and ordered accumulation with "fib", "trib" and "megatron" services.
Within each directory is a trace of logging activity, as generated by JAM DUNA. This may assist in identifying discrepancies between implementations.
See services for bootstrap
and fib
service code, which has been compiled with polkatool.
mode |
fallback |
safrole |
assurance |
orderedaccumulation |
---|---|---|---|---|
Tickets: E_T | x | x | x | |
Guarantees: E_G | x | x | ||
Assurances: E_A | x | x | ||
Preimages: E_P | x | x | ||
Refine/Accumulate PVM | x | x | ||
Bootstrap Services | x | x | ||
Ordered Accumulation | x |
As of Feb 2025, Several teams have reported success at importing both fallback and safrole.
The assurances dataset, after setting up a "Bootstrap" and "Fib" service (using the Bootstrap service), tests out the majority of host functions, and writes out the result of the host function result in many of the calls.
- ASSIGN
- BLESS
- CHECKPOINT
- EJECT
- FORGET
- GAS
- INFO
- LOOKUP
- NEW
- QUERY
- READ
- SOLICIT
- TRANSFER
- UPGRADE
- WRITE
- YIELD
INFO [03-05|19:44:12.138] Fib2-(1) result with key 0 result=010000000100000000000000
INFO [03-05|19:44:12.138] Fib2-(1) result with key 1 result=
INFO [03-05|19:44:12.138] Fib2-(1) result with key 2 result=
INFO [03-05|19:44:12.138] Fib2-(1) result with key 5 result=
INFO [03-05|19:44:12.138] Fib2-(1) result with key 6 result=
INFO [03-05|19:44:12.138] Fib2-(1) result with key 8 result=0000000000000000
INFO [03-05|19:44:12.138] Fib2-(1) result with key 9 result=6f23000000000000
INFO [03-05|19:44:22.145] Fib2-(2) result with key 0 result=020000000100000001000000
INFO [03-05|19:44:22.145] Fib2-(2) result with key 1 result=ffffffffffffffff
INFO [03-05|19:44:22.145] Fib2-(2) result with key 2 result=0300000000000000
INFO [03-05|19:44:22.145] Fib2-(2) result with key 5 result=0300000000000000
INFO [03-05|19:44:22.145] Fib2-(2) result with key 6 result=f7ffffffffffffff
INFO [03-05|19:44:22.145] Fib2-(2) result with key 8 result=0000000000000000
INFO [03-05|19:44:22.145] Fib2-(2) result with key 9 result=1f23000000000000
INFO [03-05|19:44:34.154] Fib2-(3) result with key 0 result=030000000200000001000000
INFO [03-05|19:44:34.155] Fib2-(3) result with key 1 result=0000000000000000
INFO [03-05|19:44:34.155] Fib2-(3) result with key 2 result=0000000000000000
INFO [03-05|19:44:34.155] Fib2-(3) result with key 5 result=ffffffffffffffff
INFO [03-05|19:44:34.155] Fib2-(3) result with key 6 result=f7ffffffffffffff
INFO [03-05|19:44:34.155] Fib2-(3) result with key 8 result=0000000000000000
INFO [03-05|19:44:34.155] Fib2-(3) result with key 9 result=3323000000000000
INFO [03-05|19:44:52.163] Fib2-(4) result with key 0 result=040000000300000002000000
INFO [03-05|19:44:52.163] Fib2-(4) result with key 1 result=0000000000000000
INFO [03-05|19:44:52.163] Fib2-(4) result with key 2 result=020000001d000000
INFO [03-05|19:44:52.163] Fib2-(4) result with key 5 result=ffffffffffffffff
INFO [03-05|19:44:52.163] Fib2-(4) result with key 6 result=faffffffffffffff
INFO [03-05|19:44:52.163] Fib2-(4) result with key 8 result=0000000000000000
INFO [03-05|19:44:52.163] Fib2-(4) result with key 9 result=1f23000000000000
INFO [03-05|19:45:04.171] Fib2-(5) result with key 0 result=050000000500000003000000
INFO [03-05|19:45:04.171] Fib2-(5) result with key 1 result=0300000000000000
INFO [03-05|19:45:04.171] Fib2-(5) result with key 2 result=020000001d000000
INFO [03-05|19:45:04.171] Fib2-(5) result with key 5 result=fcffffffffffffff
INFO [03-05|19:45:04.171] Fib2-(5) result with key 6 result=fcffffffffffffff
INFO [03-05|19:45:04.171] Fib2-(5) result with key 8 result=0000000000000000
INFO [03-05|19:45:04.171] Fib2-(5) result with key 9 result=1f23000000000000
INFO [03-05|19:45:19.182] Fib2-(6) result with key 0 result=060000000800000005000000
INFO [03-05|19:45:19.182] Fib2-(6) result with key 1 result=0000000000000000
INFO [03-05|19:45:19.182] Fib2-(6) result with key 2 result=030000001d000000
INFO [03-05|19:45:19.182] Fib2-(6) result with key 5 result=0000000000000000
INFO [03-05|19:45:19.182] Fib2-(6) result with key 6 result=fcffffffffffffff
INFO [03-05|19:45:19.182] Fib2-(6) result with key 8 result=0000000000000000
INFO [03-05|19:45:19.182] Fib2-(6) result with key 9 result=3323000000000000
INFO [03-05|19:45:35.202] Fib2-(7) result with key 0 result=070000000d00000008000000
INFO [03-05|19:45:35.202] Fib2-(7) result with key 1 result=0000000000000000
INFO [03-05|19:45:35.202] Fib2-(7) result with key 2 result=0200000023000000
INFO [03-05|19:45:35.203] Fib2-(7) result with key 5 result=0000000000000000
INFO [03-05|19:45:35.203] Fib2-(7) result with key 6 result=fcffffffffffffff
INFO [03-05|19:45:35.203] Fib2-(7) result with key 8 result=0000000000000000
INFO [03-05|19:45:35.203] Fib2-(7) result with key 9 result=4723000000000000
INFO [03-05|19:45:46.210] Fib2-(8) result with key 0 result=08000000150000000d000000
INFO [03-05|19:45:46.210] Fib2-(8) result with key 1 result=0300000000000000
INFO [03-05|19:45:46.210] Fib2-(8) result with key 2 result=0200000023000000
INFO [03-05|19:45:46.210] Fib2-(8) result with key 5 result=0000000000000000
INFO [03-05|19:45:46.210] Fib2-(8) result with key 6 result=fcffffffffffffff
INFO [03-05|19:45:46.210] Fib2-(8) result with key 8 result=0000000000000000
INFO [03-05|19:45:46.210] Fib2-(8) result with key 9 result=4723000000000000
INFO [03-05|19:45:58.219] Fib2-(9) result with key 0 result=08000000150000000d000000
INFO [03-05|19:45:58.219] Fib2-(9) result with key 1 result=0300000000000000
INFO [03-05|19:45:58.219] Fib2-(9) result with key 2 result=0200000023000000
INFO [03-05|19:45:58.219] Fib2-(9) result with key 5 result=0000000000000000
INFO [03-05|19:45:58.220] Fib2-(9) result with key 6 result=fcffffffffffffff
INFO [03-05|19:45:58.220] Fib2-(9) result with key 8 result=0000000000000000
INFO [03-05|19:45:58.220] Fib2-(9) result with key 9 result=4723000000000000
In key 0 is a 12 byte representation of (n, Fib(n), Fib(n-1)). This is actually exported in the refine operation as well.
This dataset enables broad testing of accumulate invocation.
We are currently developing a broader set of refine test vectors in a similar way to test:
- EXPORT
- EXPUNGE
- FETCH
- GAS
- HISTORICAL_LOOKUP
- INVOKE
- MACHINE
- PEEK
- POKE
We will defer basic testing DESIGNATE, UPGRADE, EJECT, VOID+ZERO to after a live tiny testnet has been set up.
The ordered accumulation data, after setting up a Fib+Trib+Megatron service, has the megatron work package depend on the Fib+Trib work package.
Meg(N) = Fib(N) + Trib(N)
computed in the same state transition, which forces ordered accumulation (See Sec 12).
- Fib is basically like the above but does not have any host function testing -- it just does Fib(N) = Fib(N-1) + Fib(N-2)
- Trib is like Fib but Trib(N) = Trib(N-1) + Trib(N-2) + Trib(N-3)
- The Fib+Trib workpackage has TWO work items. Meg(N) is computed in a separate work package but with the Fib+Trib work package as prereqs.
You can see the results of these in:
INFO [03-05|19:37:38.366] JAMTEST Fib SUCC n=1 result="[1 0 0 0 1 0 0 0 0 0 0 0]"
INFO [03-05|19:37:38.366] JAMTEST Trib SUCC n=1 result="[1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]"
INFO [03-05|19:37:52.652] JAMTEST Megatron SUCC n=1 result="[1 0 0 0 2 0 0 0 0 0 0 0]"
INFO [03-05|19:38:04.159] JAMTEST Fib SUCC n=2 result="[2 0 0 0 1 0 0 0 1 0 0 0]"
INFO [03-05|19:38:04.159] JAMTEST Trib SUCC n=2 result="[2 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0]"
INFO [03-05|19:38:04.159] JAMTEST Megatron SUCC n=2 result="[2 0 0 0 2 0 0 0 2 0 0 0]"
INFO [03-05|19:38:22.257] JAMTEST Megatron SUCC n=3 result="[3 0 0 0 4 0 0 0 2 0 0 0]"
INFO [03-05|19:38:22.258] JAMTEST Fib SUCC n=3 result="[3 0 0 0 2 0 0 0 1 0 0 0]"
INFO [03-05|19:38:22.258] JAMTEST Trib SUCC n=3 result="[3 0 0 0 2 0 0 0 1 0 0 0 1 0 0 0]"
INFO [03-05|19:38:38.555] JAMTEST Fib SUCC n=4 result="[4 0 0 0 3 0 0 0 2 0 0 0]"
INFO [03-05|19:38:38.555] JAMTEST Trib SUCC n=4 result="[4 0 0 0 4 0 0 0 2 0 0 0 1 0 0 0]"
INFO [03-05|19:38:38.569] JAMTEST Megatron SUCC n=4 result="[4 0 0 0 7 0 0 0 4 0 0 0]"
INFO [03-05|19:38:56.555] JAMTEST Fib SUCC n=5 result="[5 0 0 0 5 0 0 0 3 0 0 0]"
INFO [03-05|19:38:56.555] JAMTEST Trib SUCC n=5 result="[5 0 0 0 7 0 0 0 4 0 0 0 2 0 0 0]"
INFO [03-05|19:38:56.555] JAMTEST Megatron SUCC n=5 result="[5 0 0 0 12 0 0 0 7 0 0 0]"
INFO [03-05|19:39:16.452] JAMTEST Megatron SUCC n=6 result="[6 0 0 0 21 0 0 0 12 0 0 0]"
INFO [03-05|19:39:16.452] JAMTEST Fib SUCC n=6 result="[6 0 0 0 8 0 0 0 5 0 0 0]"
INFO [03-05|19:39:16.452] JAMTEST Trib SUCC n=6 result="[6 0 0 0 13 0 0 0 7 0 0 0 4 0 0 0]"
INFO [03-05|19:39:34.160] JAMTEST Megatron SUCC n=7 result="[7 0 0 0 37 0 0 0 21 0 0 0]"
INFO [03-05|19:39:34.160] JAMTEST Fib SUCC n=7 result="[7 0 0 0 13 0 0 0 8 0 0 0]"
INFO [03-05|19:39:34.160] JAMTEST Trib SUCC n=7 result="[7 0 0 0 24 0 0 0 13 0 0 0 7 0 0 0]"
...
In addition, inside data
are additional "fuzzed" datasets consisting of INVALID state transitions:
StateTransition Errors are organized into 4 categories, tracking W3F official error codes and descriptions:
- T - Safrole Ticket Errors
- A - Assurances Errors
- G - Guarantee & Work Reports Errors
- D - Disputes Errors
We enumerate them below.
Error Code | Error Name | Description |
---|---|---|
T1 | BadTicketAttemptNumber | Submit an extrinsic with a bad ticket attempt number. |
T2 | TicketAlreadyInState | Submit one ticket already recorded in the state. |
T3 | TicketsBadOrder | Submit tickets in bad order. |
T4 | BadRingProof | Submit tickets with a bad ring proof. |
T5 | EpochLotteryOver | Submit tickets when the epoch's lottery is over. |
T6 | TimeslotNotMonotonic | Progress from slot X to slot X. Timeslot must be strictly monotonic. |
Error Code | Error Name | Description |
---|---|---|
A1 | BadSignature | One assurance has a bad signature. |
A2 | BadValidatorIndex | One assurance has a bad validator index. |
A3 | BadCore | One assurance targets a core without any assigned work report. |
A4 | BadParentHash | One assurance has a bad attestation parent hash. |
A5 | StaleReport | One assurance targets a core with a stale report. |
A6 | DuplicateAssurer | Duplicate assurer. |
A7 | NotSortedAssurers | Assurers not sorted. |
Error Code | Error Name | Description |
---|---|---|
G1 | BadCodeHash | Work result code hash doesn't match the one expected for the service. |
G2 | BadCoreIndex | Core index is too big. |
G3 | BadSignature | Invalid report guarantee signature. |
G4 | CoreEngaged | A core is not available. |
G5 | DependencyMissing | Prerequisite is missing. |
G6 | DuplicatePackageTwoReports | Report contains a duplicate package (two reports from the same package). |
G7 | FutureReportSlot | Report refers to a slot in the future with respect to container block slot. |
G8 | InsufficientGuarantees | Report without enough guarantors' signatures. |
G9 | DuplicateGuarantors | Guarantors' indices are not sorted or unique. |
G10 | OutOfOrderGuarantee | Reports' cores are not sorted or unique. |
G11 | WorkReportGasTooHigh | Work report per-core gas is too high. |
G12 | ServiceItemTooLow | Accumulate gas is below the service minimum. |
G13 | BadValidatorIndex | Validator index is too big. |
G14 | WrongAssignment | Unexpected guarantor for a work report core. |
G15 | AnchorNotRecent | Context anchor is not recent enough. |
G16 | BadBeefyMMRRoot | Context Beefy MMR root doesn't match the one at anchor. |
G17 | BadServiceID | Work result service identifier doesn't have any associated account in state. |
G18 | BadStateRoot | Context state root doesn't match the one at anchor. |
G19 | DuplicatePackageRecentHistory | Package was already available in recent history. |
G20 | ReportEpochBeforeLast | Report guarantee slot is too old with respect to the block slot. |
G21 | SegmentRootLookupInvalidNotRecentBlocks | Segments tree root lookup item not found in recent blocks history. |
G22 | SegmentRootLookupInvalidUnexpectedValue | Segments tree root lookup found in recent blocks history but with an unexpected value. |
G23 | CoreWithoutAuthorizer | Target core without any authorizer. |
G24 | CoreUnexpectedAuthorizer | Target core with an unexpected authorizer. |
Error Code | Error Name | Description |
---|---|---|
D1 | NotSortedWorkReports | Not sorted work reports within a verdict. |
D2 | NotUniqueVotes | Not unique votes within a verdict. |
D3 | NotSortedValidVerdicts | Not sorted, valid verdicts. |
D4 | NotHomogenousJudgements | Not homogeneous judgements; positive votes count is incorrect. |
D5 | MissingCulpritsBadVerdict | Missing culprits for bad verdict. |
D6 | SingleCulpritBadVerdict | Single culprit for bad verdict. |
D7 | TwoCulpritsBadVerdictNotSorted | Two culprits for bad verdict, not sorted. |
D8 | AlreadyRecordedVerdict | Report an already recorded verdict with culprits. |
D9 | CulpritAlreadyInOffenders | Culprit offender already in the offenders list. |
D10 | OffenderNotPresentVerdict | Offender relative to a not-present verdict. |
D11 | MissingFaultsGoodVerdict | Missing faults for good verdict. |
D12 | TwoFaultOffendersGoodVerdict | Two fault offenders for a good verdict, not sorted. |
D13 | AlreadyRecordedVerdictWithFaults | Report an already recorded verdict, with faults. |
D14 | FaultOffenderInOffendersList | Fault offender already in the offenders list. |
D15 | AuditorMarkedOffender | Auditor marked as offender, but vote matches the verdict. |
D16 | BadSignatureInVerdict | Bad signature within the verdict judgements. |
D17 | BadSignatureInCulprits | Bad signature within the culprits sequence. |
D18 | AgeTooOldInVerdicts | Age too old for verdicts judgements. |
Only the following network chain specs are supported at present:
tiny
: Doc Reference
Nov 2024:
- added fallback based on JAM0 meeting
- genesis state fixes [thanks to Daniel from Jamixir]
- made the phases 3 digits (000, 001, ... 011) rather than variable (0, 1, .. 11) [thank you Boy Maas]
- fixed parent hash to be header hash rather than block hash [thank you Arjan, PyJAMaz]
Dec 2024:
- mode=orderedaccumulation added (C14+C15)
- C3 Recent Blocks support consistent with E.2 0.5.2 Beefy root and w3f STF reports test vectors
- 64-bit PVM support with new opcodes (with 96% coverage (see community test vectors))
- state_transitions output with service k,v metadata
Feb/March 2025:
Everyone must follow JAM Prize rules and can politely refuse collaboration with any team for any reason.
To contribute, submit a PR to:
- add additional state transitions:
${mode}/${team}
(e.g.safrole/jam-duna
). If you have a new mode, just describe it and add it - add your service code (in any language, including privileged services). Put it in
services/${team}/${servicename}
(e.g.services/strongly-web3/fib
)
- JAM Testnet on Telegram - Public, anyone can join