<p>Traditionally the term <em>mining</em> in cryptocurrency refers to the process of
contributing compute resources to the network and earning a reward. On the
Blockstack network, however, instead of just mining through computation,
developers can mine by contributing apps to the ecosystem and making
applications the community wants.</p>
<p><imgsrc="images/mining-image.png"alt=""/></p>
<p>Founders that build apps using Blockstack developer tools like Blockstack Auth
get paid each month, in amounts proportional to that month’s app quality
ranking. Blockstack PBC, in cooperation with App.co, currently administers the
payouts. A set of independent <em>App reviewers</em> determines the monthly ranking
during the pilot phase.</p>
<h2id="how-apps-are-reviewed">How apps are reviewed</h2>
<p>Blockstack worked with a team of Ph.D. game theorist and economists from
Princeton and NYU to put together a ranking algorithm which is fair and
resistant to abuse. Blockstack partnered with two different third-party
reviewers, Product Hunt and Democracy.earth. These reviewers are independent,
and generally rely on their own proprietary data and insights to generate
rankings.</p>
<h3id="product-hunt">Product Hunt</h3>
<p>Product Hunt is the place to find the best new products in tech. They have a
massive trove of user data (upvotes, comments, etc), that they use for ranking.
Product Hunt comes up with two different scores for each app — a “community”
score and a “team” score.</p>
<p>Their community score is determined only by the number of upvotes an app
received on Product Hunt, relative to other apps that are registered. For
example, if an app got more upvotes than any other app in a cohort, their
community score would be 100. If a different app got 60% as many upvotes, they’d
get a score of 60.</p>
<p>Their team score is determined by internal team members conducting reviews on
different aspects of an app. They judge based on a few criteria, like execution,
uniqueness, and desirability. Each app gets ranked 1-10 on each criterion, and
their final score is the average of each criterion. Finally, this average is
multiplied by 10, so the highest score you can get is 100.</p>
<p>Once each app has a community and team score, Blockstack converts these scores into
<em>z-scores</em>, more about z-scores below.</p>
<h3id="democracy-earth">Democracy Earth</h3>
<p>Democracy Earth is a platform for borderless peer-to-peer democracy. They’ve
built a platform that anyone can use to gather votes in a trust-less,
decentralized way.</p>
<p>Democracy Earth has built a platform for Stacks token holders to vote on how
apps should be ranked. Each token holder gets a certain number of votes, and
they can distribute those votes however they want. It’s possible to give all of
your votes to a single app, and you can also “downvote” an app with one of your
votes.</p>
<p>After a voting period, each app has a certain amount of upvotes and downvotes.
First, Blockstack calculates the percentage of total votes that are upvotes. If
you got 90 upvotes and 10 downvotes, you’d get a “likability score” of 90.
Secondly, Blockstack calculates a “traction score”, which ranks how many total
votes (including downvotes) an app received, relative to other apps.</p>
<h2id="reaching-the-final-scores">Reaching the final scores</h2>
<p>Once the reviewer-partners generate reviews, each app has 4 raw scores between 0
and 100 for the following:</p>
<ul>
<li>Product Hunt community score</li>
<li>Product Hunt team score</li>
<li>Democracy Earth likability score</li>
<li>Democracy Earth traction score</li>
</ul>
<p>First Blockstack’s determine a ‘z-score’ for each ranking category community,
team, likability, and traction. This is a statistical technique to account for
different distributions of scores within categories. Second, Blockstack computes
the average and standard deviation of each category. Finally, for each app’s
score in that category, Blockstack determines how many standard deviations it is
away from the average score in that category.</p>
<p>For example, let’s say a category has an average score of 60, with a standard
deviation of 15. A score of 90 would get a z-score of 2, because it’s 2 standard
deviations higher than the average.</p>
<p>Once each app has a calculated a z-score in every category, the average of those
4 z-scores results in a final number. A higher number is better than a lower
one, and so apps are ranked from highest to lowest.</p>
<h2id="determining-how-much-an-app-is-paid">Determining how much an app is paid</h2>
<p>For each app mining cohort, there is determined a “pot” of total earnings that will
get paid to apps. For the Alpha run, Blockstack paid a total of $25,000 USD. Starting in
December 2018, Blockstack will pay $100,000 USD and the awards will be paid out in Bitcoin.</p>
<p>The top app gets paid 20% of the total pot. So, for a pot of $100k, the top app
receives $20,000 USD. The next app gets paid 20% of the remaining pot. The
remaining pot is $80k, and 20% of that is $16,000. This process continues until
every app has been paid.</p>
<p>Here is a chart that visualizes the decay in rewards, depending on rank:</p>
<p><imgsrc="images/decaying.png"alt=""/></p>
<p>This first release of App Mining uses the initial version of our ranking and
payout mechanism. Blockstack has taken care to be thoughtful and fair, but
things may change as we learn more and get feedback from the community. Please
let us know what you think by commenting <ahref="https://forum.blockstack.org"target="\_blank">in our forum</a> or by emailing us at <ahref="mailto:hello@app.co">hello@app.co</a>!</p>
/* A CSS selector that points to your search box */
searchBox: {
selector: '#searchBox'
},
results: {
embedConfig: undefined, // {'url':undefined,'contentBlock':'.page-content-body'}, // if url is given the page will change to that URL and look for the content block there to insert the results
fullScreenConfig: undefined, // {trigger: '#ss360-search-trigger', caption: 'Search this site'}, trigger is the CSS selector to the element that starts the search full screen overlay and searchCaption the caption on the full screen search page
caption: 'Found #COUNT# search results for \"#QUERY#\"', // the caption of the search results
group: true, // whether results should be grouped if content groups are available
filters: undefined,
num: 96, // the maximum number of search results to be shown
highlightQueryTerms: true, // whether to highlight the query terms in search results
moreResultsButton: "Show more results", // HTML for the more results button, all results will be shown if this is null
noResultsText: 'Sorry, we have not found any matches for your query.', // the text to show when there are no results
queryCorrectionText: 'Did you mean "#CORRECTION#"?',
searchQueryParamName: 'ss360Query', // the name of the search query parameter
linksOpenNewTab: false, // should clicking on the result links open a new tab/window?
showSearchBoxLayover: true, //whether to show search box in search result layover
moreResultsPagingSize: 12, // the number of new results to show each time the more results button is pressed (max: 24)
orderByRelevanceText: "Relevance" // the text to be shown in order select box to describe 'order by relevance' option
},
suggestions: {
show: true, // whether to show search suggestions
maxQuerySuggestions: 3, // the maximum number of query suggestions
querySuggestionHeadline: undefined, // the headline of the query suggestions, leave blank if no headline should be shown
emptyQuerySuggestions: undefined,
showImages: false, // show images in search suggestions
num: 6, // the maximum number of search suggestions to be shown
minChars: 3, // minimum number of characters before the suggestions shows, default: 3,
maxWidth: 'auto', // the maximum width of the suggest box, default: as wide as the input box, at least 275px
throttleTime: 300, // the number of milliseconds before the suggest is triggered after finished input, default: 300ms
extraHtml: undefined, // extra HTML code that is shown in each search suggest, you can even show values of datapoints here,
highlight: true, // whether matched words should be highlighted, default: true
},
smart404: { /* The caption of the search results. */
caption: 'These links might be useful', /* The string in the title that identifies the page as a 404 page. */
identifier: 'Page not found', /* A CSS selector that points to the area in which the alternative links should be shown. */