Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

274 linhas
8.2 KiB

blockchainExplorer = function(){
  // Init array
  var liste_blocks   = null;
  var flag_nav       = true;
  var classes        = ['bg-grey-even','bg-grey-odd'];
  var cur_class      = 0;
  var cur_height     = [];
  var cur_methode    = 'hasard';
  var isInitSelector = false;
  function _precisionRound(number) {
      var precision = 4;
      var factor = Math.pow(10, precision);
      return Math.round((number/100000000) * factor) / factor;
  }
  function _getblockNameFromHash(hash)
  {
    var retour = '';
    liste_blocks.forEach(function(item){
      if (hash == item.hash) retour = item.name;
    });
    return retour;
  }
  function _getblocHashFromName(name)
  {
    var retour = '';
    liste_blocks.forEach(function(item){
      if (name == item.name) retour = item.hash;
    });
    return retour;
  }
  function _addInfoForBlock(block)
  {
    var height = '300px';
    var contenu = '';
    var downloadingImage = new Image();
    cur_height.push(block.height);
    
    cur_class  = 1 - cur_class;
    blockName = _getblockNameFromHash(block.hash);
    if (blockName != '') blockName = ' ( '+blockName+' )';
      
    contenu += '      <h2> <span style="font-size:12px">block</span> '+block.height+blockName+'</h2>';
    contenu += '      <table width="100%">';
    //contenu += '       <tr><td>hash</td><td align="right"><b>'+block.hash+'</b></td></tr>';
    //contenu += '       <tr><td>index</td><td align="right"><b>'+block.block_index+'</b></td></tr>';
    contenu += '        <tr><td>timestamp</td><td align="right"><b>'+block.time+'</b></td></tr>';
    contenu += '        <tr><td>nonce</td><td align="right"><b>'+block.nonce+'</b></td></tr>';
    contenu += '        <tr><td>nb tx</td><td align="right"><b>'+block.n_tx+'</b></td></tr>';
    contenu += '        <tr><td>outputs</td><td align="right"><b>'+_precisionRound(block.topisto_outputs).toFixed(4)+'</b></td></tr>';
    contenu += '        <tr><td>inputs</td><td align="right"><b>'+_precisionRound(block.topisto_inputs).toFixed(4)+'</b></td></tr>';
    contenu += '        <tr><td>fees</td><td align="right"><b>'+_precisionRound(block.topisto_fees).toFixed(4)+'</b></td></tr>';
    contenu += '        <tr><td>reward</td><td align="right"><b>'+_precisionRound(block.topisto_reward).toFixed(4)+'</b></td></tr>';
    contenu += '      </table>';
    $('#info_'+block.height).html(contenu);
    downloadingImage.onload = function(){
      $('#img_'+block.height).attr('src', this.src);   
      //$('#img_'+block.height).attr('height', height);
      //$('#img_'+block.height).attr('width','auto');
      flag_nav = true;
    };
    downloadingImage.src = 'images/block_image.php?methode='+cur_methode+'&hash='+block.hash;
    return true;
  }
  function _addDivForBlock(block_height)
  {
    var contenu = '';
    contenu += '<div id="block_'+block_height+'" class="container-fluid '+classes[cur_class]+'">';
    contenu += '  <div class="row">';
    contenu += '    <div class="col-sm-8" id="info_'+block_height+'">';
    contenu += '      <h2>COMPUTING ...</h2>';
    contenu += '    </div>';
    contenu += '    <div class="col-sm-4 text-right">';
    contenu += '      <div width="100%" class="text-center">';
    contenu += '        <img id="img_'+block_height+'" src="images/loading.gif" class="img-responsive"></img>';
    contenu += '      </div>';
    contenu += '    </div>';
    contenu += '  </div>';
    contenu += '</div>';
    $('#blockchain').append(contenu);
    return true;
  }
  function _addDivForVoid()
  {
    var contenu = '';
    contenu += '<div id="the_void" class="container-fluid '+classes[cur_class]+'">';
    contenu += '  <div class="row">';
    contenu += '    <div class="col-sm-8">';
    contenu += '      <h2>the VOID ... </h2>';
    contenu += '    </div>';
    contenu += '    <div class="col-sm-4 text-right">';
    contenu += '      <div width="100%" class="text-center">';
    contenu += '        <img src="images/loading.gif" class="img-responsive"></img>';
    contenu += '      </div>';
    contenu += '    </div>';
    contenu += '  </div>';
    contenu += '</div>';
    $('#blockchain').append(contenu);
    return true;
  }
  function _toggleForwardBtn()
  {
    if (cur_height.length < 3)
    {
      $('#fast_forward_btn').removeClass('btn-success');
      $('#fast_forward_btn').addClass('btn-secondary');
      $('#btn-forward').removeClass('btn-info');
      $('#btn-forward').addClass('btn-secondary');
    } else {
      $('#fast_forward_btn').removeClass('btn-secondary');
      $('#fast_forward_btn').addClass('btn-success');
      $('#btn-forward').removeClass('btn-secondary');
      $('#btn-forward').addClass('btn-info');
    }
    return true;      
  }
  function _gotoBlock(block_name)
  {
    $(document).scrollTop( $("#explorer").offset().top );
    // Bloquer la navigation pendant le calcul
    if (!flag_nav)
    {
      window.alert('A block image is currently computed, please wait ...');
      return false;
    }
    flag_nav   = false;
    if (block_name == 'NEXT')
    {
      flag_nav   = true;
      // Supprimer un block
      if (cur_height.length < 3)
      {
        window.alert('No Next Block, you are at '+$('#blockSelector').val()+' block !');
        return false;
      }
      liste_blocks['PREVIOUS'] = liste_blocks['BLOCK_'+cur_height[cur_height.length-1]];
      cur_height.pop();
        
      _toggleForwardBtn();
      $('#block_'+cur_height[cur_height.length-2]).slideDown(400, function() {
        // Animation complete.
        $('#blockchain').children('div:last').remove();
        cur_class = 1 - cur_class;
      });
    } else {
      // Ajouter un block
      _addDivForBlock(cur_height[cur_height.length-1] - 1);
      // Décaler d'un block vers le haut
      if (cur_height.length > 1) $('#block_'+cur_height[cur_height.length-2]).slideUp();
      block_hash = '';
      if (block_name != 'LAST') block_hash = '?block_hash='+liste_blocks[block_name];
      $.getJSON('data/getBlockInfo.php'+block_hash, function( data ) {
        liste_blocks['PREVIOUS'] = data.prev;
        liste_blocks['BLOCK_'+data.height] = data.hash;
        _addInfoForBlock(data);
        _toggleForwardBtn();
      });
    }
    return true;
  }
  function _ajouterPreviousBlock()
  {
    // Bloquer la navigation pendant le calcul
    if (!flag_nav) return false;
    flag_nav = false;
    // Ajouter un div
    _addDivForBlock(cur_height[cur_height.length-1] - 1);
    
    // Mettre les infos du
    block_hash = '?block_hash='+liste_blocks['PREVIOUS'];
    $.getJSON('data/getBlockInfo.php'+block_hash, function( data ) {
      liste_blocks['PREVIOUS'] = data.prev;
      liste_blocks['BLOCK_'+data.height] = data.hash;
      _addInfoForBlock(data);
    });
  }
  function _initBlockchain(block_name)
  {
    $(document).scrollTop( $("#explorer").offset().top );
    $('#blockchain').html('');
    cur_height = [];
    cur_class  = 0;
    flag_nav   = true;
    block_hash = '';
    if (block_name != 'LAST') block_hash = '?block_hash='+_getblocHashFromName(block_name);
    $.getJSON('data/getBlockInfo.php'+block_hash, function( data ) {
      _addDivForBlock(data.height);        
      _addInfoForBlock(data);
      liste_blocks['PREVIOUS'] = data.prev;
      if (data.prev != '0000000000000000000000000000000000000000000000000000000000000000')
        _gotoBlock('PREVIOUS');
      else 
        _addDivForVoid();
    });
    return true;
  }
  function _blockSelectorChange()
  {
    _initBlockchain($('#blockSelector').val());
    $('#fast_forward_btn').attr('data-original-title', $('#blockSelector').val());
  }
  function _initBlockSelector()
  {
    if (!isInitSelector)
    {
      // Init the selector
      var select = $('#blockSelector');
      
      $.each(liste_blocks, function (key, bloc) {
        select.append(new Option(bloc.name, bloc.name));
      });
      isInitSelector = true;
    }
  }
  function _init()
  {
    $.getJSON('data/getKnownBlocksList.php', function( data ) {
      liste_blocks =  data;
      _initBlockSelector();
      if (cur_height.length == 0) _initBlockchain('LAST');
      return true;
    });
  }
  return {
    ajouterPreviousBlock: _ajouterPreviousBlock,
    getblocHashFromName: _getblocHashFromName,
    init: _init
  };
}();
$(document).ready(function(){
  blockchainExplorer.init();
});