[Randomness]

Diagnoses are random, and unpredictable both in outcome and time. However, the nature of the Ethereum blockchain is such that it cannot act on itself; an outside trigger is always required. Therefore, to qualify as an autonomous system, we need to ensure both of these: first, that anyone can act as this trigger, and second, that there is an economic incentive for someone to do so. The incentive needs to be a purely financial one; it must exist even in the absence of anyone being invested (emotionally or financially) in the artwork itself.

We therefore reserve a part of the treasury, generated from sales, to financially reward whoever submits the required trigger transactions (a "keeper" in common parlance).

To ensure that a diagnosis can happen at truly any time (or in Ethereum time, any block), rather than at fixed intervals, we use a linear probability function, with increasing odds since the last time the random source was triggered, and targeting the desired total probability of 12.5% over the five year period the project is active.

Two transactions are required.
Current probability (individual / collective):
4% / 33%
Current reward:
0.3 ETH

[log]

2022-03-12 14:22:00[request][apply]3.45%-VRFNo diagnosis.
2022-03-12 14:22:00[request][apply]3.45%-VRFNo diagnosis.

Technical Details

In-Chain Randomness

The cheapest method is to use in-chain randomness, based on a future block hash. This can only be manipulated by miners.

  1. Call the requestRoll(true) function.
    Then wait for 2 additional blocks to be mined.
  2. After 2 blocks have been mined, call the applyRoll() function.
Chainlink VRF

As an alternative, Chainlink VRF can be used as a source of randomness. This is more expensive, as it requires payment of LINK tokens.

  1. Fund the contract with 2 LINK.
    Hint: Only fund the contract when you want to request randomness. Since anyone can call the contract as often as they want, it is easy to drain its balance.
  2. Call the requestRoll(false) function.
    Wait roughly two minutes, then verify on-chain that Chainlink has provided a random number.
  3. After a minute or two, call the applyRoll() function.