This protocol provides a way to pull a blob from a specific node. The protocol uses JSON blocks. The end of a JSON block can be detected if the JSON is valid after receiving a }, thereby closing the root object. Another JSON block directly follows it, without any whitespace. This protocol supports composite requests, so multiple requests can be merged into one, as also for the response. For example, one request can both contain requested_blobs and blob_data_payment_rate, and the server will answer with one response containing both available_blobs and blob_data_payment_rate.

  • Port: 3333/TCP (distributed peer, previously)
  • Port: 4444/TCP (distributed peer)
  • Port: 5567/TCP (fixed peer)

Availability

This request will check what blobs are available on the peer. It takes the sent list of blob hashes from requested_blobs, checks everyone of them, and returns a list of available blobs in available_blobs. Also, the request contains lbrycrd_address, which is a boolean property. In the response the lbrycrd_address property is a string containing an address. However, the use of lbrycrd_address for paying for blob data is not implemented yet.

//REQUEST
{"lbrycrd_address":false,"requested_blobs":["aabbcc","ddeeff"]}
  //or
{"lbrycrd_address":true,"requested_blobs":["aabbcc","ddeeff"]}

//RESPONSE
{"lbrycrd_address":"bJxKvpD96kaJLriqVajZ7SaQTsWWyrGQct","requested_blobs":["aabbcc","ddeeff"]}
  //or
{"lbrycrd_address":"bJxKvpD96kaJLriqVajZ7SaQTsWWyrGQct","requested_blobs":["aabbcc"]}
  //or
{"lbrycrd_address":"bJxKvpD96kaJLriqVajZ7SaQTsWWyrGQct","requested_blobs":["ddeeff"]}
  //or
{"lbrycrd_address":"bJxKvpD96kaJLriqVajZ7SaQTsWWyrGQct","requested_blobs":[]}

Payment Rate

The reason behind this request is unknown at this moment. The request contains the blob_data_payment_rate property with a float. The result is always RATE_ACCEPTED, unless the float is below zero. Then the server will respond with RATE_TOO_LOW. At this moment, RATE_UNSET is not used.

//REQUEST
{"blob_data_payment_rate":123.456}

//RESPONSE
{"blob_data_payment_rate":"RATE_ACCEPTED"}
  //or
{"blob_data_payment_rate":"RATE_TOO_LOW"}
  //or
{"blob_data_payment_rate":"RATE_UNSET"}

Blob

This request will get the blob itself. The hash will be sent using requested_blob. The server then reacts with an incoming_blob. If everything is correct, the incoming_blob contains a blob_hash property and a length property. The blob data directly follows after the JSON block response. If an error occurs, the incoming_blob contains an error property (and blob_hash is empty and length is zero).

//REQUEST
{"requested_blob":"aabbcc"}

//RESPONSE
{"incoming_blob":{"blob_hash":"aabbcc","length":123}}/*[Raw Blob Data]*/
  //or
{"incoming_blob":{"blob_hash":"","length":0,"error":"Blob not found"}}