Browse Source

Merge pull request #2411 from TheBlueMatt/master

(finally) Remove IRC Seed support now that lfnet is down.
0.8
Jeff Garzik 12 years ago
parent
commit
ea83336f4e
  1. 2
      bitcoin-qt.pro
  2. 14
      contrib/debian/bin/bitcoind
  3. 3
      contrib/debian/bitcoind.install
  4. 36
      contrib/debian/changelog
  5. 4
      contrib/debian/control
  6. 4
      contrib/debian/examples/bitcoin.conf
  7. 3
      contrib/debian/manpages/bitcoin.conf.5
  8. 3
      doc/coding.txt
  9. 4
      src/init.cpp
  10. 403
      src/irc.cpp
  11. 12
      src/irc.h
  12. 1
      src/makefile.linux-mingw
  13. 1
      src/makefile.mingw
  14. 1
      src/makefile.osx
  15. 1
      src/makefile.unix
  16. 7
      src/net.cpp
  17. 1
      src/net.h

2
bitcoin-qt.pro

@ -159,7 +159,6 @@ HEADERS += src/qt/bitcoingui.h \
src/walletdb.h \ src/walletdb.h \
src/script.h \ src/script.h \
src/init.h \ src/init.h \
src/irc.h \
src/bloom.h \ src/bloom.h \
src/mruset.h \ src/mruset.h \
src/checkqueue.h \ src/checkqueue.h \
@ -233,7 +232,6 @@ SOURCES += src/qt/bitcoin.cpp \
src/main.cpp \ src/main.cpp \
src/init.cpp \ src/init.cpp \
src/net.cpp \ src/net.cpp \
src/irc.cpp \
src/bloom.cpp \ src/bloom.cpp \
src/checkpoints.cpp \ src/checkpoints.cpp \
src/addrman.cpp \ src/addrman.cpp \

14
contrib/debian/bin/bitcoind vendored

@ -1,14 +0,0 @@
#!/bin/sh
set -e
umask 077
basedir=~/.bitcoin
cfgfile="$basedir/bitcoin.conf"
[ -e "$basedir" ] || mkdir "$basedir"
[ -e "$cfgfile" ] || perl -le 'print"rpcpassword=",map{(a..z,A..Z,0..9)[rand 62]}0..9' > "$cfgfile"
exec /usr/lib/bitcoin/bitcoind "$@"

3
contrib/debian/bitcoind.install vendored

@ -1,2 +1 @@
debian/bin/bitcoind usr/bin src/bitcoind usr/bin
src/bitcoind usr/lib/bitcoin

36
contrib/debian/changelog vendored

@ -1,3 +1,39 @@
bitcoin (0.8.1-natty2) natty; urgency=low
* Remove dumb broken launcher script
-- Matt Corallo <matt@bluematt.me> Sun, 24 Mar 2013 20:01:00 -0400
bitcoin (0.8.1-natty1) natty; urgency=low
* New upstream release.
-- Matt Corallo <matt@bluematt.me> Tue, 19 Mar 2013 13:03:00 -0400
bitcoin (0.8.0-natty1) natty; urgency=low
* New upstream release.
-- Matt Corallo <matt@bluematt.me> Sat, 23 Feb 2013 16:01:00 -0500
bitcoin (0.7.2-natty1) natty; urgency=low
* New upstream release.
-- Matt Corallo <matt@bluematt.me> Sat, 15 Dec 2012 10:59:00 -0400
bitcoin (0.7.1-natty1) natty; urgency=low
* New upstream release.
-- Matt Corallo <matt@bluematt.me> Wed, 24 Oct 2012 15:06:00 -0400
bitcoin (0.7.0-natty1) natty; urgency=low
* New upstream release.
-- Matt Corallo <matt@bluematt.me> Mon, 17 Sep 2012 13:45:00 +0200
bitcoin (0.6.3-natty1) natty; urgency=low bitcoin (0.6.3-natty1) natty; urgency=low
* New upstream release. * New upstream release.

