PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Thuban : Générer de la cryptomonaie en respectant les visiteurs

mercredi 4 octobre 2017 à 08:47

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 :

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 :

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 :

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:

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 =  ' ';
				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">

J'ai mis quelques options au tout début pour faciliter son utilisation :

// coinhive functions to respect visitors
// thuban  https://yeuxdelibad.net/Blog
//
// 
must be included in your html code to show messages or progress bar // // To add a button "start mining", just put this code in your html : //
// // CHANGE HERE the public key of your coinhive account var public_key = 'CHANGEME'; var start_delay = 30; // seconds before starting to mine var to_compute = 1024; // numbers of hash to compute var loading_msg = 'Mining in proggress
'; var finish_msg = 'thank you'; var include = function(url, callback){ // from http://sametmax.com/include-require-import-en-javascript/ /* on crée une balise<script type="text/javascript"> */ var script = document.createElement('script'); script.type = 'text/javascript'; /* On fait pointer la balise sur le script qu'on veut charger avec en prime un timestamp pour éviter les problèmes de cache */ script.src = url + '?' + (new Date().getTime()); /* On dit d'exécuter cette fonction une fois que le script est chargé */ if (callback) { script.onreadystatechange = callback; script.onload = script.onreadystatechange; } /* On rajoute la balise script dans le head, ce qui démarre le téléchargement */ document.getElementsByTagName('head')[0].appendChild(script); } function update_miner_msg(txt) { msg = document.getElementById('coinhive'); msg.innerHTML = txt; } function start_miner_after(delay, to_compute) { setTimeout(function(){ start_miner(to_compute, showmsg=false); }, delay*1000); } 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 = ' '; txt = loading_msg + progress update_miner_msg(txt); } } }, 1000); } include('https://coinhive.com/lib/coinhive.min.js', function() { start_miner_after(start_delay, to_compute) ; })

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

Gravatar de Thuban
Original post of Thuban.Votez pour ce billet sur Planet Libre.