blockchain-link
Version:
Link - The Blockchain File Sharing Protocol
157 lines (136 loc) • 5.25 kB
JavaScript
// 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);