Desarrollando y programando en la cadena de bloques de HIVE y Hive-Engine con Javascript/JQuery

in HK UNIVERSITY2 years ago (edited)

hiveLogo.png

hiveEngineLogo.png

Como todo desarrollador experimentado sabrá, la programación en la cadena de bloques es un concepto que requiere de formación y aprendizaje. Puedes saber programar en cualquier lenguaje pero no tener idea de como hacerlo en cierta cadena de bloques, esta mini experiencia nos adentrará y nos dará los recursos necesarios para programar concretamente en la cadena de bloques de HIVE y Hive-Engine bajo el lenguaje javascript/JQuery.

Agradecemos a Hashkings por la iniciación del curso a través de HK UNIVERSITY que ha hecho posible este post.

TOKENS, NFTs y Transacciones
Estos son los conceptos básicos con los que deberemos tratar

Para los usuario más experimentados aquí tendremos los recursos de los endpoints, métodos y tablas a los que podemos llamar con Hive-Engine

Balances
Cuando nos referimos a balances, hablaremos de tokens, estos son la cantidad de tokens que tiene un usuario o cuenta de un activo concreto. Por ejemplo: BUDS

Existen varias formas de hacer esta consulta utilizando directamente la librería sscjs o haciendo una llama ajax con JQuery a la función find/findOne al contrato tokens y tabla balances. En este ejemplo usaremos la librería sscjs:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sscjs@latest/dist/ssc.min.js"></script>
<script>
   const ssc = new SSC('https://api.hive-engine.com/rpc');
   // Obtemos los BUDs que tiene la cuenta de apzyx....
   var BUDSinStk = parseFloat(0);
   await ssc.findOne(
      'tokens',
      'balances',
      {
         account: 'apzyx',
         symbol: "BUDS"
      }, (err, result) => {

      console.log(err, result);            
      BUDSinStk = parseFloat(result.balance);
      alert(BUDSinStk);
});
</script>

En esta consulta se utiliza el método findOne por lo que sólo recuperará una fila, podemos cambiar el token BUDS por el token HKWATER o cualquier otro que este dentro del nodo Hive-Engine,

Transacciones
Las transacciones o histórico de transacciones de una cuenta requerirán de hacer varias llamadas a un mismo método que devuelve un límite del 1000 o 500 transacciones por llamada, utilizaremos el atributo offset a modo de paginación.

<script>

   function sleep(ms)
   {
      var start = new Date().getTime(), expire = start + ms;
      while (new Date().getTime() < expire) { }
      return;
   }

   var startV = BigInt(0);
   var completarDatos = true;
   var arrayHKNVAULT = [];
   while (completarDatos) {
       await  $.get({
           url: "https://history.hive-engine.com/accountHistory",
           data: {
               account: accountV,
               symbol: "BUDS",
               offset: startV,
               limit: 500
           },
           async: false
       },
           function(data, status) {

               console.log(data);
               console.log(status);

               for (var i = 0; i < data.length; i++) {
                   arrayHKNVAULT.push(data[i]);

                   var dataS = JSON.stringify(data[i])
                   var dataJs = JSON.parse(dataS);

                   if (dataJs.symbol == 'BUDS') {
                       if (dataJs.operation == 'tokens_transfer') {
                           if (dataJs.to == 'null') {
                               completarDatos = false;
                           }
                       }
                   }
               }

               if (data.length < 500) {
                   completarDatos = false;
               }

                startV = startV + BigInt(500);
            });
        sleep(333);
    }
   console.log(arrayHKNVAULT);
</script>

Estos serían los parámetros que acepta este endpoint de histórico:
GET Parameters
account: a HIVE account or multiple HIVE accounts separated by a comma (required)
symbol: a Hive-Engine token symbol (optional)
ops: a comma separated list of operations e.g. tokens_transfer (optional)
timestampStart: a unix timestamp that represents the start of the dataset (optional)
timestampEnd: a unix timestamp that represents the end of the dataset (optional)
limit: number of records for the dataset (max is 500) (optional)
offset: offset for the dataset (required to browse a dataset that is bigger than 500 records) (optional)

NFTs
Para los NFTs método de búsqueda será find, el contrato será nft y la tabla el id del NFT + Instances, en nuestro caso HKFARMInstances

<script>
    
    async function nfts() {        
        $.ajaxSetup({ async: false });
        var offsetV = BigInt(0);
        var completarDatos = true;
        while (completarDatos) {
                        
            await $.ajax({
                url: "https://engine.rishipanthee.com/contracts",
                method: "POST",
                contentType: "application/json",
                async: false,
                data: '{"jsonrpc":"2.0", "method":"find", "params":{"contract":"nft", "table":"HKFARMinstances","query":{"properties.TYPE": "plot"},"offset":'+ offsetV + ', "limit":1000, "indexes":[]}, "id": 1}'
                ,

                success: function(response) {
                    console.log(response.result);
                    
                    if (response.result.length < 1000) {
                        completarDatos = false;
                    }
                    
                    offsetV = offsetV + BigInt(1000);
                },
                error: function(error) {
                    console.log(error);
                    alert("error");
                    completarDatos = false;
                }
            });
        }

    }

</script>

Espero que todo esto les sirva de guía o ayuda para comenzar, iremos actualizando el post conforme vayamos aprendiendo nuevas estrategias y conceptos dentro del universo HIVE y HIVE-ENGINE, de la mano de HK UNIVERSITY ❤️

Pueden acceder a mi proyecto actual y trastear en la dirección
https://hashkings.azurewebsites.net/