Network incentivisation - First draft
In this document we described what we have been researching so far, and we give an example implementation in order to get a feel of what it might look like.
Feedback on the principles is most welcome, and also on the potential implementation, although this is just an example, parts of it might make it in the final cut.
For some background reading on the work done: Network incentivisation current state - HackMD
A very similar effort has been undertaken here as well https://loki-project.github.io/loki-docs
What problem are we trying to solve?
Currently the status-network is mainly supported by company-run nodes/mailservers. Without the functioning of these nodes, the status app will likely be unusable.
This is not a desirable behavior as we want the status-app to be able to survive Status. Effectively this means that Status would act much in the same way as the Ethereum foundation, potentially running only the bare minimum services to ensure the continuity of the product (i.e a few bootnodes), while the heavy lifting is done by the community.
In order to achieve this, some form of incentives are necessary.
Type of incentives
Currently two kind of incentives have been identified as promising:
- Pay for offline messages
- Pay for forwarding (essentially pay to send)
Both come with a set of benefits and tradeoffs, and can be used on their own, or in combination.
Pay for offline messages
This simply means that a client who wants to receive messages that have been sent while the user who offline, will have to pay for this service.
The payment can be in SNT, or other options have been considered (stickers for example). Here some UX exploration can be done to understand whether users would be willing to pay for offline messages, and what is the most convenient option for the user (automatic subscription, pay-as-you go etc).
This offers a lower entry-bar with respect to pay for forwarding, as users who are not interested in offline messages, would potentially still be able to use the network, and only pay for offline messaging if needed, which works much like a freemium model.
The drawback of using exclusively this approach is that it relies on the assumption that enough users will be paying for offline messages to justify the incentivised nodes to forward messages at their own expenses.
Pros
- Medium entry barrier for new users (can receive messages only when online without paying)
- Better darkness than pay-to-send
- Don’t need to be using status to run a node
- Low threshold of users needed to be profitable
- Not tied to the transport layer
Cons
- The benefits of offline inbox needs to outweight the cost of forwarding messages, if used exclusively
- Free-rider problem
- Does not solve spam problem
Pay for forwarding
This is similar to what validity labs is doing with their payment layer, essentially a client pays for each packet sent to the network, and every node that forward the packet will receive a share of that payment.
This method has some clear benefits, it is more comprehensive than pay-for-offline messages and it works as a spam prevention mechanism.
Some of the drawbacks is that is more tied to the transport layer (whisper in our case), has a higher entry barrier for new users and given the nature of whisper, is not easy to adapt as the packet is flooded to the whole network.
Pros
- Works as spam prevention
- No free-rider problem
- Highest sustainability
- Don’t need to be using status to run a node
- Low threshold of users needed to be profitable
- Conceptually simple (offline messaging could be just be paid by receiving messages)
Cons
- High entry barrier for new users
- Difficult to achieve darkness
- Difficult implementation with current transport
- Tied to transport layer
Potential implementation
Data sync layer
A data sync layer is not strictly speaking necessary to achieve this, but it will certainly help with a few things:
- Homogenize the interface between nodes & clients. Ideally we want normal peers to act altruistically as “mailserver”, and propagate data.
- Being specific on what we are interested in. Currently timestamps are used to query for data, a data sync layer would add message-ids on top of that, which can help in being more accurate (potentially saving bandwidth)
Requirements
- It should be seamless for desktop nodes to help in the network
- Peers should be useful even if they don’t have 100% uptime
- Not too coupled to the current transport layer
Implementation
Peers will only pay for offline messages at first, as that is probably the simplest problem to solve and does not ties us to whisper.
Nodes that would like to be paid for their service, will stake a certain amount and will be added to the pool.
A shared fund will be created, and part of this fund will be used to incentivise all nodes in the network, while the rest will go
Periodically each node in the pool will be checked randomly for two tests:
- A bandwidth test (for example https://loki-project.github.io/loki-docs/Advanced/SwarmFlagging/)
- A storage test (for example Mailservers and proof-of-uptime - HackMD or https://loki-project.github.io/loki-docs/Advanced/SwarmFlagging/)
A responsibility of nodes in the pool is also to be checking other nodes for well behavior, and report misbehaving nodes.
This two checks will ensure that the node is forwarding and storing packets.
Clients who are willing to pay for offline messages will select one or more node in the pool, based on the successful tests they passed, and connect to them.
On request of messages, they will pay to a shared fund, and give a receipt to the mailserver, which can be reedemed to get a compensation from the shared fund or could be a separate transaction, depending on how we decide to have clients pay for messages.
Part of this shared fund will also be distributed equally to those nodes that have passed the checks, favouring those that have consistently passed those tests, in order to incentivise uptime.
From a node perspective, once started it will join the network and potentially sync messages, and start forwarding/serving messages.
It might also be subject to tests, the result of which will be recorded by other nodes, and eventually it will be rewarded if well behaving.
A node that is not interested in being paid for their services, say a desktop node that has only short uptime (less than an hour at a time), and wants only to act altruistically, without any guarantees of uptime etc, can simply do so but will not rewarded for their services. Clients will have no assurance that it is a well behaving node, but can still connect/retrieve data in the same way they would from a node in the pool, potentially at no cost.
Desktop nodes that have a longer uptime (> 1 hour), can participate as paid nodes if they wish to do so.
Next steps
Once we settle on a strategy, it would be time to flesh out a POC and dig more deeply into the details and the nuances. At the same time we can explore the UX components to get a better perspective on how it will look like from a user perspective.
This is light on implementation details as that’s not yet our focus, we would like to first gather some feedback on the direction taken, please let us know!