diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index bef961b4..c1e8b439 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -3457,11 +3457,58 @@ NAN_METHOD(HookPackets) { o->Set(NanNew("relay"), NanNew(fRelayTxes)); #endif } else if (cur->pfrom->nVersion == 0) { - ; + // Must have a version message before anything else + return false; } else if (strCommand == "verack") { - ; + o->Set(NanNew("receiveVersion"), NanNew(min(pfrom->nVersion, PROTOCOL_VERSION))); } else if (strCommand == "addr") { - ; + vector vAddr; + cur->vRecv >> vAddr; + + // Don't want addr from older versions unless seeding + if (cur->pfrom->nVersion < CADDR_TIME_VERSION && addrman.size() > 1000) { + return true; + } + + // Bad address size + if (vAddr.size() > 1000) { + return false; // ? + } + + Local array = NanNew(); + 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 obj = NanNew(); + + char nServices[21] = {0}; + int written = snprintf(nServices, sizeof(nServices), "%020lu", (uint64_t)addr.nServices); + assert(written == 20); + + obj->Set(NanNew("services"), NanNew((char *)nServices)); + obj->Set(NanNew("time"), NanNew((unsigned int)nTime)->ToUint32()); + obj->Set(NanNew("last"), NanNew((int64_t)addr.nLastTry)); + obj->Set(NanNew("ip"), NanNew((std::string)addr.ToStringIP())); + obj->Set(NanNew("port"), NanNew((unsigned short)addr.GetPort())->ToUint32()); + obj->Set(NanNew("address"), NanNew((std::string)addr.ToStringIPPort())); + obj->Set(NanNew("reachable"), NanNew((bool)fReachable)); + + array->Set(i, obj); + i++; + } + + o->Set(NanNew("addresses"), array); } else if (strCommand == "inv") { ; } else if (strCommand == "getdata") {