Distribution
In the usual workflow, for a given round n, a submission is made , the audit is conducted on the submissions made in round n-1 and the distribution process encompasses the submissions made in round n-2.
Hence, after completing the implementation of the task logic, including the submission to K2 and the subsequent audit, the next step is to devise a mechanism for rewarding users based on their submissions. To achieve this, once the audit window concludes, a node is designated with the responsibility of generating and submitting an on-chain distribution list.
The distribution list is represented as a JSON object, consisting of key-value pairs. In this context, where the key is the node's public key and the value is the number of KOII tokens to be awarded to the node.
We can use generateDistributionList()
and validateDistribution()
function for the same, that is listed in distribution.js
under the task
directory.
generateDistributionList()
The Task Template contains a sample logic for the generateDistributionList()
, which rewards 1 KOII to all the nodes with valid submissions for that round. We'd retain the logic for the Hello World project.
In the sample code:
- An empty distribution list is initialized.
- The task's data is retrieved using the
getTaskState
helper function - All submissions are fetched from the task's data.
- The
submissions_audit_trigger
is also retrieved from the task's data; this object contains information about the audited submissions. - An empty distribution list is returned if
submissions
is null. Otherwise, the keys and values ofsubmissions
are grouped separately, and in a loop, it calculates the audits on each submission and the number of votes on the audit and then generates a distribution list based on that.
validateDistribution()
In the sample code present in the template:
- The distribution list is fetched.
- If the distribution list is not null, it is parsed and stored in the variable
fetchedDistributionList
. - The distribution list is re-generated by calling the
generateDistributionList
method with the current round number and task state as parameters. - The generated distribution list is stored in the variable
generatedDistributionList
. - Finally,
fetchedDistributionList
andgeneratedDistributionList
are compared to see if they are equal. If they are, this method returnstrue
, otherwisefalse
.