4
contrib/debian/control vendored

@ -33,8 +33,6 @@ Description: peer-to-peer network based digital currency - daemon
transact directly with each other, with the help of a P2P network to transact directly with each other, with the help of a P2P network to
check for double-spending. check for double-spending.
. .
By default connects to an IRC network to discover other peers.
.
Full transaction history is stored locally at each client. This Full transaction history is stored locally at each client. This
requires 2+ GB of space, slowly growing. requires 2+ GB of space, slowly growing.
. .
@ -51,8 +49,6 @@ Description: peer-to-peer network based digital currency - Qt GUI
transact directly with each other, with the help of a P2P network to transact directly with each other, with the help of a P2P network to
check for double-spending. check for double-spending.
. .
By default connects to an IRC network to discover other peers.
.
Full transaction history is stored locally at each client. This Full transaction history is stored locally at each client. This
requires 2+ GB of space, slowly growing. requires 2+ GB of space, slowly growing.
. .

4
contrib/debian/examples/bitcoin.conf vendored

@ -18,10 +18,6 @@
#connect=69.164.218.197 #connect=69.164.218.197
#connect=10.0.0.1:8333 #connect=10.0.0.1:8333
# Do not use Internet Relay Chat (irc.lfnet.org #bitcoin channel) to
# find other peers.
#noirc=1
# Maximum number of inbound+outbound connections. # Maximum number of inbound+outbound connections.
#maxconnections= #maxconnections=

3
contrib/debian/manpages/bitcoin.conf.5 vendored

