Andrea Piana
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    Network incentivisation === In order to make sure we are not tight to a specific transport (currently whisper), different models of operations will be explored: 1) Whisper 2) Loopix If not specified it applies to all. The main differences and properties are: #### Whisper - Sender anonimity - Receiver anonimity - Messages are flooded on the network - All nodes can have the same functions (relay + mailserver) #### Loopix - Sender anonimity - Receiver is anonymous to mix nodes, but not to providers (trusted nodes) - Messages follow a path in the network - 2 kind of nodes, mix nodes (relay only), providers (entry/exit points) - Trusted/long term relationship with providers ### Options We have a few options, some of them can be used in conjunction (i.e Donations can be always built on top of other methods). - Pay to send & receive (i.e https://discuss.status.im/t/prbs-protocol-proposal-an-incentivized-whisper-like-protocol-for-status/849/14 ) - Pay for offline messaging, providing online messaging for free (i.e freemium) - Contribute with resources (i.e bandwith/storage torrent) - Ads model (i.e pay with attention/data) - Donations (i.e wikipedia) ## Open questions Removing status-run nodes on the network has certain implications, which are common to some/all the methods listed above, so some questions needs answering: [Oskar: I think having a list of bootstrap nodes is OK, especially if we only have few of these, and people can modify this. Similar to how BT works ~. Though you wouldn't get as 'decentralized'/coordination-less as, say, SSB.] - How to make forwarding nodes discoverable? -- [Oskar: could you elaborate?] -- [Andrea: Forwarding nodes membership is dynamic and possibly a user will have to pay, if the user is to select a forwarding node (or even if it is selected automatically), how can we have a discoverable list of nodes (with potentially pricing information)?] - How to make offline message nodes discoverable? -- [Oskar: do you mean 'knowing if there are new messages to be fetched?' or the nodes themselves?] -- [Andrea: Offline messaging nodes membership is dynamic and possibly a user will have to pay, if the user is to select an offline messaging node (or even if it is selected automatically), how can we have a discoverable list of nodes (with potentially pricing information)?] - How do we know a offline messages node has been online/has the messages for the time we are interested in? -- [Oskar: IMO this is solved if you have a data sync layer, as you know parent message id and can detect if messages are missing] -- [Andrea: Not really, certainly it might help, but simple case: you go online after being offline for a while, you want to catch up on chat x, you ask mailserver/peer for data in group x, they have not the most recent data. Your parentID will be from a while ago, and you won't be able to know that there's more recent data. Also looking at briar parentID is an optional field, and only used for replies.] -- [Oskar: Right, I was imagining that's an "honest" intermittent connection, i.e. that node simply happens to be less useful. In reality I imagine you'd have multiple nodes, and if someone offers newer with more proven parent ids, then that'd be de facto more useful and act as proof itself that it has more 'uptime' (=useful new info). ] - How do we guarantee darkness if transactions are involved? -- [Oskar: would be useful to be explicit about what we mean by 'darkness' as it isn't a technical term IMO - what type of anonymity is lost and under what threat model? that said I agree] -- [Andrea: What kind of guarantees on sender & receiver anonimity (could be either or) if transactions are involved. The attacker would be anyone having access to Ethereum blockchain info, assuming we use SNT for transactions.] -- [Oskar: seems fair and like a good starting point] ## Pay to send & receive ### Using whisper Using whisper this method is complicated by the fact that every envelope is flooded to the network, so multiple paths are possible from point A to point B. ### Using loopix This would simplify things as a single path is actually followed, and similar strategies have been proposed https://www.freehaven.net/anonbib/cache/raykova-pet2008.pdf . It slightly complicated by cover messages, but probably just a matter of fleshing out details. ### Incentive for running nodes Every user will have to paid for sending and receiving messages. This payment form could be potentially a subscription. ### 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 - Simple (offline messaging could be just be paid by receiving messages) ### Cons - High entry barrier for new users - Difficult to achieve darkness ### Open questions - How to make payments work in a frictionless way? (pay per message too slow for on-chain transactions) -- [Oskar: mystery shopping payment scheme is one way (probabilistic micro payments)] - How to distribute SNTs for new users? - How mobile-only users are supposed to earn SNTs? - [Oskar: Trustlines or first 1-10k users likely already have SNT] -- [Andrea: thanks good suggestions, I Will expand both points and elaboarte on the options suggested.] ## Pay for offline messages ### Incentive for running nodes Every user will have to paid for receiving messages when offline. This payment form could be potentially a subscription. ### 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 -- [Oskar: good point!] - Low threshold of users needed to be profitable ### Cons - The benefits of offline inbox needs to outweight the cost of forwarding messages - [Oskar: could you elaborate?] -- [Andrea: Basically nodes will only be paid for offline messaging, and forwarding(sending) messages is not paid for. In that case the cost of forwarding messages needs to be less than the reward from storing offline messages] - Free-rider problem - Spam - [Oskar: could you elaborate? Think I agree but just to be explicit] - [Andrea: because forwarding is free of charge then nothing prevents a spammer to post many messages, while if you pay the node for forwarding that might act as a spam prevention mechanism] [Andrea: Here the assumption is that nodes are not paid to forward messages, only for storing offline messages. I need to make that clearer] ### Open questions - How do we ensure that they have the data we are interested in? - [Oskar: With data sync layer I think this could be done by OFFER/ACKs. Optimization: send bloomfilter a la Tribler's Dispersy. This would be similar to the 'BT resource one below'] - [Andrea: This goes back to the question above, we want to have some assurance that there are no gaps in the history i.e how do we know that the mailserver for example has a gap of x minutes?, and how we encourage the mailserver to fill the gaps (proof of uptime is basically spot checks on data stored)] - [Oskar: Maybe I'm missing somthing but I'm not clear how this is a problem if you pay for resources and have multiple intermittently connected 'mailserver'. Whoever is useful provides new info and that's what you measure. Gap of X minutes information isn't needed, since this is implicit in the messages they happen to have that are relevant for a specific group sync context.] ### Whisper With whisper a mailserver would have to collect all the data in the network as the receiver is not known. ### Loopix In this case all the offline data would be stored in a provider (a trusted node, that is aware of which messages are for you), so no darkness is provided. A potential issue in applying only this method of incentivisation is that mix nodes would need to have other incentives to forward messages, as you can't be both a provider and a mix node. [Oskar: In Loopix I agree; I'm not 100% sure if this definitely needs to be the case.] [Andrea: yes, seems like something that there quite a lot of different options] ### Details A few ways to address offline storage: One is to keep things as they are (each mailserver has their own local copy of the data). In this case mailservers need to provide a proof that they have the data for the time span we are interested in, otherwise the user might not get all the historical data available. Some thoughts are here https://hackmd.io/s/H1ZW4MMfV. Another possible way is use something like ipfs and filecoin, where a user would ask the mailserver to pin their envelopes and the problem shifts on how to make it indexable on ipfs. This option has some advantages, but has not been explored throughly yet. [Oskar: I really think it's much simpler to have a chain of messages and solve this problem by looking at it like data sync, as opposed to proving uptime or something like this. Then you can be minimally useful as a Desktop node, just like in Bittorrent, because you provide data behind a hash.] [Andrea: A chain of messages, as I understand you would like to have each message dependent on a previous message in a public chat let's say, would bring far more complications in my opinion, as you are trying to ensure strong consistency among clients, effectively forcing the users to sync the whole history before publishing any message (or at least a branch up to the root), you have side-chains, network partitions, and effectively no canonical-history (it's not like a blochain where you have consensus on a single branch, here multiple branches are ok, and a client does not necessarly know that multiple branches exists, until a message from that branch is fetched). I feel this is unnecessary for a chat application, sure makes sense for transactions or for threads in a chat application, but for every message? Briar does not use this strategy as far as I understand, or I am missing your point here?] ### Payment models Pay per data (in MB). This would work well in a system where the receiver is known (loopix), as the mailserver would be inclined to serve as much data as possible. In a system where the receiver is not known (whisper), the mailserver could easily forge envelopes increasing the bill, and that's difficult to prevent as receiver anonymity is preserved. Pay per delivery. Similarly would work well in a system where the receiver is known while it's more difficult in a system that provides darkness of the receiver, in this case the mailserver would have to trust the client to notify if any of the envelopes are for the user. Pay per request(s), this would work in both cases, a misbehaving mailserver could potentially not serve data to the user to save bandwidth. Pay fixed amount per time period (subscription). This would work in both cases, a misbehaving mailserver could potentially not serve data to the user to save bandwidth. Rate limiting can be in place to avoid too many requests. [Oskar: +1 - I wonder if there's a hybrid model where subscription is how it works for user, but it is more granular for machine2machine? E.g. with a hybrid free system, so if a node is underpaying it gets less useful traffic. But this can be hidden from user, perhaps.] [Andrea: That's interesting, good suggestion, thanks] ## Contribute to resources Bleep, a now defunct instant messaging client from bittorent, has used a similar strategy (used the DHT). The code is not open source, but it was lacking of true offline messaging and bandwith consumption for mobiles was relatively high. ### Incentive for running nodes If you want to use the app, you need to be part of the network. ### Pros - Low entry barrier ### Cons - Service requires a certain degree of uptime -- [Oskar: Why is this necessarily the case? With data sync you can be different degrees of useful, and degrades gracefully.] -- [Andrea: I need to understand exactly what you mean by data-sync, as not sure if you mean to make each message always dependent on a previous or no] -- [Oskar: Not always, part of spec would be that it allows for multiple components (like git repos can have many parent commits), but I imagined the vast majority of messages would have though. This might be the wrong way to look at it, can chat more on Monday.] - Mobile-only clients might not be feasible -- [Oskar: in general agree, but that can be OK - get help from a friend's desktop, or even leave cheap Android at home] - Only users that are interested in using the service will contribute -- [Oskar: don't follow - this happens automatically. If I download a movie on TPB I seed regardless.] [Andrea: yes, basically it's both a pro and a con. Here we are saying that the only incentive is contributing to resources. That would exclude those people who might not be interested in using Status, but only interested in earning SNT. In that case if we exclusively use this method, that share of users will have no interest in running status-node] ### Open questions - How can we make contribution of resources meaningful on a service which requires certain degree of uptime? ## Ads model ### Incentive for running nodes Nodes will be paid by advertising, either directly (the runner of the node will have to look for advertiser) or indirectly (through a contract). ### Pros - Low entry barrier ### Cons - high threshold of users needed to be profitable - Not much data can be provided about users for privacy/darkness concerns - Might increase reliance on third parties (i.e most of the revenues come from a single advertiser) ## Donations ### Incentive for running nodes Paid through a contract. ### Pros - Low entry barrier ### Cons - No incentive to donate other than the survival of the platform ## Comparison ### Options 1) Pay to send 2) Pay for offline messaging 3) Contribute with resources 4) Ads model 5) Donations | Option | continuity | entry barrier | scalability | economically viable | permission to participate | anti-spam | SNT | |----------|:----------:|:--------------:|:-----------:|:-------------------:|:-------------------------:|:---------:|:---:| | 1 | yes | moderate/high | yes | yes | no | yes | yes | | 2 | yes | moderate | yes | yes | no | no | yes | | 3 | yes | low | yes | na | no | no | no | | 4 | medium | low | yes | yes | possibly | no | yes | | 5 | low | low | yes | no | no | yes | yes | ## Spam prevention ### Pay to send Where pay to send is applicaple (loopix, while whisper is trickier), that effectively acts as spam prevention mechanism, and is effectively identical to burn to send where the receivers are the nodes relaying the message (or the whole network in case of whisper). So most of the concerns applies here as well. ### Burn to send Burning funds for spam prevention can be applied to any method listed above. As described in https://discuss.status.im/t/prbs-protocol-proposal-an-incentivized-whisper-like-protocol-for-status/849 , we could just enrich whisper envelopes with a signed proof of burning. We can allow users to buy messages in bulk, in order to make it more user-friendly (i.e 1000 messages per time period etc), and nodes will discard/refuse to forward if the limit is exceeded (it is still possible that some ms not having all the messages still forward some of those, but it's enough for spam prevention). Preserving anonymity it's a bit of an issue as you will be able to trace sender->wallet fairly easily, unless some privacy preserving methods are used. Another option is to have the mailserver acting as a guarantor. This way the client pays the mailserver, and the mailserver attaches the proof-of-burning to the envelope. In this case mailservers are effectively acting as a kind of mixer. The benefits are that you will only be able to trace back the transaction to a user using that node, the drawback is that the user will need to disclose the fact that they sent that envelope to the mailserver (but not to the entire network), also given that a small amount of users using that node, it's not much privacy preserving, effectively the user choice here is to trade-off darkness/privacy for better delivery guarantees. Having burn-to-send as a mechanism also does not necessarely implies that all messages needs to be paid. We can implement a rate limiting mechanism on nodes for messages without a proof, while allow those with a proof to be not rate capped. This can be reflected in the app by only making available features that are more bandwith intensive (multi-device, group chats) if funds have been burned.

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully