comments. remove async packet parsing.
This commit is contained in:
parent
c781b0c297
commit
f647de9a32
@ -180,19 +180,6 @@ Bitcoin.prototype.start = function(options, callback) {
|
|||||||
setInterval(function() {
|
setInterval(function() {
|
||||||
var packets = bitcoindjs.hookPackets();
|
var packets = bitcoindjs.hookPackets();
|
||||||
|
|
||||||
// bitcoindjs.hookPackets(function(err, packets) {
|
|
||||||
// if (err || !packets) {
|
|
||||||
// if (self.debug) {
|
|
||||||
// self.error('Error polling packet queue.');
|
|
||||||
// }
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// if (!packets.length) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// ;
|
|
||||||
// });
|
|
||||||
|
|
||||||
if (!packets) {
|
if (!packets) {
|
||||||
if (self.debug) {
|
if (self.debug) {
|
||||||
self.error('Error polling packet queue.');
|
self.error('Error polling packet queue.');
|
||||||
|
|||||||
@ -228,6 +228,7 @@ extern std::string DecodeDumpString(const std::string &str);
|
|||||||
using namespace node;
|
using namespace node;
|
||||||
using namespace v8;
|
using namespace v8;
|
||||||
|
|
||||||
|
// Need this because account names can be an empty string.
|
||||||
#define EMPTY ("\\x01")
|
#define EMPTY ("\\x01")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -392,14 +393,6 @@ jsblock_to_cblock(const Local<Object> jsblock, CBlock& cblock);
|
|||||||
static inline void
|
static inline void
|
||||||
jstx_to_ctx(const Local<Object> jstx, CTransaction& ctx);
|
jstx_to_ctx(const Local<Object> jstx, CTransaction& ctx);
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
async_hook_packets(uv_work_t *req);
|
|
||||||
|
|
||||||
static void
|
|
||||||
async_hook_packets_after(uv_work_t *req);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hook_packets(void);
|
hook_packets(void);
|
||||||
|
|
||||||
@ -589,64 +582,6 @@ struct async_dump_wallet_data {
|
|||||||
Persistent<Function> callback;
|
Persistent<Function> callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* async_hook_packets_data
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
struct async_hook_packets_data {
|
|
||||||
std::string err_msg;
|
|
||||||
Persistent<Function> callback;
|
|
||||||
// NOTE: Could use a union here
|
|
||||||
std::string strCommand;
|
|
||||||
std::string name;
|
|
||||||
int64_t received;
|
|
||||||
int64_t /*?*/ peerId;
|
|
||||||
std::string userAgent;
|
|
||||||
int64_t /*?*/ receiveVersion;
|
|
||||||
int64_t /*?*/ version;
|
|
||||||
int64_t /*?*/ height;
|
|
||||||
std::string us;
|
|
||||||
std::string address;
|
|
||||||
bool relay;
|
|
||||||
std::string services;
|
|
||||||
int64_t /*?*/ time;
|
|
||||||
int64_t /*?*/ last;
|
|
||||||
std::string ip;
|
|
||||||
int64_t /*?*/ port;
|
|
||||||
bool reachable;
|
|
||||||
packet_addresses_list addresses;
|
|
||||||
bool have;
|
|
||||||
std::string hash;
|
|
||||||
std::string type;
|
|
||||||
bool filtered;
|
|
||||||
packet_items_list items;
|
|
||||||
int64_t /*?*/ size;
|
|
||||||
std::string first;
|
|
||||||
int64_t /*?*/ fromHeight;
|
|
||||||
std::string toHash;
|
|
||||||
int64_t /*?*/ limit;
|
|
||||||
CTransaction tx;
|
|
||||||
CBlock block;
|
|
||||||
std::string nonce;
|
|
||||||
std::string expected;
|
|
||||||
int64_t /*?*/ bytes;
|
|
||||||
std::string problem;
|
|
||||||
bool finished;
|
|
||||||
std::string message;
|
|
||||||
std::string signature;
|
|
||||||
bool misbehaving;
|
|
||||||
std::string data;
|
|
||||||
bool full;
|
|
||||||
bool empty;
|
|
||||||
int64_t /*?*/ hashFuncs;
|
|
||||||
int64_t /*?*/ tweaks;
|
|
||||||
int64_t /*?*/ flags;
|
|
||||||
bool unknown;
|
|
||||||
bool connected;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read Raw DB
|
* Read Raw DB
|
||||||
*/
|
*/
|
||||||
@ -2815,518 +2750,9 @@ NAN_METHOD(HookPackets) {
|
|||||||
|
|
||||||
poll_packets_mutex.unlock();
|
poll_packets_mutex.unlock();
|
||||||
|
|
||||||
#if 0
|
|
||||||
Local<Function> callback = Local<Function>::Cast(args[0]);
|
|
||||||
async_hook_packets_data *data = new async_hook_packets_data();
|
|
||||||
data->err_msg = std::string("");
|
|
||||||
data->callback = Persistent<Function>::New(callback);
|
|
||||||
|
|
||||||
uv_work_t *req = new uv_work_t();
|
|
||||||
req->data = data;
|
|
||||||
|
|
||||||
int status = uv_queue_work(uv_default_loop(),
|
|
||||||
req, async_hook_packets,
|
|
||||||
(uv_after_work_cb)async_hook_packets_after);
|
|
||||||
|
|
||||||
assert(status == 0);
|
|
||||||
|
|
||||||
NanReturnValue(Undefined());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NanReturnValue(obj);
|
NanReturnValue(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
async_hook_packets(uv_work_t *req) {
|
|
||||||
async_hook_packets_data* data = static_cast<async_hook_packets_data*>(req->data);
|
|
||||||
|
|
||||||
|
|
||||||
Local<Array> obj = NanNew<Array>();
|
|
||||||
poll_packets_list *cur = NULL;
|
|
||||||
poll_packets_list *next = NULL;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
poll_packets_mutex.lock();
|
|
||||||
|
|
||||||
for (cur = packets_queue_head; cur; cur = next) {
|
|
||||||
CNode *pfrom = cur->pfrom;
|
|
||||||
std::string strCommand(cur->strCommand);
|
|
||||||
CDataStream vRecv = *cur->vRecv;
|
|
||||||
int64_t nTimeReceived = cur->nTimeReceived;
|
|
||||||
|
|
||||||
async_hook_packets_data *pdata = new async_hook_packets_data();
|
|
||||||
|
|
||||||
pdata->strCommand = strCommand;
|
|
||||||
pdata->name = strCommand;
|
|
||||||
pdata->received = (int64_t)nTimeReceived;
|
|
||||||
pdata->peerId = pfrom->id;
|
|
||||||
//pdata->peerId = pfrom->GetId();
|
|
||||||
pdata->userAgent = pfrom->cleanSubVer;
|
|
||||||
|
|
||||||
if (strCommand == "version") {
|
|
||||||
// Each connection can only send one version message
|
|
||||||
if (pfrom->nVersion != 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool fRelayTxes = false;
|
|
||||||
int nStartingHeight = 0;
|
|
||||||
int cleanSubVer = 0;
|
|
||||||
//std::string strSubVer(strdup(pfrom->strSubVer.c_str()));
|
|
||||||
std::string strSubVer = pfrom->strSubVer;
|
|
||||||
int nVersion = pfrom->nVersion;
|
|
||||||
uint64_t nServices = pfrom->nServices;
|
|
||||||
|
|
||||||
int64_t nTime;
|
|
||||||
CAddress addrMe;
|
|
||||||
CAddress addrFrom;
|
|
||||||
uint64_t nNonce = 1;
|
|
||||||
vRecv >> nVersion >> nServices >> nTime >> addrMe;
|
|
||||||
if (pfrom->nVersion < MIN_PEER_PROTO_VERSION) {
|
|
||||||
// disconnect from peers older than this proto version
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nVersion == 10300) {
|
|
||||||
nVersion = 300;
|
|
||||||
}
|
|
||||||
if (!vRecv.empty()) {
|
|
||||||
vRecv >> addrFrom >> nNonce;
|
|
||||||
}
|
|
||||||
if (!vRecv.empty()) {
|
|
||||||
vRecv >> LIMITED_STRING(strSubVer, 256);
|
|
||||||
//cleanSubVer = SanitizeString(strSubVer);
|
|
||||||
cleanSubVer = atoi(strSubVer.c_str());
|
|
||||||
}
|
|
||||||
if (!vRecv.empty()) {
|
|
||||||
vRecv >> nStartingHeight;
|
|
||||||
}
|
|
||||||
if (!vRecv.empty()) {
|
|
||||||
fRelayTxes = false;
|
|
||||||
} else {
|
|
||||||
fRelayTxes = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disconnect if we connected to ourself
|
|
||||||
if (nNonce == nLocalHostNonce && nNonce > 1) {
|
|
||||||
// XXX set pdata here
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdata->receiveVersion = cleanSubVer;
|
|
||||||
pdata->version = nVersion;
|
|
||||||
pdata->height = nStartingHeight;
|
|
||||||
pdata->us = addrMe.ToString();
|
|
||||||
pdata->address = pfrom->addr.ToString();
|
|
||||||
pdata->relay = fRelayTxes;
|
|
||||||
} else if (pfrom->nVersion == 0) {
|
|
||||||
// Must have a version message before anything else
|
|
||||||
return;
|
|
||||||
} else if (strCommand == "verack") {
|
|
||||||
pdata->receiveVersion = min(pfrom->nVersion, PROTOCOL_VERSION);
|
|
||||||
} else if (strCommand == "addr") {
|
|
||||||
vector<CAddress> vAddr;
|
|
||||||
vRecv >> vAddr;
|
|
||||||
|
|
||||||
// Don't want addr from older versions unless seeding
|
|
||||||
if (pfrom->nVersion < CADDR_TIME_VERSION && addrman.size() > 1000) {
|
|
||||||
// XXX set pdata here
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bad address size
|
|
||||||
if (vAddr.size() > 1000) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// XXX create linked list
|
|
||||||
Local<Array> array = NanNew<Array>();
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
// Get the new addresses
|
|
||||||
int64_t nNow = GetAdjustedTime();
|
|
||||||
BOOST_FOREACH(CAddress& addr, vAddr) {
|
|
||||||
boost::this_thread::interruption_point();
|
|
||||||
|
|
||||||
unsigned int nTime = addr.nTime;
|
|
||||||
if (nTime <= 100000000 || nTime > nNow + 10 * 60) {
|
|
||||||
nTime = nNow - 5 * 24 * 60 * 60;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool fReachable = IsReachable(addr);
|
|
||||||
|
|
||||||
Local<Object> obj = NanNew<Object>();
|
|
||||||
|
|
||||||
char nServices[21] = {0};
|
|
||||||
int written = snprintf(nServices, sizeof(nServices), "%020lu", (uint64_t)addr.nServices);
|
|
||||||
assert(written == 20);
|
|
||||||
|
|
||||||
obj->services = (char *)nServices;
|
|
||||||
obj->time = (unsigned int)nTime;
|
|
||||||
obj->last = (int64_t)addr.nLastTry;
|
|
||||||
obj->ip = (std::string)addr.ToStringIP();
|
|
||||||
obj->port = (unsigned short)addr.GetPort();
|
|
||||||
obj->address = (std::string)addr.ToStringIPPort();
|
|
||||||
obj->reachable = (bool)fReachable;
|
|
||||||
|
|
||||||
array->Set(i, obj);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdata->addresses = array;
|
|
||||||
} else if (strCommand == "inv") {
|
|
||||||
vector<CInv> vInv;
|
|
||||||
vRecv >> vInv;
|
|
||||||
|
|
||||||
// Bad size
|
|
||||||
if (vInv.size() > MAX_INV_SZ) {
|
|
||||||
NanReturnValue(Undefined());
|
|
||||||
}
|
|
||||||
|
|
||||||
LOCK(cs_main);
|
|
||||||
|
|
||||||
// XXX create linked list
|
|
||||||
Local<Array> array = NanNew<Array>();
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
for (unsigned int nInv = 0; nInv < vInv.size(); nInv++) {
|
|
||||||
const CInv &inv = vInv[nInv];
|
|
||||||
|
|
||||||
boost::this_thread::interruption_point();
|
|
||||||
|
|
||||||
//bool fAlreadyHave = AlreadyHave(inv);
|
|
||||||
|
|
||||||
// Bad size
|
|
||||||
if (pfrom->nSendSize > (SendBufferSize() * 2)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// XXX create linked list item
|
|
||||||
Local<Object> item = NanNew<Object>();
|
|
||||||
|
|
||||||
//item->have = fAlreadyHave;
|
|
||||||
item->hash = inv.hash.GetHex();
|
|
||||||
item->type = inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK
|
|
||||||
? "block"
|
|
||||||
: "tx";
|
|
||||||
|
|
||||||
if (inv.type == MSG_FILTERED_BLOCK) {
|
|
||||||
item->filtered = true;
|
|
||||||
} else if (inv.type == MSG_BLOCK) {
|
|
||||||
item->filtered = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
array->Set(i, item);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdata->items = array;
|
|
||||||
} else if (strCommand == "getdata") {
|
|
||||||
vector<CInv> vInv;
|
|
||||||
vRecv >> vInv;
|
|
||||||
|
|
||||||
// Bad size
|
|
||||||
if (vInv.size() > MAX_INV_SZ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdata->size = vInv.size();
|
|
||||||
if (vInv.size() > 0) {
|
|
||||||
pdata->first = vInv[0].ToString();
|
|
||||||
}
|
|
||||||
} else if (strCommand == "getblocks") {
|
|
||||||
CBlockLocator locator;
|
|
||||||
uint256 hashStop;
|
|
||||||
vRecv >> locator >> hashStop;
|
|
||||||
|
|
||||||
LOCK(cs_main);
|
|
||||||
|
|
||||||
// Find the last block the caller has in the main chain
|
|
||||||
CBlockIndex* pindex = FindForkInGlobalIndex(chainActive, locator);
|
|
||||||
|
|
||||||
// Send the rest of the chain
|
|
||||||
if (pindex) {
|
|
||||||
pindex = chainActive.Next(pindex);
|
|
||||||
}
|
|
||||||
|
|
||||||
pdata->fromHeight = pindex ? pindex->nHeight : -1;
|
|
||||||
pdata->toHash = hashStop == uint256(0) ? "end" : hashStop.GetHex();
|
|
||||||
pdata->limit = 500;
|
|
||||||
} else if (strCommand == "getheaders") {
|
|
||||||
CBlockLocator locator;
|
|
||||||
uint256 hashStop;
|
|
||||||
vRecv >> locator >> hashStop;
|
|
||||||
|
|
||||||
LOCK(cs_main);
|
|
||||||
|
|
||||||
CBlockIndex* pindex = NULL;
|
|
||||||
if (locator.IsNull()) {
|
|
||||||
// If locator is null, return the hashStop block
|
|
||||||
BlockMap::iterator mi = mapBlockIndex.find(hashStop);
|
|
||||||
if (mi == mapBlockIndex.end()) {
|
|
||||||
// XXX set pdata here
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pindex = (*mi).second;
|
|
||||||
} else {
|
|
||||||
// Find the last block the caller has in the main chain
|
|
||||||
pindex = FindForkInGlobalIndex(chainActive, locator);
|
|
||||||
if (pindex) {
|
|
||||||
pindex = chainActive.Next(pindex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pdata->fromHeight = pindex ? pindex->nHeight : -1;
|
|
||||||
pdata->toHash = hashStop.GetHex();
|
|
||||||
} else if (strCommand == "tx") {
|
|
||||||
// XXX May be able to do prev_list asynchronously
|
|
||||||
// XXX Potentially check for "reject" in original code
|
|
||||||
pdata->tx = tx;
|
|
||||||
} else if (strCommand == "block" && !fImporting && !fReindex) {
|
|
||||||
// XXX May be able to do prev_list asynchronously
|
|
||||||
pdata->block = block;
|
|
||||||
} else if (strCommand == "getaddr") {
|
|
||||||
; // not much other information in getaddr as long as we know we got a getaddr
|
|
||||||
} else if (strCommand == "mempool") {
|
|
||||||
; // not much other information in getaddr as long as we know we got a getaddr
|
|
||||||
} else if (strCommand == "ping") {
|
|
||||||
if (pfrom->nVersion > BIP0031_VERSION) {
|
|
||||||
uint64_t nonce = 0;
|
|
||||||
vRecv >> nonce;
|
|
||||||
char sNonce[21] = {0};
|
|
||||||
int written = snprintf(sNonce, sizeof(sNonce), "%020lu", (uint64_t)nonce);
|
|
||||||
assert(written == 20);
|
|
||||||
pdata->nonce = sNonce;
|
|
||||||
} else {
|
|
||||||
char sNonce[21] = {0};
|
|
||||||
int written = snprintf(sNonce, sizeof(sNonce), "%020lu", (uint64_t)0);
|
|
||||||
assert(written == 20);
|
|
||||||
pdata->none = sNonce;
|
|
||||||
}
|
|
||||||
} else if (strCommand == "pong") {
|
|
||||||
int64_t pingUsecEnd = nTimeReceived;
|
|
||||||
uint64_t nonce = 0;
|
|
||||||
size_t nAvail = vRecv.in_avail();
|
|
||||||
bool bPingFinished = false;
|
|
||||||
std::string sProblem;
|
|
||||||
|
|
||||||
if (nAvail >= sizeof(nonce)) {
|
|
||||||
vRecv >> nonce;
|
|
||||||
|
|
||||||
// Only process pong message if there is an outstanding ping (old ping without nonce should never pong)
|
|
||||||
if (pfrom->nPingNonceSent != 0) {
|
|
||||||
if (nonce == pfrom->nPingNonceSent) {
|
|
||||||
// Matching pong received, this ping is no longer outstanding
|
|
||||||
bPingFinished = true;
|
|
||||||
int64_t pingUsecTime = pingUsecEnd - pfrom->nPingUsecStart;
|
|
||||||
if (pingUsecTime > 0) {
|
|
||||||
// Successful ping time measurement, replace previous
|
|
||||||
;
|
|
||||||
} else {
|
|
||||||
// This should never happen
|
|
||||||
sProblem = "Timing mishap";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Nonce mismatches are normal when pings are overlapping
|
|
||||||
sProblem = "Nonce mismatch";
|
|
||||||
if (nonce == 0) {
|
|
||||||
// This is most likely a bug in another implementation somewhere, cancel this ping
|
|
||||||
bPingFinished = true;
|
|
||||||
sProblem = "Nonce zero";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sProblem = "Unsolicited pong without ping";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// This is most likely a bug in another implementation somewhere, cancel this ping
|
|
||||||
bPingFinished = true;
|
|
||||||
sProblem = "Short payload";
|
|
||||||
}
|
|
||||||
|
|
||||||
char sNonce[21] = {0};
|
|
||||||
int written = snprintf(sNonce, sizeof(sNonce), "%020lu", (uint64_t)nonce);
|
|
||||||
assert(written == 20);
|
|
||||||
|
|
||||||
char sPingNonceSent[21] = {0};
|
|
||||||
written = snprintf(sPingNonceSent, sizeof(sPingNonceSent), "%020lu", (uint64_t)pfrom->nPingNonceSent);
|
|
||||||
assert(written == 20);
|
|
||||||
|
|
||||||
pdata->expected = sPingNonceSent;
|
|
||||||
pdata->received = sNonce;
|
|
||||||
pdata->bytes = (unsigned int)nAvail;
|
|
||||||
|
|
||||||
if (!(sProblem.empty())) {
|
|
||||||
pdata->problem = sProblem;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bPingFinished) {
|
|
||||||
pdata->finished = true;
|
|
||||||
} else {
|
|
||||||
pdata->finished = false;
|
|
||||||
}
|
|
||||||
} else if (strCommand == "alert") {
|
|
||||||
CAlert alert;
|
|
||||||
vRecv >> alert;
|
|
||||||
|
|
||||||
uint256 alertHash = alert.GetHash();
|
|
||||||
|
|
||||||
pdata->hash = alertHash.GetHex();
|
|
||||||
|
|
||||||
if (pfrom->setKnown.count(alertHash) == 0) {
|
|
||||||
if (alert.ProcessAlert()) {
|
|
||||||
std::string vchMsg(alert.vchMsg.begin(), alert.vchMsg.end());
|
|
||||||
std::string vchSig(alert.vchSig.begin(), alert.vchSig.end());
|
|
||||||
pdata->message = vchMsg;
|
|
||||||
pdata->signature = vchSig;
|
|
||||||
pdata->misbehaving = false;
|
|
||||||
} else {
|
|
||||||
// Small DoS penalty so peers that send us lots of
|
|
||||||
// duplicate/expired/invalid-signature/whatever alerts
|
|
||||||
// eventually get banned.
|
|
||||||
// This isn't a Misbehaving(100) (immediate ban) because the
|
|
||||||
// peer might be an older or different implementation with
|
|
||||||
// a different signature key, etc.
|
|
||||||
pdata->misbehaving = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (strCommand == "filterload") {
|
|
||||||
CBloomFilter filter;
|
|
||||||
vRecv >> filter;
|
|
||||||
|
|
||||||
if (!filter.IsWithinSizeConstraints()) {
|
|
||||||
// There is no excuse for sending a too-large filter
|
|
||||||
pdata->misbehaving = true;
|
|
||||||
} else {
|
|
||||||
LOCK(pfrom->cs_filter);
|
|
||||||
filter.UpdateEmptyFull();
|
|
||||||
|
|
||||||
//std::string svData(filter.vData.begin(), filter.vData.end());
|
|
||||||
//char *cvData = svData.c_str();
|
|
||||||
//int vDataHexLen = sizeof(char) * (strlen(cvData) * 2) + 1;
|
|
||||||
//char *vDataHex = (char *)malloc(vDataHexLen);
|
|
||||||
//int written = snprintf(vDataHex, vDataHexLen, "%x", cvData);
|
|
||||||
//uint64_t dataHex;
|
|
||||||
//sscanf(cvData, "%x", &dataHex);
|
|
||||||
//// assert(written == vDataHexLen);
|
|
||||||
//vDataHex[written] = '\0';
|
|
||||||
|
|
||||||
//pdata->data = vDataHex;
|
|
||||||
////free(vDataHex);
|
|
||||||
//pdata->full = filter.isFull;
|
|
||||||
//pdata->empty = filter.isEmpty;
|
|
||||||
//pdata->hashFuncs = filter.nHashFuncs;
|
|
||||||
//pdata->tweaks = filter.nTweak;
|
|
||||||
//pdata->flags = filter.nFlags;
|
|
||||||
pdata->misbehaving = false;
|
|
||||||
}
|
|
||||||
} else if (strCommand == "filteradd") {
|
|
||||||
vector<unsigned char> vData;
|
|
||||||
vRecv >> vData;
|
|
||||||
|
|
||||||
// Nodes must NEVER send a data item > 520 bytes (the max size for a script data object,
|
|
||||||
// and thus, the maximum size any matched object can have) in a filteradd message
|
|
||||||
if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) {
|
|
||||||
pdata->misbehaving = true;
|
|
||||||
} else {
|
|
||||||
LOCK(pfrom->cs_filter);
|
|
||||||
if (pfrom->pfilter) {
|
|
||||||
//std::string svData(vData.begin(), vData.end());
|
|
||||||
//char *cvData = svData.c_str();
|
|
||||||
//int vDataHexLen = sizeof(char) * (strlen(cvData) * 2) + 1;
|
|
||||||
//char *vDataHex = (char *)malloc(vDataHexLen);
|
|
||||||
//int written = snprintf(vDataHex, vDataHexLen, "%x", cvData);
|
|
||||||
//uint64_t dataHex;
|
|
||||||
//sscanf(cvData, "%x", &dataHex);
|
|
||||||
//// assert(written == vDataHexLen);
|
|
||||||
//vDataHex[written] = '\0';
|
|
||||||
|
|
||||||
//pdata->data = vDataHex;
|
|
||||||
////free(vDataHex);
|
|
||||||
pdata->misbehaving = false;
|
|
||||||
} else {
|
|
||||||
pdata->misbehaving = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (strCommand == "filterclear") {
|
|
||||||
; // nothing much to grab from this packet
|
|
||||||
} else if (strCommand == "reject") {
|
|
||||||
; // nothing much to grab from this packet
|
|
||||||
} else {
|
|
||||||
pdata->unknown = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the last seen time for this node's address
|
|
||||||
if (pfrom->fNetworkNode) {
|
|
||||||
if (strCommand == "version"
|
|
||||||
|| strCommand == "addr"
|
|
||||||
|| strCommand == "inv"
|
|
||||||
|| strCommand == "getdata"
|
|
||||||
|| strCommand == "ping") {
|
|
||||||
pdata->connected = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
obj->Set(i, o);
|
|
||||||
i++;
|
|
||||||
|
|
||||||
if (cur == packets_queue_head) {
|
|
||||||
packets_queue_head = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cur == packets_queue_tail) {
|
|
||||||
packets_queue_tail = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
next = cur->next;
|
|
||||||
// delete cur->pfrom; // cleaned up on disconnect
|
|
||||||
free(cur->strCommand);
|
|
||||||
delete cur->vRecv;
|
|
||||||
free(cur);
|
|
||||||
}
|
|
||||||
|
|
||||||
poll_packets_mutex.unlock();
|
|
||||||
|
|
||||||
// XXX set pdata here
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
async_hook_packets_after(uv_work_t *req) {
|
|
||||||
NanScope();
|
|
||||||
async_hook_packets_data* data = static_cast<async_hook_packets_data*>(req->data);
|
|
||||||
|
|
||||||
if (data->err_msg != "") {
|
|
||||||
Local<Value> err = Exception::Error(NanNew<String>(data->err_msg));
|
|
||||||
const unsigned argc = 1;
|
|
||||||
Local<Value> argv[argc] = { err };
|
|
||||||
TryCatch try_catch;
|
|
||||||
data->callback->Call(Context::GetCurrent()->Global(), argc, argv);
|
|
||||||
if (try_catch.HasCaught()) {
|
|
||||||
node::FatalException(try_catch);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Local<Array> packets = NanNew<Array>();
|
|
||||||
const unsigned argc = 2;
|
|
||||||
Local<Value> argv[argc] = {
|
|
||||||
Local<Value>::New(Null()),
|
|
||||||
Local<Value>::New(packets)
|
|
||||||
};
|
|
||||||
TryCatch try_catch;
|
|
||||||
data->callback->Call(Context::GetCurrent()->Global(), argc, argv);
|
|
||||||
if (try_catch.HasCaught()) {
|
|
||||||
node::FatalException(try_catch);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data->callback.Dispose();
|
|
||||||
|
|
||||||
delete data;
|
|
||||||
delete req;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hook_packets(void) {
|
hook_packets(void) {
|
||||||
CNodeSignals& nodeSignals = GetNodeSignals();
|
CNodeSignals& nodeSignals = GetNodeSignals();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user