@ -24,9 +24,6 @@ Use as many *addnode=* settings as you like to connect to specific peers.
\fBconnect=\fR\fI'10.0.0.1:8333'\fR \fBconnect=\fR\fI'10.0.0.1:8333'\fR
Use as many *connect=* settings as you like to connect ONLY to specific peers. Use as many *connect=* settings as you like to connect ONLY to specific peers.
.TP .TP
\fBnoirc=\fR[\fI'1'\fR|\fI'0'\fR]
Use or Do not use Internet Relay Chat (irc.lfnet.org #bitcoin channel) to find other peers.
.TP
\fRmaxconnections=\fR\fI'value'\fR \fRmaxconnections=\fR\fI'value'\fR
Maximum number of inbound+outbound connections. Maximum number of inbound+outbound connections.
.SH JSON-RPC OPTIONS .SH JSON-RPC OPTIONS

3
doc/coding.txt

@ -65,9 +65,6 @@ StartNode : Starts other threads.
ThreadGetMyExternalIP : Determines outside-the-firewall IP address, ThreadGetMyExternalIP : Determines outside-the-firewall IP address,
sends addr message to connected peers when it determines it. sends addr message to connected peers when it determines it.
ThreadIRCSeed : Joins IRC bootstrapping channel, watching for new
peers and advertising this node's IP address.
ThreadSocketHandler : Sends/Receives data from peers on port 8333. ThreadSocketHandler : Sends/Receives data from peers on port 8333.
ThreadMessageHandler : Higher-level message handling (sending and ThreadMessageHandler : Higher-level message handling (sending and

4
src/init.cpp

@ -262,7 +262,6 @@ std::string HelpMessage()
" -externalip=<ip> " + _("Specify your own public address") + "\n" + " -externalip=<ip> " + _("Specify your own public address") + "\n" +
" -onlynet=<net> " + _("Only connect to nodes in network <net> (IPv4, IPv6 or Tor)") + "\n" + " -onlynet=<net> " + _("Only connect to nodes in network <net> (IPv4, IPv6 or Tor)") + "\n" +
" -discover " + _("Discover own IP address (default: 1 when listening and no -externalip)") + "\n" + " -discover " + _("Discover own IP address (default: 1 when listening and no -externalip)") + "\n" +
" -irc " + _("Find peers using internet relay chat (default: 0)") + "\n" +
" -checkpoints " + _("Only accept block chain matching built-in checkpoints (default: 1)") + "\n" + " -checkpoints " + _("Only accept block chain matching built-in checkpoints (default: 1)") + "\n" +
" -listen " + _("Accept connections from outside (default: 1 if no -proxy or -connect)") + "\n" + " -listen " + _("Accept connections from outside (default: 1 if no -proxy or -connect)") + "\n" +
" -bind=<addr> " + _("Bind to given address and always listen on it. Use [host]:port notation for IPv6") + "\n" + " -bind=<addr> " + _("Bind to given address and always listen on it. Use [host]:port notation for IPv6") + "\n" +
@ -453,9 +452,6 @@ bool AppInit2()
// ********************************************************* Step 2: parameter interactions // ********************************************************* Step 2: parameter interactions
fTestNet = GetBoolArg("-testnet"); fTestNet = GetBoolArg("-testnet");
if (fTestNet) {
SoftSetBoolArg("-irc", true);
}
if (mapArgs.count("-bind")) { if (mapArgs.count("-bind")) {
// when specifying an explicit binding address, you want to listen on it // when specifying an explicit binding address, you want to listen on it

403
src/irc.cpp

@ -1,403 +0,0 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2012 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "irc.h"
#include "net.h"
#include "base58.h"
#include <boost/algorithm/string/predicate.hpp> // for startswith() and endswith()
using namespace std;
using namespace boost;
int nGotIRCAddresses = 0;
void ThreadIRCSeed2(void* parg);
#pragma pack(push, 1)
struct ircaddr
{
struct in_addr ip;
short port;
};
#pragma pack(pop)
string EncodeAddress(const CService& addr)
{
struct ircaddr tmp;
if (addr.GetInAddr(&tmp.ip))
{
tmp.port = htons(addr.GetPort());
vector<unsigned char> vch(UBEGIN(tmp), UEND(tmp));
return string("u") + EncodeBase58Check(vch);
}
return "";
}
bool DecodeAddress(string str, CService& addr)
{
vector<unsigned char> vch;
if (!DecodeBase58Check(str.substr(1), vch))
return false;
struct ircaddr tmp;
if (vch.size() != sizeof(tmp))
return false;
memcpy(&tmp, &vch[0], sizeof(tmp));
addr = CService(tmp.ip, ntohs(tmp.port));
return true;
}
static bool Send(SOCKET hSocket, const char* pszSend)
{
if (strstr(pszSend, "PONG") != pszSend)
printf("IRC SENDING: %s\n", pszSend);
const char* psz = pszSend;
const char* pszEnd = psz + strlen(psz);
while (psz < pszEnd)
{
int ret = send(hSocket, psz, pszEnd - psz, MSG_NOSIGNAL);
if (ret < 0)
return false;
psz += ret;
}
return true;
}
bool RecvLineIRC(SOCKET hSocket, string& strLine)
{
loop
{
bool fRet = RecvLine(hSocket, strLine);
if (fRet)
{
if (fShutdown)
return false;
vector<string> vWords;
ParseString(strLine, ' ', vWords);
if (vWords.size() >= 1 && vWords[0] == "PING")
{
strLine[1] = 'O';
strLine += '\r';
Send(hSocket, strLine.c_str());
continue;
}
}
return fRet;
}
}
int RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const char* psz3=NULL, const char* psz4=NULL)
{
loop
{
string strLine;
strLine.reserve(10000);
if (!RecvLineIRC(hSocket, strLine))
return 0;
printf("IRC %s\n", strLine.c_str());
if (psz1 && strLine.find(psz1) != string::npos)
return 1;
if (psz2 && strLine.find(psz2) != string::npos)
return 2;
if (psz3 && strLine.find(psz3) != string::npos)
return 3;
if (psz4 && strLine.find(psz4) != string::npos)
return 4;
}
}
bool Wait(int nSeconds)
{
if (fShutdown)
return false;
printf("IRC waiting %d seconds to reconnect\n", nSeconds);
for (int i = 0; i < nSeconds; i++)
{
if (fShutdown)
return false;
Sleep(1000);
}
return true;
}
bool RecvCodeLine(SOCKET hSocket, const char* psz1, string& strRet)
{
strRet.clear();
loop
{
string strLine;
if (!RecvLineIRC(hSocket, strLine))
return false;
vector<string> vWords;
ParseString(strLine, ' ', vWords);
if (vWords.size() < 2)
continue;
if (vWords[1] == psz1)
{
printf("IRC %s\n", strLine.c_str());
strRet = strLine;
return true;
}
}
}
bool GetIPFromIRC(SOCKET hSocket, string strMyName, CNetAddr& ipRet)
{
Send(hSocket, strprintf("USERHOST %s\r", strMyName.c_str()).c_str());
string strLine;
if (!RecvCodeLine(hSocket, "302", strLine))
return false;
vector<string> vWords;
ParseString(strLine, ' ', vWords);
if (vWords.size() < 4)
return false;
string str = vWords[3];
if (str.rfind("@") == string::npos)
return false;
string strHost = str.substr(str.rfind("@")+1);
// Hybrid IRC used by lfnet always returns IP when you userhost yourself,
// but in case another IRC is ever used this should work.
printf("GetIPFromIRC() got userhost %s\n", strHost.c_str());
CNetAddr addr(strHost, true);
if (!addr.IsValid())
return false;
ipRet = addr;
return true;
}
void ThreadIRCSeed(void* parg)
{
// Make this thread recognisable as the IRC seeding thread
RenameThread("bitcoin-ircseed");
printf("ThreadIRCSeed started\n");
try
{
ThreadIRCSeed2(parg);
}
catch (std::exception& e) {
PrintExceptionContinue(&e, "ThreadIRCSeed()");
} catch (...) {
PrintExceptionContinue(NULL, "ThreadIRCSeed()");
}
printf("ThreadIRCSeed exited\n");
}
void ThreadIRCSeed2(void* parg)
{
// Don't connect to IRC if we won't use IPv4 connections.
if (IsLimited(NET_IPV4))
return;
// ... or if we won't make outbound connections and won't accept inbound ones.
if (mapArgs.count("-connect") && fNoListen)
return;
// ... or if IRC is not enabled.
if (!GetBoolArg("-irc", false))
return;
printf("ThreadIRCSeed trying to connect...\n");
int nErrorWait = 10;
int nRetryWait = 10;
int nNameRetry = 0;
while (!fShutdown)
{
CService addrConnect("92.243.23.21", 6667); // irc.lfnet.org
CService addrIRC("irc.lfnet.org", 6667, true);
if (addrIRC.IsValid())
addrConnect = addrIRC;
SOCKET hSocket;
if (!ConnectSocket(addrConnect, hSocket))
{
printf("IRC connect failed\n");
nErrorWait = nErrorWait * 11 / 10;
if (Wait(nErrorWait += 60))
continue;
else
return;
}
if (!RecvUntil(hSocket, "Found your hostname", "using your IP address instead", "Couldn't look up your hostname", "ignoring hostname"))
{
closesocket(hSocket);
hSocket = INVALID_SOCKET;
nErrorWait = nErrorWait * 11 / 10;
if (Wait(nErrorWait += 60))
continue;
else
return;
}
CNetAddr addrIPv4("1.2.3.4"); // arbitrary IPv4 address to make GetLocal prefer IPv4 addresses
CService addrLocal;
string strMyName;
// Don't use our IP as our nick if we're not listening
// or if it keeps failing because the nick is already in use.
if (!fNoListen && GetLocal(addrLocal, &addrIPv4) && nNameRetry<3)
strMyName = EncodeAddress(GetLocalAddress(&addrConnect));
if (strMyName == "")
strMyName = strprintf("x%"PRI64u"", GetRand(1000000000));
Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str());
Send(hSocket, strprintf("USER %s 8 * : %s\r", strMyName.c_str(), strMyName.c_str()).c_str());
int nRet = RecvUntil(hSocket, " 004 ", " 433 ");
if (nRet != 1)
{
closesocket(hSocket);
hSocket = INVALID_SOCKET;
if (nRet == 2)
{
printf("IRC name already in use\n");
nNameRetry++;
Wait(10);
continue;
}
nErrorWait = nErrorWait * 11 / 10;
if (Wait(nErrorWait += 60))
continue;
else
return;
}
nNameRetry = 0;
Sleep(500);
// Get our external IP from the IRC server and re-nick before joining the channel
CNetAddr addrFromIRC;
if (GetIPFromIRC(hSocket, strMyName, addrFromIRC))
{
printf("GetIPFromIRC() returned %s\n", addrFromIRC.ToString().c_str());
// Don't use our IP as our nick if we're not listening
if (!fNoListen && addrFromIRC.IsRoutable())
{
// IRC lets you to re-nick
AddLocal(addrFromIRC, LOCAL_IRC);
strMyName = EncodeAddress(GetLocalAddress(&addrConnect));
Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str());
}
}
if (fTestNet) {
Send(hSocket, "JOIN #bitcoinTEST3\r");
Send(hSocket, "WHO #bitcoinTEST3\r");
} else {
// randomly join #bitcoin00-#bitcoin99
int channel_number = GetRandInt(100);
Send(hSocket, strprintf("JOIN #bitcoin%02d\r", channel_number).c_str());
Send(hSocket, strprintf("WHO #bitcoin%02d\r", channel_number).c_str());
}
int64 nStart = GetTime();
string strLine;
strLine.reserve(10000);
while (!fShutdown && RecvLineIRC(hSocket, strLine))
{
if (strLine.empty() || strLine.size() > 900 || strLine[0] != ':')
continue;
vector<string> vWords;
ParseString(strLine, ' ', vWords);
if (vWords.size() < 2)
continue;
std::string strName;
if (vWords[1] == "352" && vWords.size() >= 8)
{
// index 7 is limited to 16 characters
// could get full length name at index 10, but would be different from join messages
strName = vWords[7].c_str();
printf("IRC got who\n");
}
if (vWords[1] == "JOIN" && vWords[0].size() > 1)
{
// :username!username@50000007.F000000B.90000002.IP JOIN :#channelname
strName = vWords[0].substr(1, vWords[0].find('!', 1) - 1);
printf("IRC got join\n");
}
if (boost::algorithm::starts_with(strName, "u"))
{
CAddress addr;
if (DecodeAddress(strName, addr))
{
addr.nTime = GetAdjustedTime();
if (addrman.Add(addr, addrConnect, 51 * 60))
printf("IRC got new address: %s\n", addr.ToString().c_str());
nGotIRCAddresses++;
}
else
{
printf("IRC decode failed\n");
}
}
}
closesocket(hSocket);
hSocket = INVALID_SOCKET;
if (GetTime() - nStart > 20 * 60)
{
nErrorWait /= 3;
nRetryWait /= 3;
}
nRetryWait = nRetryWait * 11 / 10;
if (!Wait(nRetryWait += 60))
return;
}
}
#ifdef TEST
int main(int argc, char *argv[])
{
WSADATA wsadata;
if (WSAStartup(MAKEWORD(2,2), &wsadata) != NO_ERROR)
{
printf("Error at WSAStartup()\n");
return false;
}
ThreadIRCSeed(NULL);
WSACleanup();
return 0;
}
#endif

12
src/irc.h

@ -1,12 +0,0 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2012 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_IRC_H
#define BITCOIN_IRC_H
void ThreadIRCSeed(void* parg);
extern int nGotIRCAddresses;
#endif

1
src/makefile.linux-mingw

@ -71,7 +71,6 @@ OBJS= \
obj/key.o \ obj/key.o \
obj/db.o \ obj/db.o \
obj/init.o \ obj/init.o \
obj/irc.o \
obj/keystore.o \ obj/keystore.o \
obj/main.o \ obj/main.o \
obj/net.o \ obj/net.o \

1
src/makefile.mingw

@ -79,7 +79,6 @@ OBJS= \
obj/key.o \ obj/key.o \
obj/db.o \ obj/db.o \
obj/init.o \ obj/init.o \
obj/irc.o \
obj/keystore.o \ obj/keystore.o \
obj/main.o \ obj/main.o \
obj/net.o \ obj/net.o \

1
src/makefile.osx vendored

@ -80,7 +80,6 @@ OBJS= \
obj/key.o \ obj/key.o \
obj/db.o \ obj/db.o \
obj/init.o \ obj/init.o \
obj/irc.o \
obj/keystore.o \ obj/keystore.o \
obj/main.o \ obj/main.o \
obj/net.o \ obj/net.o \

1
src/makefile.unix

@ -111,7 +111,6 @@ OBJS= \
obj/key.o \ obj/key.o \
obj/db.o \ obj/db.o \
obj/init.o \ obj/init.o \
obj/irc.o \
obj/keystore.o \ obj/keystore.o \
obj/main.o \ obj/main.o \
obj/net.o \ obj/net.o \

7
src/net.cpp

@ -3,7 +3,6 @@
// Distributed under the MIT/X11 software license, see the accompanying // Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "irc.h"
#include "db.h" #include "db.h"
#include "net.h" #include "net.h"
#include "init.h" #include "init.h"
@ -347,7 +346,6 @@ bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const cha
return error("GetMyExternalIP() : connection closed"); return error("GetMyExternalIP() : connection closed");
} }
// We now get our external IP from the IRC server first and only use this as a backup
bool GetMyExternalIP(CNetAddr& ipRet) bool GetMyExternalIP(CNetAddr& ipRet)
{ {
CService addrConnect; CService addrConnect;
@ -1155,6 +1153,7 @@ static const char *strMainNetDNSSeed[][2] = {
static const char *strTestNetDNSSeed[][2] = { static const char *strTestNetDNSSeed[][2] = {
{"bitcoin.petertodd.org", "testnet-seed.bitcoin.petertodd.org"}, {"bitcoin.petertodd.org", "testnet-seed.bitcoin.petertodd.org"},
{"bluematt.me", "testnet-seed.bluematt.me"},
{NULL, NULL} {NULL, NULL}
}; };
@ -1928,10 +1927,6 @@ void StartNode(void* parg)
if (fUseUPnP) if (fUseUPnP)
MapPort(); MapPort();
// Get addresses from IRC and advertise ours
if (!NewThread(ThreadIRCSeed, NULL))
printf("Error: NewThread(ThreadIRCSeed) failed\n");
// Send and receive from sockets, accept connections // Send and receive from sockets, accept connections
if (!NewThread(ThreadSocketHandler, NULL)) if (!NewThread(ThreadSocketHandler, NULL))
printf("Error: NewThread(ThreadSocketHandler) failed\n"); printf("Error: NewThread(ThreadSocketHandler) failed\n");

1
src/net.h

@ -49,7 +49,6 @@ enum
LOCAL_IF, // address a local interface listens on LOCAL_IF, // address a local interface listens on
LOCAL_BIND, // address explicit bound to LOCAL_BIND, // address explicit bound to
LOCAL_UPNP, // address reported by UPnP LOCAL_UPNP, // address reported by UPnP
LOCAL_IRC, // address reported by IRC (deprecated)
LOCAL_HTTP, // address reported by whatismyip.com and similar LOCAL_HTTP, // address reported by whatismyip.com and similar
LOCAL_MANUAL, // address explicitly specified (-externalip=) LOCAL_MANUAL, // address explicitly specified (-externalip=)

Loading…
Cancel
Save