Du libre, du code, des idées, du mélange d’ArraKISS…

De l’épice pour la pensée

Il y a à peu près un mois, j'ai ajouté sur mon site un petit bout de javascript pour intégrer coinhive et proposer aux visiteurs de miner du monero pour moi.
L'idée me semblait intéressante sur plusieurs points et je voulais savoir ce que ça pourrait donner.

Aujourd'hui, cela a fait gagner 0.00418 XMR, soit environ 5 centimes d'euros par mois, alors que certains ont fait tourner leur processeur rien que pour "me récompenser". Par ailleurs, il faut savoir que la somme minimale que l'on peut retirer à coinhive est de 0.5 XMR. On en est très loin donc.
Je met donc fin à cette expérience car :

  • Cela me gêne que des lecteurs de bonne foi pensent récompenser l'auteur alors que seul coinhive en profite;
  • Le côté abusif de coinhive qui tournait de façon cachée, en prenant toutes les ressources, peu importe s'il s'agit d'un mobile ou non a été pris en compte en amont;
  • Ce n'est pas rentable ni pour moi, et décevant pour ceux qui souhaitent bien faire;
  • Les autres méthodes de remerciement sont beaucoup plus efficaces ("merci", "coucou", ...);
  • Je n'aime pas dépendre d'un service tiers.

