datdotorg / datdot-node-rust

datdot blockchain node in rust
https://playproject.io/datdot-node-rust
GNU General Public License v3.0
48 stars 9 forks source link

Phase 1 logic #24

Open ninabreznik opened 4 years ago

ninabreznik commented 4 years ago

@todo

1. publisher registers new data

we get merkle root like this https://pastebin.com/QH7egWUX and then submit it to the chain

await API.tx.datVerify.registerData(merkleRoot)

2. chain emits SomethingStoredevent

3. after the event is emitted, users can register for different roles: encoder, hoster, attestor

await API.tx.datVerify.registerEncoder()
await API.tx.datVerify.registerSeeder()
await API.tx.datVerify.registerAttestor()

4. When users registers for any of the roles, chain will check if there is any data that needs hosting and if there is at least one hoster, one encoder and one attestor, then 'New Pin' is emitted

5. new event is emitted (NewPin) where encoder and hoster are notified about what feed needs hosting/encoding

const [encoderID, hosterID, datID] = event.data

6. we pair hoster and encoder: encoder compresses data and passes them over to hoster

7. when encoder finishes its job, it notifies the chain (registerEncoding)

const args = [hosterID, datID, start, end]
// if more ranges, send same tx for each range separately

8. when hoster gets all the data, it also notifies the chain (confirmHosting)

await API.tx.datVerify.confirmHosting(datID, index) // index = HostedMap.encoded[index] (get encoderID and then loop through to get position in the array)

9. chain emits event: HostingStarted

const data = event.data // [hosterID, datID]

10. Publisher can now submitChallenge

await API.tx.datVerify.submitChallenge(hosterID, datID)

11. Challenge event is emitted where hoster is notified about the challenges

const [hosterKey, datKey] = event.data
// hostedMap => see which chunks are hosted by this hoster for this key (Rust API line 317)

12. Hoster submits proof to the chain

//challengeID no longer exists -> use [datID, chunk] directly
await API.tx.datVerify.submitProof(challengeID, []) //challenge ID is parsed

13. If challenges are successful, chain emits new event: AttestPhase

const [challengeID, expectedAttestors] = event.data
const attestorIDs = JSON.parse(expectedAttestors).expected_attestors

// change proposal:
// could we just pass an array of attestors instead of an object
const [challengeID, attestorIDs] = event.data

14. random attester is selected to go grab data from the swarm

jam10o-new commented 4 years ago

Missing in description above -

step 8) confirmHosting has an additional index parameter to identify which encoding is being confirmed.

jam10o-new commented 4 years ago

also, changes described in point 13 have been implemented

jam10o-new commented 4 years ago

(for me) new spec: https://github.com/ninabreznik/service.js/blob/dev/src/simulate-substrate.js