UNPKG

blockchain-link

Version:

Link - The Blockchain File Sharing Protocol

157 lines (136 loc) 5.25 kB
// Generated by CoffeeScript 1.6.3 (function() { var LinkSequenceDecoder, ThreadBarrier, WritableBufferStream, bytesToHex, dbMap, decodeBase58, decodeTx, decoder, getDB, getLatest, hashBuffer, levelup, nextBlock, queryDB, startBuffer, startBufferStream; levelup = require('levelup'); ThreadBarrier = require('./concurrent').ThreadBarrier; decodeBase58 = require('./link').decodeBase58; bytesToHex = require('./link').bytesToHex; hashBuffer = require('./link').hashBuffer; WritableBufferStream = require('buffertools').WritableBufferStream; LinkSequenceDecoder = require("./link").LinkSequenceDecoder; startBufferStream = new WritableBufferStream(); startBufferStream.write("Link"); startBuffer = startBufferStream.getBuffer(); decoder = new LinkSequenceDecoder; decodeTx = function(tx, db) { var address, decoded, error, errors, id, spend, spends, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; spends = []; _ref = tx.vout; for (_i = 0, _len = _ref.length; _i < _len; _i++) { spend = _ref[_i]; if (spend.value === 1e-8) { _ref1 = spend.scriptPubKey.addresses; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { address = _ref1[_j]; spends.push(address); } } } decoded = decoder.decode(spends); errors = decoder.verify(decoded); if (errors.length > 0) { for (_k = 0, _len2 = errors.length; _k < _len2; _k++) { error = errors[_k]; console.log(error); } return; } id = hashBuffer("sha256", new Buffer(JSON.stringify(decoded))).toString("hex"); return db.put(id, decoded); }; nextBlock = function(blockIndex, db, client, callback) { if (blockIndex % 1000 === 0) { console.log("Still indexing: " + blockIndex); } return client.getBlockHash(blockIndex, function(error, hash) { return client.getBlock(hash, function(error, block) { if (error != null) { return callback(blockIndex); } if ((block != null ? block.tx : void 0) != null) { return (function(blockIndex) { var tb, tx, _i, _len, _ref, _results; tb = new ThreadBarrier(block.tx.length, function() { return nextBlock(blockIndex + 1, db, client, callback); }); _ref = block.tx; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { tx = _ref[_i]; _results.push(client.getRawTransaction(tx, function(err, raw) { client.decodeRawTransaction(raw, function(error, tx) { var address, b, data, linkStart, vout, _j, _len1, _ref1, _ref2, _results1; _ref1 = tx.vout; _results1 = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { vout = _ref1[_j]; if (((_ref2 = vout.scriptPubKey) != null ? _ref2.addresses : void 0) != null) { _results1.push((function() { var _k, _len2, _ref3, _results2; _ref3 = vout.scriptPubKey.addresses; _results2 = []; for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) { address = _ref3[_k]; data = bytesToHex(decodeBase58(address)); linkStart = data.substring(2, 10); b = new Buffer(linkStart, "hex"); if (b.compare(startBuffer) === 0) { decodeTx(tx, db); continue; } else { _results2.push(void 0); } } return _results2; })()); } else { _results1.push(void 0); } } return _results1; }); return tb.join(); })); } return _results; })(blockIndex); } else { return nextBlock(blockIndex + 1, db, client, callback); } }); }); }; getLatest = function(db, client) { return db.get("lastBlock", function(err, lastBlock) { if (err) { lastBlock = 128100; } console.log("Starting indexing: " + lastBlock); return nextBlock(lastBlock, db, client, function(lastBlock) { db.put("lastBlock", lastBlock); console.log("Finished indexing: " + lastBlock); return setTimeout(function() { return getLatest(db, client); }, 60000); }); }); }; dbMap = {}; getDB = function(name, client) { var db; if (dbMap[name] != null) { return dbMap[name]; } db = levelup("LinkDB-" + name, { valueEncoding: 'json' }); require("./search").search(db); getLatest(db, client); return dbMap[name] = db; }; queryDB = function(name, client, keywords, callback) { return getDB(name, client).search(keywords, callback); }; exports.getDB = getDB; exports.queryDB = queryDB; }).call(this);