Alors qu'il avait été annoncé un modèle économique alternatif aux publicités pour récompenser les créateurs, je n'y crois pas du tout (ou alors il faut clairement abuser des ressources des visiteurs). Les dons récurrents via liberapay, les virements bancaires, l'envoi postal d'une carte avec un petit mot sont beaucoup plus efficaces (surtout en terme d'énergie).

Vous avez peut-être déjà entendu parler de l'idée consistant à remplacer les encarts de publicité sur un site web par un bout de code javascript qui permet au visiteur de générer de la cryptomonaie pour le webmaster. Korben en a déjà parlé, et je dois avouer trouver le concept intéressant, mais pas pour les mêmes raisons que lui.

Tout d'abord, permettre à un site de financer son hébergement ne peut que l'encourager à améliorer le contenu. Jusqu'à présent, cela se fait par des publicités, à l'insu du visiteur, c'est envahissant et énervant.

Coinhive propose donc une alternative intéressante et beaucoup moins envahissante. Ce service propose notamment :

  • Remplacer les captchas par la génération d'un peu de cryptomonnaie. C'est pas mal, mais déjà que les captchas normaux m'énervent, si je dois attendre 30s pour pouvoir poster un commentaire, ça va vite me saouler.
  • Lancer la génération de cryptomonnaie lorsque le visiteur visite la page. Si c'est automatique, je trouve ça carrément irrespectueux, le visiteur n'a jamais demandé qu'on fasse cracher son CPU, il veut juste lire une page web.
  • Chacune de ses solutions réclame qu'on désactive un bloqueur de pub. Ben non justement, si le visiteur en a un, c'est pas pour qu'on vienne lui chier dans les bottes avec un message anti-adblock.
  • Par ailleurs, ces deux idées font travailler le pc du visiteur au maximum de ses capacités par défaut, sans fin pour la seconde. En ce qui me concerne, j'ai vite fait de fermer un onglet qui bouffe toutes mes ressources.

Non satisfait par les solutions proposées par coinhive, mais pourtant séduit par le concept, me voilà parti pour javascripter (si si ça se dit) en lisant la doc donnée. Laisser de la doc, je trouve ça vachement cool!
Voici les idées que je souhaite mettre en place :

  • Limiter la charge processeur et prendre soin des ventilos des visiteurs.
  • Proposer un bouton "Super article", qui va hasher une certaine quantité (un peu comme le captcha) et s'arrêter ensuite. C'est le visiteur qui clique s'il a envie de "récompenser".
  • Autre possibilité, lancer le minage de cryptomonnaie après un certain délai, pour une durée limitée. Cela suppose que si le visiteur reste à lire un article pendant un certain temps, c'est que l'article a de l'intérêt et qu'il ne fait pas autre chose en même temps demandant de la charge processeur.

Je pars du principe que c'est intéressant d'afficher la progression du hashage au visiteur, on prévoit dont un petit bout de html qui contiendra nos mesages :

<div id="coinhive"></div>

On démarre le minage après un certain délai en arrière-plan avec cette fonction :

function start_miner_after(delay, to_compute) 
{
	setTimeout(function(){
		start_miner(to_compute, showmsg=false);
	}, delay*1000);
}

Si on veut ajouter un bouton pour que le visiteur lance le hashage par lui-même, on peut mettre le code html suivant dans sa page en précisant la quantité à hasher:

<div id="coinhive"><button onclick="start_miner(1024)">Start mining</button></div> 

La fonction qui lance le minage est la suivante :

function start_miner(hash, throttle=0.5, showmsg=true)
{
	// 'hash' is the number of hash you want the user to compute. 
	// Must be a multiple of 256

	var miner = new CoinHive.Anonymous(public_key);
	miner.setThrottle(throttle);
	console.log('Start mining using ' + throttle * 100 + '% of CPU');
	miner.start();
	// Listen on events
	miner.on('found', function() { /* Hash found */ })
	//miner.on('accepted', function() { /* Hash accepted by the pool */ })

	// Run util it's computed
	var perc = 0;
	var timer = setInterval(function() {
		var totalHashes = miner.getTotalHashes();
		var acceptedHashes = miner.getAcceptedHashes();

		if (totalHashes >= hash){
			miner.stop();
			if (showmsg) { update_miner_msg(finish_msg); };
			clearInterval(timer);
		}
		else {
			if (showmsg) { 
				progress =  '<progress value="' + totalHashes + '" max="' + hash + '"></progress> ';
				txt = loading_msg + progress
				update_miner_msg(txt);
			}
		}

	}, 1000);
}

Voici le code javascript au complet, à inclure comme d'habitude avec

<script src="/path/to/thubancoinhive.js"></script>

J'ai mis quelques options au tout début pour faciliter son utilisation.
La version que j'utilise est disponible en suivant ce lien : thubancoinhive.js

Voilà, je vais tester ça quelques temps voir ce que ça donne, je serai peut-être déçu, mais qui ne tente rien...

EDIT : voici le code html qui me sert à insérer un petit encadré pour permettre aux visiteurs de miner s'ils ont aimé leur visite :


<div id="coinhivecontainer" style="background:white; padding:15px; border:1px solid #111; position:fixed; bottom:5px; right: 5px; min-width:150px; text-align:center;">
        <a href="javascript:void(0)" onclick="closeCoinhive()" class="coinhiveclose">X</a>
        <div id="coinhive">
                <a href="javascript:void(0)" title="Miner du monero pour récompenser l'auteur" onclick="start_miner(512, throttle=1)"><U+1F449> Cet article m'a intéressé</a>
        </div>
</div>

En cliquant sur la croix, le visiteur peut virer cet encadré s'il est gêné avec ce bout de javascript :


function closeCoinhive() {
    document.getElementById("coinhivecontainer").style.display = "none";
}

EDIT 2 Suite à la remarque de 22decembre, j'ai ajouté un petit test dans le code pour modifier la charge processeur si le visiteur utilise un smartphone :


var cpu_usage = 0.5;
var cpu_usage_mobile = 0.3;
...
...
var isMobile = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/);
        if (isMobile) { var cpu = cpu_usage; }
        else { var cpu = cpu_usage_mobile; }

        start_miner_after(start_delay, to_compute, cpu) ;

EDIT 3
Voici le message envoyé à l'équipe de coinhive, plus qu'à patienter :

Hello,
Interested by the alternative proposed by coinhive to monetize a website, I tried it.
However, I found some aspect quite disturbing with examples in documentation:
- Once a visitor is mining, it never stops until he close the website,
- Throttle is 1 by default, the user might want to leave the website to save its computer ressources
- Smartphones computes as much as PCs.
- How can someone be sure he's computing monero and not something else?

I'm afraid these points lead visitors to leave a website, which is the opposite of what we want.
Maybe you should consider some integration code more respectful of visitors.
You can find on the link below how I start after a delay the mining on my website, don't use all the CPU, set a lower throttle for smartphones and limit the amout of hases that is computed.

Regards.
thuban


link to the code I use : https://yeuxdelibad.net/js/thubancoinhive.js