jueves, 28 de septiembre de 2017

BITCOIN, BLOCKCHAIN

Blockchain Data API

Some API calls are available with CORS headers if you add a &cors=true parameter to the GET request

  • https://blockchain.info/rawblock/$block_hash
  • You can also request the block to return in binary form (Hex encoded) using ?format=hex
{
    "hash":"0000000000000bae09a7a393a8acded75aa67e46cb81f7acaa5ad94f9eacd103",
    "ver":1,
    "prev_block":"00000000000007d0f98d9edca880a6c124e25095712df8952e0439ac7409738a",
    "mrkl_root":"935aa0ed2e29a4b81e0c995c39e06995ecce7ddbebb26ed32d550a72e8200bf5",
    "time":1322131230,
    "bits":437129626,
    "nonce":2964215930,
    "n_tx":22,
    "size":9195,
    "block_index":818044,
    "main_chain":true,
    "height":154595,
    "received_time":1322131301,
    "relayed_by":"108.60.208.156",
    "tx":[--Array of Transactions--]
{

  • https://blockchain.info/rawtx/$tx_hash
  • You can also request the transaction to return in binary form (Hex encoded) using ?format=hex
{
    "hash":"b6f6991d03df0e2e04dafffcd6bc418aac66049e2cd74b80f14ac86db1e3f0da",
    "ver":1,
    "vin_sz":1,
    "vout_sz":2,
    "lock_time":"Unavailable",
    "size":258,
    "relayed_by":"64.179.201.80",
    "block_height, 12200,
    "tx_index":"12563028",
    "inputs":[


            {
                "prev_out":{
                    "hash":"a3e2bcc9a5f776112497a32b05f4b9e5b2405ed9",
                    "value":"100000000",
                    "tx_index":"12554260",
                    "n":"2"
                },
                "script":"76a914641ad5051edd97029a003fe9efb29359fcee409d88ac"
            }

        ],
    "out":[

                {
                    "value":"98000000",
                    "hash":"29d6a3540acfa0a950bef2bfdc75cd51c24390fd",
                    "script":"76a914641ad5051edd97029a003fe9efb29359fcee409d88ac"
                },

                {
                    "value":"2000000",
                    "hash":"17b5038a413f5c5ee288caa64cfab35a0c01914e",
                    "script":"76a914641ad5051edd97029a003fe9efb29359fcee409d88ac"
                }

        ]
}

  • https://blockchain.info/charts/$chart-type?format=json
{
    "values" : [
        {
            "x" : 1290602498, //Unix timestamp
            "y" : 1309696.2116000003
        }]
}

  • https://blockchain.info/block-height/$block_height?format=json
{
    "blocks" :
    [
        --Array Of Blocks at the specified height--
    ]
}

  • https://blockchain.info/rawaddr/$bitcoin_address
  • Address can be base58 or hash160
  • Optional limit parameter to show n transactions e.g. &limit=50 (Default: 50, Max: 50)
  • Optional offset parameter to skip the first n transactions e.g. &offset=100 (Page 2 for limit 50)
{
    "hash160":"660d4ef3a743e3e696ad990364e555c271ad504b",
    "address":"1AJbsFZ64EpEfS5UAjAfcUG8pH8Jn3rn1F",
    "n_tx":17,
    "n_unredeemed":2,
    "total_received":1031350000,
    "total_sent":931250000,
    "final_balance":100100000,
    "txs":[--Array of Transactions--]
}

  • https://blockchain.info/multiaddr?active=$address|$address
  • Multiple addresses divided by |
  • Address can be base58 or xpub
  • Optional limit parameter to show n transactions e.g. &limit=50 (Default: 50, Max: 100)
  • Optional offset parameter to skip the first n transactions e.g. &offset=100 (Page 2 for limit 50)
{
    "addresses":[

    {
        "hash160":"641ad5051edd97029a003fe9efb29359fcee409d",
        "address":"1A8JiWcwvpY7tAopUkSnGuEYHmzGYfZPiq",
        "n_tx":4,
        "total_received":1401000000,
        "total_sent":1000000,
        "final_balance":1400000000
    },

    {
        "hash160":"ddbeb8b1a5d54975ee5779cf64573081a89710e5",
        "address":"1MDUoxL1bGvMxhuoDYx6i11ePytECAk9QK",
        "n_tx":0,
        "total_received":0,
        "total_sent":0,
        "final_balance":0
    },

    "txs":[--Latest 50 Transactions--]

  • https://blockchain.info/unspent?active=$address
  • Multiple Addresses Allowed separated by "|"
  • Address can be base58 or xpub
  • Optional limit parameter to show n transactions e.g. &limit=50 (Default: 250, Max: 1000)
  • Optional confirmations parameter to limit the minimum confirmations e.g. &confirmations=6
The tx hash is in reverse byte order. What this means is that in order to get the html transaction hash from the JSON tx hash for the following transaction, you need to decode the hex (using this site for example). This will produce a binary output, which you need to reverse (the last 8bits/1byte move to the front, second to last 8bits/1byte needs to be moved to second, etc.). Then once the reversed bytes are decoded, you will get the html transaction hash.
{
    "unspent_outputs":[
        {
            "tx_age":"1322659106",
            "tx_hash":"e6452a2cb71aa864aaa959e647e7a4726a22e640560f199f79b56b5502114c37",
            "tx_index":"12790219",
            "tx_output_n":"0",
            "script":"76a914641ad5051edd97029a003fe9efb29359fcee409d88ac", (Hex encoded)
            "value":"5000661330"
        }
    ]
}

  • https://blockchain.info/balance?active=$address
  • Multiple Addresses Allowed separated by "|"
  • Address can be base58 or xpub
List the balance summary of each address listed.
{
    "1MDUoxL1bGvMxhuoDYx6i11ePytECAk9QK": {
        "final_balance": 0,
        "n_tx": 0,
        "total_received": 0
    },
    "15EW3AMRm2yP6LEF5YKKLYwvphy3DmMqN6": {
        "final_balance": 0,
        "n_tx": 2,
        "total_received": 310630609
    }
}

  • https://blockchain.info/latestblock
{
    "hash":"0000000000000538200a48202ca6340e983646ca088c7618ae82d68e0c76ef5a",
    "time":1325794737,
    "block_index":841841,
    "height":160778,
    "txIndexes":[13950369,13950510,13951472]
 }

  • https://blockchain.info/unconfirmed-transactions?format=json
{
    "txs":[--Array of Transactions--]
}

  • Blocks for one day: https://blockchain.info/blocks/$time_in_milliseconds?format=json
  • Blocks for specific pool: https://blockchain.info/blocks/$pool_name?format=json
{
    "blocks" : [
    {
        "height" : 166107,
        "hash" : "00000000000003823fa3667d833a354a437bdecf725f1358b17f949c991bfe0a",
        "time" : 1328830483
    },
    {
        "height" : 166104,
        "hash" : "00000000000008a34f292bfe3098b6eb40d9fd40db65d29dc0ee6fe5fa7d7995",
        "time" : 1328828041
    }]
}

Query API Plaintext query api to retreive data from blockchain.info

Some API calls are available with CORS headers if you add a &cors=true paramter to the GET request
Please limit your queries to a maximum of 1 every 10 seconds. All bitcoin values are in Satoshi i.e. divide by 100000000 to get the amount in BTC

Real-Time

  • getdifficulty - Current difficulty target as a decimal number
  • getblockcount - Current block height in the longest chain
  • latesthash - Hash of the latest block
  • bcperblock - Current block reward in BTC
  • totalbc - Total Bitcoins in circulation (delayed by up to 1 hour])
  • probability - Probability of finding a valid block each hash attempt
  • hashestowin - Average number of hash attempts needed to solve a block
  • nextretarget - Block height of the next difficulty retarget
  • avgtxsize - Average transaction size for the past 1000 blocks. Change the number of blocks by passing an integer as the second argument e.g. avgtxsize/2000
  • avgtxvalue - Average transaction value (1000 Default)
  • interval - average time between blocks in seconds
  • eta - estimated time until the next block (in seconds)
  • avgtxnumber - Average number of transactions per block (100 Default)

Address Lookups

To filter by x number of confirmations include the confirmations parameter
e.g. /q/addressbalance/1EzwoHtiXB4iFwedPr49iywjZn2nnekhoj?confirmations=6
to only include transactions with 6 or more confirmations. This is extremely important if you are processing valuable transactions.
  • getreceivedbyaddress/Address - Get the total number of bitcoins received by an address (in satoshi). Multiple addresses separated by | Do not use to process payments without the confirmations parameter
    Add the parameters start_time and end_time to restrict received by to a specific time period. Provided times should be a unix timestamp in milliseconds. Multiple addresses separated by |
  • getsentbyaddress/Address - Get the total number of bitcoins send by an address (in satoshi). Multiple addresses separated by | Do not use to process payments without the confirmations parameter
  • addressbalance/Address - Get the balance of an address (in satoshi). Multiple addresses separated by | Do not use to process payments without the confirmations parameter
  • addressfirstseen/Address - Timestamp of the block an address was first confirmed in.

Transaction Lookups

  • txtotalbtcoutput/TxHash - Get total output value of a transaction (in satoshi)
  • txtotalbtcinput/TxHash - Get total input value of a transaction (in satoshi)
  • txfee/TxHash - Get fee included in a transaction (in satoshi)
  • txresult/TxHash/Address - Calculate the result of a transaction sent or received to Address. Multiple addresses separated by |

Tools

  • addresstohash/Address - Converts a bitcoin address to a hash 160
  • hashtoaddress/Hash - Converts a hash 160 to a bitcoin address
  • hashpubkey/Pubkey - Converts a public key to a hash 160
  • addrpubkey/Pubkey - Converts a public key to an Address
  • pubkeyaddr/Address - Converts an address to public key (if available)

Misc

  • unconfirmedcount - Number of pending unconfirmed transactions
  • 24hrprice - 24 hour weighted price from the largest exchanges
  • marketcap - USD market cap (based on 24 hour weighted price)
  • 24hrtransactioncount - Number of transactions in the past 24 hours
  • 24hrbtcsent - Number of btc sent in the last 24 hours (in satoshi)
  • hashrate - Estimated network hash rate in gigahash
  • rejected - Lookup the reason why the provided tx or block hash was rejected (if any)

Cadena de bloques

Formación de una cadena de bloques. La cadena mayor (negra) consiste del serie de bloques más larga del bloque de génesis (verde) al bloque actual. Bloques huérfanos (púrpura) existen fuera de la cadena mayor
Una cadena de bloques, también conocida por las siglas BC (del inglés Blockchain)12345​ es una base de datos distribuida, formada por cadenas de bloques diseñadas para evitar su modificación una vez que un dato ha sido publicado usando un sellado de tiempo confiable y enlazando a un bloque anterior.6​ Por esta razón es especialmente adecuada para almacenar de forma creciente datos ordenados en el tiempo y sin posibilidad de modificación ni revisión. Este enfoque tiene diferentes aspectos:
  • Almacenamiento de datos.- Se logra mediante la replicación de la información de la cadena de bloques
  • Transmisión de datos.- Se logra mediante peer-to-peer
  • Confirmación de datos.- Se logra mediante un proceso de consenso entre los nodos participantes. El tipo de algoritmo más utilizado es el de prueba de trabajo en el que hay un proceso abierto competitivo y transparente de validación de las nuevas entradas llamada minería.
El concepto de cadena de bloque fue aplicado por primera vez en 2009 como parte de Bitcoin.
Los datos almacenados en la cadena de bloques normalmente suelen ser transacciones (Ej. financieras) por eso es frecuente llamar a los datos transacciones. Sin embargo no es necesario que lo sean. Realmente podríamos considerar que lo que se registran son cambios atómicos del estado del sistema. Por ejemplo una cadena de bloques puede ser usada para estampillar documentos y securizarlos frente a alteraciones.7

Aplicaciones[editar]

El concepto de cadena de bloques es usado en los siguientes campos:
  • En el campo de las criptomonedas la cadena de bloques se usa como notario público no modificable de todo el sistema de transacciones a fin de evitar el problema de que una moneda se pueda gastar dos veces. Por ejemplo es usada en BitcoinEthereumDogecoin y Litecoin, aunque cada una con sus particularidades .8
  • En el campo de las bases de datos de registro de nombres la cadena de bloques es usada para tener un sistema de notario de registro de nombres de tal forma que un nombre solo pueda ser utilizado para identificar el objeto que lo tiene efectivamente registrado. Es una alternativa al sistema tradicional de DNS. Por ejemplo es usada en Namecoin.
  • Uso como notario distribuido en distintos tipos de transacciones haciéndolas más seguras, baratas y rastreables. Por ejemplo se usa para sistemas de pago, transacciones bancarias (dificultando el lavado de dinero), envío de remesas, préstamos y en los sistemas de gestión de activos digitales puede ser usado con distintos propósitos.
  • Es utilizado como base de plataformas descentralizadas que permiten soportar la creación de acuerdos de contrato inteligente entre pares. El objetivo de estas plataformas es permitir a una red de pares administrar sus propios contratos inteligentes creados por los usuarios. Primero se escribe un contrato mediante un código y se sube a la cadena de bloques mediante una transacción. Una vez en la cadena de bloques el contrato tiene una dirección desde la cual se puede interactuar con él. Ejemplos de este tipo de plataformas son EthereumRipple y Eris

Clasificación[editar]

Según el acceso a los datos[editar]

Las cadenas de bloques se pueden clasificar basándose en el acceso a los datos almacenados en la misma:79
  • Cadena de bloques pública: Es aquella en la que no hay restricciones ni para leer los datos de la cadena de bloques (los cuales pueden haber sido cifrados) ni para enviar transacciones para que sean incluidas en la cadena de bloques. En ellas es fácil entrar y salir, son transparentes, están construidas con precacución para la operación en un entorno no confiable. Son ideales para uso en aplicaciones totalmente descentralizadas como por ejemplo para el Internet
  • Cadena de bloques privada: Es aquella en la que tanto los accesos a los datos de la cadena de bloque como el envío de transacciones para ser incluidas, están limitadas a una lista predefinida de entidades
Ambos tipos de cadenas deben ser considerados como casos extremos pudiendo haber casos intermedios.

Según los permisos[editar]

Las cadenas de bloques se pueden clasificar basándose en los permisos para generar bloques en la misma:7
  • Cadena de bloques sin permisos: Es aquella en la que no hay restricciones para que las entidades puedan procesar transacciones y crear bloques. Este tipo de cadenas de bloques necesitan tokens nativos para proveer incentivos que los usuarios mantengan el sistema. Ejemplos de tokens nativos son los nuevos bitcoins que se obtienen al construir un bloque y las comisiones de las transacciones. La cantidad recompensada por crear nuevos bloques es una buena medida de la seguridad de una cadena de bloques sin permisos.
  • Cadena de bloques con permisos: Es aquella en la que el procesamiento de transacciones está desarrollado por una predefinida lista de sujetos con identidades conocidas. Por ello generalmente no necesitan tokens nativos. Los tokens nativos son necesarios para proveer incentivos para los procesadores de transacciones. Por ello es típico que usen como protocolo de consenso prueba de participación

Posibles combinaciones de acceso y permisos[editar]

Las posibles combinaciones de ambos tipos de características son:9
  • Cadenas de bloques públicas sin permisos. Ejemplo Bitcoin. Como no es posible la existencia de cadenas de bloques privadas sin permisos, a estas también se las llama simplemente cadenas de bloques sin permisos.
  • Cadenas de bloques públicas con permisos. Por ejemplo las cadenas laterales federadas. Estas cadenas no puede tener ataques Sybil, por lo que en principio poseen un grado más alto de escalabilidad y flexibilidad frente a las públicas sin permisos.
  • Cadenas de bloques privadas con permisos.
Esta combinación es posible ya que hay distintas formas de acceder a los datos de la cadena:7
  • Leer las transacciones de la cadena de bloques, quizás con algunas restricciones (Ejemplo un usuario puede tener acceso solo a las transacciones en las que está involucrado directamente)
  • Proponer nuevas transacciones para la inclusión en la cadena de bloques.
  • Crear nuevos bloques de transacciones y añadirlo a la cadena de bloques.
La última forma de acceso está restringida para cierto conjunto limitado de entidades. Sin embargo las otras dos formas de acceso no tienen por qué estar restringidas. Por ejemplo una cadena de bloques para entidades financieras sería una cadena con permisos pero podría:7
  • Garantizar el acceso de lectura (quizá limitada) para transacciones y cabeceras de bloques para sus clientes con el objetivo de proveer una tecnológica, transparente y fiable forma de asegurar la seguridad de los depósitos de sus clientes.
  • Garantizar acceso de lectura completo a los reguladores para garantizar el necesario nivel de cumplimiento.
  • Proveer a todas las entidades con acceso a los datos de la cadena de bloques una descripción exhaustiva y rigurosa del protocolo, el cual debería contener explicaciones de todas las posibles interacciones con los datos de la cadena de bloques.

Según modelo de cambio de estado[editar]

Las cadenas de bloques también se pueden clasificar según el modelo de cambio de estado en la base de datos en:10
  • Basado en el gasto de salidas de transacciones, también llamado modelo UTXO (en referencia a los UTXO de Bitcoin): En ellas cada transacción gasta salidas de transacciones anteriores y produce nuevas salidas que serán consumidas en transacciones posteriores. A este tipo de cadenas de bloques pertenecen por ejemplo las de BitcoinR3BlockstreamBOSCoin y Qtum. Este enfoque tiene ventajas como:
    • En la propia estructura de la cadena existe una prueba de que nunca se puede gastar dos veces ya que cada transacción prueba que la suma de sus entradas es más grande que la suma de sus salidas.
    • Cada transacción puede ser procesada en paralelo porque son totalmente independientes y no hay conflictos en las salidas.
Sin embargo el problema de este tipo de cadenas es que solo son utilizables para aplicaciones donde cada salida es propiedad de uno y solo un individuo como por ejemplo es el caso de las monedas digitales. Una salida multipropietario sería muy lenta y no sería eficiente para aplicaciones de propósito general. Por ejemplo, supongamos un contrato inteligente que implementa un contador que puede ser incrementado. Imagina que hay algún incentivo económico para que cada nodo incremente en uno el contador, y que hay 1000 nodos activamente intentado incrementarlo. Usando este modelo de cadena de bloques tendríamos una salida con el valor del contador que sería solicitada por muchos nodos. Finalmente un nodo tendría éxito y produciría una transacción con una nueva salida con el contador incrementado en una unidad más. El resto de nodos estarían forzados a reintentar hasta que su transacción sea aceptada. Este sistema es muy lento e ineficiente. Esto es debido a que un cuando se realiza la transacción se bloquea la salida, se realiza una transformación y finalmente se produce la nueva salida. Esta claro que sería mucho más óptimo si se realizara todo de una sola vez y se produjera directamente el estado resultante. Además el problema puede estar no solo en el tiempo de las transacción si no también en el de proceso. Supongamos que el contador tiene adjunto un buffer de 1MB cuyo valor cambia de forma determinista cada vez que el contador cambia. Se tendría que procesar 1MB cada vez que realizara una transacción.
  • Basado en mensajes. En este caso, la cadena de bloques representa un consenso sobre el orden de los mensajes y el estado es derivado de forma determinísta a partir de estos mensajes. Este enfoque es utilizado por las cadenas de bloques de Steem y Bitshares. Por ejemplo para para implementar un contador cada usuario debería simplemente firmar un mensaje pidiendo el incremente en 1. No se necesita saber el estado actual del contador para que el mensaje sea válidos. En este modelo si 1000 nodos envían la petición al mismo tiempo, el productor del bloque podría agregar todas la peticiones en un bloque y en un solo paso el contador pasaría de valer de 0 a valer 1000. Una aplicación del mundo real que aprovecharía las cualidades de este modelo sería el siguiente:
Se emite una orden de compra de productos financieros indicando un precio máximo y un volumen concreto. A partir de ahí hay una competición sobre esa salida entre los participante que quieren la solicitud al mismo tiempo. Supongamos que se desea realizar la transacción de forma que sea lo más beneficiosa posible realizando una subasta a la baja para que la solicitud compre activos por el menor precio.10

Cadena lateral[editar]

Una cadena lateral, en inglés sidechain, es una cadena de bloques que valida datos desde otra cadena de bloques a la que se llama principal. Su utilidad principal es poder aportar funcionalidades nuevas, las cuales pueden estar en periodo de pruebas, apoyándose en la confianza ofrecida por la cadena de bloques principal.1112​ Las cadenas laterales funcionan de forma similar a como hacían las monedas tradicionales con el patrón oro.13
Un ejemplo de cadena de bloques que usa cadenas laterales es Lisk.14​ Debido a la popularidad de Bitcoin y la enorme fuerza de su red para dar confianza mediante su algoritmo de consenso por prueba de trabajo, se quiere aprovechar como cadena de bloques principal y construir cadenas laterales vinculadas que se apoyen en ella. Una cadena lateral vinculada es una cadena lateral cuyos activos pueden ser importados desde y hacia la otra cadena. Este tipo de cadenas se puede conseguir de las siguiente formas:12
  • Vinculación federada, en inglés federated peg. Una cadena lateral federada es una cadena lateral en la que el consenso es alcanzado cuando cierto número de partes están de acuerdo (confíanza semicentralizada). Por tanto tenemos que tener confianza en ciertas entidades. Este es el tipo de cadena lateral Liquid, de código cerrado, propuesta por Blockstream.15
  • Vinculación SPV, en inglés SPV peg donde SPV viene de Simplified Payment Verification. Usa pruebas SPV. Esencialmente una prueba SPV está compuesta de una lista de cabeceras de bloque que demuestran prueba de trabajo y una prueba criptográfica de que una salida fue creada en uno de los bloques de la lista. Esto permite a los verificadores chequea que cierta cantidad de trabajo ha sido realizada para la existencia de la salida. Tal prueba puede ser invalidada por otra prueba demostrando la existencia de una cadena con más trabajo la cual no ha incluido el bloque que creó la salida. Por tanto no se requiere confianza en terceras partes. Es la forma ideal. Para conseguirla sobre Bitcoin el algoritmo tiene que ser modificado y es difícil alcanzar el consenso para tal modificación. Por ello se usa con bitcoin vinculación federada como medida temporal

Aspectos jurídicos de Blockchain y Bitcoin[editar]

Para Javier González Granado el éxito de la cadena de bloques en la utilización del bitcoin ha permitido resolver dos grandes cuestiones:
  • 1.- Evitar el problema del doble gasto, es decir evita la falsificación y que una misma moneda pueda ser gastada dos veces.
  • 2.- Conseguir la descentralización de los pagos electrónicos ya que se garantiza la realización segura de pagos y cobros directos entre particulares por vía electrónica.
Además, la confianza es otra de las característica intrínseca del sistema. Desde el punto de vista jurídico el bitcoin sería un bien patrimonial, privado, incorporal, digital, en forma de unidad de cuenta, creado mediante un sistema informático y utilizado como medida común de valor por acuerdo de los usuarios del sistema. Es un bien mueble, fungible, identificable e irrepetible pero divisible. Pero no es dinero, no es dinero electrónico ni tiene valor mobiliario, se trataría de bienes patrimoniales que son tomados como medida común de valor en sistemas de intercambio económico, cerrados, cooperativos y descentralizados, ajenos al dinero fiduciario estatal, y basados en la confianza y acuerdo de los usuarios del sistema. Para González Granado el bitcoin sin regulación no se constituirá en una moneda de uso general como medio de pago. 1617
Blogger Widgets