READ ALL AND ANALYZE LINGUISTICALLY! Message header
(4) message start
(12) command
(4) size
The message start string is designed to be unlikely to occur in normal data.
The characters are rarely used upper ascii, not valid as UTF-8, and produce
a large 4-byte int at any alignment.
Check start string
Check the command string for errors
Must be all zeros after the first zero
Message size
disk only
socket
flood
inventory based relay
broadcast and subscription
fClient = false; set by version message
Push a version message
We're using mapAskFor as a priority queue,
the key is the earliest time the request can be sent
Patch in the size
printf("%02x ", vSend[i] & 0xff);
Put on lists to offer to the other nodes
Save original serialized message so newer versions are preserved
Expire old relay messages
Global state
mapNextTx is only used anymore to track disk tx outpoints used by memory txes
mapKeys
mapWallet
Inserts only if not already there, returns tx inserted or tx found
debug print
Merge
Write to disk
Notify UI
Refresh UI
Reaccept any txes of ours that aren't already in a block
Rebroadcast any of our txes that aren't in a block yet
CTransaction
Load the block this tx is in
Update the tx's hashBlock
Locate the transaction
Fill in merkle branch
Is the tx in a block that's in the main chain
Relinquish previous transactions' posNext pointers
Get prev tx from disk
Version -1 tells unserialize to set version so we write back same version
Relinquish posNext pointer
Write back
Put a blocked-off copy of this transaction in the test pool
Remove transaction from index
Resurect single transaction objects
Take over previous transactions' posNext pointers
Get prev tx from single transactions in memory
Get prev tx from disk
Version -1 tells unserialize to set version so we write back same version
If tx will only be connected in a reorg,
then these outpoints will be checked at that time
Verify signature
Check for conflicts
Flag outpoints as used
Write back
Tally transaction fees
Add transaction to test pool
Add transaction to disk index
Delete redundant single transaction objects
Coinbase is only valid in a block, not as a loose transaction
Check for conflicts with in-memory transactions
and allow replacing with a newer version of the same transaction
Check against previous transactions
Store transaction in memory
If updated, erase old tx from wallet
Find the block it claims to be in
Get merkle root
Make sure the merkle branch connects to this block
CBlock and CBlockIndex
Cache
Go back 30 days
Load first and last block
Limit one change per timespan
Work back to the first block in the orphan chain
issue here: it doesn't know the version
Watch for transactions paying to me
Find the fork
List of what to disconnect
List of what to connect
Pretest the reorg
Invalid block, delete the rest of this branch
Disconnect shorter branch
Connect longer branch
Add to block index
New best
Adding to current best branch
New best branch
New best link
Relay wallet transactions that haven't gotten in yet
Scan ahead to the next pchMessageStart, which should normally be immediately
at the file pointer.  Leaves file pointer at end of pchMessageStart.
FAT32 filesize max 4GB, fseek and ftell max 2GB, so we must stay under 2GB
Load from disk
debug
Genesis Block:
GetHash()      = 0x000006b15d1327d67e971d1de9116bd60a3a01556c91b6ebaa416ebc0cfaa646
hashPrevBlock  = 0x0000000000000000000000000000000000000000000000000000000000000000
hashMerkleRoot = 0x769a5e93fac273fd825da42d39ead975b5d712b2d50953f35a4fdebdec8083e3
txNew.vin[0].scriptSig      = 247422313
txNew.vout[0].nValue        = 10000
...            txNew.vout[0].scriptPubKey  = OP_CODESEPARATOR 0x31D18A083F381B4BDE37B649AACF8CD0AFD88C53A3587ECD...
nTime          = 1221069728
nBits          = 20
nNonce         = 141755
CBlock(hashPrevBlock=000000, hashMerkleRoot=769a5e, nTime=1221069728, nBits=20, nNonce=141755, vtx=1)
CTransaction(vin.size=1, vout.size=1, nLockTime=0)
CTxIn(COutPoint(000000, -1), coinbase 04695dbf0e)
CTxOut(nValue=10000, nSequence=4294967295, scriptPubKey=51b0, posNext=null)
vMerkleTree: 769a5e
Genesis block
debug print
Start new block file
Read index header
Read block header
Skip transactions
break; is this all we want to do if there's a file error like this?
Add to block index without updating disk
precompute tree structure
test
mapNext[pindex->pprev].push_back(pindex);
print split or gap
print columns
print item
put the main timechain first
iterate children
Size limits
Check timestamp
Check proof of work matches claimed amount
First transaction must be coinbase, the rest must not be
Check transactions
Check merkleroot
Check for duplicate
Get prev block index
Check timestamp against prev
Check proof of work
Check transaction inputs and verify signatures
Write block to history file
Add atoms to user reviews for coins created
Check for duplicate
Preliminary checks
If don't already have its previous block, shunt it off to holding area until we get it
Ask this guy to fill in what we're missing
Store to disk
Now process any orphan blocks that depended on this one
Messages
Don't know what it is, just say we already got one
Message format
(4) message start
(12) command
(4) size
(x) data
Scan for message start
Read header
Message size
Rewind and wait for rest of message
need a mechanism to give up waiting for overlong message size error
Copy message to its own buffer
Process message
Can only do this once
Ask the first connected node for block updates
Must have a version message before anything else
Store the new addresses
Put on lists to send to other nodes
Send block from disk
Send stream from relay memory
Find the first block the caller has in the main chain
Send the rest of the chain
Find the owner's new transactions
Upgrade transaction to a fully supported CWalletTx
debug print
need to expand the time range if not enough found
int64 nSince = GetAdjustedTime() - 60 * 60; in the last hour
we have a chance to check the order here
Keep giving the same key to the same ip until they use it
Send back approval of order and pubkey to use
Broadcast
Send back confirmation
Ignore unknown commands for extensibility
Don't send anything until we get their version message
Message: addr
Message: inventory
Message: getdata
BitcoinMiner
Create coinbase tx
CBigNum bnNonce; this nonce is so multiple processes working for the same keyUser
BN_rand_range(&bnNonce, &CBigNum(INT_MAX));  don't cover the same ground
Create new block
Add our coinbase tx as first transaction
Collect the latest transactions into the block
Find if all dependencies are in this or previous blocks
if (nTransactionFee < 0) could require a tx fee here
Add tx to block
Update last few things
Prebuild hash buffer
Get time of previous block
Search
debug print
Process this block the same as if we had received it from another node
Update nTime every few seconds
Actions
List of values less than target
Solve subset sum by stochastic approximation
If the next larger is still closer, return it
Choose coins to use
Fill vout[0] to the payee
Fill vout[1] back to self with any change
Use the same key as one of the coins
Fill vout[1] to ourself
Fill vin
Fill vtxPrev by copying from previous transactions vtxPrev
Add tx to wallet, because if it has change it's also ours,
otherwise just for transaction history.
Mark old coins as spent
Broadcast
This must not fail. The transaction has already been signed and recorded.
static const int64 TRANSACTIONFEE = 1 * CENT; /change this to a user options setting, optional fee can be zero
static const unsigned int MINPROOFOFWORK = 40; /need to decide the right difficulty to start with
static const unsigned int MINPROOFOFWORK = 20;  /ridiculously easy for testing
An input of a transaction.  It contains the location of the previous
transaction's output that it claims and a signature that matches the
output's public key.
An output of a transaction.  It contains the public key that the next input
must be able to sign with to claim it.
disk only
CDiskTxPos posNext;  so far this is only used as a flag, nothing uses the location
The basic transaction that is broadcasted on the network and contained in
blocks.  A transaction can contain multiple inputs and outputs.
Set version on stream for writing back same version
Basic checks that don't depend on any context
Check for negative values
Read transaction
Return file pointer
A transaction with a merkle branch linking it to the timechain
A transaction with a bunch of additional info that only the owner cares
about.  It includes any unrecorded transactions needed to link it back
to the timechain.
probably need to sign the order info so know it came from payer
would be nice for it to return the version number it reads, maybe use a reference
Nodes collect new transactions into a block, hash them into a hash tree,
and scan through nonce values to make the block's hash satisfy proof-of-work
requirements.  When they solve the proof-of-work, they broadcast the block
to everyone and the block is added to the timechain.  The first transaction
in the block is a special one that creates a new coin owned by the creator
of the block.
Blocks are appended to blk0001.dat files on disk.  Their location on disk
is indexed by CBlockIndex objects in memory.
header
network and disk
memory only
ConnectBlock depends on vtx being last so it can calculate offset
Open history file to append
Write index header
Write block
Open history file to read
Read block
Check the header
The timechain is a tree shaped structure starting with the
genesis block at the root, with each block potentially having multiple
candidates to be the next block.  pprev and pnext link a path through the
main/longest chain.  A blockindex may have multiple pprev pointing back
to it, but pnext will only point forward to the longest branch, or will
be null if the block is not part of the longest chain.
Open history file
Overwrite with empty null block
Describes a place in the timechain to another node such that if the
other node doesn't have the same branch, it can find a recent common trunk.
The further back it is, the further before the branch point it may be.
Exponentially larger steps back
Find the first block the caller has in the main chain
Find the first block the caller has in the main chain
Global state variables
New address
Services have been added
If the dialog might get closed before the reply comes back,
call this in the destructor so it doesn't get called after it's deleted.
Look for an existing connection
Connect
debug print
debug print
Add node
todo: need to set last failed connect time, and increment a failed to connect counter
debug print
All of a nodes broadcasts and subscriptions are automatically torn down
when it goes down, so a node has to stay up to keep its broadcast going.
Cancel and delete unsourced broadcasts
Cancel subscriptions
Disconnect nodes
Disconnect duplicate connections
In case two nodes connect to each other at once,
the lower ip disconnects its outbound connection
Disconnect unused nodes
remove from vNodes
hold in disconnected pool until all refs are released
Delete disconnected nodes
wait until threads are done using it
Find which sockets have data to receive
timeout.tv_usec = 50000; frequency to poll pnode->vSend
debug
Accept new connections
Service each socket
Receive
typical socket buffer is 8K-64K
socket closed gracefully
socket error
Send
number of connections may still need to be increased before release
Initiate network connections
Make a list of unique class C's
Taking advantage of mapAddresses being in sorted order,
with IPs of the same class C grouped together.
The IP selection process is designed to limit vulnerability to address flooding.
Any class C (a.b.c.?) has an equal chance of being chosen, then an IP is
chosen within the class C.  An attacker may be able to allocate many IPs, but
they would normally be concentrated in blocks of class C's.  They can hog the
attention within their class C, but not the whole IP address space overall.
A lone node in a class C will get as much attention as someone holding all 255
IPs in another class C.
Choose a random class C
Organize all addresses in the class C by IP
Choose a random IP in the class C
Once we've chosen an IP, we'll try every given port before moving on
Advertise our address
Get as many addresses as we can
should the one on the receiving end do this too?
Subscribe our local subscription list
Wait
Poll the connected nodes for messages
Receive messages
Send messages
Wait and allow messages to bunch up
todo: start one thread per processor, use getenv("NUMBER_OF_PROCESSORS")
Sockets startup
Get local host ip
Create socket for listening for incoming connections
Set to nonblocking, incomming connections will also inherit this
The sockaddr_in structure specifies the address family,
IP address, and port for the socket that is being bound
Listen for incoming connections
Start threads
Sockets shutdown


There's more work to do on DoS, but I'm doing a quick build of what I have so far in case it's needed, before venturing into more complex ideas.  The build for this is version 0.3.19.
- Added some DoS controls
As Gavin and I have said clearly before, the software is not at all resistant to DoS attack.  This is one improvement, but there are still more ways to attack than I can count.
I'm leaving the -limitfreerelay part as a switch for now and it's there if you need it.
- Removed "safe mode" alerts
"safe mode" alerts was a temporary measure after the 0.3.9 overflow bug.  We can say all we want that users can just run with "-disablesafemode", but it's better just not to have it for the sake of appearances.  It was never intended as a long term feature.  Safe mode can still be triggered by seeing a longer (greater total PoW) invalid block chain.
Builds:
It would have been nice to get this attention in any other context.  WikiLeaks has kicked the hornet's nest, and the swarm is headed towards us.
That means a lot coming from you, Hal.  Thanks.
If you ever find anyone who turned it on.  It's disabled by default.
It's all STL.  There are almost no buffers.
@dtvan: all 3 excellent points.
1) IP records don't need to be in the chain, just do registrar function not DNS.  And CA problem solved, neat.
2) Pick one TLD, .web +1.
3) Expiration and significant renewal costs, very important.
Avoiding CPU power fragmentation is no longer a reason.  Independent networks/chains can share CPU power without sharing much else.  See:
I agree.  All transactions, IP changes, renewals, etc. should have some fee that goes to the miners.
You might consider a certain amount of work to generate a domain, instead of a fixed total circulation.  The work per domain could be on a schedule that grows with Moore's Law.  That way the number of domains would grow with demand and the number of people using it.
Right, the exchange rate between domains and bitcoins would float.
A longer interval than 10 minutes would be appropriate for BitDNS.
So far in this discussion there's already a lot of housekeeping data required.  It will be much easier if you can freely use all the space you need without worrying about paying fees for expensive space in Bitcoin's chain.  Some transactions:
Changing the IP record.
Name change.  A domain object could entitle you to one domain, and you could change it at will to any name that isn't taken.  This would encourage users to free up names they don't want anymore.  Generated domains start out blank and the miner sells it to someone who changes it to what they want.
Renewal.  Could be free, or maybe require consuming another domain object to renew.  In that case, domain objects (domaincoins?) could represent the right to own a domain for a year.  The spent fee goes to the miners in the next block fee.
Some sample pseudocode using the new Accounts based commands in 0.3.18.
// if you make a sale, move the money from their account to your "" account
sendfrom(username, bitcoinaddress, amount, 6, "withdrawal by user")
You can use listtransactions(username) to show them a list of their recent transactions.
Piling every proof-of-work quorum system in the world into one dataset doesn't scale.
Bitcoin and BitDNS can be used separately.  Users shouldn't have to download all of both to use one or the other.  BitDNS users may not want to download everything the next several unrelated networks decide to pile in either.
The networks need to have separate fates.  BitDNS users might be completely liberal about adding any large data features since relatively few domain registrars are needed, while Bitcoin users might get increasingly tyrannical about limiting the size of the chain so it's easy for lots of users and small devices.
Fears about securely buying domains with Bitcoins are a red herring.  It's easy to trade Bitcoins for other non-repudiable commodities.
If you're still worried about it, it's cryptographically possible to make a risk free trade.  The two parties would set up transactions on both sides such that when they both sign the transactions, the second signer's signature triggers the release of both.  The second signer can't release one without releasing the other.
Not locktime.
There's a possible design for far in the future:
You intentionally write a double-spend.  You write it with the same inputs and outputs, but this time with a fee.  When your double-spend gets into a block, the first spend becomes invalid.  The payee does not really notice, because at the moment the new transaction becomes valid, the old one becomes invalid, and the new transaction simply takes its place.
It's easier said than implemented.  There would be a fair amount of work to make a client that correctly writes the double-spend, manages the two versions in the wallet until one is chosen, handles all the corner cases.  Every assumption in the existing code is that you're not trying to write double-spends.
There would need to be some changes on the Bitcoin Miner side also, to make the possibility to accept a double-spend into the transaction pool, but only strictly if the inputs and outputs match and the transaction fee is higher.  Currently, double-spends are never accepted into the transaction pool, so every node bears witness to which transaction it saw first by working to put it into a block.
The incentive is to get the rewards from the extra side chains also for the same work.
While you are generating bitcoins, why not also get free domain names for the
If you currently generate 50 BTC per week, now you could get 50 BTC and some domain names too.
You have one piece of work.  If you solve it, it will solve a block from both Bitcoin and BitDNS.  In concept, they're tied together by a Merkle Tree.  To hand it in to Bitcoin, you break off the BitDNS branch, and to hand it in to BitDNS, you break off the Bitcoin branch.
In practice, to retrofit it for Bitcoin, the BitDNS side would have to have maybe ~200 extra bytes, but that's not a big deal.  You've been talking about 50 domains per block, which would dwarf that little 200 bytes per block for backward compatibility.  We could potentially schedule a far in future block when Bitcoin would upgrade to a modernised arrangement with the Merkle Tree on top, if we care enough about saving a few bytes.
Note that the chains are below this new Merkle Tree.  That is, each of Bitcoin and BitDNS have their own chain links inside their blocks.  This is inverted from the common timestamp server arrangement, where the chain is on top and then the Merkle Tree, because that creates one common master chain.  This is two timestamp servers not sharing a chain.
I think it would be possible for BitDNS to be a completely separate network and separate block chain, yet share CPU power with Bitcoin.  The only overlap is to make it so miners can search for proof-of-work for both networks simultaneously.
The networks wouldn't need any coordination.  Miners would subscribe to both networks in parallel.  They would scan SHA such that if they get a hit, they potentially solve both at once.  A solution may be for just one of the networks if one network has a lower difficulty.
I think an external miner could call getwork on both programs and combine the work.  Maybe call Bitcoin, get work from it, hand it to BitDNS getwork to combine into a combined work.
Instead of fragmentation, networks share and augment each other's total CPU power.  This would solve the problem that if there are multiple networks, they are a danger to each other if the available CPU power gangs up on one.  Instead, all networks in the world would share combined CPU power, increasing the total strength.  It would make it easier for small networks to get started by tapping into a ready base of miners.
Thanks for setting this up Cdecker.
Is there any chance of getting it to build the GUI version also?  If this is Ubuntu, if you get wxWidgets 2.9.0 it should just be a matter of following the steps in build-unix.txt exactly.  Is this an environment where you can build wxWidgets once and leave it there and just keep using it?
As long as the interface is designed for things like showing the user the last N transactions history, it's fine, now that we have the Accounts feature making it easier to do payment detection the right way.
Gavin, could listtransactions have an option to list transactions for all accounts?
I'm not sure what the interface could be, maybe:
listtransactions <JSON null type> [count]
It would be hard to do that from the command line though.
I can't think of a good solution for the interface, that's the problem.  Maybe "*" special case like "" is.  Everyone would have to make sure no user can create account name "*".
I don't get how that's "easy" to track with transactions.
I came to agree with Gavin about whitelisting when I realized how quickly new transaction types can be added.
That's already possible.  <pubkey> OP_CHECKSIG.  <pubkey> can be 33 to 120 bytes.
I also support a third transaction type for timestamp hash sized arbitrary data.  There's no point not having one since you can already do it anyway.  It would tell nodes they don't need to bother to index it.
New transaction templates can be added as needed.  Within a few days, there will be plenty of GPU power that accepts and works on it.  Network support will be thorough
there'll be enough clients who understand how to receive and interpret the new transaction.
Timestamp hashes are still already possible:
If there's an actual application like BitDNS getting ready to actually start inserting hashes, we can always add a specific transaction template for timestamps.
I like Hal Finney's idea for user-friendly timestamping.  Convert the hash of a file to a bitcoin address and send 0.01 to it:
I'm not talking about the normal risk for a given minconf level, I'm talking about additional pitfalls from listtransactions when used this way.
The OP's example of listtransactions <account> [count=10] [txid] seems to imply and it would be very easy for programmers to assume that if they pass in the last txid of the previous call to listtransactions, they will never see the same transaction more than once, which is not the case.  It would be very easy to double-count payments if you don't maintain your own persistent map or dictionary to track which txid's you've already accepted.
It doesn't seem right to have a function that seems tailor made to be used a certain obvious way, and that way is a non-obvious trap.
Suppose both spends are to the same address.  getreceivedbyaddress would always count only one or the other spend at any given time, never both.
Using listtransactions, it would be very easy to count both.  You see the first spend, you count it.  You see the second spend, you count it.  Total is double counted.
The main addition in this release is the Accounts-Based JSON-RPC commands that Gavin's been working on (more details at
Then how do you cope with the issues I listed in the message you quoted?
It's not safe to use listtransactions this way.
I know I've been criticized for being reluctant about listtransactions.  Let me explain my reluctance.
Transactions are dynamic.  Past transactions can become unconfirmed, go away and come back, become invalid and disappear, or be replaced by a different double-spend.  Their date can change, their order can change.
Programmers are naturally inclined to want to use listtransactions like this: feed me the new transactions since I last asked, and I'll keep my own tally or static record of them.  This will seem to work in all regular use, but if you use the amounts for anything, it is highly exploitable:
1) How do you know if a past transaction becomes invalid and disappears?
2) When there's a block-chain reorg, it would be easy to double-count transactions when they get confirmed again.
3) A transaction can be replaced by a double-spend with a different txid.  You would count both spends.
The model where you assume you only need to see new transactions because you've already seen previous transactions is not true.  Old transactions can change at any time.
Any time you take an action based on payment amounts received, you always need to go back to bitcoin and ask for a current balance total (or use move or sendfrom), and be ready for the possibility that it can go down.
Now that we have the Accounts feature making it easier to do it the right way, we're better prepared to have listtransactions.
No, don't "bring it on".
The project needs to grow gradually so the software can be strengthened along the way.
I make this appeal to WikiLeaks not to try to use Bitcoin.  Bitcoin is a small beta community in its infancy.  You would not stand to get more than pocket change, and the heat you would bring would likely destroy us at this stage.
That's a good optimisation.  I'll add that next time I update SVN.
More generally, we could also consider this:
We would then rely on dbenv.txn_checkpoint(0, 0, 0) in CDB::Close() to flush after wallet writes.
What was this wallet used with?  An early accounts patch or git build?
It's while loading the wallet.  I assume it must be in this:
You could check that with this:
Was there an interim version of accounts on git at some point that had just ("acentry", "account") for the key?
If you have gdb, you could run it in gdb and do a backtrace.
It seems like you're inclined to assume everything is wrong more than is actually so.
Writing the block index is light work.  Building the tx index is much more random access per block.  I suspect reading all the prev txins is what's slow.  Read caching would help that.  It's best if the DB does that.  Maybe it has a setting for how much cache memory to use.
Already does that.  See CDB.  The lifetime of the (for instance) CTxDB object is only to support database transactions and to know if anything is still using the database at shutdown.
If it was doing that it would be much slower.  It's supposed to be only once a minute or 500 blocks:
Probably should add this:
Does transaction commit imply flush?  That seems surprising to me.  I assume a database op wrapped in a transaction would be logged like any other database op.  Many database applications need to wrap almost every pair of ops in a transaction, such as moving money from one account to another. (debit a, credit b)  I can't imagine they're required to batch all their stuff up themselves.
In the following cases, would case 1 flush once and case 2 flush twice?
Contorting our database usage will not be the right approach.  It's going to be BDB settings and caching.
Very much not.  Using multiple copies of wallet.dat is not recommended or supported, in fact all of Bitcoin is designed to defeat that.  Both copies will get screwed up.
If you're trying to consolidate your generated coins into one wallet, a better solution now is to run getwork miners on the additional systems.  jgarzik has a CPU miner, and it supports tcatm's 4-way SSE2, so on Windows it's up to twice as fast as the built-in SHA if you have an AMD or recent Intel (core 3, 5 or 7).
New demonstration CPU miner available:
Despite everything else said, the current next step is:
In particular, I suspect that more read caching might help a lot.
Then something more specific was wrong.  That's not due to normal initial download time.  Without more details, it can't be diagnosed.  If it was due to slow download, did it speed up after 10-20 minutes when the next block broadcast should have made it switch to a faster source?  debug.log might have clues.  How fast is their Internet connection?  Was it steadily slow, or just slow down at one point?
The 74000 checkpoint is not enough to protect you, and does nothing if the download is already past 74000.  -checkblocks does more, but is still easily defeated.  You still must trust the supplier of the zipfile.
If there was a "verify it" step, that would take as long as the current normal initial download, in which it is the indexing, not the data download, that is the bottleneck.
80 bytes per header and no indexing work.  Might take 1 minute.
The data is mostly hashes and keys and signatures that are uncompressible.
The speed of initial download is not a reflection of the bulk data transfer rate of the protocol.  The gating factor is the indexing while it downloads.
ribuck's description is spot on.
Pool operators can modify their getwork to take one additional parameter, the address to send your share to.
The easy way for the pool operator would be to wait until the next block is found and divy it up proportionally as:
user's near-hits/total near-hits from everyone
That would be easier and safer to start up.  It also has the advantage that multiple hits from the same user can be combined into one transaction.  A lot of your hits will usually be from the same people.
The instant gratification way would be to pay a fixed amount for each near-hit immediately, and the operator takes the risk from randomness of having more or less near-hits before a block is found.
Either way, the user who submits the hit that solves the block should get an extra amount off the top, like 10 BTC.
New users wouldn't really even need the Bitcoin software.  They could download a miner, create an account on mtgox or mybitcoin, enter their deposit address into the miner and point it at anyone's pool server.  When the miner says it found something, a while later a few coins show up in their account.
Miner writers better make sure they never false-positive near-hits.  Users will depend on that to check if the pool operator is cheating them.  If the miner wrongly says it found something, users will look in their account, not find anything, and get mad at the pool operator.
You should try it with tcatm's 4-way SSE2 SHA in sha256.cpp.  It compiles fine as a C file, just rename sha256.cpp to sha256.c.  I was able to get it to work in simple tests on Windows, but not when linked in with Bitcoin.  It may have a better chance of working as part of a C program instead of C++.
Currently it's only enabled in the Linux build, so if you get it to work you could make it available to Windows users.  It's about 100% speedup on AMD CPUs.
That's what it does, it returns true/false.
Laszlo does them, but I haven't asked him to do one for a while because there wasn't anything major.  I'll ask him to do this version.
I tested it on a slow 7 year old drive, where bandwidth and CPU were clearly not the bottleneck.  Initial download took 1 hour 20 minutes.
If it's taking a lot longer than that, certainly 24 hours, then it must be downloading from a very slow node, or your connection is much slower than around 15KB per sec (120kbps), or something else is wrong.  It would be nice to know what appears to be the bottleneck when that happens.
Every 10 minutes or so when the latest block is sent, it should have the chance to change to a faster node.  When the latest block is broadcast, it requests the next 500 blocks from other nodes, and continues the download from the one that sends it fastest.  At least, that's how it should work.
It may only need more read caching.  It has to read randomly all over blk0001.dat and blkindex.dat to index.  It can't assume the file is smaller than memory, although it currently still is.  Caching would be effective, since most dependencies are recent.
Someone should experiment with different Berkeley DB settings and see if there's something that makes the download substantially faster.  If something substantial is discovered, then we can work out the particulars.
We checkpoint every 500 blocks.
Version 0.3.17 is now available.
Changes:
- new getwork, thanks m0mchil
- added transaction fee setting in UI options menu
- free transaction limits
- sendtoaddress returns transaction id instead of "sent"
- getaccountaddress <account>
The UI transaction fee setting was easy since it was still there from 0.1.5 and all I had to do was re-enable it.
The accounts-based commands: move, sendfrom and getbalance <account> will be in the next release.  We still have some more changes to make first.
Downloads:
It's not the downloading that takes the time, it's verifying and indexing it.
Bandwidthwise, it's more efficient than if you downloaded an archive.  Bitcoin only downloads the data in blk0001.dat, which is currently 55MB, and builds blkindex.dat itself, which is 47MB.  Building blkindex.dat is what causes all the disk activity.
During the block download, it only flushes the database to disk every 500 blocks.  You may see the block count pause at ??499 and ??999.  That's when it's flushing.
Doing your own verifying and indexing is the only way to be sure your index data is secure.  If you copy blk0001.dat and blkindex.dat from an untrusted source, there's no way to know if you can trust all the contents in them.
Maybe Berkeley DB has some tweaks we can make to enable or increase cache memory.
A revised version of getwork is now in the official client, but the miners need to be updated a little to use it.
getwork does the byte-reversing.  midstate, data and hash1 are already big-endian, and you pass data back still big-endian, so you work in big-endian and don't have to do any byte-reversing.  They're the same data that is passed to the ScanHash_ functions.  You can take midstate, data and hash1, put them in 16-byte aligned buffers and pass them to a ScanHash_ function, like ScanHash(pmidstate, pdata + 64, phash1, nHashesDone).  If a nonce is found, patch it into data and call getwork.
I should probably change the ScanHash_ functions to use pdata instead of pdata + 64 so they're consistent.
target is little endian, it's supposed to be the same as how m0mchil's did it.  (if it's not, then it should be fixed)  That's the only case where you would use byte reverse.  I think you do it like: if ByteReverse((unsigned int*)hash[6]) < (unsigned int*)target[6].
This is the new spec.  It shouldn't be hard to update your miner to use it.
The changes are:
- It does not return work when you submit a possible hit, only when called without parameter.
- The block field has been split into data and hash1.
- state renamed to midstate for consistency.
- extranonce not needed.
It's not an exact drop-in replacement.  I wanted to clean up the interface a little.  It only requires a few changes.
ScanHash_ functions aren't going away.  BTW, the interface of this is designed to mirror the parameters of that (midstate, data, hash1).
I uploaded a redesign of m0mchil's getwork to SVN rev 189 (version 31601)
m0mchil's external bitcoin miner idea has solved a lot of problems.  GPU programming is immature and hard to compile, and I didn't want to add additional dependencies to the build.  getwork allows these problems to be solved separately, with different programs for different hardware and OSes.  It's also convenient that server farms can run a single Bitcoin node and the rest only run getwork clients.
The interface has a few changes:
getwork [data]
If [data] is not specified, returns formatted hash data to work on:
"midstate" : precomputed hash state after hashing the first half of the data
"data" : block data
"hash1" : formatted hash buffer for second hash
"target" : little endian hash target
If [data] is specified, tries to solve the block and returns true if it was successful.  [data] is the same 128 byte block data that was returned in the "data" field, but with the nonce changed.
Notes:
- It does not return work when you submit a possible hit, only when called without parameter.
- The block field has been separated into data and hash1.
- data is 128 bytes, which includes the first half that's already hashed by midstate.
- hash1 is always the same, but included for convenience.
- Logging of "ThreadRPCServer method=getwork" is disabled, it would be too much junk in the log.
Thanks m0mchil for keeping up on the updates!
GPU miners, please upgrade as soon as possible to shut down the free transaction abuse!  This version has the new priority-based limit on free transaction spam.
Before SVN 184, compiling transactions into a block used an n^2 algorithm.  The new efficient single-pass algorithm is orders of magnitude quicker.  (O(n) vs O(n^2)/2 algorithm, n=200 maybe 10 to 100 times quicker)
I'm doing something like that.  Priority is a more formalised version of the concept you're describing.
Yes, like this.  And the no-priority-requirement area is 3K, about a dozen transactions per block.
I just uploaded SVN rev 185 which has a minimal priority requirement for free transactions.  Transaction floods are made up of coins that are re-spent over and over, so they depend on their own 0 conf transactions repeatedly.  0 conf transactions have 0 priority, so free transactions like that will have to wait for one transaction to get into a block at a time.
Version 0.3.15 doesn't write transactions using 0 conf dependencies unless that's all it has left, so normal users shouldn't usually have a problem with this.
I think this is a good compromise short of making the default fee 0.01.  It's not so much to ask that free transactions can only be used to turn coins over so often.  If you're using free transactions, you're taking charity and there has to be some limit on how often you can use it with the same coins.
We've always said free transactions may be processed more slowly.  You can help ensure your transactions go through quickly by adding -paytxfee=0.01.
We can't safely do OP_BLOCKNUMBER.  In the event of a block chain reorg after a segmentation, transactions need to be able to get into the chain in a later block.  The OP_BLOCKNUMBER transaction and all its dependants would become invalid.  This wouldn't be fair to later owners of the coins who weren't involved in the time limited transaction.
nTimeLock does the reverse.  It's an open transaction that can be replaced with new versions until the deadline.  It can't be recorded until it locks.  The highest version when the deadline hits gets recorded.  It could be used, for example, to write an escrow transaction that will automatically permanently lock and go through unless it is revoked before the deadline.  The feature isn't enabled or used yet, but the support is there so it could be implemented later.
You should use at least some priority in case a flood comes along before the next block.
As long as all dependencies have at least 1 conf, if the transaction doesn't have enough priority at first, the dependencies will age until it does.
Or managing how much priority you spend on a transaction.  The software would have to know your future plans to know whether to spend your priority now or save it for later.  I don't think we'll need to get into that much detail though.  There's a wide enough difference between normal users and flooders.
Priority doesn't have to do everything.  Once you know there's a flood, you can add -paytxfee=0.01.  Hopefully with priority, your transactions before that should be at worst slow, not stuck.
Version 0.3.15 is now available.
Thank you for limiting flood tests to the testnet.
Version 0.3.15 combines several features to help legitimate transactions jump the queue during a flood attack.  The key was Gavin's idea for prioritising transactions based on the age of their dependencies.  Every coin is entitled to turn over so often.  The longer waited, the more priority accumulates.  Priority is sum(valuein * age) / txsize.  Transaction fee still takes precedence over priority, and priority determines the order of processing within a fee strata.
In support of the priority feature, SelectCoins only uses your own 0 conf transactions only as a last resort if that's all you have left.  This helps keep you from turning your coins over rapidly unless you're forcing it by actually turning all your coins over rapidly.
I'm happy if someone with artistic skill wants to contribute alternatives.  The icon/logo was meant to be good as an icon at the 16x16 and 20x20 pixel sizes.  I think it's the best program icon, but there's room for improvement at larger sizes for a graphic for use on websites.
It'll be a lot simpler if authors could make their graphics public domain.
The only thing I can think of is to see if there are other versions of mingwm10.dll you can get.  mingwm10.dll is a tiny little DLL that came with the MinGW compiler that you need when you build for multi-thread.  I don't know exactly what it does, but it probably just says something like "yes Windows, see I'm in a DLL like you insisted."
The end of your debug.log file might show the last thing it was doing before it crashed.
Here's some pseudocode of how you would use the account based commands.  It sure makes website integration a lot easier.
sendfrom(username, bitcoinaddress, amount, 6)
I have the beginning of something like this.  It's mostly like what Gavin described.
Some more rpc interface:
move <fromaccount> <toaccount> <amount>
Move from one internal account to another.  I think blank account name ("") will be your default account.  If you sell something to a user, you could do move "theiraccount" "" 123.45.
Is "move" the best name for this?  I shied away from "transfer" because that sounds too close to sending a transaction.
I'm thinking a new function getaccountaddress instead of overloading getnewaddress:
getaccountaddress <account>
Gives you an address allocated from getnewaddress <account>.  It'll keep giving the same address until something is received on the address, then it allocates a new address.  (It automatically does what the sample code I posted some time ago did)
Would these commands make it possible in simple cases to implement your website without needing a database of your own?
ECDSA can't encrypt messages, only sign signatures.
It would be unwise to have permanently recorded plaintext messages for everyone to see.  It would be an accident waiting to happen.
If there's going to be a message system, it should be a separate system parallel to the bitcoin network.  Messages should not be recorded in the block chain.  The messages could be signed with the bitcoin address keypairs to prove who they're from.
This is the important clue.  I believe it's saying it crashed in that.  Maybe there are other versions of it to try.  mingwm10.dll is just a simple placeholder thing that satisfies some callback requirement for multithreaded apps.
Is anyone else running OK on Windows 64-bit?
OK, if it really won't get past block 1698 on redownload, then we're in stranger territory.
Yes, possibly he has antivirus software or even a router or filewall that is pattern matching a sequence of bytes and censoring it.
It would be instructive to get knightmb's blk*.dat and see if that gets him past that point.
He was generating invalid blocks at difficulty 1.0.  He must have a corrupted entry in his blk0001.dat or blkindex.dat file.  He just needs to delete blk*.dat and let it redownload.
The safety lockdown detected the problem and was displaying "WARNING: Displayed transactions may not be correct!" because it saw a longer chain existed that it was unable to accept.  The safety lockdown cannot stop generation or it would create an attack possibility.
Good idea, I made a change to make sure it won't generate before checkpoint block 74000.
The order matters not to the program, but it matters to me maintaining it.  If it jumbles the order of the .po file then I can't diff for changes.  I have to update all 7 translation files when I change the English text in the program, and it's easier when they're all in the same order.
I can still put it back into normal order by making poedit rescan it.
It is normal that untranslated strings are shown on top.
I know, but not easily without complicating the sourcecode.
Version 0.3.14 is now available
SVN rev 163 (ver 0.3.13.3) has the key pool feature.  Pre-generated new keys are aged in a queue before use, so that backups of wallet.dat hold keys you'll use in the future.
For now I made the default pool size 100.  It can be configured with -keypool=.  Be aware, it takes a little time to increase the pool size, so don't go crazy with it.  Disk space is about 1K per key.
I have not addressed the recovery side of this yet.  If you actually did restore an old wallet.dat, I think you may have to delete blk*.dat to rediscover your own transactions during the redownload.
I've only tested this moderately.  You might not want to use this for a website server until it's had some more testing.
Repeating myself here, but there is open source software for that, so it would just be a matter of bolting on a Bitcoin payment mechanism.  One good one I found was Mihalism Multi Host.  It's designed as a free host, so it would just need a few tweaks to loosen up restrictions consistent with paid use.
Maybe you were just unlucky to have an exit node without reverse lookup.
The IRC server's response doesn't look like it was disconnecting you for that.  It's supposed to go IRC SENDING: NICK after that, and it doesn't so it gets timed out.
I see the problem.  The IRC code is looking for various phrases to see when the server is ready to receive your NICK, but it's not looking for that particular phrase.  I'll fix it.
I don't know if it's really required to wait for the server to finish looking up hostname before sending nick.
How long did it take to get connected with TOR the first time, having to use the seed nodes?
That's going to be more of a SelectCoins thing.
SVN rev 161 has a refinement to recursively determine if your own unconfirmed transactions can be spent.  This is needed because you should be able to spend your own change right away.
The new recursive determination is: 0/unconfirmed can be spent if it's yours and all its dependencies are either in a block or also yours.
Here's a Windows build:
This version is an improvement if you already had a 0/unconfirmed transaction and might have already spent it.  If you were the original creator of a 0/unconfirmed transaction, you still need theymos' patch instead.
poedit reorganised the file for some reason.  I re-ran update from sources and it put it back in the original order so it's fine now.  Did you run it on a drive where files aren't sorted alphabetically, like a FAT drive or USB flash drive?
Strings aren't added or changed very often.  It's months before enough changes build up.
I uploaded the changes.
This Windows build has the Russian translation in it:
It can be phased in, like:
It can start being in versions way ahead, so by the time it reaches that block number and goes into effect, the older versions that don't have it are already obsolete.
When we're near the cutoff block number, I can put an alert to old versions to make sure they know they have to upgrade.
poedit does it.  Either get the src directory from a release, or download it with SVN.  Place your .po file 3 directories deep under the src directory.  Open it with poedit and do Catalog->Update from sources.
So for example, you have:
Thanks eurekafag, Russian translation added to SVN rev 160.
Make sure you keep your node online so it'll keep rebroadcasting transaction b412a0.  It haven't seen it rebroadcast since 29/09/2010 16:41.
You're connecting to yourself.  All 21 connection attempts were to a node with version 31300 (0.3.13).  Not everyone has 0.3.13 yet.
IRC seems to be working.  It ought to have other nodes to try.
There may be something I need to do to make sure it doesn't try to connect to itself again right away after disconnecting.  I can't see how it's happening though, it should be resetting nLastTry which would put it to the back of the queue, but the log doesn't show it.
You can try moving addr.dat aside.  Maybe there's something wrong in it.
Are you using -addnode?
ShadowOfHarbringer, is yours faster with -4way?
If it is, then I'm thinking that any AMD that supports 64-bit has 128-bit SSE2.
The specialbuild version I posted here looks for model 4 or higher.  If yours is faster with -4way, then I should change it to always use SSE2 with any AMD with 64-bit.
This is the point of confusion.  extraNonce is not part of the block header, it is part of the first transaction.  It does not slow down your hashing.  It does not change the size of the header.
We need to be vigilant and nip in the bud any misconception that the contents of your block slows down your hash speed.  It doesn't.
extraNonce never needs to be very big.  We could reset it every second whenever the time changes if we wanted.  Worst case, if you didn't want to keep track of incrementing it, extraNonce could be 4 random bytes and the chance of wasting time from collision would be negligible.
Separate machines are automatically collision proof because they have different generated public keys in the first transaction.  That also goes for each thread too.
+1 theymos.  Don't use this patch, it'll make you incompatible with the network, to your own detriment.
We can phase in a change later if we get closer to needing it.
Transactions aren't accepted or displayed as 0/unconfirmed until your node has a path of transactions back to the block chain.
Any transactions in your wallet also have bundled with them all unrecorded transactions required to reach the block chain.  If you have a transaction that is displayed as 0/unconfirmed, then you have all the previous unrecorded transactions it depends on and you will also rebroadcast those transactions when you rebroadcast yours.
If a no-fee block has already been generated and hasn't helped, then I need to look at what's wrong.  It's a part of code that doesn't get much use.  They should be recorded in the wallets of everyone who has a transaction depending on them.
Sigh... why delete a wallet instead of moving it aside and keeping the old copy just in case?  You should never delete a wallet.
It may take a while to collect re-broadcast transactions.  It'll help if you can accept inbound connections so you'll be listening to more nodes.  Even if you find a block in 3 hours, keep it running continuously for a few days at least.
Seriously?  What hardware is that?
Could a few people please run this special build?  It'll amnesty the dust spam transactions, which will clear up the 0/unconfirmed problem for now.  We really just need one block letting them through to clear up the previous transactions.  Post if you generate a block with this.
These are binaries only.  The linux version is 64-bit only.
The linux 64-bit version includes a change to the cpuid 4-way 128-bit SSE2 autodetect for AMD in 64-bit mode, if you'd like to test that and see if that's better.
Forgot to say, I suspected the detect might not work on 64-bit AMD.  I found it hard to believe but AMD reports a different model number in 64-bit mode.
Could you grep CPUID your debug.log and tell me what it says?  (and anyone else with 64-bit AMD)  And what AMD chip do you have?
Do all AMDs that support 64-bit have the better SSE2 hardware also?
Version 0.3.13 is now available.  You should upgrade to prevent potential problems with 0/unconfirmed transactions.  Note: 0.3.13 prevents problems if you haven't already spent a 0/unconfirmed transaction, but if that already happened, you need 0.3.13.2.
Download:
(Thanks Laszlo for the Mac OSX build!)
Note:
The SSE2 auto-detect in the Linux 64-bit version doesn't work with AMD in 64-bit mode.  Please try this instead and let me know if it gets it right:
You can still control the SSE2 use manually with -4way and -4way=0.
Version 0.3.13.2 (SVN rev 161) has improvements for the case where you already had 0/unconfirmed transactions that you might have already spent.  Here's a Windows build of it:
Too late for 0.3.13, but I'll try to find time to add it to the next version.
It can be safe if you're using it over your own LAN, like if you have multiple servers at a location that talk to each other.
0.3.13 RC1 is available for Windows:
True, the switch should be something more dynamic that pays per KB.  It's harder to think of how to explain it.
It ramps up the fee requirement as the block fills up:
It's a typical pricing mechanism.  After the first 50KB sells out, the price is raised to 0.01.  After 250KB is sold, it goes up to 0.02.  At some price, you can pretty much always get in if you're willing to outbid the other customers.
Just including the minimum 0.01 goes a long way.
If you do, I think it should be a very brief, single paragraph article like 100 words or less that simply identifies what Bitcoin is.
I wish rather than deleting the article, they put a length restriction.  If something is not famous enough, there could at least be a stub article identifying what it is.  I often come across annoying red links of things that Wiki ought to at least have heard of.
The article could be as simple as something like:
"Bitcoin is a peer-to-peer decentralised /link/electronic currency/link/."
The more standard Wiki thing to do is that we should have a paragraph in one of the more general categories that we are an instance of, like Electronic Currency or Electronic Cash.  We can probably establish a paragraph there.  Again, keep it short.  Just identifying what it is.
Open bitcoin.po with poedit, do Catalog->Update from sources.  It looks for the sourcecode up 3 directories (..\..\..) from where bitcoin.po is.
This updates your existing .po file you already worked on and adds any news strings.  It may try to match close strings, so check things over and make sure it didn't make any bad guesses.
Make sure you use the .po file I uploaded to SVN or in a release, because I always fix up at least a few things.  I'm attaching your Russian one to this message.
0.3.13 release candidate, to be released soon so please test:
- don't count or spend payments until they have 1 confirmation
- internal version number from 312 to 31300
- only accept transactions sent by IP address if -allowreceivebyip is specified
- dropped DB_PRIVATE Berkeley DB flag
- fix problem sending the last cent with sub-cent fractional change
- auto-detect whether to use 128-bit 4-way SSE2 on Linux
Gavin Andresen:
- option -rpcallowip= to accept json-rpc connections from another machine
- clean shutdown on SIGTERM on Linux
0.3.13 release candidate, please test:
As you figured out, the root problem is we shouldn't be counting or spending transactions until they have at least 1 confirmation.  0/unconfirmed transactions are very much second class citizens.  At most, they are advice that something has been received, but counting them as balance or spending them is premature.
I made changes so they show up in lighter print, with the credit amount in square brackets like [+1.23], and the amount not counted towards your balance and not available for spending.  This doesn't apply to transactions you sent, which you implicitly trust, since you wrote them.
I didn't make it (+1.23) because parenthesis in accounting means negative.  I hope square brackets is different enough to be clear what is meant.
The JSON-RPC interface can still see 0/unconfirmed if it wants by specifying 0 confirmations.
I uploaded the changes to SVN rev 158.  I will post a 0.3.13 RC shortly.
If you have any of these transactions in your wallet, do not send any payments until you've upgraded to 0.3.13, which will be coming soon.
If you've already sent any of these transactions, or you're the creator of them, then use theymos' patch or make the following change and use it to send your clean transactions to a new wallet to clean things up.
It's not implemented yet, but the network can support a transaction that requires two signatures.  It's described here:
It's absolutely safer than a straight payment without escrow, but not as good as a human arbitrated escrow, assuming you trust the human enough.
In this kind of escrow, a cheater can't win, but it's still possible for you to lose.  It at least takes away the profit motive for cheating you.  The seller is assured that the money is reserved for him, while the buyer retains the leverage that the seller hasn't been paid yet until completion.
I don't think it should cause any problems for version comparisons.  31300 > 312.
I would not encourage using the extra decimal places.  They're only intended for future use.
You are correct that above 0.01 can still have additional precision, but the recipient won't be able to see it.  The UI will show it rounded down.
Bitcoin would be convenient for people who don't have a credit card or don't want to use the cards they have, either don't want the spouse to see it on the bill or don't trust giving their number to "porn guys", or afraid of recurring billing.
I don't understand, are you under the impression that the program sets the system clock?  It doesn't.
We use an internal offset based on the median of other nodes' times, but for security reasons we don't let them offset us by more than an hour.  If they indicate we're off by more than an hour, then we resort to alerting the user to fix their clock.
In the next release (0.3.13), I'm going to change the format of the internal version number integer from 313 to 31300, for instance 31305 = 0.3.13.5.  The last number represents changes on the SVN between releases and ought to be properly represented in the version number.  Otherwise, it would be a pain if we had a mistake or something in one of the sub versions that needed to be worked around.
I implemented this change in SVN rev 157.
The reason I previously made it so high was to allow very large transactions without hitting the transaction fee.  The threshold was around 26,000 BTC for transactions made of 50 BTC generated coins.  Even though it was 100 times easier to generate back then, only a few people ever encountered the fee at that level.  The new threshold puts it at around 11,000 BTC for sending generated coins.  It would mostly only be reached with generated bitcoins.  If you bought your bitcoins, they'll be denominated in larger transactions and won't be anywhere near the fee limit, unless you bought them in several hundred separate transactions.  Even if you do reach the fee level, you only have to pay it once to bundle your little transactions together.
Theymos already said this...  ECDSA does not support encrypting messages.  Only digital signatures.
Probably best to disable receiving by IP unless you specifically intend to use it.  This is a lot of surface area that nobody uses that doesn't need to be open by default.
In storefront cases, you would typically only want customers to send payments through your automated system that only hands out bitcoin addresses associated with particular orders and accounts.  Random unidentified payments volunteered to the server's IP address would be unhelpful.
In general, sending by IP has limited useful cases.  If connecting directly without a proxy, the man-in-the-middle risk may be tolerable, but no privacy.  If you use a privacy proxy, man-in-the-middle risk is unacceptably high.  If we went to all the work of implementing SSL, only large storefronts usually go to the trouble of getting a CA cert, but most of those cases would still be better off to use bitcoin addresses.
I uploaded this change to SVN rev 156.  The switch to enable is "-allowreceivebyip".
Senders with this version will get the error "Recipient is not accepting transactions sent by IP address".  Older version senders will get "Transfer was not accepted".
I used a different name for the switch because "-allowiptransactions" sounds like it includes sending.  If there's a better name for the switch, we can change it again.
I don't know anything about any of the bug trackers.  If we were to have one, we would have to make a thoroughly researched choice.
We're managing pretty well just using the forum.  I'm more likely to see bugs posted in the forum, and I think other users are much more likely to help resolve and ask follow up questions here than if they were in a bug tracker.  A key step is other users helping resolve the simple stuff that's not really a bug but some misunderstanding or confusion.
I keep a list of all unresolved bugs I've seen on the forum.  In some cases, I'm still thinking about the best design for the fix.  This isn't the kind of software where we can leave so many unresolved bugs that we need a tracker for them.
The lines it's tripping on:
So it's acting like nothing is defined, not even map and vector.
Yet, db.h is included by headers.h (and only there, nowhere else) which includes vector, map, util.h and everything before db.h.
Is VC trying to use precompiled headers and screwing it up?  Could there be some leftover precompiled header files in your directory from previously failed attempts that it's finding and using?
There's an installer package now that makes it really easy to install MinGW.  Don't use the latest version 4.5.0, use a few versions back like 4.4.1 (1.908.0) or 1.812.0.  A setup program completely installs everything, it's not hard like it used to be.  I think the only thing I had to do was rename make*.exe something to make.exe.
Off topic, but: It would be nice if someone would hack on getting tcatm's 4-way 128-bit SSE2 code working on Windows.  There's something with MinGW's optimisation, I'm not sure but maybe a problem with 16-byte alignment on the stack, that makes it segfault.  With some fiddling, I was able to get his code to work in a test program, but not in Bitcoin itself for some reason.
Bouncing between 0 and 2 connections could be if it's connecting to itself.  Are you using the "-connect" switch?
Did you compile it or is this a release build, and what version?
I'm not sure how the 200Kb/sec, since it waits at least a half second between connection attempts.  How fast is it flickering between 0 and 2 connections?  Faster than twice a second?
The wait function on linux is:
If that doesn't work right, then it would be possible for it to spin through the loop as fast as it can.
If the only library is closed source, then there's a project to make an open source one.
If the only library is GPL, then there's a project to make a non-GPL one.
If the best library is MIT, Boost, new-BSD or public domain, then we can stop re-writing it.
I don't question that GPL is a good license for operating systems, especially since non-GPL code is allowed to interface with the OS.  For smaller projects, I think the fear of a closed-source takeover is overdone.
Trying it without the DB_PRIVATE flag in rev 153.  We need to keep an eye on what's different.
On Windows at least, it creates six __db.001 - __db.006 files with sizes from 24K to 4MB.  It doesn't delete them on exit, it just leaves them behind.
The docs say it uses memory mapped files.  I assume they have the same file permissions as the database files, so the same user access restrictions apply.
Tests on Windows private LAN download of 78500 blocks:
with DB_PRIVATE     20 minutes 51 seconds
without DB_PRIVATE   20 minutes 51 seconds
I wasn't expecting them to come out exactly the same.
Is there a way to open BerkeleyDB exclusive?
DB_PRIVATE is the worst of both worlds.  DB_PRIVATE is not exclusive, but it does make it get screwed up if another process tries to access it at the same time.
I've dropped the DB_PRIVATE flag in rev 153.
Added in SVN rev 152
The fix is in SVN rev 151.
You will be able to send your stuck 0.01 (actually 0.01000010) when you next upgrade.
I think I know what happened.  Doubleclick on the generated transaction.  It probably has a sub-0.01 transaction fee in it.
Someone has been paying a 0.00000010 transaction fee.  I don't think you can even set that with -paytxfee, I think you'd have to modify the code to do it.  Your generated block is worth 50.00000010, so when you try to send the whole thing you have 0.00000010 left over for the change, which triggers the dust spam 0.01 fee.
It would normally be harmless except in this corner case.  I should add a special case to CreateTransaction to handle this.
What version is the one where this happened?  Release build, or built it yourself?  Which operating system?
Were you sending by IP or by Bitcoin Address?
When you sent 49.99, did it prompt you to pay a 0.01 fee?
There was a change in GetMinFee, but I can't see how it would cause this.  It only starts to apply when a block gets huge.
The reason for the difference in block number is the number displayed was reduced by 1 in 0.3.11 because it made more sense that way.
SVN rev 150 has some code to try to auto-detect whether to use 4-way SSE2.  We need this because it's only faster on certain newer CPUs that have 128-bit SSE2 and not ones with 64-bit SSE2.
It uses the CPUID instruction to get the CPU brand, family, model number and stepping.  That's the easy part.  Knowing what to do with the model number is the hard part.  I was not able to find any table of family, model and stepping numbers for CPUs.  I had to go by various random reports I saw.
Here's what I ended up with:
I saw some sporadic inconsistent model numbers for AMD CPUs, so I'm not sure if this will catch all capable AMDs.
If it's wrong, you can still override it with -4way or -4way=0.
It prints what it finds in debug.log.  Search on CPUID.
This is only enabled if built with GCC.
Did you try -4way?
AMD Phenom (I think 4-core) CPUs are doing about 11,000khps with -4way, about 100% speedup.  24 cores should get 66,000khps.  AMD is the best choice because it has the best SSE2 implementation. (or maybe because tcatm had an AMD and optimised his code for that)
There's been so much else to do that I haven't had time to make -4way automatic.  For now you still have to do it manually.
Bitcoin clients currently only create and recognize transactions that match two possible templates.
Those are some quick tests that loosely check if transactions fit some general metrics that those standard transactions fit.  Nodes will only work on adding those transactions to their block.
In the future, if we add more templates to the existing 2 types of transactions, we can change the "rather not work on nonstandard transactions" test to accept them.
Currently, paying a fee is controlled manually with the -paytxfee switch.  It would be very easy to make the software automatically check the size of recent blocks to see if it should pay a fee.  We're so far from reaching the threshold, we don't need that yet.  It's a good idea to see how things go with controlling it manually first anyway.
It's not a big deal if we reach the threshold.  Free transactions would just take longer to get into a block.
I did a rough tally of 4000 blocks from around 74000-78000.  This is excluding the block reward transactions:
There were average 2 transactions per block, 17 transactions per hour, 400 transactions per day.
Average transaction bytes per block was 428 bytes, or 214 bytes per transaction.
The current threshold is 200KB per block, or about 1000 transactions per block.  I think it should be lowered to 50KB per block.  That would still be more than 100 times the average transactions per block.
The threshold can easily be changed in the future.  We can decide to increase it when the time comes.  It's a good idea to keep it lower as a circuit breaker and increase it as needed.  If we hit the threshold now, it would almost certainly be some kind of flood and not actual use.  Keeping the threshold lower would help limit the amount of wasted disk space in that event.
Version 0.3.12 is now available.
Features:
- json-rpc errors return a more standard error object. (thanks to <PRESIDIO_ANONYMIZED_PERSON>)
- json-rpc command line returns exit codes.
- json-rpc "backupwallet" command.
- Recovers and continues if an exception is caused by a message you received.  Other nodes shouldn't be able to cause an exception, and it hasn't happened before, but if a way is found to cause an exception, this would keep it from being used to stop network nodes.
If you have json-rpc code that checks the contents of the error string, you need to change it to expect error objects of the form {"code":<number>,"message":<string>}, which is the standard.  See this thread:
Download:
Another option is to reduce the number of free transactions allowed per block before transaction fees are required.  Nodes only take so many KB of free transactions per block before they start requiring at least 0.01 transaction fee.
The threshold should probably be lower than it currently is.
I don't think the threshold should ever be 0.  We should always allow at least some free transactions.
Can you build?
Try changing line 78 of init.cpp from:
If that works, I'll change the source.  It should work.
rpc backupwallet <destination> is in SVN rev 147.
Thanks.
This is in SVN rev 147.
This is more standard, and although json-rpc 1.0 didn't specify the format of error objects, it did specify that they would be
not strings or other values, so we needed to change this to be correct.  The code/message members have become standard in later json-rpc specs.
If you have code that checks the error and expects a string, you'll need to change it.  When there is an error, the error member is now an object not a string.
Also in SVN rev 147:
- The command line json-rpc returns the error code as its exit code.  Exit codes can only be 0-255 on unix, so it's abs(code)%256.
- The "backupwallet <destination>" command that was discussed in another thread.  It locks the wallet and copies it, so you can be sure you get a correct copy.
Any suggestions for better text to put for this error message so the next person will be less likely to be confused?
It's trying to tell them their clock is wrong and they need to correct it.
It's relying on 3 time sources:
1) the system clock
2) the other nodes, if within an hour of the system clock
if those disagree, then
3) the user (asking the user to fix the system clock)
I've thought about NTP, but this is more secure.
You can probably just comment out the line
Let me know if it works, and watch if it memory leaks.
It looks like a template class to make sure the derived class defines its own version of allocate and deallocate.  It would be weird if that was the actual problem and it made it all the way to release.  Probably a false alarm.
The code assumes little-endian throughout and was written with the intention of never being ported to big-endian.  Every integer that is sent over the network would have to be byte swapped, in addition to many dozens of other places in code.  It would not be worth the extra sourcecode bloat.
Big-endian is on its way out anyway.
What OS?  I ran the Windows and 64-bit Linux version and checked the about dialog.
The Mac version is still 0.3.10.1.
I updated the first post to be more specific.  Only the -4way code is compiled this way.
The simplification is intentional.  There will only be more than one thash[7]=0 in one out of 134,217,728 cases.  It only makes it 0.0000007% slower.
Version 0.3.11 is now available.
Changes:
- Some blk*.dat checking on load
- Built the -4way code with -march=amdfam10, which makes it a little faster
- Warning if your clock is too far off
- Warnings/errors/alerts can also be seen in the getinfo command
- Alert system
The alert system can display notifications on the status bar to alert you if you're running a version that needs to be upgraded for an important security update.
In response to an alert, your node may also go into safe mode, which disables the following json-rpc commands (used by automated websites) to protect it from losing money until you get a chance to upgrade:
If you decide it's a false alarm and want to take your chances, you can use the switch -disablesafemode to re-enable them.
This is an important safety improvement.  For a large segment of possible problems, this can warn everyone immediately once a problem is discovered and prevent them from acting on bad information.
Nodes keep operating and do not stop generating in response to an alert, so old versions may still try to make a fork, but the alert system can make sure users are warned not to act on anything in the fork.
Download:
As a thought experiment, imagine there was a base metal as scarce as gold but with the following properties:
- boring grey in colour
- not a good conductor of electricity
- not particularly strong, but not ductile or easily malleable either
- not useful for any practical or ornamental purpose
and one special, magical property:
- can be transported over a communications channel
If it somehow acquired any value at all for whatever reason, then anyone wanting to transfer wealth over a long distance could buy some, transmit it, and have the recipient sell it.
Maybe it could get an initial value circularly as you've suggested, by people foreseeing its potential usefulness for exchange.  (I would definitely want some)  Maybe collectors, any random reason could spark it.
I think the traditional qualifications for money were written with the assumption that there are so many competing objects in the world that are scarce, an object with the automatic bootstrap of intrinsic value will surely win out over those without intrinsic value.  But if there were nothing in the world with intrinsic value that could be used as money, only scarce but no intrinsic value, I think people would still take up something.
(I'm using the word scarce here to only mean limited potential supply)
Bitcoins have no dividend or potential future dividend, therefore not like a stock.
More like a collectible or commodity.
That's kind of interesting as an upside-down bar chart of how many blocks were produced each day.  The target is 144 blocks per day.
Sorry, I've been so busy lately I've been skimming messages and I still can't keep up.
We want to avoid Windows API calls whenever possible.  They usually take about 6-8 parameters and a lot of testing to get right, it takes a page of code to do something simple.
I usually shy away from iostreams.  Seems like I too often hit limitations.  They kind of botched the C++ streams standard in the 90's, which is too bad, streams can be very powerful and useful when done right.  Using it in rpc.cpp may still turn out to be a mistake.
Bottom line is I'd rather call an existing file copy function than make and test my own.
I doubt there's an mmap(2) on Windows.  I'd rather call an existing file copy function than make and test my own.
Thanks.  I thought it would be in there somewhere.
We already use boost::filesystem in a dozen places.  It's not a new added dependency.  It gives us a lot of portable stuff that we would otherwise have to have a #ifdef for each OS and test everywhere.
If you read it into memory and write it out, it could fail in tight memory situations.
I'm looking for something like copyfile(const char* from, const char* to) or copyfile(path from, path to), preferably something in Boost if it has it.  If you find it for me, it's more likely I'll get to implementing it.
We require Boost for JSON and a dozen things replacing dependencies on wxWidgets.  Boost is good, portable stuff, we should not shy away from it.
Try -datadir=
Last time I tried $(shell /usr/bin/wx-config), there was immediate hollering about build problems with it.  There wasn't time to investigate at the time.
One problem with $(shell /usr/bin/wx-config) is it will pick up any version (wx 2.8 ) and any configuration (non-UTF-8 ) of wxWidgets that happens to be there.  -lwx_gtk2ud-2.9 only matches the right configuration.  It fails if wxWidgets was built with the wrong configuration.
Did they say why they were baffled?
Why is it there?  Was it included by the OS, or did you have to build it?  If you built it, I wonder why it would put itself in a different place.
Has wxWidgets 2.9 finally started to become available as a debian package?
Maybe we should do this:
Again, those paths help make sure it's only 2.9 and will fail with 2.8.
wxWidgets 2.8 comes in ANSI and UTF-16, both wrong for us.  It's tempting because it's so easily available as a package; a lot of people were frustrated by it until we started hardcoding 2.9 into the makefile.
I started posting in the other topic but I'll repeat here, this thread seems more specific to the topic.
The main backup improvement will be a pre-generated pool of keys and a rescan at load to scrape missed transactions from the block history.  Then a backup will last forward for a long time.
I was starting to post the same idea you said nelisky.
How about a json-rpc command that locks the wallet, flushes it, copies wallet.dat to a location you specified, then unlocks it?  That would be a smaller project than the pooled keys, so maybe it could be done first.
What's the simplest portable way to copy a file?  Is there something in Boost?
What should it be named?  maybe:
Any backup process/procedure would just be a stopgap until there's time to properly work on coding solutions in software.  We can try to use words to help the situation until code gets there.
The main backup improvement will be pre-made pool of keys, and a rescan at load to scrape missed transactions from the block history.  Then a backup will last forward for a long time.
Can you provide more details about what removing DB_PRIVATE does?
I can't remember if I had a specific reason for DB_PRIVATE, or if I just copied the flags from some example code.  Does removing DB_PRIVATE make it safe for other processes to open the database simultaneously?  That may be an improvement, depending what the side effects are.  Does it substantially reduce performance by making it have to write out every change immediately or do other coordination?  Are there additional locking or coordination files then?  What else changes?  You could test by timing an initial block download with and without DB_PRIVATE, preferably -connect-ing to a local machine so network isn't a factor.
Apparently, DB_PRIVATE doesn't do what you would hope it would do, which is prevent other processes from being able to open the database.  It still lets them, it just screws up if they do.  Another option, if there's a way, would be to make it lock the database files so they can't be accessed by other processes.
My apologies, your post was indeed a question not a statement.
getinfo has a new field that shows any alert messages or other errors that would be displayed on the status bar.
The rpc methods return a json-rpc error with the error description "Safe mode: " followed by additional text specified by the alert.
I added the switch "-testsafemode" for you.  SVN rev 145.
This stuff is very new and may still be subject to change.
Many switches are intentionally undocumented, like if their functionality is still under construction or I haven't settled on their name yet, or just test code not intended for release.
-4way should eventually be replaced by an auto-detect.
WRT the alert system, who cares?  The most the key can do is temporarily disable six json-rpc commands until the site owners either add the -disablesafemode switch or upgrade.  All nodes keep running and generating, the network stays up.  If I'm not available, any script kiddie can figure out how to add two characters and make a new version that disables the alert system.  It would be a temporary inconvenience only.
This is what makes me think the people objecting don't know what they're talking about.  It can't "shut down the complete network".
I changed the switch name to -disablesafemode.
It can't do arbitrary actions remotely.  Maybe some of you are responding to other posters who suggested the alert system should do more?
If there is an alert, the following json-rpc methods return an error:
The remaining 14 methods function as normal.
I believe the safer option should be enabled by default.  If you want your server to keep trading and ignore an alert saying the money its receiving might be like the money from the overflow bug, then you can use the switch and not blame anyone else if you lose your money.
Worst case if you leave alerts enabled, your site stops trading until you upgrade or add the -disablesafemode switch.
Getting surprised by some temporary down time when your node would otherwise be at risk is better than getting surprised by a thief draining all your inventory.
Someday when we haven't found any new bugs for a long time and it has been thoroughly security reviewed without finding anything, this can be scaled back.  I'm not arguing that this is the permanent way of things forever.  It's still beta software.
This is in SVN rev 142 as version 0.3.11.
If you're so paranoid that you're getting hysterical over this, then surely you're paranoid enough that if a warning message displays on the status bar, you'll check the website and forum.
I think if another bug like the overflow bug occurs, it's important that automated websites stop trading until their admins can check out what's going on and decide what to do.  If you decide it's a false alarm and want to take your chances, you can use the "-disablesafemode" switch.
This probably explains why hyperthreading increases performance with -4way.  If three SSE2 units is excessive, then hyperthreading would help keep them all busy.
Hey Zooko!
I wanted to thank you for posting about Bitcoin on your blog a year or two ago, back when I announced it on the Cryptography mailing list.
I've been working on writing the alert system.  Alerts are broadcast through the network and apply to a range of version numbers.  Alert messages are signed with a private key that only I have.
Nodes can do two things in response to an alert:
- Put a warning message on the status bar.
- Make the money handling methods of the json-rpc interface return an error.
In cases like the overflow bug or a fork where users may not be able to trust received payments, the alert should keep old versions mostly safe until they upgrade.  Manual users should notice the status bar warning when looking for received payments, and the json-rpc safe mode stops automated websites from making any more trades until they're upgraded.
The json-rpc methods that return errors during an alert are:
Thanks for clearing that up.  I read the link someone posted about AMD making that change around 2007, but I didn't know what the story was for Intel.
There's no hope for Core/Core2 then.  They only have half the SSE2 hardware.
Strange that Intel has 3 128bit units, but AMD with 2 128bit units is the faster one.
Search debug.log for "proof-of-work found".  If you find any, then check for any errors right after that.
The margin is 2 hours.
This should be solved in SVN rev 141 and the next release (0.3.11+).  It'll pop up a message box alerting you if your clock is off by more than an hour.
The clock part will be covered in the next release (0.3.11 or higher).  SVN rev 141 pops up a message box if your clock is too far off.
That's right.  You don't need to be re-broadcasting your transactions for it to work.
When any node disconnects a fork, it dumps all the transactions from the fork back into the transaction pool to add to the new chain.  The entire network is making sure to re-integrate your transactions again.  All you should see is that your number of confirmations starts over from 0.
In some types of forks, your transaction would have gotten into both forks already, so you're already good either way.
I'm not sure what to call it, but we could use a post that lists these things users should know.  If someone has time to write it, here's the list:
- Make sure your clock is set correctly.
- Microsoft Security Essentials.  This never got written up proper.
- Warning not to mess around with your wallet.dat file.  It's a database file, it's not as simple as you think.  In this Beta version, we haven't had time to try and tinker-proof it yet.  It may not work as expected if you start swapping it around.
Make sure your computer's date and time are correct.
That's the first I've heard anyone say i5 was slower.  Everyone else has said 4way was faster on i5.  Moreso with hyperthreading enabled.
Good, so I take it that's a confirmation that it's working on Mac as well?
Laszlo told me he did compile in the -4way stuff on Mac, so the -4way switch is also available to try on Mac.  I don't think makefile.osx on SVN has it yet, just the built version.
That's a really well written walkthough.  Someone should confirm if they followed it and didn't run into any snags.
wxWidgets 2.9 is their first UTF-8 version.  We are UTF-8 on all platforms including Windows.
The distro packages of 2.8 are UTF-16, so they just trip people up.  People had endless build problems with 2.8 and its wxString UTF-16/ANSI conditional build options until we standardized on 2.9.  Also, to use 2.8, we were using ANSI, which was just a temporary stopgap until wxWidgets supported UTF-8.
This is a problem that will solve itself.  With time, 2.9 will become a more mainline release.
In the next SVN rev, I'll make it only go back to the last checkpoint at block 74000.  If we need to correct a problem in the future, we can always make sure it goes back at least as far back as the problem.  Also, I'm adding code to verify the block index, which means the proof-of-work chain is checked.
Still, the system won't be entirely secure against your blk*.dat files.  You are trusting someone if you use a copy of their blk files.
The performance numbers posted from a VIA C7's hardware SHA-256 weren't astronomical.  Only in the 1500 khash/s range.  If you think about it, just because it's implemented in hardware doesn't mean it's crazy fast.  It still has to do all the steps.  It's only if simplifying it down to single-purpose hardware makes it small enough to fit many in parallel.  That's not necessarily easy or a given.
Definitely.  The old screenshots of 0.1 are very outdated.
Windows Aero is a good choice.  Windows is still the largest user group.  Mind what's behind it for the transparent parts.
What to have displayed in the transaction list?  Not completely filled up with stuff, just a few things.
Total proof-of-work.
Un-upgraded nodes have the correct chain most of the time, but they are still trying to include the overflow transaction in every block, so they're continually trying to fork and generate invalid blocks.  If an old version node is restarted, its transaction pool is emptied, so it may generate valid blocks for a while until the transaction gets broadcast again.  0.3.9 and lower nodes still must upgrade.
The SVN now has the code we needed to automatically reorg the block chain without having to delete the blk*.dat files manually.  I knew I couldn't write that code fast and carefully enough yesterday, so I went with the quick manual option.
There is no way for the software to automatically know if one chain is better than another except by the greatest proof-of-work.  In the design it was necessary for it to switch to a longer chain no matter how far back it has to go.
The only exception to that is the manual checkpoints I've added.  If it weren't for those, it would be able to reorg all the way back to the first block.
SVN rev 139 does a basic check of the block chain after loading.
With this we wouldn't have needed to delete blk*.dat, it would have automatically done a reorg back to the fork.  There wasn't time to do a careful implementation of this at the time.
It might take longer than we want, since it has to load all the blocks.  If it's too slow, we could have it only go back to a certain block number.
This is what I ended up doing in SVN rev 139.
Instead of deleting the bad chain, I added an extra CheckBlock to ConnectBlock so bad blocks can't get back into the best chain once they're kicked out.
Done in SVN rev 137
I'd like to reduce the number of blocks displayed in the status bar by 1.   When you first load the program, it'll display 0 blocks instead of 1:
"0 connections    0 blocks     0 transactions"
It's always been "nBestHeight + 1" because it's counting the genesis block.  Technically, yes, the genesis block is a block.  It's a hardcoded block that you start out with.  You can't
have the genesis block.  Maybe think of it as a reference coin that you measure other coins against.  The block count people are looking for is the number of blocks they've downloaded.
The main benefit is that blocks will be equal to the block number of the current best block.  If blocks is 10, then the highest block number you have is 10.  It means you have block 10 and you don't have block 11.
It would reduce the confusion we had here:
That's a difficult approach.
We need to cause a reorg, which will disconnect the invalid chain.
This is code that will rarely ever get tested, and is fairly intricate, so something simple and safe is best.
Here's what I was thinking of.  (I haven't tested this yet)  It checks all the blocks in the main chain.  If it finds a bad one, it sets all that chain's bnChainWork to 0 so it can't win best chain again, and it reduces best chain work to the fork level so any new block after the fork will cause a reorg.  (It can't change pindexBest without actually doing a reorg)
This isn't perfect yet.  It still needs to receive one valid block to trigger the reorg.
It would probably be possible to initiate an AddToBlockIndex or Reorganize after the check, but it would require a lot more careful attention.  I probably should break out part of AddToBlockIndex that sets the new best block.  I'll probably end up doing that instead of the code below.
I wrapped sha256.cpp in
try it now.
It looks like we overtook the bad chain somewhere around 74689.  0.3.9 and lower nodes have been responding with the current block number for some hours now.
That means it's no longer necessary to delete blk*.dat before upgrading.  You can just upgrade and it'll reorg away the bad block chain.
Thanks to everyone for the quick response!
cpu family 6 model 26 stepping 4 is an Intel Core i7.
That's a 23% speedup with -4way, 63% total speedup with -4way + hyperthreading.
33% faster with hyperthreading than without it.
That works.
That's strange...  are we sure that's the same thing?  tcatm, try amdfam10 and make sure you get the same speed measurement.
GCC 4.3.3 doesn't support -march=amdfamk10.  I get:
Hey, you may be onto something!
hyperthreading didn't help before because all the work was in the arithmetic and logic units, which the hyperthreads share.
tcatm's SSE2 code must be a mix of normal x86 instructions and SSE2 instructions, so while one is doing x86 code, the other can do SSE2.
How much of an improvement do you get with hyperthreading?
Some numbers?  What CPU is that?
On Windows, findstr /c:"version message" debug.log
It looks like the bad chain was on block 74678 recently.  Can't wait to overtake it.
On the stats at there's been 5 blocks per hour in the last 3 hours.  We had a difficulty adjustment about a day ago that should have put it back to 6 blocks per hour.
The bad chain is also slowed down as more nodes upgrade.
We've already generated 14 blocks since 74638.  The builds of 0.3.10 were uploaded about 2 and 3 hours ago.  Of the nodes I'm connected to, more than half are already 0.3.10.  I would say we probably already have more power than the bad chain.
1) Once more than 50% of the node power is upgraded and the good chain overtakes the bad, the 0.3.10 nodes will make it hard for any bad transactions to get any confirmations.
2) If you didn't remove your blk*.dat files, you're not helping to contribute to that 50%, and you'll still show bad transactions until the good chain overtakes the bad chain.
If you still show 74638 blocks then you aren't connected to any 0.3.10 nodes.
For today, try adding these parameters:
-addnode=75.158.131.108 -addnode=99.27.237.13 -addnode=68.68.99.14
Right, it will get reincorporated into the fixed chain.  The transaction won't disappear, it'll still be visible on both sides, but the confirmation count will jump back to 0 and start counting up again.
It's only if you generated a block in the bad chain after block 74638 that the 50 BTC from that will disappear.  Any blocks in the bad chain wouldn't have matured yet.
For now, can some people running 0.3.10 with static IP who can receive incoming connections post their IP?  Then we can -addnode= them and make sure to connect to at least one 0.3.10 node.
I suspect there's some difficulty receiving blocks if all the nodes you're connected to are 0.3.9 or lower.  We need enough of us so that at least one node you connect to will be 0.3.10.  The problem will start to go away when we make up more than 1/8th of the network.
It'll help if you port forward so you can get lots of connections.
Version 0.3.10 patches the block 74638 overflow bug.
The Linux version includes tcatm's 4-way SSE2 SHA-256 that makes generating faster on i5, i7 (with hyperthreading) and AMD CPU's.  Try the "-4way" switch to enable it and check if it's faster for you.
Download from sourceforge:
It is no longer necessary to delete blk*.dat.  The good block chain has overtaken the bad block chain, so you can just upgrade and it'll automatically reorg away the bad block chain.
Agree, wanted to do that for a long time, haven't had time to do it.
For now, you could also subscribe to the bitcoin-list mailing list.  It rarely gets used except for announcements like this and major new versions.
Starting at 67000 is
Yeah, at the moment you'll stop at 74638.  It should start slowly creeping up as more nodes upgrade and generate.
Linux build links below.
The Linux version includes tcatm's 4-way SSE2 SHA-256 that makes generating faster on i5 and AMD CPU's.  Use the "-4way" switch to enable it and check if it's faster for you.
Download links:
Just leave the old one alone!  Older is better.  What block number is it?  Anywhere from 60000-74000 is good.  The one that you've had available for a while has been vetted and is the best choice.
Don't update the block chain download.  When you take someone's block chain download, you don't want it right up to the end.  A somewhat old one is better so it can download and verify the most recent blocks.
tcatm's 4-way SSE2 SHA-256 is in the file sha256.cpp and already uploaded a few revs ago.
I just now uploaded rev 134 which is the makefile.unix that enables building with it on Linux.  If you build rev 134 on Linux now you'll get the -4way switch.
If you have problems building because of it, then edit makefile.unix and:
- remove -DFOURWAYSSE2
- remove obj/sha256.o from the end of these lines:
bitcoin: $(OBJS) obj/ui.o obj/uibase.o obj/sha256.o
bitcoind: $(OBJS:obj/%=obj/nogui/%) obj/sha256.o
The 0.3.10 linux build
have the -4way option when I build it.
Here are the patch downloads for Windows:
Steps:
1) Shut down.
2) Download knightmb's blk files and replace your blk0001.dat and blkindex.dat files.
3) Upgrade to 0.3.10.
4) It should start out with less than 74000 blocks and redownload the rest.
Or if you don't want to mess with downloading blk files, you can just do this:
1) Shut down.
2) Delete (or move) blk*.dat
3) Upgrade to 0.3.10.
4) It redownloads all blocks, probably take about an hour.
Patch is uploaded to SVN rev 132!
For now, recommended steps:
1) Shut down.
2) Download knightmb's blk files.  (replace your blk0001.dat and blkindex.dat files)
3) Upgrade.
4) It should start out with less than 74000 blocks. Let it redownload the rest.
If you don't want to use knightmb's files, you could just delete your blk*.dat files, but it's going to be a lot of load on the network if everyone is downloading the whole block index at once.
I'll build releases shortly.
Once you have an update, you could download knightmb's block chain.  You'll want one that's old enough that it ends
block 74000 so the most recent security lockin will check it.  Can someone find the link for that?
It would help if people stop generating.  We will probably need to re-do a branch around the current one, and the less you generate the faster that will be.
A first patch will be in SVN rev 132.  It's not uploaded yet.  I'm pushing some other misc changes out of the way first, then I'll upload the patch for this.
Here's the preliminary change.  Look right?  I have more changes to make, this isn't all of it.  Will SVN shortly.
Don't sticky the topic, nobody looks up there.  There'll be enough posts to bump.
I just uploaded a quick build so testers can check if I built it right.  (I don't have an i5 or AMD)  If it checks out, I'll put together the full package and do all the release stuff.
I hope someone can test an i5 or AMD to check that I built it right.  I don't have either to test with.
I'm also curious if it performs much worse on 32-bit linux vs 64-bit.
The idea was the main part.  When you posted your patch, I realized it should have been done that way instead of "-?".  I always had reservations about "-?" because it intrudes on the possible parameter values, and the help response is based on the version of the caller instead of the server.
Some places where generation will gravitate to:
1) places where it's cheapest or free
2) people who want to help for idealogical reasons
3) people who want to get some coins without the inconvenience of doing a transaction to buy them
There are legitimate places where it's free.  Generation is basically free anywhere that has electric heat, since your computer's heat is offsetting your baseboard electric heating.  Many small flats have electric heat out of convenience.
How expensive is heating oil?  With the price of oil so high, if it's actually more expensive than electric, then generating would have negative cost.
There's also kids putting it on their parent's power bill, employees their employer, botnets, etc.
Case 3 comes into play for small amounts.  The overhead of doing an exchange doesn't make sense if you just need a small bit of pocket change for incidental micropayments.  I think this is a nice advantage vs fiat currency, instead of all the seigniorage going to one big entity, let it go in convenience amounts to people who need to scrape up a small amount of change.
0.3.10 has tcatm's 4-way SSE2 as an option switch.
Use the switch "-4way" to turn it on.  Without the switch you get Crypto++ ASM SHA-256.
I could only get this working with Linux.
Please report back your CPU and results!  I think it's pretty clear that Core 2 and lower are slower, i5 faster.  I don't think we've heard any i7 results yet.  We need to know about the different models of AMD or other less common CPUs.
On both MinGW GCC 4.4.1 and 4.5.0 I have it working with test.cpp but SIGSEGV when called by BitcoinMiner.  So now it doesn't look like it's the version of GCC, it's something else, maybe just the luck of how the stack is aligned.
I have it working fine on GCC 4.3.3 on Ubuntu 32-bit.
I found the problem with Crypto++ on MinGW 4.5.0.  Here's the patch for that:
MinGW GCC 4.5.0:
Crypto++ doesn't work, X86_SHA256_HashBlocks() never returns
I only got 4-way working with test.cpp but not when called by BitcoinMiner
MinGW GCC 4.4.1:
Crypto++ works
4-way SIGSEGV
GCC is definitely not aligning __m128i.
Even if we align our own __m128i variables, the compiler may decide to use a __m128i behind the scenes as a temporary variable.
By making our __m128i variables aligned and changing these inlines to defines, I was able to get it to work on 4.4.1 with -O0 only:
But that's with -O0.
Got the test working on 32-bit with MinGW GCC 4.5.  Exactly 50% slower than stock with Core 2.
If you haven't already, try aligning thash.  It might matter.  Couldn't hurt.
No help from -O0, same error.
MinGW is GCC 3.4.5.  Probably the problem.
I'll see if I can get a newer version of MinGW.
MinGW on Windows has trouble compiling it:
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://www.mingw.org/bugs.shtml> for instructions.
make: *** [obj/sha256.o] Error 1
It's too soon to start junking up the API for backward compatibility at all costs.
Just return "<txid>".
I'm not grasping your idea yet.  Does it hide any information from the public network?  What is the advantage?
If at least 50% of nodes validated transactions enough that old transactions can be discarded, then everyone saw everything and could keep a record of it.
Can public nodes see the values of transactions?  Can they see which previous transaction the value came from?  If they can, then they know everything.  If they can't, then they couldn't verify that the value came from a valid source, so you couldn't take their generated chain as verification of it.
Does it hide the bitcoin addresses?  Is that it?  OK, maybe now I see, if that's it.
Crypto may offer a way to do "key blinding".  I did some research and it was obscure, but there may be something there.  "group signatures" may be related.
There's something here in the general area:
What we need is a way to generate additional blinded variations of a public key.  The blinded variations would have the same properties as the root public key, such that the private key could generate a signature for any one of them.  Others could not tell if a blinded key is related to the root key, or other blinded keys from the same root key.  These are the properties of blinding.  Blinding, in a nutshell, is x = (x * large_random_int) mod m.
When paying to a bitcoin address, you would generate a new blinded key for each use.
Then you need to be able to sign a signature such that you can't tell that two signatures came from the same private key.  I'm not sure if always signing a different blinded public key would already give you this property.  If not, I think that's where group signatures comes in.  With group signatures, it is possible for something to be signed but not know who signed it.
As an example, say some unpopular military attack has to be ordered, but nobody wants to go down in history as the one who ordered it.  If 10 leaders have private keys, one of them could sign the order and you wouldn't know who did it.
Here's a test build if you'd like to help test before 0.3.9 is released.
(or if you'd rather get upgrading out of the way now instead of waiting)
Linux please test rc2 instead.  This adds a -4way switch for tcatm's 4-way SSE2.  This will only be for Linux:
Please report back your results
Which doesn't matter because you can't access sourceforge to download the software either.
If you've ever been connected before, you don't need IRC to bootstrap anymore.  Even if you haven't, you can bootstrap from seed nodes.  IRC is completely redundant since 0.3.0.
No, that's not what it is.
-paytxfee allows you to include a transaction fee with your transactions.  If transaction confirmations become slow, you can get priority by using "-paytxfee=0.01".  Any transactions you send would cost an extra 0.01.  There's no reason to use more than 0.01.
It's just there in case we need it.  It probably won't be needed, and it can be explained more if we do.
That big of a difference in speed, by a factor of 4 or 6, feels like it's likely to be some quirky weak spot or instruction that the old chip is slow with.  Unless it's a touted feature of the i5 that they made SSE2 six times faster.
A quick summary:
My system went from ~7100 to ~4200.
This particular system has dual Intel Xeon Quad-Core CPUs (E5335) @ 2.00GHz.
on an Intel Core 2 Duo T7300 running x86_64 linux it was 55% slower compared to the stock version (r121)
My Core2Quad (Q6600) slowed down 50%,
my i5 improved ~200%,
on an AMD Opteron 2374 HE running x86_64 linux I got a 105% improvement (!)
Fixed in SVN rev 130.
True, there would probably be someone with a dial-up modem or satellite dish internet.  Rarer would be someone who has both that and the wired internet that has the outage, but if it's a big enough segment to matter, out of a million people there's bound to be a multi-home geek.
ISP network cuts are just your local area.  If you still have communication with the rest of your area, it would probably be something like 1/1000 of the world or less.  Block generation in the segment would take several hours per block.
I favour the plan to monitor if the frequency of blocks received drops too slow.  That covers a large range of possibilities.
Misc bugfixes in rev 130:
fix -datadir with relative path
autostart is now off by default except on windows
fix occasional "vector iterator not dereferencable" assertion when compiled with msvc
fix readlink compile warning on linux build
use sys/param.h and BSD define instead of __BSD__
-paytxfee switch, e.g. -paytxfee=0.01
This is in SVN rev 130.  Check that it compiles right.
Are you back to talking about the existing Bitcoin system here?
I was talking about in the hypothetical system I was describing, if the network doesn't know the values and lineage of the transactions, then it can't verify them and vouch for them, so the clients would have to keep the history all the way back.
If a client wasn't present until recently, the two ways to convince it that a transaction has a valid past is:
1) Show it the entire history back to the original generated coin.
2) Show it a history back to a thoroughly deep block, then trust that if so many nodes all said the history up to then was correct then it must be true.
But if the network didn't know all the values and lineage of the transactions, it couldn't do 2), I don't think.
That code was a bad idea anyway, I'm deleting it.  Any Mac code should only use __WXMAC_OSX__, not __WXMAC__ or __WXOSX__, and we should stop using __BSD__.
Will that definitely cause BSD to be defined on Mac?
It would be nice to keep the blk*.dat files small as long as we can.
The eventual solution will be to not care how big it gets.
But for now, while it's still small, it's nice to keep it small so new users can get going faster.  When I eventually implement client-only mode, that won't matter much anymore.
There's more work to do on transaction fees.  In the event of a flood, you would still be able to jump the queue and get your transactions into the next block by paying a 0.01 transaction fee.  However, I haven't had time yet to add that option to the UI.
Scale or not, the test network will react in the same ways, but with much less wasted bandwidth and annoyance.
It doesn't have to be such a breaking change.  New nodes could accept old transactions for a long time until most nodes have already upgraded before starting to refuse transactions without PoW.  Or, they could always accept old transactions, but only a limited number per time period.
I've thought about PoW on transactions many times, but usually I end up thinking a 0.01 transaction fee is essentially similar and better.  0.01 is basically a proof of work, but not wasted.  But if the problem is validating loads of transactions, then PoW could be checked faster.
A more general umbrella partial solution would be to implement the idea where an unlikely dropoff in blocks received is detected.  Then an attacker would still need a substantial portion of the network's power to benefit from a DoS attack.
+1
Any demonstration tests at this point would only show what we already know, and divert dev time from strengthening the system to operational fire fighting.
You can get away with backing up without stopping the client if you don't do anything or receive a payment within a few seconds before the backup.  (like 5 seconds)
No, it doesn't usually empty your wallet with each transaction.  It uses the smallest set of coins it can find to add up to near the amount.  In this case, unfortunately, his wallet had a single 9000 BTC bill in it, and it had to break it to get 1 BTC and 8999 BTC change.
Still thinking this idea through...
The only job the network needs to do is to tell whether a spend of an outpoint is the first or not.
If we're willing to have clients keep the history for their own money, then some of the information may not need to be stored by the network, such as:
- the value
- the association of inpoints and outpoints in one transaction
The network would track a bunch of independent outpoints.  It doesn't know what transactions or amounts they belong to.  A client can find out if an outpoint has been spent, and it can submit a satisfying inpoint to mark it spent.  The network keeps the outpoint and the first valid inpoint that proves it spent.  The inpoint signs a hash of its associated next outpoint and a salt, so it can privately be shown that the signature signs a particular next outpoint if you know the salt, but publicly the network doesn't know what the next outpoint is.
I believe the clients would have to keep the entire history back to the original generated coins.  Someone sending a payment would have to send data to the recipient, as well as still communicating with the network to mark outpoints spent and check that the spend is the first spend.  Maybe the data transfer could be done as an e-mail attachment.
The fact that clients have to keep the entire history reduces the privacy benefit.  Someone handling a lot of money still gets to see a lot of transaction history.  The way it retrospectively fans out, they might end up seeing a majority of the history.  Denominations could be made granular to limit fan-out, but a business handling a lot of money might still end up seeing a lot of the history.
Updated SVN.  Thanks.
There's little hope of not repeatedly stumbling over that in the future.  It doesn't break the compile for me.
That makes it sound like it might somehow get lost and the parties can't get it even if they want to cooperate.
When you pay for something up front, you can't get it back either.  Consumers seem comfortable with that.  It's no worse than that.
Either party always has the option to release it to the other.
Then you must also be against the common system of payment up front, where the customer loses.
Payment up front: customer loses, and the thief gets the money.
Simple escrow: customer loses, but the thief doesn't get the money either.
Are you guys saying payment up front is better, because at least the thief gets the money, so at least someone gets it?
Imagine someone stole something from you.  You can't get it back, but if you could, if it had a kill switch that could be remote triggered, would you do it?  Would it be a good thing for thieves to know that everything you own has a kill switch and if they steal it, it'll be useless to them, although you still lose it too?  If they give it back, you can re-activate it.
Imagine if gold turned to lead when stolen.  If the thief gives it back, it turns to gold again.
It still seems to me the problem may be one of presenting it the right way.  For one thing, not being so blunt about "money burning" for the purposes of game theory discussion.  The money is never truly burned.  You have the option to release it at any time forever.
This is a very interesting topic.  If a solution was found, a much better, easier, more convenient implementation of Bitcoin would be possible.
Originally, a coin can be just a chain of signatures.  With a timestamp service, the old ones could be dropped eventually before there's too much backtrace fan-out, or coins could be kept individually or in denominations.  It's the need to check for the absence of double-spends that requires global knowledge of all transactions.
The challenge is, how do you prove that no other spends exist?  It seems a node must know about all transactions to be able to verify that.  If it only knows the hash of the in/outpoints, it can't check the signatures to see if an outpoint has been spent before.  Do you have any ideas on this?
It's hard to think of how to apply zero-knowledge-proofs in this case.
We're trying to prove the absence of something, which seems to require knowing about all and checking that the something isn't included.
SVN rev 128: disable SSE2 on 32-bit.  This may only disable it for MSVC and GCC.  Other compilers might have different 64-bit defines.
The heat from your computer is not wasted if you need to heat your home.  If you're using electric heat where you live, then your computer's heat isn't a waste.  It's equal cost if you generate the heat with your computer.
If you have other cheaper heating than electric, then the waste is only the difference in cost.
If it's summer and you're using A/C, then it's twice.
Bitcoin generation should end up where it's cheapest.  Maybe that will be in cold climates where there's electric heat, where it would be essentially free.
SVN rev 125:
- Always make 8 outbound connections even if have 8 inbound
- Limit outbound connections to one per a.b.?.? range
- Switch -maxconnections=#
I added the (currently undocumented) switch -maxconnections=#.  You shouldn't use it unless you need to because your router can't maintain a lot of connections, then try -maxconnections=30.
I haven't really tested -maxconnections much, could someone test it?
That's a good point, I believe you could run with generation off if you don't have SSE2.
How about add to the top of cryptopp/config.h:
that would disable SSE2 for 32-bit builds.  (at least with GCC or MSVC)
I uploaded 0.3.8.1 for Linux with re-built 64-bit.  I ran a difficulty 1 test with it and it has generated blocks.
int is good until 2106.  Surely the network will have to be totally revamped at least once by then.
There should not be any signed int.  If you've found a signed int somewhere, please tell me (within the next 25 years please) and I'll change it to unsigned int.
When we switched to Crypto++ 5.6.0 SHA-256 in version 0.3.6, generation got broken on the Linux 64-bit build.  Version 0.3.8.1 is on SourceForge with the 64-bit binary updated.
Future versions after 0.3.8 will probably require SSE2.  Anyone have Pentium 3 or older where this would be a problem?
I found that SSE2 only added a slight 2% speedup, which didn't seem worth the incompatibility.  I was trying to take the safer option.
It doesn't look to me like Crypto++ could be deciding whether to use SSE2 at runtime.  There's one place where it detects SSE2 for deciding some block count parameter, but the SSE2 stuff is all #ifdef at compile time and I can't see how that would switch at runtime.  Maybe I'm not looking in the right place.
Should we enable SSE2 in all the makefiles?  It seems like we must in case someone compiles with 64-bit.
I will recompile the 64-bit part of the Linux 0.3.8 release.
Sorry about that.  CRITICAL_BLOCK isn't perfect.  You have to be careful not to break or continue out of it.  There's an assert that catches and warns about break.  I can be criticized for using it, but the syntax would be so much more bloated and error prone without it.
Is there a chance the SSE2 code is slow on Intel because of some quirk that could be worked around?  For instance, if something works but is slow if it's not aligned, or thrashing the cache, or one type of instruction that's really slow?  I'm not sure how available it is, but I think Intel used to have a profiler for profiling on a per instruction level.  I guess if tcatm doesn't have a system with the slow processor to test with, there's not much hope.  But it would be really nice if this was working on most CPUs.
Here's an outline of the kind of escrow transaction that's possible in software.  This is not implemented and I probably won't have time to implement it soon, but just to let you know what's possible.
The basic escrow: The buyer commits a payment to escrow. The seller receives a transaction with the money in escrow, but he can't spend it until the buyer unlocks it. The buyer can release the payment at any time after that, which could be never. This does not allow the buyer to take the money back, but it does give him the option to burn the money out of spite by never releasing it. The seller has the option to release the money back to the buyer.
While this system does not guarantee the parties against loss, it takes the profit out of cheating.
If the seller doesn't send the goods, he doesn't get paid. The buyer would still be out the money, but at least the seller has no monetary motivation to stiff him.
The buyer can't benefit by failing to pay. He can't get the escrow money back. He can't fail to pay due to lack of funds. The seller can see that the funds are committed to his key and can't be sent to anyone else.
Now, an economist would say that a fraudulent seller could start negotiating, such as "release the money and I'll give you half of it back", but at that point, there would be so little trust and so much spite that negotiation is unlikely. Why on earth would the fraudster keep his word and send you half if he's already breaking his word to steal it? I think for modest amounts, almost everyone would refuse on principle alone.
Really?  Do you think people won't be able to understand the benefit?  (If your response is an argument that there's no benefit at all, I guess that will reinforce the case that people won't be able to understand it.)
It's the same situation as gold and gold mining.  The marginal cost of gold mining tends to stay near the price of gold.  Gold mining is a waste, but that waste is far less than the utility of having gold available as a medium of exchange.
I think the case will be the same for Bitcoin.  The utility of the exchanges made possible by Bitcoin will far exceed the cost of electricity used.  Therefore, having Bitcoin would be the net waste.
Each node's influence on the network is proportional to its CPU power.  The only way to show the network how much CPU power you have is to actually use it.
If there's something else each person has a finite amount of that we could count for one-person-one-vote, I can't think of it.  IP addresses... much easier to get lots of them than CPUs.
I suppose it might be possible to measure CPU power
For instance, if the CPU power challenge was only run for an average of 1 minute every 10 minutes.  You could still prove your total power at given times without running it all the time.  I'm not sure how that could be implemented though.  There's no way for a node that wasn't present at the time to know that a past chain was actually generated in a duty cycle with 9 minute breaks, not back to back.
Proof-of-work has the nice property that it can be relayed through untrusted middlemen.  We don't have to worry about a chain of custody of communication.  It doesn't matter who tells you a longest chain, the proof-of-work speaks for itself.
Once you get away from a system where each node's influence is proportional to their CPU power, then what else do you use to determine who is (approximately) one person?
A transaction can be written that requires two signatures to spend it next.  You write a payment that requires the signature of both the recipient and the sender to spend it.  To release the escrow, you give the recipient the signature for your half, or the payee can return it by giving you his signed half.  There's no mediator in this simple case.  The recourse is to refuse to ever release it, essentially burning the money.
If you're only going to have one person work on building the block, that could take days.  Oh, do you mean send a different variation to each node with the tx fee written to them?
The way it is now, it's whoever builds this gets it.
If we needed to, we could have a BitTorrent-esque tit-for-tat for transaction broadcast.  Relay paying transactions to me, or I won't relay them to you.  It probably won't be an actual problem though.  It only takes one node relaying like it should to cancel out 7 others greedily not relaying.
I can't think of a way to implement that.  All the transaction fees would be additional transactions.  What about the transaction fees for the transaction fee's transaction?
It's not implemented.
It turned out nobody liked that mode of transfer anyway, so it hasn't had much development attention.
Silently failing would look bad.
Definitely needed.  What rate are you thinking of?  Ultimately, it's better to rate limit it than to let it all drain out.
That might work surprisingly well.  If it works, it keeps them from hitting the rate limit, but the rate limit is there as the last line of defence.
Definitely time to lower it.
I don't know a way to implement that.  The transaction fee to the block creator uses a special trick to include the transaction fee without any additional size.  If there was a transaction for each transaction fee, then what about the transactions fees for the transaction fee's transaction?
One alternative is to use a round-up system.  You pay for, say, 1000 pages or images or downloads or searches or whatever at a time.  When you've used up your 1000 pages, you pay for another 1000 pages.  If you only use 1 page, then you have 999 left that you may never use, but it's not a big deal because the cost per 1000 is still small.
Or you could pay per day.  The first time you access the site on a given day, you pay for 24 hours of access.
Per 1000 or per day may be easier for consumers to get their heads around too.  They worry about per item because it's harder to figure if it might add up too fast.  Unlimited for 24 hours they know what the cost will be.  Or if 1000 seems like plenty, they're not worrying that it's costing more with each click if they figure 1000 is more than they'll probably use.
Forgot to add the good part about micropayments.  While I don't think Bitcoin is practical for smaller micropayments right now, it will eventually be as storage and bandwidth costs continue to fall.  If Bitcoin catches on on a big scale, it may already be the case by that time.  Another way they can become more practical is if I implement client-only mode and the number of network nodes consolidates into a smaller number of professional server farms.  Whatever size micropayments you need will eventually be practical.  I think in 5 or 10 years, the bandwidth and storage will seem trivial.
I am not claiming that the network is impervious to DoS attack.  I think most P2P networks can be DoS attacked in numerous ways.  (On a side note, I read that the record companies would like to DoS all the file sharing networks, but they don't want to break the anti-hacking/anti-abuse laws.)
If we started getting DoS attacked with loads of wasted transactions back and forth, you would need to start paying a 0.01 minimum transaction fee.  0.1.5 actually had an option to set that, but I took it out to reduce confusion.  Free transactions are nice and we can keep it that way if people don't abuse them.
That brings up the question: if there was a minimum 0.01 fee for each transaction, should we automatically add the fee if it's just the minimum 0.01?  It would be awfully annoying to ask each time.  If you have 50.00 and send 10.00, the recipient would get 10.00 and you'd have 39.99 left.  I think it should just add it automatically.  It's trivial compared to the fees many other types of services add automatically.
No, not at all.
Bitcoin isn't currently practical for very small micropayments.  Not for things like pay per search or per page view without an aggregating mechanism, not things needing to pay less than 0.01.  The dust spam limit is a first try at intentionally trying to prevent overly small micropayments like that.
Bitcoin is practical for smaller transactions than are practical with existing payment methods.  Small enough to include what you might call the top of the micropayment range.  But it doesn't claim to be practical for arbitrarily small micropayments.
The software is designed to support things like this.  I was going to post details of the plans for Escrow, but since getting slashdotted I haven't had time.
I guess SourceForge hasn't updated its mirrors yet.  The files are there on the admin side, but not on the user side.  I have no idea how long that will take.  It's always been immediate in the past.
Edit: SourceForge is updated now.
I'd rather you didn't make a build of the 1000 node connecting version available.  It won't take very many people running that before we have to make another release just to limit the incoming connections.
Version 0.3.8 adds an important security improvement.  Everyone should upgrade to get this change.
The new safety feature displays a warning message in the status bar and locks down RPC if it detects a problem that may require an upgrade.
If it sees a longer chain, but it can't process it, then it knows something is wrong.  It displays "WARNING: Displayed transactions may not be correct!  You may need to upgrade." and makes most RPC commands return an error.  It still keeps generating as normal, which is necessary for the stability of the network.
There were important security updates in the versions before this too, so if you haven't upgraded recently, it's extremely important that you upgrade now!
Also, don't forget, we recently added 2.4x faster generating thanks to tcatm's mid-state caching optimisation and BlackEye's help getting ASM SHA-256 working.:
creighto: I agree with that idea.  After a few hours, it should be possible for the client to notice if the flow of blocks has dropped off by more than would be likely just by chance.  It could tell if it's not hearing the hum of the world anymore.
In practice, splits are likely to be very asymmetrical.  It would be hard to split the world down the middle.  More likely it would be a single country vs the rest of the world, lets say a 1:10 split.  In that case, it would take the minority fork 10 times as long to generate 100 blocks, so about 7 days.  Also it would be super easy for the client to realize it's hearing way too few blocks and something must be wrong.
There's no time limit.  Assuming you weren't spending coins generated in the minority fork, or spending someone's double-spends you received, your transactions can get into the other chain at any time later.
I guess we should try to support the case where there's no Content-Length parameter.  I don't want to rip and replace streams though, even if it has to read one character at a time.
Edit: That is, assuming there actually are any libraries that don't support Content-Length.
I urge you not to use BDB 4.8.  The database/log0000* files will be incompatible if anyone uses your build and then goes back to the official build.
Yes, 0.3.7 has it.  It was in rev 112.
The reason I didn't use protocol buffers or boost serialization is because they looked too complex to make absolutely airtight and secure.  Their code is too large to read and be sure that there's no way to form an input that would do something unexpected.
I hate reinventing the wheel and only resorted to writing my own serialization routines reluctantly.  The serialization format we have is as dead simple and flat as possible.  There is no extra freedom in the way the input stream is formed.  At each point, the next field in the data structure is expected.  The only choices given are those that the receiver is expecting.  There is versioning so upgrades are possible.
CAddress is about the only object with significant reserved space in it.  (about 7 bytes for flags and 12 bytes for possible future IPv6 expansion)
The larger things we have like blocks and transactions can't be optimized much more for size.  The bulk of their data is hashes and keys and signatures, which are uncompressible.  The serialization overhead is very small, usually 1 byte for size fields.
On Gavin's idea about an existing P2P broadcast infrastructure, I doubt one exists.  There are few P2P systems that only need broadcast.  There are some libraries like Chord that try to provide a distributed hash table infrastructure, but that's a huge difficult problem that we don't need or want.  Those libraries are also much harder to install than ourselves.
Is it 2x fast on AMD and 1/2 fast on Intel?
Tried that, but it doesn't work for things on the stack.  I ran some tests.
It doesn't even cause an error, it just doesn't align it.
"Minimize to the tray instead of the taskbar" & "Minimize to the tray on close" must not be implemented yet on the Mac.  We should grey them out in the next version.
Did it print anything to the console?  Are you sure you didn't run "bitcoind"?
Try version 0.3.7.
It can be built with Boost 1.37 or later.
It would be neat if someone had a page (like that handy calculator at
) that projects what the next difficulty adjustment will be.
For instance, if it already got half way to the next adjustment in only 3.5 days instead of 7, we would expect difficulty to double:
Also, it could show the predicted time when the next adjustment will occur, and tell when the last adjustment was and how much it changed.
That's amazing...
So are you saying you use 128-bit registers to SIMD four 32-bit data at once?  I've wondered about that for a long time, but I didn't think it would be possible due to addition carrying into the neighbour's value.
Except that wouldn't work for boost 1.40+ (on Ubuntu 10.04), where you need to get libboost-all-dev.
Seems they changed everything around in Boost recently, "-mt" and all that, makes it hard.
BTW, I tried Boost 1.34 but it didn't have the boost.interprocess stuff.
Mac OSX version is available now.  See bitcoin.org or the SourceForge link.
I can't understand why you're having so much pain.  I just followed the instructions in build-unix.txt.  I made a couple little corrections for Boost 1.37, which I'll put on SVN the next time I update it, noted below:
What are you needing to use listtransactions for?
The reason I didn't implement listtransactions is I want to make sure web programmers don't use it.  It would be very easy to latch onto that for watching for received payments.  There is no reliable way to do it that way and make sure nothing can slip through the cracks.  Until we have solid example code using getreceivedbyaddress and getreceivedbylabel to point to and say "use this! use this! don't use listtransactions!", I don't think we should implement listtransactions.
When we do implement listtransactions, maybe one way to fight that is to make it all text.  It should not break down the fields into e.g. comment, confirmations, credit, debit.  It could be one pretty formatted string like "0/unconfirmed   0:0:0 date   comment      debit 4  credit 0" or something so it's hard for programmers to do the wrong thing and process it.  It's only for viewing the status of your server.  I guess that would be kinda annoying for web interfaces that would rather format it into html columns though.
I don't get how it let you send if it was not matured.  Your balance would have been lower than the amount.  It would have said balance 0.01, right?  If I try that it says "you don't have enough money" or "Insufficient funds" from the command line.
How many blocks did it say it had left to mature when you sent?
There's a chance it might still go through.
Have you copied or moved your wallet.dat in any way?
We don't really need pre-compiled header.  It only makes it compile slightly faster.  I think I'll just get rid of it.  Even still, you'd still need to remember to "make -f makefile.unix clean" or delete headers.h.gch one more time to get rid of the leftover file.
Damn that GLIBC_2.11.  I thought I'd been careful not to accept any of the updates.
Yeah, acutely aware that I should have stayed on 9.04 or 9.10.  It's a lot more work to downgrade than upgrade and I've been squeezed for time.  Ubuntu is the most popular distro, so I'm staying with that.
If the transaction didn't go out immediately at first, like if you weren't connected at the time, it may take up to 2 hours to resend it.  Long term, it does keep relentlessly sending it.
I'll shorten that length of time in a future version.
You do need to have downloaded the complete block chain (currently 71040 blocks) before you'll see any confirms.  Same with the recipient.
Actually, it works well to just PM me.  I'm the one who's going to be fixing it.  If you find a security flaw, I would definitely like to hear from you privately to fix it before it goes public.
"./bitcoin: /lib64/libc.so.6: version `GLIBC_2.11' not found (required by ./bitcoin)" isn't a new problem that started with 0.3.6 is it?  This was built on the same OS installations as 0.3.0.
Unfortunately I upgraded to Ubuntu 10.04 before 0.3.0.  I will not upgrade anymore.  I don't know when I might have time to reinstall to downgrade, but at least by not upgrading, it'll gradually fix itself.
0.3.6 Linux build is back to the old makefile.unix.  It static links libjpeg so that shouldn't be a problem.
Is that working better?
If you got 22DbRunRecoveryException and you've used someone else's build before, you may need to delete (or move the files somewhere else) database/log.000000*
Windows and Linux users: if you got 0.3.5 you still need to upgrade to 0.3.6.
SVN is updated with version 0.3.6.
Uploading Windows build of 0.3.6 to Sourceforge now, then will rebuild linux.
Haven't had time to update the SVN yet.  Wait for 0.3.6, I'm building it now.  You can shut down your node in the meantime.
Please upgrade to 0.3.6 ASAP!  We fixed an implementation bug where it was possible that bogus transactions could be displayed as accepted.  Do not accept Bitcoin transactions as payment until you upgrade to version 0.3.6!
If you can't upgrade to 0.3.6 right away, it's best to shut down your Bitcoin node until you do.
Also in 0.3.6, faster hashing:
- midstate cache optimisation thanks to tcatm
- Crypto++ ASM SHA-256 thanks to BlackEye
Total generating speedup 2.4x faster.
Windows and Linux users: if you got 0.3.5 you still need to upgrade to 0.3.6.
WTF?  How did we get on that?  AFAIK, the only e-mail is if you tell the forum to do notifications, and I guess the wiki registration.  I'd consider turning off the forum notification e-mails, I don't know why we have that.
The current system where every user is a network node is not the intended configuration for large scale.  That would be like every Usenet user runs their own NNTP server.  The design supports letting users just be users.  The more burden it is to run a node, the fewer nodes there will be.  Those few nodes will be big server farms.  The rest will be client nodes that only do transactions and don't generate.
See the snack machine thread, I outline how a payment processor could verify payments well enough, actually really well (much lower fraud rate than credit cards), in something like 10 seconds or less.  If you don't believe me or don't get it, I don't have time to try to convince you, sorry.
You were looking at the wrong code.  Here's the code that applies:
The timestamp is limited to up to 2 hours in the future.  It can be earlier than the previous block, but it must be greater than the median of the last 11 blocks.  The reason for doing it that way is so the time can get corrected in the next block if the previous block had the time too far in the future, like what happened.
Was that the only thing I broke in the OSX build?!  Does it actually work after just that one change?
I had to do that for makefile.vc also.  It compiled, but SHA-256 didn't work correctly; it returned the same incorrect hash each time.
We'll disable it now, and if anyone figures out how to fix it, we can re-enable it then.  It's still 1.7x faster from the midstate optimisation.
The Crypto++ ASM SHA-256 works with GCC on Linux and Windows (MinGW).
I uploaded this makefile.osx change to SVN.  (let me know if that compiles now)
It was able to reproduce this.  The database doesn't like the relative path.
"bitcoind -datadir=./subdir getinfo" works against a running daemon, but trying to start the daemon as "bitcoind -datadir=./subdir" gets that exception.
I guess we should resolve the full path before passing it to the database.
It looks like you were the first one to ever use -datadir with a relative path.
OK, thanks.  I'd also like to know if it runs fine as long as you don't turn on Generate.  You'd think as long as it doesn't actually execute any SSE2 instructions, it would still load.  At least Pentium 3's could run it without generating.
I added a subset of the Crypto++ 5.6.0 library to the SVN.  I stripped it down to just SHA and 11 general dependency files.  There shouldn't be any other crypto in there other than SHA.
I aligned the data fields and it worked.  The ASM SHA-256 is about 48% faster.  The combined speedup is about 2.5x faster than version 0.3.3.
I guess it's using SSE2.  It automatically sets its build configuration at compile time based on the compiler environment.
It looks like it has some SSE2 detection at runtime, but it's hard to tell if it actually uses it to fall back if it's not available.  I want the release builds to have SSE2.  SSE2 has been around since the first Pentium 4.  A Pentium 3 or older would be so slow, you'd be wasting your electricity trying to generate on it anyway.
I added the cached SHA256 state idea to the SVN, rev 113.  The speedup is about 70%.  I credited it to tcatm based on your post in the x64 thread.
I can compile the Crypto++ 5.6.0 ASM SHA code with MinGW but as soon as it runs it crashes.  It says its for MASM (Microsoft's assembler) and the sample command line they give looks like Visual C++.  Does it only work with the MSVC and Intel compilers?
Is that still starting from Crypto++?  Lets get this into the main sourcecode.
I replaced the last of the few wxBase dependencies in bitcoind.
bitcoind now compiles without wxWidgets or wxBase in SVN rev 112.
main(int argc, char* argv[]) is added to init.cpp.  CMyApp and the Startup folder stuff are moved to ui.cpp.  ui.cpp and uibase.cpp aren't linked by bitcoind.
The makefiles have -DGUI to control whether the GUI is used.
I test compiled MinGW, VC and Ubuntu.  I don't know if I broke the Mac OSX build, someone will need to check that.
Sorry, actually it's ECDSA (Elliptic Curve Digital Signature Algorithm) not RSA.  I shouldn't have said "prime numbers".  ECDSA doesn't take much time to generate a keypair.
For future reference, here's my public key.  It's the same one that's been there since the bitcoin.org site first went up in 2008.  Grab it now in case you need it later.
SVN rev 111
That's strange, didn't someone just say that was supposed to work?  (what library was he using?)  Post if you figure out what wrong.
I hope it's not going to put up this much of a fight for all PHP users.
Looks like we've got the Fortran scenario already.
+1 to you for having such a long password that you found this bug.
Uploaded to SVN as rev 110.
2^80 is if you can use a birthday attack.  You can't use a birthday attack for this, so the difficulty is the full 2^160 bits.  Although, if you were trying to crack any one of 1 million (2^20) transactions, you could do a partial birthday attack 2^160/2^20 = 2^140.
Bitcoin Addresses are the only place where 160-bit hash is used.  Everything else is SHA-256.  They're calculated as:
bitcoinaddress = RIPEMD-160(SHA-256(publickey))
Correct me if I'm wrong (please, and I'll gladly eat crow) but I think it would be hard to use an analytical attack on RIPEMD-160 in this case.  An analytical attack prescribes a certain range or pattern of inputs to try that will greatly increase your chance of finding a collision.  Here, you don't have that kind of control over RIPEMD-160's input, because the input is the output of SHA-256.  If an analytical attack helps you find an input to RIPEMD-160 that produces a collision, what are you going to do with it?  You still have to get SHA-256 to output that value, so you would still have to break SHA-256 too.
For brute force, RIPEMD-160(SHA-256(x)) is no stronger than RIPEMD-160 alone.  But for analytical attack, it seems like you must analytical attack both RIPEMD-160 and SHA-256.  If I'm wrong, then the strength is the same as RIPEMD-160 and the SHA-256 only serves as one round of key strengthening.
You would still have to sign it with public key 654321.  You need to find a collision using a public key for which you know the private key.
When you claim a Bitcoin Address transaction, you give your public key that matches the hash, then you must sign it with that key.
Red's point is that it's easy to quickly generate insecure public keys which you could break and find the private key after you find a collision.
He points out that if the public key was required to be a secure one, one which must have required significant work to find the prime numbers, that would increase the strength above that of the hash function alone.  Someone trying to brute force would have to take time generating a key for each attempt.
Red, thanks for telling me privately first!  Please go ahead and post it (and relieve the suspense for everyone!)
His point is that transactions paid to a Bitcoin Address are only as secure as the hash function.  To make Bitcoin Addresses short, they are a hash of the public key, not the public key itself.  An attacker would only have to break the hash function, not ECDSA.
It's best if you tell it to me privately so it can be fixed first.
I just e-mailed you my e-mail address.  (or you could PM me here)
Please upgrade to 0.3.3!  Important security improvements were made in 0.3.2 and 0.3.3.
New features:
- Gavin Andresen's HTTP authentication to secure JSON-RPC
- 5x faster initial block download, under 30 minutes
Please do these tests on the test network.  That's what it's for.  Thanks.
Was that on the test network?
FLATDATA was a workaround to serialize a fixed field length array.  There was a cleaner way to make it understand how to serialize arrays directly, but MSVC6 couldn't do it and I wanted to keep compatibility with MSVC6 at that time.  We don't support MSVC6 anymore because we use something in Boost that doesn't.  We lost support for it after 0.2.0.  Maybe someday I'll swap in the clean way that just knows how to serialize fixed length arrays without wrapping them in FLATDATA.
Please test 0.3.2.5 in preparation for the 0.3.3 release!  This build is looking good and should be the one that goes into 0.3.3.  I encourage you to go ahead and upgrade now if you're on Windows or Linux.
New features:
- Gavin Andresen's HTTP authentication to secure JSON-RPC
- 5x faster initial block download, under 30 minutes
The JSON-RPC HTTP authentication feature in 0.3.3 solves this problem.
Can anyone confirm if JSON-RPC over HTTP is supposed to use status 500 if the reply is an error reply?  I can't remember where I picked that up, maybe it's wrong.  It seems like 200 would make more sense unless there's something wrong with the mechanics of the HTTP request itself.  (and maybe that's what it said and I forgot and spread 500 to all error responses)
Obviously it's a bug that it repeats the header.
I was trying to follow the 1.0 spec:
It called for multiple invocation.
I think they mean it's like this, but I'm not sure:
I can't remember where I think I saw that it's supposed to send back HTTP status 500 for an error reply.  If it contains multiple responses and one is an error, I wonder if that makes the status 500 for the whole thing, I guess so.  Maybe it should always return 200.  I think someone sounded like the 500 might be causing a problem.
This probably gets fixed after 0.3.3.  Until then, just use single invocation.  I wonder if any JSON-RPC package even supports multiple invocation, probably not.
It would be nice if we could pin down better how multiple-invocation is supposed to work, if at all, before trying to fix it, and whether returning HTTP status 500 for error response is right.
I don't think authentication should be disabled by default if there's no conf file or the config file doesn't contain "rpcpassword", but what if it contains "rpcpassword="?
I can see both points.
What if the programmer can't figure out how to do HTTP authentication in their language (Fortran or whatever) or it's not even supported by their JSON-RPC library?  Should they be able to explicitly disable the password requirement?
OTOH, what if there's a template conf file, with
rpcpassword=  # fill in a password here
There are many systems that don't allow you to log in without a password.  This forum, for instance.  Gavin's point seems stronger.
BTW, I haven't tested it, but I hope having rpcpassword=  in the conf file is valid.  It's only if you use -server or -daemon or bitcoind that it should fail with a warning.  If it doesn't need the password, it should be fine.  Is that right?
Not really.  I'll change it to 1000 next time.
By making some adjustments to the database settings, I was able to make the initial block download about 5 times faster.  It downloads in about 30 minutes.
The database default had it writing each block to disk synchronously, which is not necessary.  I changed the settings to let it cache the changes in memory and write them out in a batch.  Blocks are still written transactionally, so either the complete change occurs or none of it does, in either case the data is left in a valid state.
I only enabled this change during the initial block download.  When you come within 2000 blocks of the latest block, these changes turn off and it slows down to the old way.
I built a test build if you'd like to start using it:
These binaries also include Gavin Andresen's JSON-RPC HTTP authentication feature and the other important security improvements from 0.3.2.
I've been running a test over the last 24 hours that kills and restarts it randomly every 2-60 seconds (poor thing) while it's trying to do an initial block download and it's been fine.
There are no changes to the way it handles wallet.dat.  This change is only for blk*.dat and the non-critical addr.dat.  You can always delete blk*.dat if it gets screwed up and let it re-download.
If I recall correctly, 500 is the prescribed status code for JSON-RPC error responses.  There is still a JSON response in the body of the reply telling the explanation of the error, which could be something like {"result":"","error":"bitcoin address not found","id":"1"}.
Gavin's changes look good.  I think everything is complete.  Here's a test build, please test it!
Yes, I think that would be really good so each dev doesn't have to figure it out themselves.  We need a simple example for each of Python, PHP and Java importing the json-rpc library and using it to do a getinfo or something, including doing the http authentication part.
In many of the contexts of this RPC stuff, you can print to the console with fprintf(stdout, like this:
boost::program_options has the same "key=value" format.  Gavin pointed out we can use it in a simple way as a parser without getting into all the esoteric c++ syntax like typed value extraction.  We can use more features if we want later.
Lets go ahead with HTTP basic authentication instead of password as a parameter.
Thanks for that survey!
I find "key value" a little unnatural.  There ought to be a more definite separator between key and value that suggests assignment.  The space people may just be getting lazy using their language's split function.
key=some full sentence with spaces in it.  # seems more clear
key some full sentence with spaces in it.  # than this
Allright then, lets go with self-parsed mapConfig, syntax:
file extension .conf.  What's the filename, is it ~/.bitcoin/settings.conf or ~/.bitcoin/bitcoin.conf or what?
I think we better strip whitespace at the beginning and end of the key and the value.
# user who likes column formatted
this sentence would be this    # "this sentence would be this"
guess this is ok too
The normal syntax should be "key=value", but you can't blame people for the occasional "key = value".
I was researching config file formats, here's a comparison.
YAML is massive.  I'm not sure there's a lightweight easy to build library we can integrate into our project.  Seems overkill.
JSON is tempting and I'm inclined to like it, but two main sticking points:
1) No comments!  How can you have a config file where you can't comment out a line to disable it?
2) Not very user friendly to have to "quote" all the strings, including the keys, and also have to remember the comma at the end of lines.
I suppose we could easily preprocess JSON reading the config file one line at a time, truncate the lines at any # character (and/or "//"?), concatenate them into a string and pass it to JSON, so you could go:
Boost has boost::program_options.
We could read lines ourselves and feed them into a map<string, string> mapConfig.
If we use the syntax:
...and don't allow whitespace indenting before the keys, I guess we would be a subset of YAML and could switch to YAML someday if we need more complexity.
If we go with self parsed, that doesn't mean we can't use JSON on particular parameter values as needed.  If an option needs a list or more structured data, it could always parse its value as json:
Although it has to be all on one line then.
I guess I'm leaning towards self parsed mapConfig:
Still need to know what's the most typical settings file format on Linux.  Is there a standard file extension?  I've never seen a settings file using JSON, and it doesn't look very human friendly with everything required to be in quotes.  I think what I usually see is like:
Is there a settings file thing in Boost?
When you're using bitcoind to issue commands from the command line as a client, can we have it get the password from the settings file then too?
Gavin pointed out I forgot to increment the column of numbers in CommandLineRPC, so the current -rpcpw= implementation doesn't work right from the command line with non-string parameters.  (JSON-RPC is fine)  Still under construction.
Bitcoin is an implementation of Wei Dai's b-money proposal
on Cypherpunks
in 1998 and Nick Szabo's Bitgold proposal
The timing is strange, just as we are getting a rapid increase in 3rd party coverage after getting slashdotted.  I hope there's not a big hurry to wrap the discussion and decide.  How long does Wikipedia typically leave a question like that open for comment?
It would help to condense the article and make it less promotional sounding as soon as possible.  Just letting people know what it is, where it fits into the electronic money space, not trying to convince them that it's good.  They probably want something that just generally identifies what it is, not tries to explain all about how it works.
If you post in
please don't say "yeah, but bitcoin is really important and special so the rules shouldn't apply" or argue that the rule is dumb or unfair.  That only makes it worse.  Try to address how the rule is satisfied.
Search "bitcoin" on google and see if you can find more big references in addition to the infoworld and slashdot ones.  There may be very recent stuff being written by reporters who heard about it from the slashdot article.
I hope it doesn't get deleted.  If it does, it'll be hard to overcome the presumption.  Institutional momentum is to stick with the last decision.  (edit: or at least I assume so, that's how the world usually works, but maybe Wiki is different)
So you drop a settings file in the ~/.bitcoin directory, that sounds better.  In the "no password is set" warning, it could tell you where the file is and what to do.
What is the most popular and common settings file format?
HTTP basic authentication should be considered.  In actual practice though, it's more work for web developers to figure out how to specify the password through some extra parameter in the HTTP or JSON-RPC wrapper than to just stick an extra parameter at the beginning of the parameter list.  What do you think?  Does HTTP basic authentication get us any additional benefits?  Moving it off the parameter list but then you still have to specific it in a more esoteric place I'm not sure is a net win.
You're also confusing me, what do you mean?  Did I do something unintended?
Don't use the -server or -daemon switch or run bitcoind on a machine where you use a web browser.  It opens port 8332 on 127.0.0.1, the local loopback address, and you wouldn't think that web browsers could cross-site access it, but it is possible.
We're working on a release soon that puts a password on the JSON-RPC interface, but until then, avoid using the -server switch, and don't web browse on the same machine where bitcoind is running.
Update:
The JSON-RPC HTTP authentication feature in 0.3.3 solves this problem.
Right, that is quite a bit better.
Can you give me any examples of other stuff that does it that way?  (and what the command line looks like)
The main change you're talking about here is instead of -rpcpw= when you start bitcoind, you'd use a switch that specifies a text file to go and read it from, right?  (any ideas what I should name the switch?)
Nice graph!  A moving average to smooth it out would be nice.
says 212 blocks in the last 24 hours, or 8.8 per hour.
Typically, over 25,000 BTC.
OpenSSL doesn't have any interface for doing just the low level raw block hash part of SHA256.  SHA256 begins by wrapping your data in a specially formatted buffer.  Setting up the buffer takes an order of magnitude longer than the actual hashing if you're only hashing one or two blocks like we do.  It's intended that the time is amortised if you were hashing many KB or MB of data.  In BitcoinMiner, we format the buffer once and keep reusing it.
If you can find SHA256 code that's faster (with MinGW/GCC) than what we've got, that would be really great!  (although, keep licensing in mind)  The one we have is the only one I tried, so there's significant chance for improvement.
When I wrote it more than 2 years ago, there were screaming hot SHA1 implementations but minimal attention to SHA256.  That's a lot of time for them to come up with better stuff.  SHA256 was a lot slower than the fastest SHA1 at the time than I thought it should be.  Obviously SHA256 should be slower than SHA1 by a certain amount, but not by as much as I saw.
(hope you don't mind I renamed your thread, SHA-256 optimisation is something important that I keep forgetting about)
I uploaded to SVN my changes to add a password to JSON-RPC.  If you're set up to build, please test it.
The -server switch is replaced with -rpcpw=<password>, which is also used with bitcoind.
bitcoin -rpcpw=<password>    -- runs with JSON-RPC port open
bitcoind -rpcpw=<password>   -- daemon with password
If you have a better idea for the switch name, let me know, but keep in mind there will eventually be a password for encrypting the database too.  I'm not sure but I think they may want to use different passwords for the two.
It gives a warning if you don't set a password.
All commands now require the password as the first parameter.  It'll tell you that if you run "bitcoind help".
The central code:
Any comments on these decisions?
1) if (strRPCPassword.size() < 15) Sleep(50);  -- this means if it's a short password, it'll wait 50ms after each attempt.  This might be used as a DoS attack, but I figured if it's a short password, it's more important to protect against brute force password scan.  This may tell outsiders whether the password is less than 15 characters, but less than 15 isn't all that noteworthy, most passwords are less than 15.  If you want to close the DoS possibility, just use a password 15 characters or longer.
2) begin = strRequest.end();  -- if it's a single request with multiple invocations, I throw away the rest if one has a bad password.  This is so you can't stuff it with millions of password attempts in one packet.  What do you think, is this the right thing to do?  (multiple invocation is probably almost never used anyway)
I also fixed the two duplicated commands listed in the help:
t I thought too.
Now I'm hearing a report that it IS possible for javascript to do a cross-domain POST request to 127.0.0.1.  Not other domains, but just specifically to that one.  Great...
If this is the case, then do not use the -server switch or bitcoind on a system where you do web browsing.
I'll get started on adding the password field.
They're only intended for intrepid programmers who read the sourcecode.
I didn't say impermeable, I said good-enough.  The loss in practice would be far lower than with credit cards.
No, the vending machine talks to a big service provider (aka payment processor) that provides this service to many merchants.  Think something like a credit card processor with a new job.  They would have many well connected network nodes.
In 0.3.0, the change to 8 only ended up in the Windows version, the other versions still had 15.
Please upgrade to 0.3.2, it's available now.
I didn't realize you were going to document all the intentionally undocumented commands.  They're unsupported and not intended to be used by users.
All the user-facing commands are listed in the -? help.
I went about 200 blocks back.  The block chain was a clean straight line without branches, and there was only one known version of the locked block.
Sorry, not yet, but I do want to make the initial block download faster.
Right, they'll re-appear when it's finished downloading all the blocks.
I believe it'll be possible for a payment processing company to provide as a service the rapid distribution of transactions with good-enough checking in something like 10 seconds or less.
The network nodes only accept the first version of a transaction they receive to incorporate into the block they're trying to generate.  When you broadcast a transaction, if someone else broadcasts a double-spend at the same time, it's a race to propagate to the most nodes first.  If one has a slight head start, it'll geometrically spread through the network faster and get most of the nodes.
A rough back-of-the-envelope example:
So if a double-spend has to wait even a second, it has a huge disadvantage.
The payment processor has connections with many nodes.  When it gets a transaction, it blasts it out, and at the same time monitors the network for double-spends.  If it receives a double-spend on any of its many listening nodes, then it alerts that the transaction is bad.  A double-spent transaction wouldn't get very far without one of the listeners hearing it.  The double-spender would have to wait until the listening phase is over, but by then, the payment processor's broadcast has reached most nodes, or is so far ahead in propagating that the double-spender has no hope of grabbing a significant percentage of the remaining nodes.
Download links available now on bitcoin.org.  Everyone should upgrade to this version.
- Added a simple security safeguard that locks-in the block chain up to this point.
- Reduced addr messages to save bandwidth now that there are plenty of nodes to connect to.
- Spanish translation by milkiway.
- French translation by aidos.
The security safeguard makes it so even if someone does have more than 50% of the network's CPU power, they can't try to go back and redo the block chain before yesterday.  (if you have this update)
I'll probably put a checkpoint in each version from now on.  Once the software has settled what the widely accepted block chain is, there's no point in leaving open the unwanted non-zero possibility of revision months later.
0.3.2 has some security safeguards to lock in the block chain up to this point and limit the damage a little if someone gets 50%.
But if someone has 50%+ of the CPU power and malicious intent, they can prove what it already says in the design document.
We should queue up a supply of pre-made addresses in the wallet to use when a new address is needed.  They aren't very big, so it wouldn't hurt to have a lot of them.  This would more generally cover the case also where someone backs up, then requests a new address and receives a big payment with it.  Maybe there should be separate queues so one type of demand on addresses doesn't deplete it for the others.
The addresses would be created and stored in the normal place, but also listed on a separate list of created-but-never-used addresses.  When an address is requested, the address at the front of the never-used queue is handed out, and a new address is created and added to the back.
There's some kind of rescan in the block loading code that was made to repair the case where someone copied their wallet.dat.  I would need to check that the rescan handles the case of rediscovering received payments in blocks that were already received, but are forgotten because the wallet was restored.
It must be a rounding error when getinfo converts to floating point to return the JSON-RPC result.  The only place where it uses floating point to represent money is returning a value in JSON-RPC.
1.139999999999 is longer than bitcoin can internally represent.
internally, it could only be:
1.139999999999 is much much closer to 1.14000000 than 1.13999999, so it must be 1.14000000.
The code is this:
(double)GetBalance() / (double)COIN.
(I can't think of an easy way to fix it at the moment)
0.3.1 fixes that, sets the generate threads to the lowest priority.  Download links are on the homepage now.
I uploaded windows 0.3.1 rc1 and linux 0.3.1 rc2 to SourceForge and updated the links on the homepage.
You don't need to update to 0.3.1 unless you had one of the problems listed in the first post.  If you've got it working already, stay with 0.3.0.
We need someone to write sample code, preferably Python or Java, showing the recommended way to use the JSON-RPC interface to create an account system.  Most sites that sell things will need something like this.  Someone who's kept up on the JSON-RPC threads here should have some idea how it should work.
When a user is logged in to their account, you show the bitcoin address they can send to to add funds.  Before showing it, you check if it's been used, if it has then you replace it with a new one (getnewaddress <username>).  You only need to keep the latest bitcoin address for the account in your database.  (I posted a sample code fragment for this in an earlier thread somewhere, search on getnewaddress)
You use getreceivedbylabel <username> with the username as the label to get the "credit" amount of the account.  You need to keep a "debit" amount in your database.  The current balance of the account is (credit - debit).  When the user spends money, you increase debit.
If you're requiring more than 0 confirmations, it's nice if you show the current balance (0 confirmations) and the available balance (1 or more confirmations), so they can immediately see that their payment is acknowledged.  Not all sites need to wait for confirmations, so the dual current & available should be optional.  Most sites selling digital goods are fine to accept 0 confirmations.
A nice sample app for this would be a simple bank site, which would have the above, plus the option to send a payment to a bitcoin address.  The sample code should be the simplest possible with the minimum extra stuff to make it a working site.
vekja.net is an example of a site like this.
Right, the difficulty adjustment is trying to keep it so the network as a whole generates an average of 6 blocks per hour.  The time for your block to mature will always be around 20 hours.
The recent adjustment put us back to close to 6 blocks per hour again.
There's a site where you can see the time between blocks, and since block 68545, it's been more like 10 minutes per block:
I've been trying to encourage someone to write and release some sample Python code showing the recommended way to do the typical accounting stuff, but to no avail.  It would be nice if you didn't have to re-invent the wheel like you're doing here.  Search on getnewaddress and you should find a thread where I gave a small fragment of sample pseudocode.
Neat chart.
Difficulty just increased by 4 times, so now your cost is US$0.02/BTC.
No, not related at all.
Yes, about 20 hours.  (120 conf / 6 blocks per hour = 20 hours)  That's the normal length of time before you can spend it.  You know long before that that you won one.
Good point.  If you're going to have more than 8 LAN nodes connect to one gateway node, then you'd better have the gateway node set up so it can receive incoming connections.  Otherwise, while the gateway node has 8 or more connections, it will not try to add any more outbound connections.  As the outside nodes you're connected to come and go, it doesn't make new outbound connections to replace them.  You'll be fine if you can accept incoming connections, then there will be plenty of others connecting to you.
It's in init.cpp.
It's a wxWidgets app, so it doesn't have a main() function.  It may in a little while, since I'm pretty close to making bitcoind build w/o wxBase.  (it'll be in init.cpp)
Sorry about my choice of the filename "main.cpp", another possible name would have been "core.cpp".  It's much too late to change.  I still prefer main.cpp.
We're still in great need of sample code showing the recommended way to use the JSON-RPC functions, like for a basic account system on a typical storefront website.  Using getreceivedbylabel using the username as the label, changing to a new bitcoin address once the stored one for that account gets used.  I posted a sample code fragment on the forum somewhere.  (search on getreceivedbylabel or getnewaddress)  The sample code could be a plain vanilla bank site where you can deposit and send payments.
It adjusted to 181.54 a few minutes ago.  Typical time to get a block is about a week now.
The difficulty can adjust down as well as up.
The network should be generating close to 6 blocks per hour now.
Many businesses are like that.  For a car salesman, when will the next customer walk in the door?
On the OP's question, it's a good feature, but the question is, how would we word it so people don't expect to get something after that specific amount of time?  "it said 7 days and I waited more than a week and didn't get anything!"  Approx, average, but still they're going to think that way.  It can't be a whole sentence, unless we think of somewhere else to put it, but where would that be?  Suggestions?
The difficulty quadrupled a few minutes ago to 181.54.  It's going to take typically about a week to generate now.
SHA256 is not like the step from 128 bit to 160 bit.
To use an analogy, it's more like the step from 32-bit to 64-bit address space.  We quickly ran out of address space with 16-bit computers, we ran out of address space with 32-bit computers at 4GB, that doesn't mean we're going to run out again with 64-bit anytime soon.
SHA256 is not going to be broken by Moore's law computational improvements in our lifetimes.  If it's going to get broken, it'll be by some breakthrough cracking method.  An attack that could so thoroughly vanquish SHA256 to bring it within computationally tractable range has a good chance of clobbering SHA512 too.
If we see a weakness in SHA256 coming gradually, we can transition to a new hash function after a certain block number.  Everyone would have to upgrade their software by that block number.  The new software would keep a new hash of all the old blocks to make sure they're not replaced with another block with the same old hash.
I like that in libraries for the external API's, but you can probably tell from the code that I'm not a fan of it for interior functions.  Big obligatory comment headers for each function space out the code and make you hesitate about creating a small little function where the comment header would be bigger than the function.  They're some trouble for maintenance, as changes to the function then require duplicate changes in the comment header.  I like to keep code compact so you can see more code on the screen at once.
To add them now at this point, what would be written would just be what's obvious from looking at the function.
The external API we have, in rpc.cpp, the usage documentation is in the help string.
Sorry to be a wet blanket.
Because of all the dependencies that different systems don't have.  It's easier to just static link what we can.  It doesn't increase the size by very much.
Bitcoin automatically rebroadcasts your transactions if it receives new blocks that don't contain them.  It may take about an hour to get rebroadcasted.  It is relentless though.  It will keep nagging the network forever until your transaction gets into a block.
Please try the 0.3.1 release candidate, it should at least resolve the libcrypto dependency:
Let me know if that works.
That's the first time I've seen this error.
How many blocks do you have? (in the status bar)
You should move your blk*.dat files (in ~/.bitcoin) to another directory and let it start over downloading the block chain again.  If you don't mind, could you keep the old blk*.dat files for a little while in case I need to look at them?
The proof-of-work difficulty is currently 45.38.  (see
It's about to increase again in a few hours.  It's only been 3-4 days since the last increase, so I expect it will increase by the max of 4 times, or very nearly the max.  That would put it at 181.54.
The target time between adjustments is 14 days, 14/3.5 days = 4.0 times increase.
That must be it then.
It must be looking for a larger icon like 20x20 but we don't have one.
5 BTC seems like a lot these days, maybe the normal amount should be 1 or 2 BTC.
This is an important service so new users can at least get something if generating is too hard.
Run it with the undocumented switch -minimizetotray and the option is available in the options menu.
I don't know how to fix it.  It's something wrong deep inside wxWidgets or GTK or Gnome.
What is "120DPI mode"?  Is that an actual setting somewhere?  Sounds like an obscure enough candidate.  I suppose it needs twice the resolution icon to fill the size of the upper left corner icon.  Only one size is provided.
It could go either way.  The Startup folder has the advantage that the end user can see it and manually remove it with the regular UI (not regedit) if they already blew away the Bitcoin directory and its uninstaller.  Bitcoin will not relentlessly keep re-adding it if you delete it manually.
OpenOffice is another example of something that puts its link in the Startup folder.
The fix for the thread priority level on linux is available in the 0.3.1 release candidate here:
That's surprising that we've never heard of that before now.
Maybe you're the first person to ever run it on Vista
I have to guess it has something to do with your display color depth selection.  e.g. 8-bit, 16-bit, 24-bit, 32-bit, what is it?  Do you have a weird video card, display setup or running it on a tablet or mobile or something?
Yes a bug.  It'll have to be fixed in the next version.
I updated the first post with a link to rc2 for linux with the fix for this.  Please check that this is fixed for you.  Thanks!
I was not able to reproduce this.  I have dual-proc, so I ran two memory hogs.  Bitcoin got 0% of CPU according to the task manager.  The khash/sec meter stayed stuck because it couldn't get any CPU to update it.
Do you have dual-proc?  Are you sure you weren't running a single processor hog?
Thanks for the Spanish and French translations!  The edited and updated .po files are attached.
I uploaded these to the SVN.
I updated them to 0.3.0.
I am tempted to remove the download links from the other languages and only keep it on English.
They will need to be updated for 0.3.1 soon.  Perhaps there's a way for someone to manage the updating of the translated drupal pages.
I uploaded an updated bitcoin.po for 0.3.1 attached to this message:
please use it if you're starting a new translation.
If you already have a po file, poedit can update it.
- Get the src directory from the 0.3.1 release candidate posted in the development forum, any version will do:
- Make a subdirectory under src: locale/??/LC_MESSAGES
(?? could be anything really, "en" or your language 2-letter code)
- Put your .po file there
- Open it with poedit
- In poedit, Catalog->Update from sources
The key is that the src directory with the sourcefiles needs to be 3 directories up from the .po file.
I need to give an updated .po file.
OK, this must be a problem somewhere, I'll have to take a look at it or one of the other devs can.
Many of the strings are in code automatically generated from uiproject.fbp where nothing can be done about these things.  I have a program I use to find all the spacing inconsistencies at the beginning and ending of strings in your .po file and manually fix them up before I upload them to SVN.
I don't think you have a particular problem, I think your system is laggy because you're running a lot of things at once and hitting the pagefile because memory is full.  You confirmed when you shut off generation that your CPU drops to 0%, so the CPU usage is definitely all idle priority.  There's nothing in the 0.3.1 that would affect these things.
Well, it can't hurt to do a backup and it's a good idea to backup regularly, but no, a backup is not required before installing this.
This is a bugfix maintenance release.  It is now uploaded to SourceForge.  Mac OS X didn't need any fixes so we don't really need to update it, 0.3.0 is still good.
The download links are on bitcoin.org
Then all the CPU time is the generate thread, which definitely runs at the lowest possible priority, idle priority.  It's normal that your CPU meter is 100%.  Since it's idle priority, it won't actually slow anything else down, even though the CPU meter is 100%.
We don't even specify linking glibcxx_3.4.11, so gcc must automatically link it behind the scenes.  There's probably a compiler switch that would tell it to static link it.  I'm not sure what the licensing issues would be.  Typically, compiler stuff is fully redistributable.
More directly, this:
I will be posting release candidate of 0.3.1 with this fix shortly.  Please try that and let me know if it fixes the problem.
OK, the undocumented switch "-minimizetotray" which re-enables the option.
I uploaded the change to SVN.
The design outlines a lightweight client that does not need the full block chain.  In the design PDF it's called Simplified Payment Verification.  The lightweight client can send and receive transactions, it just can't generate blocks.  It does not need to trust a node to verify payments, it can still verify them itself.
The lightweight client is not implemented yet, but the plan is to implement it when it's needed.  For now, everyone just runs a full network node.
I anticipate there will never be more than 100K nodes, probably less.  It will reach an equilibrium where it's not worth it for more nodes to join in.  The rest will be lightweight clients, which could be millions.
At equilibrium size, many nodes will be server farms with one or two network nodes that feed the rest of the farm over a LAN.
This is a common point of confusion.  There's no such thing as being 1% towards solving a block.  You don't make progress towards solving it.  After working on it for 24 hours, your chances of solving it are equal to what your chances were at the start or at any moment.
It's like trying to flip 37 coins at once and have them all come up heads.  Each time you try, your chances of success are the same.
The RNG is the OpenSSL secure random number generator.  On Windows it's seeded with the complete set of all hardware performance counters since your computer started, on Linux it's dev/random.
Microsoft Security Essentials Live Protection is blocking your communication with the network.  You have connections, which tricks Bitcoin into thinking it's connected, but they are silent because the data is being blocked.
You need to make bitcoin.exe an excluded process in Live Protection.
This is becoming a common problem.  Someone should write this up in a pegged thread.
The message "Warning: This block was not received by any other nodes" occurs when Bitcoin broadcasts a block, but nobody confirms they received it.  The warning is there just for this kind of situation, where for some reason you have connections, but they have gone dead and nobody can hear you.  Your block will never become valid because nobody received it.
After it initially tries incorrectly to set itself to the lowest priority, the generate thread only changes its priority again temporarily when it finds a block.  When you've found a block, you should want it to hurry up and broadcast it as soon a possible before someone else finds one and makes yours invalid.  The generate thread only changes to higher priority for less than a second every few days.
There should be a 0.3.1 release for this soon.  There are a few other issues we need to look at fixing in 0.3.1 before making a release.
That's interesting.  I know the minimize to tray on Ubuntu is very clunky, but I didn't know it had a CPU peg problem too.  Anyone else able to reproduce this problem?  We had this feature disabled on Linux before, but then it seemed better to have the imperfect UI than to lose the feature entirely.  I'm thinking we should disable it again on Linux.
What language is your computer set to?  Is it set to German, Dutch or Italian?  Is it one of those sub-languages like "nl-??"?
It's trying to load a translation and failing.  You could delete the locale directory that came with bitcoin so it doesn't try to use it.
Can someone test each language on Ubuntu and see if there's a problem with just one of them or maybe all three?
This is the second time I've seen this "Live Protection" problem reported.
It must be blocking the program's network communication.  It sounds like it's allowing connections to be made, hence the 10 connections shown, but not allowing any data to be sent or received on them.
We need to understand this problem better.
Can someone write some instructions on the wiki explaining how to turn off or add an exclusion to Live Protection or whatever its full proper name is.
Laszlo corrected this, but unfortunately it was too late to make it into 0.3.0.  There will probably be a 0.3.1 soon though.
The problem is I used PRIO_MIN, I should have used PRIO_MAX for the lowest priority.  The OS isn't supposed to let you increase priority, so the PRIO_MIN ought to leave it at priority 0.
It doesn't work with wxWidgets 2.8, it needs wxWidgets 2.9.  Unfortunately, there isn't a Debian package of wxWidgets 2.9 yet.
Thanks for making that calculator.
The difficulty doubled a day or two ago, plus it's just random and you can have surprisingly long dry spells.
In Windows, you select the process in the task manager, right click, Set Priority.  Set it to BelowNormal or Low.  That shouldn't make a difference though.
If you turn off Generate Coins, does the CPU usage go flat?  That would confirm that all the CPU time it's taking is generate, which is idle priority already.
It could be it's slow just because you have too many things running at once and you're out of memory.  When you switch from one thing to another, it has to page it in from disk.
So that was responsible for keeping blocks from downloading?
The link: "Win32 CPU Cycles vs 'Live Protection' Engines"
For BitcoinFX, Live Protection was keeping it from getting CPU for generating coins.  You said your friend was getting 1400-1600 khash/s, so it was getting CPU.  I guess Live Protection must have been blocking some other part of the program then?
True, if it happened suddenly.  If it happens gradually, we can still transition to something stronger.  When you run the upgraded software for the first time, it would re-sign all your money with the new stronger signature algorithm.  (by creating a transaction sending the money to yourself with the stronger sig)
I'll start thinking about how to do this.
At the moment, you can kind of use -connect.  You can use -connect to make it connect to local computers on your LAN, like -connect=192.168.0.100.  If you start it out blank and don't let it connect to the main network, the difficulty is still at the original low difficulty.  If you've port-forwarded though, then outside nodes might still connect inward to you.
With -connect it still uses IRC, do you think it shouldn't get on IRC when you're telling it to only connect to specific nodes with -connect?  The main scenario for -connect is where you have a server farm, with two connected to the network and the rest connected to the first two.  In that case, you wouldn't want the -connect computers on IRC.
I tested this with a non-lower-ASCII account name on XP and confirmed the bug, then tested that the new GetDefaultDataDir fixed it.  This change is revision 102 of the SVN.
What the OP described is called "cornering the market".  When someone tries to buy all the world's supply of a scarce asset, the more they buy the higher the price goes.  At some point, it gets too expensive for them to buy any more.  It's great for the people who owned it beforehand because they get to sell it to the corner at crazy high prices.  As the price keeps going up and up, some people keep holding out for yet higher prices and refuse to sell.
The Hunt brothers famously bankrupted themselves trying to corner the silver market in 1979:
"Brothers Nelson Bunker Hunt and Herbert Hunt attempted to corner the world silver markets in the late 1970s and early 1980s, at one stage holding the rights to more than half of the world's deliverable silver.[1] During Hunt's accumulation of the precious metal silver prices rose from $11 an ounce in September 1979 to nearly $50 an ounce in January 1980.[2] Silver prices ultimately collapsed to below $11 an ounce two months later,[2] much of the fall on a single day now known as Silver Thursday, due to changes made to exchange rules regarding the purchase of commodities on margin.[3]"
I think I see where the problem is.  Coincidentally, I recently coded a replacement for the function in question which should fix it.  It's not enabled yet, but in the SVN version it prints a debug message in debug.log showing the new directory value and old value for comparison.
It's hard to imagine the Internet getting segmented airtight.  It would have to be a country deliberately and totally cutting itself off from the rest of the world.
Any node with access to both sides would automatically flow the block chain over, such as someone getting around the blockade with a dial-up modem or sat-phone.  It would only take one node to do it.  Anyone who wants to keep doing business would be motivated.
If the network is segmented and then recombines, any transactions in the shorter fork that were not also in the longer fork are released into the transaction pool again and are eligible to get into future blocks.  Their number of confirmations would start over.
If anyone took advantage of the segmentation to double-spend, such that there are different spends of the same money on each side, then the double-spends in the shorter fork lose out and go to 0/unconfirmed and stay that way.
It wouldn't be easy to take advantage of the segmentation to double-spend.  If it's impossible to communicate from one side to the other, how are you going to put a spend on each side?  If there is a way, then probably someone else is also using it to flow the block chain over.
You would usually know whether you're in the smaller segment.  For example, if your country cuts itself off from the rest of the world, the rest of the world is the larger segment.  If you're in the smaller segment, you should assume nothing is confirmed.
Thanks for finding that.  We switched from ANSI in 0.2 to UTF-8 in version 0.3, so it must be related to that.
Just to confirm, if you log in with the non-latin character username, not having an appdata/Bitcoin directory yet, and run Bitcoin and let it create the database from scratch, does it work or not?
Everybody needs to connect to the same IRC server and channel so they can find each other.
It might not be good if we suddenly rushed freenode with a ton of users all at once.
The fallback is our own seed system.
irc.lfnet.org is pretty old and has impressive uptime.  I think it's going to be fine.
We could take IRC out at some point if we want, but I'd rather ease into it and just test our own seed system as a backup for now, and I really like the complementary redundant attributes of the two different systems.
0.3 released
Announcing version 0.3 of Bitcoin, the P2P cryptocurrency!  Bitcoin is a digital currency using cryptography and a distributed network to replace the need for a trusted central server.  Escape the arbitrary inflation risk of centrally managed currencies!  Bitcoin's total circulation is limited to 21 million coins.  The coins are gradually released to the network's nodes based on the CPU power they contribute, so you can get a share of them by contributing your idle CPU time.
or read the forum to find out more.
BTW, I did come to my senses after that brief bout with 1.3, this release is still going to be 0.3 beta not 1.0.
I really appreciate the effort, but there are a lot of problems.
We don't want to lead with "anonymous".  (I've been meaning to edit the homepage)
"The developers expect that this will result in a stable-with-respect-to-energy currency outside the reach of any government." -- I am definitely not making an such taunt or assertion.
It's not stable-with-respect-to-energy.  There was a discussion on this.  It's not tied to the cost of energy.  NLS's estimate based on energy was a good estimated starting point, but market forces will increasingly dominate.
Sorry to be a wet blanket.  Writing a description for this thing for general audiences is bloody hard.  There's nothing to relate it to.
Laszlo's build is going to be our first Mac release so please test it!
I reduced max outbound connections from 15 to 8 in RC4.
15 was way more than we needed for redundancy.  8 is still plenty of redundancy.
As the nodes upgrade to this version, this will cut in half the number of connections that inbound accepting nodes get.
If anyone wants more than 8 connections, they can open port 8333 on their firewall.
OK, back to 0.3 then.
Please download RC4 and check it over as soon as possible.  I'd like to release it soon.
Other than the version number change, which included changes in readme.txt and setup.nsi, I reduced the maximum number of outbound connections from 15 to 8 so nodes that accept inbound don't get too many connections.  15 was a lot more than needed.  8 is still plenty for redundancy.
Links removed, 0.3 is now released, so go to
to download it.
It is, but generating is more than twice as slow.
Thanks for the feedback on this.
One thing we could do is lower the outbound connections from 15 to 10 or maybe even 5.  The choice of 15 was arbitrary.  It just needs to be enough for redundancy and fast exponential propagation of messages.  10 would still be plenty.  5 should be fine.  10 is good as a nice round number so users can see that it stopped intentionally.
It would help to implement UPnP so there would be more inbound accepting nodes.  Your number of connections is the ratio of inbound accepting nodes to out-only times 15.  We need to encourage more people to accept inbound connections.
I will implement a feature to stop accepting inbound connections once you hit a certain number.
Which version are you running?
Anyone know how many connections typical P2P software like BitTorrent can get up to?
Here's an answer to a similar question about how to recover from a major meltdown.
MinGW still only has good old stable 3.4.5.  There's not much reason for them to update it.
When I looked at the 3.4.5 compiled SHA disassembly, I couldn't see any room for improvement at all.  I can't imagine how 8% more could be squeezed out of it.  Is it possible Windows could have 8% more overhead?  Not making system calls or anything, just plain busy computational code, could task switching and other housekeeping operations take away that much?
Welcome, Harry.
I hadn't thought about starting out using bitcoind without using bitcoin first.  I guess for now, this thread serves as the tutorial.
The focus for bitcoind so far has been more on backend support for websites.  There's demand for things that would be nice for adminning headless generators like listgenerated.  For the moment, you can grep the debug.log file for "generated" and "hashmeter" for some feedback.  Generated blocks take about 24 hours before they're credited to your balance.
But 1.0 sounds like the first release.  For some things newness is a virtue but for this type of software, maturity and stability are important.  I don't want to put my money in something that's 1.0.  1.0 might be more interesting for a moment, but after that we're still 1.0 and everyone who comes along thinks we just started.  This is the third major release and 1.3 reflects that development history.  (0.1, 0.2, 1.3)
Many big ISPs give you a new IP every time you connect, usually in the same class B (a.b.?.?).  Maybe you should have a minimum time between payments per class-B.
If you can't solve the problem, you can always keep lowering the amount of bitcoins given until it's manageable, and always require captcha.
The linux release candidate in the "1.3 almost ready" thread contains prebuilt bitcoind.
I think that's the best option right now.  Like cash, you don't keep your entire net worth in your pocket, just walking around money for incidental expenses.
They could make a smaller version of the site optimized for mobile.  If there was an app, it could be a front end to one of those, with the main feature being QR-code reader, or maybe there's already a universal QR-code reading app that web sites can be designed to accept scans from.
If there was an iPhone app that was just a front end for vekja or mybitcoin, not a big involved P2P, would apple approve it and if not, on what basis?  It could always be an Android app instead.  An app is not really necessary though, just a mobile sized website.
A web interface to your own Bitcoin server at home wouldn't be a solution for everyone.  Most users don't have a static IP, and it's too much trouble to set up port forwarding.
Changed the version number to 1.3 and removed "Beta".
(links removed, see below)
Uses irc.lfnet.org.
Is it about time we lose the Beta?  I would make this release version 1.3.
The first panel of the status bar is shared with the help description of menu items as you hover over them.  Since all our menu item descriptions are blank, it replaces it with blank when you're hovering in a menu.
Freenode is too visible, right in the middle of where all those users and moderators are hanging out.  Laszlo's option is a much better fit for us.
I made 0.3.0.RC2 available that uses irc.lfnet.org instead of freenode if you want to start switching over:
Lets try using Laszlo's irc.lfnet.org instead of freenode.  Here's RC2, that's the only change in it:
(see below for download links)
This seems like a good idea.
What does everyone think, should we make the switch for 0.3?
We need more details about what happened MadHatter.
Both 0.2 and 0.3 have a backup way of getting connected without IRC, it's just slower to get connected.
0.2 can find other nodes without IRC if it's ever been connected before, but a new install can't discover the network for the first time without IRC.
0.3 can also seed without IRC.  It can operate entirely without IRC if it needs to, but it's better having IRC for redundancy.
Thanks virtualcoin, that's a perfect comparison.
The 8% speedup from 32-bit Windows (2310k) to 32-bit Linux (2500k) is probably from the newer version of GCC on Linux (4.4.3 vs 3.4.5).
The 15% speedup from 32-bit to 64-bit Linux is more of a mystery.  The code is completely 32-bit.
Hmm, I think the 8 extra registers added by x86-64 must be what's helping.  That would make a significant difference to SHA if it could hold most of the 16 state variables in registers.
I don't know.  Maybe someone with more Linux experience knows how to install the library it needs.
I built it on Ubuntu 10.04.  I hope that wasn't a mistake.  Maybe it should have been built on an older version for more backward compatibility.  Is this a problem on Linux, that if you build on the latest version, then it has trouble working on older versions?  Is there any way I can downgrade to an older version of GCC on 10.04?
The 64-bit version shouldn't be any faster than the 32-bit version, but it would be great if someone could do a side-by-side comparison of the two linux versions and check.  SHA-256 is a 32-bit algorithm and nothing in BitcoinMiner uses 64-bit at all.
We don't need to bother with a 64-bit version for Windows.  32-bit programs work on all versions of Windows.  It's not like Linux where the 64-bit OS wants 64-bit programs.
I'm also curious if it's a little faster on linux than windows.
Do you think I should make the directories:
Here's RC1 for linux for testing:
(link removed, see below)
It contains both 32-bit and 64-bit binaries.
Recent changes:
build-unix.txt:
- Added instructions for building wxBase, which is needed to compile bitcoind.
- The package libboost-dev doesn't install anything anymore, you need to get libboost-all-dev.
- Updated version numbers.
makefile.unix:
- The libboost libraries have removed the "-mt" from their filenames in 1.40.  If you're compiling with Boost 1.38 or lower, like on Ubuntu Karmic, you would need to change it back to boost_system-mt and boost_filesystem-mt.
Laszlo figured out that enabling some more optimisation increased performance about 20%, so 0.3 hashes 20% faster than 0.2.0, but I assume he used that in his own build.
30khash increase to what total rate?  (to figure the % increase)
You figured it out faster than I could post a reply.
It looks like laszlo's build of Berkeley DB has database/log.* files that are not compatible with ours.  The .dat files are fine, their format shouldn't ever change.  All data is stored in the .dat files.  All your own data is stored in wallet.dat.  If you had waited for it to redownload the block chain, your missing transactions and generateds would have appeared as the block chain reached the point where those transactions were recorded.
When you copied the directory except log.0000000002, that's the best solution.  You should be good now.
The database/log.* files only contain temporary database data.  If you exited bitcoin normally the last time, not exited by forced terminating it or crashing, then the database/log.* files can normally be deleted safely.  They're only used so that if the database is in the middle of a transaction when the computer crashes or the program is killed or crashes, then it could recover without losing data.
Please keep running v0.3 if at all possible, don't go back to v0.2.10.
Anyone else who hits this problem, move the database\log.000000000* files somewhere else.  (if it works fine after that, you can delete them later)
I'm reluctant to make the installer delete or move those files.  If the previous run was stopped by crashing or killed, that would be the wrong thing to do.
davidonpda, were you also running laszlo's build previously?
Check if the "%appdata%" directory exists, and "%appdata%\bitcoin"
does it work then?
What operating system?
Normally when it does that it's because the directory where the data directory should go doesn't exist.  See if the "%appdata%" directory exists.
Do you get that error with 0.2 also?  It's hard to see how you could get that with 0.3 and not with 0.2 since there's nothing different in that regard.
Here's RC1 for windows for testing:
(removed, see RC2 below)
Please only download this if you're going to test and report back whether everything seems fine or not.  Make sure to look through the files in "c:\program files\bitcoin"
My fear is too many programmers would latch onto that for checking for received payments.  It can never be reliable that way.  The list/getreceivedbyaddress/label functions are the only way to do it reliably.
We shouldn't delay forever until every possible feature is done.  There's always going to be one more thing to do.
Agree.  Certainly too trivial to clutter the user's attention with.
I changed it to every 30 minutes.
If I increased it to every 10 minutes, it would still be a small enough presence in the log file.  Question is whether that would be more output than the user wants when they grep.
It's too late now for feature changes to 0.3, but I'll add that to the post-0.3 to do list.  I never would have noticed that if you hadn't pointed it out.
I've noticed that hashing performance doesn't vary as much between CPUs as you'd expect.  Compared to an old CPU, a newer CPU doesn't show as much of a speedup at hashing as it does on general benchmarks.
I guess recent CPU optimizations must have concentrated on things like I/O and branch prediction.  Most programs are a bunch of memory access, comparisons and branching, they rarely get down to cranking away at maths for very long.
The latest SVN version has a khash/s display.  Around 400 khash/s per processor is typical.
I finished everything on my list to do for version 0.3.  The code on SVN is about ready to release.
Testing at this point is much appreciated.
On Ubuntu 10.04 it wouldn't remove the taskbar button cleanly, so I made it leave it there.
But now that you mention it, it's probably better to have the feature, even if it's messy, than not to have it, though it may confuse a few people when the taskbar button temporarily stays around but disappears if you click on it.
Updated SVN.
Thanks for testing.
I integrated the hashmeter idea into the SVN version.  It displays khash/s in the left section of the status bar.
Two new log messages:
grep your debug.log for "generated" to see what you've generated, and grep for "hashmeter" to see the performance.  On windows, use:
findstr "hashmeter generated" "%appdata%\bitcoin\debug.log"
I have the hashmeter messages once an hour.  How often do you think it should be?
Lost coins only make everyone else's coins worth slightly more.  Think of it as a donation to everyone.
Computers have to get about 2^200 times faster before that starts to be a problem.  Someone with lots of compute power could make more money by generating than by trying to steal.
This is now fixed in the SVN version.
1) Menu bar default color.
2) Balance bar not a different color.
3) Background behind bitcoin address and balance now the same color as toolbar.
I checked all the standard themes and it seems reasonable with all of them.
Ubuntu minimize,maximize,close buttons to the right:
gconf-editor
apps->metacity->general
button_layout=menu:minimize,maximize,close
They've got it awfully buried considering 9 out of 10 users are used to having it on the right.
Excellent choice of a first project, nice work.  I had planned to do this exact thing if someone else didn't do it, so when it gets too hard for mortals to generate 50BTC, new users could get some coins to play with right away.  Donations should be able to keep it filled.  The display showing the balance in the dispenser encourages people to top it up.
You should put a donation bitcoin address on the page for those who want to add funds to it, which ideally should update to a new address whenever it receives something.
The SVN version now uses IRC first and if that fails it falls back to a hardcoded list of seed nodes.  There are enough seed nodes now that many of them should still be up by the time of the next release.  It only briefly connects to a seed node to get the address list and then disconnects, so your connections drop back to zero for while.  At that point, be patient.  It's only slow to get connected the first time.
This means TOR users won't need to -addnode anymore, it'll get connected automatically.
A second version would be a massive development and maintenance hassle for me.  It's hard enough maintaining backward compatibility while upgrading the network without a second version locking things in.  If the second version screwed up, the user experience would reflect badly on both, although it would at least reinforce to users the importance of staying with the official version.  If someone was getting ready to fork a second version, I would have to air a lot of disclaimers about the risks of using a minority version.  This is a design where the majority version wins if there's any disagreement, and that can be pretty ugly for the minority version and I'd rather not go into it, and I don't have to as long as there's only one version.
I know, most developers don't like their software forked, but I have real technical reasons in this case.
That's one of the reasons for transaction fees.  There are other things we can do if necessary.
Since 2007.  At some point I became convinced there was a way to do this without any trust required at all and couldn't resist to keep thinking about it.  Much more of the work was designing than coding.
Fortunately, so far all the issues raised have been things I previously considered and planned for.
The nature of Bitcoin is such that once version 0.1 was released, the core design was set in stone for the rest of its lifetime.  Because of that, I wanted to design it to support every possible transaction type I could think of.  The problem was, each thing required special support code and data fields whether it was used or not, and only covered one special case at a time.  It would have been an explosion of special cases.  The solution was script, which generalizes the problem so transacting parties can describe their transaction as a predicate that the node network evaluates.  The nodes only need to understand the transaction to the extent of evaluating whether the sender's conditions are met.
The script is actually a predicate.  It's just an equation that evaluates to true or false.  Predicate is a long and unfamiliar word so I called it script.
The receiver of a payment does a template match on the script.  Currently, receivers only accept two templates: direct payment and bitcoin address.  Future versions can add templates for more transaction types and nodes running that version or higher will be able to receive them.  All versions of nodes in the network can verify and process any new transactions into blocks, even though they may not know how to read them.
The design supports a tremendous variety of possible transaction types that I designed years ago.  Escrow transactions, bonded contracts, third party arbitration, multi-party signature, etc.  If Bitcoin catches on in a big way, these are things we'll want to explore in the future, but they all had to be designed at the beginning to make sure they would be possible later.
I don't believe a second, compatible implementation of Bitcoin will ever be a good idea.  So much of the design depends on all nodes getting exactly identical results in lockstep that a second implementation would be a menace to the network.  The MIT license is compatible with all other licenses and commercial uses, so there is no need to rewrite it from a licensing standpoint.
I'm working on getting version 0.3 released as soon as I can.  Just a last few things left to do.  It's been a long time since 0.2 and we need to get a prebuilt bitcoind with command line and JSON-RPC available.  This time we'll have both 32-bit and 64-bit linux binaries, and Laszlo is going to build a Mac OSX release.  Plus, we'll include the German, Dutch and Italian translations by DataWraith, Xunie and Joozero (thanks you guys!).
Thanks DataWraith!  The German translation is uploaded to SVN.
This is great, we've already got 3 major languages.
But as long as the link is already doing the typing for you, I don't see much benefit in using a domain address instead of bitcoin address.  With a bitcoin address, the user can't send an unidentified payment.  They can't send payment until they've been given a correct bitcoin address to send to.
What would be nice about sending by domain is you could visually verify who it's going to.
A more crucial issue is what if the browser isn't allowed to connect to 127.0.0.1:
and if that's true, then what about that example freenet link that had 127.0.0.1 in it?
The premise is false.  Adding more transactions to the block you're working on does NOT slow down your generation rate.  When generate is scanning hashes, it only hashes the header of the block, which is constant size.  The header contains a hash of the transactions (the Merkle root) and is only updated occasionally.
If necessary I can write code to make nodes prefer not to use a block if it doesn't contain enough of the transactions they know about.  A discouraged block would almost always fail to be included in the main chain, but would be accepted if it did get in.  I doubt this will be necessary, since there's no real advantage for nodes not to include all transactions.
Sorry, I didn't test compile on linux the last few revisions.
Reverted makefile.unix.
3) Nothing, if sending by bitcoin address
5) It is decentralised.  After you have connected to the network the first time, you no longer need IRC.
SHA-256 is very strong.  It's not like the incremental step from MD5 to SHA1.  It can last several decades unless there's some massive breakthrough attack.
If SHA-256 became completely broken, I think we could come to some agreement about what the honest block chain was before the trouble started, lock that in and continue from there with a new hash function.
If the hash breakdown came gradually, we could transition to a new hash in an orderly way.  The software would be programmed to start using a new hash after a certain block number.  Everyone would have to upgrade by that time.  The software could save the new hash of all the old blocks to make sure a different block with the same old hash can't be used.
SirArthur has a good point about the normal online merchant case, which is what the send-by-IP option is more suited to.  This is the case where the merchant will have a server on a static IP and their own domain name and SSL cert.
Instead of connecting by IP, we can connect to a domain name by SSL, using the existing CA infrastructure to authenticate that you're connected to the owner of that domain.
The user would send to domain.com (or
is ok too).  That would be very natural and users could see and verify that what they entered is who they intend to pay.
The SSL also makes it safe for TOR users.
Problem is, I think merchants would still prefer to use bitcoin addresses to be certain they know what the payment is for.  You simply cannot count on users to enter the right thing in the comment fields to identify the transaction.  It would only approach practical if we had a mailto style link that prepopulates the comment field with the order number, but then the link could just as well be a bitcoin address.
Just having an open bitcoin server at domain.com that users could send unidentified payments to would be too much of a liability.  Regular users aren't used to the idea of having to identify the payment.  Merchants would get too many blank payments followed by "I paid you, where's my stuff?!" a week later.
The payment sequence does have a step where the receiver verifies the order before accepting it.  It can reject the payment and return an error message if it doesn't contain a valid order number.  That would require a difficult level of integration of custom code with the bitcoin server though.
Bitcoin has its own distributed address directory using the "addr" message.  It's about time we coded in a list of the current long running static nodes to seed from.  I can add code so new nodes do not preferentially stay connected to the seed nodes, just connect and get the list, so it won't be a burden on them.
What do you think, should I go ahead with adding the seeds?
It'll still try IRC first.  The IRC has the advantage that it lists nodes that are currently online, since they have to stay connected to stay on the list, but the disadvantage that it's a single point of failure.  The "addr" system has no single point of failure, but can only tell you what nodes have recently been seen, so it takes a little longer to get connected since some of the nodes you try have gone offline.  The combination of the two gets us the best of both worlds and more total robustness.
Is there anyone who wants to volunteer to run an IRC server in case freenode gets tired of us?
I uploaded the 93% complete Dutch translation to SVN.  Thanks!
That's a good idea.  I'm not sure where exactly to fit that in, but it could certainly calculate the expected average time between blocks generated, and then people would know what to expect.
Every node and each processor has a different public key in its block, so they're guaranteed to be scanning different territory.
Whenever the 32-bit nonce starts over at 1, bnExtraNonce gets incremented, which is an arbitrary precision integer.
The current sending by IP is not very useful: it connects to the IP, so you'd like to use TOR for anonymity, but then it can totally be eavesdropped and man-in-the-middled.
The future plan for sending to an IP is to make it a bitcoin address plus IP, like:
I need suggestions for the separator character.  ":" is a candidate, but IPv6 has : in it and that might get confusing.  Something that's allowed in url parameters would be nice.
I want to use SSL for the connection, using the bitcoin address' public key as the cert.  You would be certain you're connected to who you thought, and safely encrypted.  The bitcoin address would not be used for the transaction, only for authentication.  A new generated bitcoin address would be sent through the SSL connection.
Since it's authenticated, it would then be safe to allow the IP address to be a domain name.  Some care taken that if a proxy is used, it uses socks4a instead of DNS lookup.
Hurray!  We have our first language.  I uploaded it to SVN to go in with the 0.3 release.
In the SVN version, if a transaction requires a transaction fee, it says
"This transaction is over the size limit.  You can still send it for a fee of #,
which goes to the nodes that process your transaction and helps to support the network.
Do you want to pay the fee?"
If you don't have enough money with the fee added, it says
"Total exceeds your balance when the # transaction fee is included  "
Does anyone want to translate the Bitcoin client itself?  It would be great to have at least one other language in the 0.3 release.
All you have to do is get poedit and translate the po file I'm attaching to this post.  It's less than 750 words.
Updated bitcoin.po attachment for 0.3.1
It does in fact download 500 blocks at a time, then the counter counts one at a time as it verifies the blocks.
The advantage of letting bitcoin download and verify the blocks is that you do not have to trust the person you're downloading them from.  If you downloaded the blk*.dat files from some site, you would have to trust that site, since you would be accepting the data without verifying it yourself.  If you're copying blk*.dat from another computer of yours, that should be fine.
How long is the initial block download taking for you?
Yeah, that actually is what it is.  getallreceived 0 should do what you want.  (now it's renamed to listreceivedbyaddress 0)  The default is 1 confirmation, but I think in reality most digital goods and services can be 0 confirmations.  Like you say, if you need more than 0 confirmations, you could show two numbers, unconfirmed and available balance, so they immediately see their transaction went through.
listreceivedbyaddress [minconf=1] [includeempty=false]
[minconf] is the minimum number of confirmations before payments are included.
[includeempty] whether to include addresses that haven't received any payments.
Returns an array of objects containing:
"address" : receiving address
"label" : the label of the receiving address
"amount" : total amount received by the address
"confirmations" : number of confirmations of the most recent transaction included
or listreceivedbylabel if you're labelling addresses with their username.
So far I've concentrated on functions for web merchants, not so much on stuff for remote management of headless coin generators yet.
This is on my list.  I will soon make the "Your Bitcoin Address:" window automatically change whenever you receive anything to the address displayed.
I'm also recommending this approach for the implementation of web apps.  I just posted some sample code showing a suggested way of implementing this.
Versions on SVN since 0.2.4 already have a "New..." button next to the address bar to encourage changing it manually too.
@theymos: If nothing else, we can fall back on that solution in the future.
I added label related functions to help with managing multiple addresses per user.  New or renamed functions are:
amount received on a single address
amount received by all addresses with this label
list addresses and amounts they've received
list labels and amounts they've received
misc label functions for completeness
For consistency I renamed getamountreceived->getreceivedbyaddress and getallreceived->listreceivedbyaddress.  The old names are still there so as not to break existing code, but they're deprecated.
The idea is that if you give the username whenever you call getnewaddress, you can get the user's total received across all their addresses using the "bylabel" functions.  You can freely change their address without worrying about tracking all their old addresses.
A good way to automate changing the user's receiving address: just before displaying their current address, check if it has been used to receive anything, if it has then replace it with a new one:
// Get a new address whenever the current one has received anything
If you're just getting one particular user's balance, such as in response to a page request by that user, use getreceivedbylabel, but if you're scanning over all users, it's better to use listreceivedbylabel to get the complete list and scan against the result.  Scanning users with getreceivedbylabel would be n-squared, using listreceivedbylabel is n-log-n (or n linear).
You should only really need to scan all users if you're polling in order to spontaneously take action in response to money received, rather than the user going to a webpage, seeing their balance and telling you what to do with it.  It's not necessary to poll very frequently.  If you require 1 confirmation, that'll take an average of 10 minutes anyway, so there's no point in polling more often than every few minutes.
If you're selling digital goods and services, where you don't lose much if someone gets a free access, and it can't be resold for profit, I think you're fine to accept 0 confirmations.
It's mostly only if you were selling gold or currency that you'd need multiple confirmations.
Almost but not quite.  Bitcoin uses EC-DSA, which can only do digital signing, not encryption.  RSA can do both, but I didn't use it because it's an order of magnitude bigger and would have been impractical.
It's not the download so much as verifying all the signatures in all the blocks as it downloads that takes a long time.
How long is the initial block download typically taking?  Does it slow down half way through or is about the same speed the whole way?
I've thought about ways to do a more cursory check of most of the chain up to the last few thousand blocks.  It is possible, but it's a lot of work, and there are a lot of other higher priority things to work on.
Simplified Payment Verification is for lightweight client-only users who only do transactions and don't generate and don't participate in the node network.  They wouldn't need to download blocks, just the hash chain, which is currently about 2MB and very quick to verify (less than a second to verify the whole chain).  If the network becomes very large, like over 100,000 nodes, this is what we'll use to allow common users to do transactions without being full blown nodes.  At that stage, most users should start running client-only software and only the specialist server farms keep running full network nodes, kind of like how the usenet network has consolidated.
SPV is not implemented yet, and won't be implemented until far in the future, but all the current implementation is designed around supporting it.
In the meantime, sites like
have been experimenting with account-based sites.  You create an account on a website and hold your bitcoins on account there and transfer in and out.  Creating an account on a website is a lot easier than installing and learning to use software, and a more familiar way of doing it for most people.  The only disadvantage is that you have to trust the site, but that's fine for pocket change amounts for micropayments and misc expenses.  It's an easy way to get started and if you get larger amounts then you can upgrade to the actual bitcoin software.
A little late, but in case anyone else has the same issue.  The compile dump had 2 warnings (that were 20 lines long) and 2 link errors.  The errors were:
Those are probably due to switching to the release build of wxWidgets instead of debug.  They're moving towards only debug build and ditching the release build, so they probably don't care that their release build is broken by referring to non-existent assert stuff.  There's nothing to fear about the debug build.  It's fully suitable for releases.
bitcoind runs as a daemon and can either be controlled by command line or JSON-RPC.
Thanks madhatter and generica for detailing the instructions for building on freebsd.
At the moment, it always assumes the incoming port is 8333, so it would tell other bitcoin nodes to connect to router:8333 even if you're redirecting from another port number.
I'm not in a big hurry to fix this because I can't think of any benefit to having more than one incoming connection port.  If you're providing one incoming port, then you've done your bit to help the network.  Having two incoming ports to the same person doesn't help redundancy.
If you have many computers, then using the -connect switch on most of them to connect locally makes more sense.
SheriffWoody:
Bitcoin addresses you generate are kept forever.  A bitcoin address must be kept to show ownership of anything sent to it.  If you were able to delete a bitcoin address and someone sent to it, the money would be lost.  They're only about 500 bytes.
sirius-m:
Thousands of own addresses should not be any problem at all.  If you've generated 50000 BTC, then you already have 1000 own addresses, one for each 50 generated.  Those are hidden, they're not shown in the UI.
It would be a good idea to add a little code that keeps giving the same address to the same IP.  Here's what I did in C++ to keep giving the same key (aka bitcoin address) until they use it:
// Keep giving the same key to the same ip until they use it
...sends the key mapReuseKey[pfrom->addr.ip]
...later...
If it's not convenient to know when you've received, just clear the cached keys every 20 minutes.
I want to add a parameter to getnewaddress for number of days to expire if nothing is received with the address.
Does it happen every time you run it, or just happened once at some random time?
I've never seen that fail before.  It's a call to OpenSSL that I assumed would never fail, but I put an error check there just in case.  I can't imagine how it would fail.  Out of memory maybe.
NID_secp256k1 is a constant.
There you go, we could easily do it the same way, like:
<bitcoinaddress>;amount=<amount>
Bitcoin can answer port 8330 on local loopback just as it does for JSON-RPC on 8332.  It would give an HTTP answer.
I think we can do that.
Although it would be possible for Bitcoin to take care of business in the HTTP response by presenting HTML UI to the user, as a user I would wonder if some website is trying to trick me or if I'm really talking to my own Bitcoin server.
The HTTP response could simply be HTML with the JavaScript equivalent of the back button, sending it back to the page.  Bitcoin then pops up the Send Bitcoins dialog with the destination bitcoin address and amount already filled in.  It would work just like a mailto: link that pops up a new email with the address filled in.
127.0.0.1 loopback is accessible by any user on the machine, it doesn't have per-user separation, but it's OK because it would only serve the convenience function of pre-filling the fields in a dialog.  You'd still have to press Send.  We'd have to make sure the Send button is not selected so it couldn't jump into the foreground while you're typing a space or enter.
That's a good idea.  At the very least a warning dialog explaining that it'll connect to the IP and send the information cleartext, giving the chance to cancel.
When you generate a new bitcoin address, it only takes disk space on your own computer (like 500 bytes).  It's like generating a new PGP private key, but less CPU intensive because it's ECC.  The address space is effectively unlimited.  It doesn't hurt anyone, so generate all you want.
Mihalism Multi Host is a popular open source PHP file hosting server.
It's geared toward image hosting, but I think by increasing the file size limit and liberalising the allowed file extensions, it could just as easily be used for general file upload hosting.  They need the limits to keep it reasonable as a free service, but if we bolt on a Bitcoin payment mechanism, the limits could be relaxed.
It doesn't have a bunch of client side scripting or anti-embedding junk to rip out.  It generates standard links that work normally.
There's a turnover churn in these free hosting sites.  Small sites can give free image hosting, but once one starts getting popular, it gets too swamped with moochers using them for free bandwidth.  Any site that gets well known has to become more aggressively pay-naggy to cover bandwidth costs.  It's a perfect example of a service where the needed price point is in the no-man's-land between just a little too expensive to be free, but too cheap for most users to take the trouble of a conventional payment.  It's in the gap between 0 and 19.95.  The best they can do is try to maybe get 1 out of 1000 users to pay 9.95, but that has 999/1000 users treated like freeloaders.  It can't really be advertising supported because the images are embedded in other sites and downloaded without going to the hosting site.
An example of a site running the software:
What do you think?  If I made a Bitcoin payment integration for this, would anyone be interested in running it?  It might be the first fully automated service available to buy with Bitcoins.  The advantage it could offer over the free services is general file upload hosting of large files without making downloading users go to the upload site and jump through hoops.  It would give a normal link directly to the file.
Title changed.
It helps that we have someone with actual experience running a proxy service.  Do you think Psiphon is the best one currently?  (sometimes the one you run was the best when you started but you found better ones later)
LR and Pecunix have many established exchanges to paper currencies by various payment methods, and a number of vendors accept them as payment, so an exchange link between Bitcoin and LR/Pecunix would give us 2nd-hop access to all that.  The possibility to cash out through them would help support the value of bitcoins.
Bitcoin has unique properties that would be complementary.  LR/Pecunix are easy to spend anonymously, but hard to buy anonymously and not worth the trouble to buy in small amounts.  Bitcoin, on the other hand, is easy to get in small amounts anonymously.  It would be convenient to buy LR/Pecunix with bitcoins rather than through conventional payment methods.
Most customers who convert to LR to buy something would probably ask the seller first if they accept Bitcoin, encouraging them to start accepting it.
It's unrelated.  There wasn't anything there when I started.
The price of .com registrations is lower than it should be, therefore any good name you might think of is always already taken by some domain name speculator.  Fortunately, it's standard for open source projects to be .org.
That's a great idea.  There's a thriving business in those services, but I've always thought the standard payment methods are at odds with privacy minded customers.
Would you consider making your software freely available so anyone could easily set one up?  I know for competitive reasons the inclination is to keep it to yourself, but it could get an order of magnitude more use if anyone could give proxy access to their country just by putting the software on a server.
I wonder if there are other kinds of web application servers where we would only have to tack on the payment mechanism to an already existing system?
Thanks soultcer for talking with the Freenode staffer.  Good to know it's OK at the current size, and now they know who we are.  They're supportive of projects like TOR so I hope they would probably be friendly to us.  We don't want to overstay our welcome.  If we get too big, then by the same token, we're big enough that we don't need IRC anymore and we'll get off.
We only needed IRC because nobody had a static IP.  In the early days there were some steady supporters, but they all had pool-allocated IPs that change every few days.  IRC was only intended as a temporary solution.  Bitcoin's built-in addr system is the main solution.
Bitcoin can get the list of IPs from any bitcoin node.  In that sense, every node serves as a directory server.
When there are enough static IP nodes to have a good chance that at least one will still be running by the time the current version goes out of use, we can preprogram a seed list.
How do you think we should compile the seed list?  Would it be OK to create it from the currently connected IPs that have been static for a while?
BTW, if we want to supplement by deploying separate directory server software, may I suggest IRC?  IRC is a good directory server (I've heard it has other uses too), and there are mature IRC server implementations available that anyone can run.
Bitcoin's IRC client implementation is already thoroughly tested.
When you want to upload an image to embed in a forum post, there are services like imageshack, but because they're free, they limit the number of views.  It's a minuscule amount of bandwidth cost, but they can't just give it away for free, there has to be something in it for them.  It would be nice to be able to pay for the bandwidth and avoid the limits, but conventional payments are too inconvenient for such a minor thing.
It's worse if you want to upload a file for others to download.  There are services like rapidshare, but they require the downloaders to go through extra steps and delays to make them look at advertising or encourage upgrading to a paid subscription, and they limit it to 10 or so downloads.
It would be nice if we made some free PHP code for an image and file hosting service that charges Bitcoins.  Anyone with some extra bandwidth quota could throw it on their webserver and run it.  Users could finally pay the minor fee to cover bandwidth cost and avoid the limits and hassles.  Ideally, it should be MIT license or public domain.
Services like this would be great for anonymous users, who have trouble paying for things.
It sets different priorities for each thread.  The generate threads run at PRIO_MIN.  The other threads rarely take any CPU and run at normal.
The priorities converted from Windows priorities were probably from a table like this:
"The following table shows the mapping between nice values and Win32 priorities. Refer to the Win32 documentation for SetThreadPriority() for more information on Win32 priority issues.
If you have better values, suggestions welcome.
Also, there was some advice on the web that PRIO_PROCESS is used on Linux because threads are processes.  If that's not true, maybe it accounts for unexpectedly setting the priority of the whole app.
threads are processes on linux, so PRIO_PROCESS affects just the one thread
sirius-m debugged this, it was 64-bit related.
The fix is now available on SVN, file util.cpp.
When there's enough scale, maybe there can be an exchange site that doesn't do transfers, just matches up buyers and sellers to exchange with each other directly, similar to how e-bay works.
To make it safer, the exchange site could act as an escrow for the bitcoin side of the payment.  The seller puts the bitcoin payment in escrow, and the buyer sends the conventional payment directly to the seller.  The exchange service doesn't handle any real world money.
This would be a step better than e-bay.  E-bay manages to work fine even though shipped goods can't be recovered if payment falls through.
We have the standard icon sizes, and the full size scales nicely to anything else.
I added the full size to the first post.
In the Windows world, "unicode" means UTF-16 (wchar).
2.8 has two build variations, ANSI and UTF-16 (unicode).  The UTF-16 version is the "unicode" version provided in the Debian package.  I believe 2.8 and its UTF-16 build labelled simply "unicode" has been the source of build problems described in the forum.  We were previously using 2.8 ANSI in anticipation of getting to UTF-8 without going through UTF-16 hell.  We cannot compile with UTF-16.
2.9 has only one version, UTF-8.  On Windows, we set the codepage to UTF-8, so on all platforms our code is UTF-8 and wxWidgets interfaces with us in UTF-8.  On Linux I assume the codepage is already UTF-8.  By standardizing on 2.9 we avoid the multi-build confusion of 2.8, and we need 2.9 for UTF-8 internationalization.
Make sure you read build-unix.txt and configure wxWidgets using the configure parameters given.
Curious, why is it incredibly hard to provide wxWidgets 2.9.0?  If you mean for users, that's why we static link it.
It's unfortunate that we require so many big dependencies, but we need them all.  At least on Debian/Ubuntu, all but wxWidgets are available as packages.  Eventually they'll provide a 2.9 package.
I don't know how to do SVG, but I did the original very large, over 500 pixels across, so it can be scaled down.  I'll give the original when I'm finished.
I had to custom tweak each icon size so the vertical lines land square on their pixels, otherwise they're ugly blurry and inconsistent.  Such is the challenge of making icons.  The original will be good for scaling to custom sizes between 48 and 500 but not smaller.
Are you using wxWidgets 2.9.0?  I don't recommend using anything other than 2.9.0.
It looks like they've got a reference in the wx headers (arrstr.h) to something outside of wxBase.
Removing -D__WXDEBUG__ from bitcoin's makefile would probably solve it.
If that doesn't work and you just want to get it working, you could edit wxWidgets include/wx/arrstr.h, line 167 and comment out the wxASSERT_MSG.
Good suggestion.  I made the B slightly lighter and the background slightly darker.  Very slightly.  The foreground is now exactly the same colour as the BC in the old one.
It's kind of OK if you can't easily read the B in the 16x16.  At that size, you just need to see that it's a coin.  It doesn't matter so much what's embossed on it, just that there be some detail there because it wouldn't look like a coin if it was a blank smooth circle.
It's slightly wider than tall because the dark perspective under it goes more to the right than down.
I finished and posted the 32x31 and 48x47 versions in the first message.  I like the 48 a lot.
How does everyone feel about the B symbol with the two lines through the outside?  Can we live with that as our logo?
wx/clipbrd.h isn't used, move it inside the #if wxUSE_GUI.
Updated headers.h on SVN.
Sorry, I linked to wxbase but I had full wxWidgets on my computer.
The db.h:140 class Db no member named "exisits" is stranger.  pdb->get, pdb->put, pdb->del compiled before that.  Do you have version 4.7.25 of Berkeley DB?
I suppose they might have added exists recently, using get before that.
The formula is based on the time it takes to generate 2016 blocks.  The difficulty is multiplied by 14/(actual days taken).  For instance, this time it took 9.4 days, so the calculation was 14/9.4 = 1.49.  Previous difficulty 2.53 * 1.49 = 3.78, a 49% increase.
I don't know what you're talking about accepting easier difficulties.
OK, I made a build target bitcoind that only links wxBase and does not link GTK.  Version 0.2.7 on SVN.
I split out the init and shutdown stuff from ui.cpp into init.cpp, so now ui.cpp is pure UI.  ui.h provides inline stubs if wxUSE_GUI=0.  We only have four functions that interface from the node to the UI.  In the bitcoind build, we don't link ui.o or uibase.o.
Sure feels like it could be something in wxWidgets retrying endlessly because some UI thing failed or something wasn't inited correctly.  Our hack to ignore the initialize failure and run anyway means we're in uncharted territory.  We're relying on the fact that we hardly use wx in this mode.  We do still use a few things like wxGetTranslation and wxMutex.
Another way to debug would be to run in gdb, wait until everything is quiet and all threads should be idle, and break it and see which thread is busily doing something and what it's doing.
I suspect bitcoind will probably work fine, but I hope you can still debug the problem.
Yes, the original is 546x531 pixels.
It looks good at larger size too, but since the small icons are what you mostly always see, I wanted to judge it on those first.  I'll post larger sizes and full size a little later.
The automatic adjustment happened earlier today.
I updated the first post.
When and how fast did memory usage increase?  Right away, slowly over a long time, or starting at some later event?
I have -daemon running on ubuntu 9.10 64-bit and memory usage is steady.
It has to be something about the difference on the server besides 64-bit.  Maybe some malfunction from the lack of GUI.  A memory leak debug tool could give a clue.
If you GPL stuff, I have to avoid using it.  Nothing against GPL per-se, but Bitcoin is an MIT license project.  Anything GPL please clearly mark it as such.
New icons, what do you think?  Better than the old one?
Full size 530x529 image for scaling down to custom sizes:
The perspective shadow was too thick on the larger sizes.  I updated 32, 48 and the full size.
I release these images into the public domain (copyright-free).  I request that derivative works be made public domain.
How much "dealing with" does GTK actually require?  Is it just a matter of "sudo apt-get install libgtk2.0-0" and having some extra libraries sitting around?  GTK doesn't have to do anything, just be there for bitcoin to link to when it loads up, have the gtk-init-check call fail because no GUI present, then it's done.
It saves us butchering everything with ifdefs and a separate compile and binary to use wxBase just to try to avoid linking GTK.
That would be nice at point-of-sale.  The cash register displays a QR-code encoding a bitcoin address and amount on a screen and you photo it with your mobile.
No, each generated transaction uses a new, single-use address.
Nothing uses the address in the main window, it's just there for convenience for you to copy.  0.2.5 has a "New..." button next to it to make it easy to change each time you use it.
Version 0.2.6 on SVN can now run as a daemon and be controlled by command line or JSON-RPC.
On Linux it needs libgtk2.0-0 installed, but does not need a GUI running.  Hopefully gtk can be installed without having a windowing system installed.
The command to start as a daemon is:
bitcoin -daemon [switches...]
Or, to run the UI normally and also be able to control it from command line or JSON-RPC, use the "-server" switch.
bitcoin -server [switches...]
With either switch, it runs an HTTP JSON-RPC server that accepts local socket connections on 127.0.0.1:8332.  The port is bound to loopback and can only be accessed from the local machine, but from any account, not just the user it's running under.
To control it from the command line, the interface is a command name without any switches, followed by parameters if any.
It's a simple JSON-RPC client and prints the JSON result.  Look at rpc.cpp for the list of commands.
Web apps or anything automated will normally use JSON-RPC directly, not command line.  There are JSON-RPC libraries for all the major languages.  In script languages like PHP and Python the syntax is as natural as calling a local function.
Ah yes, there we go, back to normal again.
The ctrl+alt+F[1-8] thing never worked on this computer.  The screen just goes haywire.
There's a separate public/private keypair for every bitcoin address.  You don't have a single private key that unlocks everything.  Bitcoin addresses are a 160-bit hash of the public key, everything else in the system is 256-bit.
If there was a collision, the collider could spend any money sent to that address.  Just money sent to that address, not the whole wallet.
If you were to intentionally try to make a collision, it would currently take 2^126 times longer to generate a colliding bitcoin address than to generate a block.  You could have got a lot more money by generating blocks.
The random seed is very thorough.  On Windows, it uses all the performance monitor data that measures every bit of disk performance, network card metrics, cpu time, paging etc. since your computer started.  Linux has a built-in entropy collector.  Adding to that, every time you move your mouse inside the Bitcoin window you're generating entropy, and entropy is captured from the timing of disk ops.
There are now "Sending" and "Receiving" tabs in the Address Book.  Your addresses are referred to as "receiving addresses".
madhatter was working on building it on Mac.  He had errors probably caused by UTF-16 wxWidgets 2.8.  Should have better luck now with 2.9.0.  wxWidgets 2.9.0 is UTF-8 and wouldn't have that problem.
I think he had it working on FreeBSD, but he wanted a non-UI version.
I have the command line and JSON-RPC daemon version working now.  Will SVN it in a day or two.
I disabled gdm on my Ubuntu system so it boots into command line.  I hope I will be able to get it enabled again with rcconf.
Just a random streak of bad luck.  It looks steady to me.
Competition doesn't have an effect until the next automatic retarget adjustment, and we haven't reached the next one yet.
The adjustments are every 2016 blocks.  To calculate our progress towards the next one, divide the block total by 2016.  The fractional part is how far we are to the next one.
My back-of-the-envelope projection: 42032 blocks/2016 = 20.85 = 85% of the way.  About 1.5 days to go until the next one.  That'll only be about 10 days since the last one, the target is 14 days, so 14/10 = 1.4 = around 40% difficulty increase.
Uploaded some UI changes to SVN as version 0.2.5.
Instead of View->Show Generated, we now have tabs:
Makes it a lot easier to flip to received and check for payments.
Moved the "Your Addresses" book inside the main address book.  It was confusing having two address books.
I found the "To:" in "From: unknown, To: (one of your bitcoin addresses)" still confusing, so I changed it to "From: unknown, Received with:".  The bitcoin address is abbreviated so you can see the label that you set in the Receiving tab of the address book.
Fixed a few UI glitches from the upgrade to wxWidgets 2.9.0.
I haven't forgotten about you people who want non-UI, but I had to do some fun stuff before more build bashing.
Excellent analysis, xc.
A rational market price for something that is expected to increase in value will already reflect the present value of the expected future increases.  In your head, you do a probability estimate balancing the odds that it keeps increasing.
In the absence of a market to establish the price, NewLibertyStandard's estimate based on production cost is a good guess and a helpful service (thanks).  The price of any commodity tends to gravitate toward the production cost.  If the price is below cost, then production slows down.  If the price is above cost, profit can be made by generating and selling more.  At the same time, the increased production would increase the difficulty, pushing the cost of generating towards the price.
In later years, when new coin generation is a small percentage of the existing supply, market price will dictate the cost of production more than the other way around.
At the moment, generation effort is rapidly increasing, suggesting people are estimating the present value to be higher than the current cost of production.
It would be nice to have a list of static IPs for new users to send test donations to so they can see how the software works.  If you can accept incoming connections and you have a static IP address, post it here!
Anything sent to these IPs should be considered a donation.
If you do request a round-trip, be sure to include your return bitcoin address or IP in the comment, but please assume it'll be one-way.  They won't necessarily be watching for incoming transactions to send back.
Nodes stop trying to initiate connections once they have 15.  If you can accept incoming connections, then you can get well above that from nodes connecting to you, otherwise you max out at 15.
I don't know if there's any reason to have 15 connections.  Maybe it should be 10.
Since nodes that can only connect out are probably at or near 15 most of the time now, you should level off to an equilibrium.  45 suggests a ratio of 3 out-only nodes to every 1 in-accepting node.
The number of connections won't be a good gauge of the size of the network any more.  Someone should periodically IRC to the bitcoin channel on chat.freenode.net and count the number of users.  That gives you the total count of network nodes (except TOR nodes).
Block generation is again running ahead of pace.  We're in for another big step up in difficulty at the next adjustment in about 5 days.
I updated the SVN with changes to support translation.  Translatable strings are all enclosed in _(""), and we're using UTF-8 on all platforms.
When the program runs, it looks in the directory of the EXE for the file: locale\<langcode>\LC_MESSAGES\bitcoin.mo
<langcode> is the two letter code of the language your OS is set to, like "de" or "nl".
On Linux, it also looks for:
/usr/share/locale/<langcode>/LC_MESSAGES/bitcoin.mo
/usr/local/share/locale/<langcode>/LC_MESSAGES/bitcoin.mo
(are there other standard places it should look on linux?)
Here's a quick walkthrough using poedit to make a .po and .mo file:
- Download the bitcoin sourcecode from SVN
- In the trunk directory, mkdir locale\<lang>\LC_MESSAGES
- In poedit, File->New catalog->Paths tab
- Click the "New item" dotted rectangle button
- Put "../../.." and MAKE SURE TO PRESS ENTER to add the path
- Click OK
- Save the file as "bitcoin.po" in the LC_MESSAGES directory you made
- It should then scan the sourcecode and find about 170 strings
- If it didn't find anything, check Catalog->Settings->Path tab, make sure the "../../.." was added
When you're done translating, commit both bitcoin.po (the editable catalog file) and bitcoin.mo (compiled data used by the program).
2 seconds of latency in both directions should reduce your generation success by less than 1%.
Probably OK, but I'm not sure.  The protocol is designed to resync to the next message, and messages get re-requested from all the other nodes you're connected to until received.  If you miss a block, it'll also keep requesting it every time another blocks comes in and it sees there's a gap.  Before the original release I did a test dropping 1 out of 4 random messages under heavy load until I could run it overnight without any nodes getting stuck.
I thought about that but there wasn't a practical way to do smaller increments.  The frequency of block generation is balanced between confirming transactions as fast as possible and the latency of the network.
The algorithm aims for an average of 6 blocks per hour.  If it was 5 bc and 60 per hour, there would be 10 times as many blocks and the initial block download would take 10 times as long.  It wouldn't work anyway because that would be only 1 minute average between blocks, too close to the broadcast latency when the network gets larger.
Right now there isn't a port number setting to do that.  It's a feature yet to be implemented.  You can only set up your NAT to port-forward to one of the computers.  (I said something earlier about NAT port translation, but that wouldn't work, other nodes wouldn't know to connect to that port)
If you want, as a small optimization, you could run the rest of your computers as:
bitcoin -connect=<the IP of the first computer>
so they get all their network communication from the first computer and don't all connect over the net individually for the same information.  This saves bandwidth, although it doesn't use much bandwidth to begin with, so it wouldn't really matter unless you had tons of computers.
For redundancy in case the first computer goes down, you could have two that connect out and the rest connect to both of them.  The first two are run normally, the rest are run like:
Another big jump in difficulty yesterday from 1.82 times to 2.53 times, a 39% increase since 10 days ago.  It was 10 days apart not 14 because more nodes joined and generated the 2016 blocks in less time.
Right.  Otherwise we couldn't have a finite limit of 21 million coins, because there would always need to be some minimum reward for generating.  In a few decades when the reward gets too small, the transaction fee will become the main compensation for nodes.  I'm sure that in 20 years there will either be very large transaction volume or no volume.
Almost all transactions are free.  A transaction is over the maximum size limit if it has to add up more than 500 of the largest payments you've received to make up the amount.  A transaction over the size limit can still be sent if a small fee is added.
The average transaction, and anything up to 500 times bigger than average, is free.
It's only when you're sending a really huge transaction that the transaction fee ever comes into play, and even then it only works out to something like 0.002% of the amount.  It's not money sucked out of the system, it just goes to other nodes.  If you're sad about paying the fee, you could always turn the tables and run a node yourself and maybe someday rake in a 0.44 fee yourself.
I couldn't get wxWidgets 2.8.9 to compile on Karmic 64-bit either.
I have been compiling the latest SVN on Karmic 64-bit with wxWidgets 2.9.0, which compiles fine on 64-bit.  Read build-unix.txt and use the given ../configure parameters on wxWidgets so you can use the makefile.unix.wx2.9 as supplied.  (--enable-debug --disable-shared --enable-monolithic)
The download link on the homepage is to the sourceforge tar.gz archive which contains the 32-bit binary and the 0.2.0 sources, which were not yet buildable on 64-bit at the time.
The SVN was first buildable on 64-bit with wx2.9.0 on 28 January 2010.
Hopefully they'll have a wxWidgets 2.9.0 debian package someday.
True, sending by IP through Tor trades one problem for another.  The Tor exit node can see the text of your message and potentially MITM you.
Best to only send to bitcoin addresses then.  Payments by bitcoin address are broadcast over the network as part of the normal network traffic.  All communications with the network are broadcasts of public information.
Am I missing something?  Is there something wrong with the 32-bit linux precompiled binary on bitcoin.org?
The bitcoin binary in the distribution static links the wxWidgets library, and its shared links (openssl and GTK) are included in Ubuntu, so it can run without needing to be a .deb to pull down dependencies.
Since we're upgrading to wxWidgets 2.9.0 for UTF-8, which doesn't have a DEB package yet, we'll continue to need to static link it.
There's a small transaction fee for very large transactions.  The node that generates the block that contains the transaction gets the fee.
If the same money gets sent again, it won't incur the fee again.  If all you have is generated coins in your wallet, if you send them all in one huge transaction, it has to bundle hundreds of 50 bc coins together.  After that it's just one line to send the combined unit.
Are you just trying to run the program or do you really need to compile it?  There's a 32-bit linux binary that can be run on 64-bit ubuntu if you "sudo apt-get ia32-libs".
I recently updated the SVN for building on 64-bit Karmic with wxWidgets 2.9.0.  This was after the 0.2.0 release.  The 0.2.0 release did not build on 64-bit yet.
Unfortunately there currently isn't a -dev deb package of either of the versions of wxWidgets that we can use.  On Karmic they only have the UTF-16 version.  We need either the ANSI (libwxgtk2.8-ansi-dev) version or the UTF-8 (wxWidgets 2.9.0) version.  We're moving towards 2.9.0.
I know you said you didn't want VM, but as a last resort, last I checked the Windows version runs fine in Wine.
There are command line options:
bitcoin -addnode=1.2.3.4    to tell bitcoin about a node to connect to
bitcoin -connect=1.2.3.4    connect only to the specified node(s)
You can use more than one of these, for instance
bitcoin -connect=(first to try) -connect=(next to try) ...
You can specify non-routable IPs with -connect like 192.168.x.x, so if you had a server farm and you wanted one server to connect to the world and the rest to connect to the one server, you could do that.
In particular, -addnode is needed if you're always going to connect through TOR, since the IRC server blocks all the TOR exit nodes.  To connect through TOR, you could use:
bitcoin -proxy=127.0.0.1:9050 -addnode=212.159.72.216
It's much easier to have a single binary and multiple .mo files.  It's too much maintenance work to have lots of build variations.  Once the software support is implemented, anyone could contribute translations.
wxWidgets uses the gettext standard.  You use the gettext tools or something like poedit to create a .po file by scanning the sourcefiles for strings and editing the translations into the .po file, then compile it into a .mo file.  The program loads the .mo file at runtime and reskins all the strings.  Additional languages can be added to an existing program by adding .mo files without recompiling the program.
On Windows, the .mo files would go in a lang subdirectory in the directory where the EXE is located.
Right now I'm working on JSON-RPC and command line support, but when I'm finished with that I hope to do this next.
Thank you for the offer to help translate.  That is probably the best way you could help.
I will need to prepare the code for translation first.  wxWidgets has locale support, and most strings are in generated code that is already wrapped, so it shouldn't be too hard.  We also must finish upgrading to wxWidgets-2.9.0 to get UTF-8 support.  I've done test builds with 2.9.0 and there is one bug left to fix.
What operating system are you using?  Windows, Linux 32-bit or 64 bit?
No, sorry.  I've been meaning to redo it.  The largest icon that still looks good is the 20x20 one which is used for the tray icon in GNOME.  Any larger than that looks bad.  The 16x16 and 20x20 ones have quite a bit of hand tweaking to get the pixels to work out right.  If you just scale down a larger image, the pixels end up blurred and awkward in places where the lines in "BC" don't land square on a pixel.
The best 16x16 with full alpha channel is in src/rc/bitcoin.ico.  I don't like the 32x32 version.
I'm attaching bitcoin20x20.png, the 20x20 version with full transparency.
Eventually at most only 21 million coins for 6.8 billion people in the world if it really gets huge.
But don't worry, there are another 6 decimal places that aren't shown, for a total of 8 decimal places internally.  It shows 1.00 but internally it's 1.00000000.  If there's massive deflation in the future, the software could show more decimal places.
If it gets tiresome working with small numbers, we could change where the display shows the decimal point.  Same amount of money, just different convention for where the ","'s and "."'s go.  e.g. moving the decimal place 3 places would mean if you had 1.00000 before, now it shows it as 1,000.00.
When you send to a bitcoin address, you don't connect to the recipient.  You send the transaction to the network the same way you relay transactions.  There's no distinction between a transaction you originated and one you received from another node that you're relaying in a broadcast.  With a very small network though, someone might still figure it out by process of elimination.  It'll be better when the network is larger.
If you send by IP, the recipient sees you because you connect to their IP.  You could use TOR to mask that.
You could use TOR if you don't want anyone to know you're even using Bitcoin.
Bitcoin is still very new and has not been independently analysed.  If you're serious about privacy, TOR is an advisable precaution.
That's not possible.  You've handed control of the money over to the recipient's keypair.  Only that key can control it.
It's similar to if you encrypt a file with AES and a strong password, and you lose the password.  The data is lost.
We had our first automatic adjustment of the proof-of-work difficulty on 30 Dec 2009.
The minimum difficulty is 32 zero bits, so even if only one person was running a node, the difficulty doesn't get any easier than that.  For most of last year, we were hovering below the minimum.  On 30 Dec we broke above it and the algorithm adjusted to more difficulty.  It's been getting more difficult at each adjustment since then.
The adjustment on 04 Feb took it up from 1.34 times last year's difficulty to 1.82 times more difficult than last year.  That means you generate only 55% as many coins for the same amount of work.
The difficulty adjusts proportionally to the total effort across the network.  If the number of nodes doubles, the difficulty will also double, returning the total generated to the target rate.
For those technically inclined, the proof-of-work difficulty can be seen by searching on "target:" in debug.log.  It's a 256-bit unsigned hex number, which the SHA-256 value has to be less than to successfully generate a block.  It gets adjusted every 2016 blocks, typically two weeks.  That's when it prints "GetNextWorkRequired RETARGET" in debug.log.
When using proxy port 9050, it will only make one attempt to connect to IRC, then give up, since it knows it will probably always fail because IRC servers ban all the TOR exit nodes.  If you're using another port, it would assume it might be a regular old normal proxy and would keep retrying IRC at longer and longer intervals.  You should not use Polipo or Privoxy as those are http filters and caches that would corrupt Bitcoin's messages if they make any changes.  Bitcoin might be trying to overcome it by reconnecting.  You should use port 9050.
As riX says, the "is giving Tor only an IP address. Apps that do DNS..." warnings are nothing to worry about.  Bitcoin doesn't use DNS at all in proxy mode.
Since Bitcoin can't get through to IRC through Tor, it doesn't know which nodes are currently online, so it has to try all the recently seen nodes.  It tries to conserve connection attempts as much as possible, but also people want it to connect quickly when they start it up and reconnect quickly if disconnected.  It uses an algorithm where it tries an IP less and less frequently the longer ago it was successful connected.  For example, for a node it saw 24 hours ago, it would wait 5 hours between connection attempts.  Once it has at least 2 connections, it won't try anything over a week old, and 5 connections it won't try anything over 24 hours old.
Port forwarding forwards a port to one computer.  It tells the router which computer handles connections to that port.  So that's the computer receiving.
If you didn't set up port forwarding, then incoming connections won't go to any computer, and attempts to send to that IP would just say it couldn't connect to the recipient and nothing is sent.  When sending by IP, you still send to a bitcoin address, but your computer connects to that IP, gets a new bitcoin address from it, gives the transaction directly to the them and confirms that it was received and accepted.
Someone should post their static IP so people can try out sending by IP and also give that user free money.
There's a 32-bit checksum in bitcoin addresses so you can't accidentally type an invalid address.
If 4) you send to a recipient who has abandoned or lost their wallet.dat, then the money is lost.  A subtle point can be made that since there is then less total money in circulation, everyone's remaining money is worth slightly more, aka "natural deflation".
Thanks for that.  Which version of Windows?
I uploaded this fix to the SVN.  It watches for spent coins and updates your wallet on load and also continuously as blocks come in.  I also put a better error message, but it should never hit it because it always finds spent coins ahead of time, unless you spent the same money at the same time on two computers at once.
If you want to try it, PM or e-mail me your e-mail address where I can send it as an attachment and also what OS (win, linux 32-bit, linux 64-bit).
I committed a fix for 64-bit compile and some fixes to support wxWidgets 2.9.0.
There was one compile error in serialize.h with min(sizeof()) that I fixed for 64-bit.  The rest of the 64-bit compile errors I was getting were in wxWidgets 2.8.9, so I started working on supporting wxWidgets 2.9.0.
wxWidgets 2.9.0 is UTF-8.  We've been using the ANSI version of wxWidgets 2.8.9 in anticipation of wxWidgets UTF-8 support.
I compiled and ran on 64-bit Ubuntu 9.10 Karmic.
I think the only bug left is where the status number is mashed up.  I'm not sure why, I have to suspect it's a UTF-8 thing, but no idea how that could happen.  Haven't looked into it.
build-unix.txt is updated and two makefiles on SVN:
Unfortunately there's still no debian package for either version of wxWidgets we use.  They only have the wchar ("unicode") version of wxWidgets 2.8, which is a disaster because wchar wxString doesn't convert to std::string.  We use either ANSI wxWidgets 2.8, or wxWidgets 2.9.  So you still have to get it and build it yourself.
The recommended ways to do a payment for an order:
1) The merchant has a static IP, the customer sends to it with a comment.
2) The merchant creates a new bitcoin address, gives it to the customer, the customer sends to that address.  This will be the standard way for website software to do it.
RSA vs ECDSA: it's not the size of the executable but the size of the data.  I thought it would be impractical if the block chain, bitcoin addresses, disk space and bandwidth requirements were all an order of magnitude bigger.  Also, even if using RSA for messages, it would still make sense to do all the bitcoin network with ECDSA and use RSA in parallel for only the message part.  In that case, everything that's been implemented up to now would be implemented exactly as it has been.
We can figure out the best way to do this much later.  It could use a separate (maybe existing) e-mail or IM infrastructure to pass messages, and instead of RSA, maybe just put a hash of the message in the transaction to prove that the transaction is for the order described in the message.  The message would have to include a salt so nobody could brute force the hash to reveal a short message.
That's the right way to do it as riX says.  The software can generate a new bitcoin address whenever you need one for each payment.  "Please send X bc to [single-use bitcoin address] to complete your order"  When the server receives that amount to the bitcoin address, that could trigger it to automatically fulfil the order or e-mail the shop owner.
Adding command line support is a high priority.  It's just a matter of getting the time to code it.
The resync idea would go through your wallet and check it against the block index to find any transactions that your current computer doesn't realize are already spent.  That could happen if they were spent on another computer with a copy of the wallet file, or you had to restore the wallet to a backup from before they were spent.  Currently, the software just assumes it always knows whether its transactions are spent because it marks them spent in wallet.dat when it spends them.
A wallet merge tool is possible to implement but much less in demand once resync solves most of the problem.  With resync, you could do about the same thing by sending all the money from one wallet to the other.  The receiver would resync and discover all its overlapping coins were spent, then receive them in the new transaction.
Where it says "# blocks" in the status column I'm changing it to say "# confirmations".  That might be clearer.
If you doubleclick on the transaction you get a little more information.
Yes, it's a technical limitation.  Sending by bitcoin address enters the transaction into the network and the recipient discovers it from the network.  You don't connect directly with them and they don't have to be online at the time.
I very much wanted to find some way to include a short message, but the problem is, the whole world would be able to see the message.  As much as you may keep reminding people that the message is completely non-private, it would be an accident waiting to happen.
Unfortunately, ECDSA can only sign signatures, it can't encrypt messages, and we need the small size of ECDSA.  RSA can encrypt messages, but it's many times bigger than ECDSA.
That is what happens if you copy wallet files around.  If you copy your wallet file to a second computer, then they both think the money in the wallet is theirs.  If one spends any of it, the other doesn't know those coins are already spent and would try to spend them again, and that's the error you would hit.
Now that it's clear this is a key error message, it ought to be something more like "the money appears to be already spent...  this could happen if you used a copy of your wallet file on another computer."
You can move or backup your wallet file, but it needs to have only one "lineage" and only used in one place at a time.  Any time you transfer money out of it, then you must no longer use any previous copies.
This brings up a good point.  In the case of restoring a backup that may be from before you spent some coins, we need to add functionality to resync it to discover which coins have already been spent.  This would not be hard to do, it just hasn't been implemented yet.  I'll add it to the list.  This would make it mostly repair the situation instead of giving that error message.
I've been thinking about that for a while.  I want to add the backend support for .onion addresses and connecting to them, then go from there.
There aren't many .onion addresses in use for anything because the user has to go through a number of steps to create one.  Configure TOR to generate a .onion address, restart TOR, configure it with the generated address.  Perhaps this is intentional to keep TOR so it can't be integrated into file sharing programs in any sufficiently automated way.
Coins generate at the same speed with any number of connections >= 1.
More connections just add redundancy.  If you only had one connection, what if that node is slow or busy, or only connected to you?  Having several connections increases the certainty that you're well connected to the network.  That hasn't been a problem in practice, the network is very thoroughly connected.  If you have 2 or 3 connections, you're fine.
I haven't tried compiling 64-bit yet. 64-bit wouldn't make it any faster, since it uses 64-bit numbers in only a few places and SHA-256 is a 32-bit algorithm, but it may be convenient for those running a 64-bit OS. If I get a chance I'll try -m64 and see what the problem is.
You can run the 32-bit version on 64-bit Linux by installing ia32-libs.  (sudo apt-get install ia32-libs)  If we made a Debian package, it could automatically pull that in as a dependency.
The transfer is immediate if you send by IP address.  If you send by bitcoin address and the recipient isn't online at the time, it might take 30 minutes or more to see it.
Also, the recipient needs to be synced up with the block chain before it'll see the received transaction.  That means the status bar at the bottom needs to say at least 33000 blocks, like "x connections  33200 blocks  x transactions".
Would it be clearer if the status said "x confirmations", like:
Each block essentially means another node has confirmed that it agrees with all transactions up to that point.
What you can currently do is set "Minimize to the tray" in options, then run it as "bitcoin -min" so it starts minimized.  The only visible part will be a small (20x20) icon on the tray, which can be doubleclicked if you want to access the UI.  Note: there's a bug with tray icons sometimes disappearing on 64-bit Karmic Koala, not sure if it's from 64-bit or Karmic, it was fine on 32-bit Jaunty.
We didn't have time to implement the "Start Bitcoin on system startup" feature on Linux in time for 0.2 so it's greyed out.  I figured Linux people wouldn't mind doing that manually anyway.  I guess they need to know about the -min switch to do it right.
You can locate the data directory where you want with the "-datadir=<directory>" switch.  I know someone is already doing that to put it on a TrueCrypt USB drive.
That's good, is it running fine on FreeBSD?
I committed the changes to headers.h.  For consistency, I used __BSD__.  The complete list of defines is at
malloc.h is only needed on windows, I'll move that into the __WXMSW__ section before it causes any more trouble.
- Multi-processor support for coin generation
- Proxy support for use with TOR
- Fixed some slowdowns in the initial block download
Major thanks to <PRESIDIO_ANONYMIZED_PERSON> (sirius-m) for all his coding work and for hosting the new site and this forum, and New Liberty Standard for his help with testing the Linux version.
Then it must be something you're doing differently with building or configuring wxWidgets.
What options did you use on the wxWidgets "configure" script?  The options I used are in build-unix.txt.
Never heard of that happening.  Is there anything in debug.log?  If you touched the file, that sounds like something is there.  Does the program have write access to the file?
It looks like the implicit conversion from std::string to wxString isn't working.  That's used everywhere, the conversion needs to work.
wxString is complicated by supporting win32's 16-bit wchar and 8-bit ansi dual-compile.  You can get that problem on Windows if the "unicode" (meaning wchar) build is used, so that wxString is wchar and std::string is char.
It's probably some wxWidgets compile defines or build configuration.  What "configure" options did you use?
I'm not sure __WXMAC__ is the right define.  It may be the Mac Classic support that's complicating wxString, and we only want OSX.  Try __WXOSX__ (or see below)
"There are two wxWidgets ports to Mac OS. One of them, wxMac, exists in two versions: Classic and Carbon. The Classic version is the only one to work on Mac OS version 8. The Carbon version may be built either as CFM or Mach-O (binary format, like ELF) and the former may run under OS 9 while the latter only runs under OS X. Finally, there is a new Cocoa port which can only be used under OS X. To summarize:
If you want to test for all Mac platforms, classic and OS X, you should test both __WXMAC__ and __WXCOCOA__.
If you want to test for any GUI Mac port under OS X, use __WXOSX__.
If you want to test for any port under Mac OS X, including, for example, wxGTK and also wxBase, use __DARWIN__"
There would be a command line switch at runtime to tell it to run without UI.  All it needs to do is not create the main window.  A simplistic way would be to disable "pframeMain->Show" and "ptaskbaricon->Show" in ui.cpp.  The network threads don't care that the UI isn't there.  The only other UI is a message box in CheckDiskSpace if it runs out of disk space.
Then a separate command line utility to communicate with it to do things.  Not sure what it should be named.
"natural deflation"... I like that name for it.  Yes, there will be natural deflation due to payment mistakes and lost data.  Coin creation will eventually get slow enough that it is exceeded by natural deflation and we'll have net deflation.
Mac support would be nice.  wxWidgets really pays off for cross platform.
Please don't try PPC.  PPC is big-endian and Bitcoin is little-endian, there would be endless endian bugs making it harder for me to debug the network if there's a potentially byte-swapping node out there.  PPC is on its way out anyway.
Considered autoconf.  Autoconf is a necessity for large projects with a quagmire makefile, but I think we're small enough that it's more optimal without it.  I'd rather keep the makefile simple as long as possible.
My head hurts just thinking about that.  Funnelling all the UI backend through a TCP connection would make everything twice as hard.  There's too much bandwidth between the UI and the internal data structures in order to keep the listview control updated, because of the way the listview control works.
I'd rather have command line control, that would get us remote admin and batch automation.
The average total coins generated across the network per day stays the same.  Faster machines just get a larger share than slower machines.  If everyone bought faster machines, they wouldn't get more coins than before.
We should have a gentleman's agreement to postpone the GPU arms race as long as we can for the good of the network.  It's much easer to get new users up to speed if they don't have to worry about GPU drivers and compatibility.  It's nice how anyone with just a CPU can compete fairly equally right now.
Right, the SVN has the almost-release-candidate 0.2 source, which can also be built and run on Linux.   It hasn't been tested on FreeBSD.
That would be a big help.  TOR users wouldn't have to worry about how to get seeded, and we wouldn't depend on IRC.
It can be run in a few simple modes without access to the UI if you don't mind a minimized window on the desktop.  (0.1.5 doesn't have -min so it would be an open window)
To only run a seed:
bitcoin -min -gen=0
You could sort of monitor it by looking at debug.log.  To stop it, kill the process, the database won't mind.
To generate:
bitcoin -min -gen
To get the generated bitcoins, you'd have to copy wallet.dat (with version 0.2) to a machine with a UI, swap in the wallet.dat, run bitcoin and transfer the coins to your main account.  (With version 0.1.5 you'd have to copy the whole "%appdata%/Bitcoin" directory.)  There is one caveat about copying wallet.dat: if you happened to kill the program at the exact moment that it generated a coin or received a payment, wallet.dat might not work by itself and you'd have to copy the whole directory.
I see, that would happen with multiple nodes using the same NAT or VPN or some ISP that funnels everyone through a few proxy servers.  I just committed a fix to SVN for this.  If it gets "433" name already in use (it was error 433, right?), it'll retry with a non-address random username.
That's great, any help is really appreciated!
That's true, with the send-to-IP option, you are sending to whoever answers that IP.  Sending to a bitcoin address doesn't have that problem.
The plan is to implement an IP + bitcoin address option that would have the benefits of both.  It would still use a different address for each transaction, but the receiver would sign the one-time-use address with the given bitcoin address to prove it belongs to the intended receiver.
For that level of anonymity you need to connect through TOR, which will be possible with version 0.2, which is only a few weeks away.  I'll post TOR instructions at that time.
Version 0.1.5: backup the whole %appdata%\Bitcoin directory.
Version 0.2: you can backup just wallet.dat.
Nope.  The whole design is all about preventing that from working.
Those coins can never be recovered, and the total circulation is less.  Since the effective circulation is reduced, all the remaining coins are worth slightly more.  It's the opposite of when a government prints money and the value of existing money goes down.
It's currently 29,296 blocks.  The circulation is the number of blocks times 50, so the current circulation is 1,464,800 bc.
If you only have 24k blocks, it must not have finished the initial block download.  Exit bitcoin and start it again.  Version 0.2 is better/faster at the initial block download.
Typically a few hundred right now.  It's easy now but it'll get harder as the network grows.
Good question, it's TCP.  The website needs to be updated to say TCP port 8333.
The port forwarding is so other nodes can connect to you, so it helps you stay connected because you are able to be connected with more nodes.  You also need it to receive payments by IP address.
No, the other nodes won't accept that.
Being open source means anyone can independently review the code.  If it was closed source, nobody could verify the security.  I think it's essential for a program of this nature to be open source.
Slower machines produce fewer coins.  It's proportional to CPU speed.
There are more coming.
It uses a transactional database called Berkeley DB.  It will not lose data in a system crash.  Transactions are written to the database immediately when they're received.
For now, you can just multiply the total blocks by 50.  The Bitcoin network has been running for almost a year now.  The design and coding started in 2007.
That's a good approach for mobile.  Programmatic API used by PHP (any language) to present a web UI covers remote admin, mobile and any other client that can't be online all the time with a static IP.  It would be like webmail.  It would be easier for new users to get started if they only need to create an account on a website, not install software.
Yeah, we can phase out IRC when there are enough static nodes to preprogram a seed list.  Once you get seeded, you don't need IRC.
There were some issues in 0.1.5 where the initial block download could get bogged down.  0.2 has code to make sure it goes smoothly.  It ought to take less than an hour, I think.  I need to hurry up and get 0.2 out the door.
The blocks increase linearly, it'll be decades before it's millions.  In theory, the block download time should top out 8 months from now when Moore's Law will be growing faster than the block chain.
It's SVN on sourceforge.  PM or e-mail me your sourceforge account and I'll give you access.
That's great because that's where I have less expertise.  For instance, I haven't researched the best way to do the "Start Bitcoin on system startup" feature on Linux.  On Windows, the option adds/removes an icon in the Startup folder.
Helpful suggestions, thanks.
That's a good idea.  The side accepting the connection just needs to withhold from sending anything until it receives a valid handshake.  Any portscan would only get a dead connection that doesn't volunteer to identify itself.
I have thought about eventually SSLing all the connections.  I assume anything short of SSL would be pointless against DPI.  Maybe a better more immediate solution is to connect through TOR, which will be possible with 0.2.
That's one of the main things on the agenda after 0.2.
Yeah, the other stealth stuff would be kinda pointless if it's always the same port number.
I'm looking forward to trying UPnP.  Do most P2P clients typically have UPnP enabled by default?
I'm still thinking about how best to structure the management interface.  Maybe command line commands to communicate with the background daemon to query transactions received and initiate sending transfers.  That would be more automation friendly.  Or what about an http interface on some port other than 80 to manage it with a browser?
We've been working hard on improvements for the next version release.  Martti (sirius-m) added some nice features to make it more user friendly and easier to run in the background:
Minimize to system tray option
Autostart on boot option so you can keep it running in the background automatically
New options dialog layout
Setup EXE for Windows, in addition to the archive download
I've been working on a number of refinements to the networking code and laying the groundwork for future functionality.  Also coming in version 0.2:
Multi-processor support for coin generation
Proxy support
The Linux version is on its way.  Martti's Linux port was merged into the main code branch and New Liberty Standard has been testing it.  It'll be in the next release, version 0.2.
Command line is on the to-do list after 0.2.
Bitcoins are sent to and from bitcoin addresses, which are essentially random numbers with no identifying information.
When you send to an IP address, the transaction is still written to a bitcoin address.  The IP address is only used to connect to the recipient's computer to request a fresh bitcoin address, give the transaction directly to the recipient and get a confirmation.
Blocks contain a history of the bitcoin addresses that a coin has been transferred to.  If the identities of the people using the bitcoin addresses are not known and each address is used only once, then this information only reveals that some unknown person transferred some amount to someone else.
The possibility to be anonymous or pseudonymous relies on you not revealing any identifying information about yourself in connection with the bitcoin addresses you use.  If you post your bitcoin address on the web, then you're associating that address and any transactions with it with the name you posted under.  If you posted under a handle that you haven't associated with your real identity, then you're still pseudonymous.
For greater privacy, it's best to use bitcoin addresses only once.  You can change addresses as often as you want using Options->Change Your Address.  Transfers by IP address automatically use a new bitcoin address each time.
In the next release (version 0.2), the command line to run it through a proxy from the first time is:
bitcoin -proxy=127.0.0.1:9050
The problem for TOR is that the IRC server which Bitcoin uses to initially discover other nodes bans the TOR exit nodes, as all IRC servers do.  If you've already connected once before then you're already seeded, but for the first time, you'd need to provide the address of a node as such:
bitcoin -proxy=127.0.0.1:9050 -addnode=<someipaddress>
If someone running a node with a static IP address that can accept incoming connections could post their IP to use for -addnode, that would be great.
Whichever one you've set your NAT to forward port 8333 to will receive it.  If your router can change the port number when it forwards, you could allow more than one client to receive.  For instance, if port 8334 forwards to a computer's port 8333, then senders could send to "x.x.x.x:8334"
If your NAT can't translate port numbers, there currently isn't a command line option to change the incoming port that bitcoin binds to, but I'll look into it.
Can nodes on the network tell from which and or to which bitcoin address coins are being sent? Do blocks contain a history of where bitcoins have been transfered to and from? Can nodes tell which bitcoin addresses belong to which IP addresses? Is there a command line option to enable the sock proxy the first time that bitcoin starts? What happens if you send bitcoins to an IP address that has multiple clients connected through network address translation (NAT)?
There will be a proxy setting in version 0.2 so you can connect through TOR.  I've done a careful scrub to make sure it doesn't use DNS or do anything that would leak your IP while in proxy mode.
It's important to have network connectivity while you're trying to generate a coin (block) and at the moment it is successfully generated.
1) During generation (when the status bar says "Generating" and you're using CPU to find a proof-of-work), you must constantly keep in contact with the network to receive the latest block. If your block does not link to the latest block, it may not be accepted.
2) When you successfully generate a block, it is immediately broadcast to the network.  Other nodes must receive it and link to it for it to be accepted as the new latest block.
Think of it as a cooperative effort to make a chain.  When you add a link, you must first find the current end of the chain.  If you were to locate the last link, then go off for an hour and forge your link, come back and link it to the link that was the end an hour ago, others may have added several links since then and they're not going to want to use your link that now branches off the middle.
After a block is created, the maturation time of 120 blocks is to make absolutely sure the block is part of the main chain before it can be spent.  Your node isn't doing anything with the block during that time, just waiting for other blocks to be added after yours.  You don't have to be online during that time.
e.g; Being able to route BitCoin through Tor.
As far as I know, there's no network transaction when you click Generate Coins - your computer just starts calculating the next proof-of-work.  The CPU usage is 100% when you're generating coins.
In this example, the network connection is used when you broadcast the information about the proof-of-work block you've created (that which entitles you to the new coin). Generating coins successfully requires constant connectivity, so that you can start working on the next block when someone gets the current block before you.
Welcome to the new Bitcoin forum!
The old forum can still be reached here:
I'll repost some selected threads here and add updated answers to questions where I can.
Another factor that would mitigate spam if POW tokens have value:
automated mailboxes that collect their POW and don't read the
there would be a profit motive for people to set up massive
quantities of fake e-mail accounts to harvest POW tokens from
spam.  They'd essentially be reverse-spamming the spammers with
The process has the potential to establish the POW token's value
message.  The ratio of fake mailboxes to real people could become
too high for spam to be cost effective.
temporarily let more spam through, it would only hasten the
in the first place, since spammers that don't have a botnet could
buy tokens from harvesters.  While the buying back would
Interestingly, one of the e-gold systems already has a form of
self-defeating cycle leading to too many harvesters exploiting the
spammers.
If the system let users configure the minimum payment they're
spam called "dusting".  Spammers send a tiny amount of gold dust
in order to put a spam message in the transaction's comment field.
paid to receive spam.
willing to receive, or at least the minimum that can have a
message with it, users could set how much they're willing to get
Address book labels for receiving addresses is confusing but I'm not sure what else to do.  Anyone using it for more than just simple purposes would need to create different receiving addresses for each payer so they could tell who's paying them.  That concept doesn't have much analogy in the real world.
The first default one is labelled "Your Address" when it's created.
All the places where address book labels are set are where the user manually sets it.  The only time it automatically adds a label is a blank one when you send to a new address.  I guess you could have entered the label on an address you thought was mine but the software was confusing and you put it in the wrong place.
it can do is tell which of your addresses it was received on.
It should be your Bitcoin address at home that you received it
with.  There's no way for it to know who it's from, so the best
to you.
You can create multiple addresses and give a different address
to each person and label them to help figure out who's sending
address, either under the Address Book button or the "Change..."
It doesn't know any names other than what you tell it.  The name
printed there is what's associated in your address book for that
electronic currency in some way, now that we know a way to do it
button to the right of your Bitcoin address.
I would be surprised if 10 years from now we're not using
It could get started in a narrow niche like reward points,
that won't inevitably get dumbed down when the trusted third party
gets cold feet.
for services that could almost be free but not quite.
donation tokens, currency for a game or micropayments for adult
sites.  Initially it can be used in proof-of-work applications
It's sent directly when it connects.  The recipient doubleclicks
It can already be used for pay-to-send e-mail.  The send dialog is
resizeable and you can enter as long of a message as you like.
have a way for fans to contact them, they could set up Bitcoin and
on the transaction to see the full message.  If someone famous is
getting more e-mail than they can read, but would still like to
Subscription sites that need some extra proof-of-work for their
give out the IP address on their website.  "Send X bitcoins to my
priority hotline at this IP and I'll read the message personally."
It might make sense just to get some in case it catches on.  If
free trial so it doesn't cannibalize subscriptions could charge
bitcoins for the trial.
applications if you could effortlessly pay a few cents to a
enough people think the same way, that becomes a self fulfilling
prophecy.  Once it gets bootstrapped, there are so many
backup.  The data is stored in a transactional database DBM, so
website as easily as dropping coins in a vending machine.
The files are in "%appdata%\Bitcoin", that's the directory to
Firefox store their settings files there, despite the headwind of
it should be safe from loss if there's a crash or power failure.
%appdata% is per-user access privilege.  Most new programs like
Just now added code to the next release for that.
Microsoft changing the directory name with every Windows release
and being full of spaces and so long it runs off the screen.
 of communication
I group attacks into two classes:
1) Attacks that can only be done by someone actually in the chain
local LAN, admins at ISPs in between, and the LAN on the
2) Attacks that can be done by anyone on the Internet from anywhere
Type 1 exposes you to people in your house or company on your
develop one technique to attack multiple victims.
recipient's side.  Type 2 exposes you to a billion people who can
self-select to be attackers and get economy of scale when they
Bitcoin address doesn't have that vulnerability, although there's
Sending by IP requests a new public key, so yes, it's vulnerable
to type 1 man-in-the-middle.  If that's a concern, sending to a
unsigned cleartext e-mail, which is already vulnerable to type 1
a small privacy tradeoff.  I have a feeling most of the time
people will get Bitcoin addresses off of non-SSL websites and
when sending (maybe 1.2.3.4-1Kn8iojk...), where the recipient uses
and type 2 through DNS poisoning.
One solution would be to use both the IP and Bitcoin addresses
system starts to be used for real business purposes, I will
the public key of the Bitcoin address to sign the new public key
to prove that you're sending to who you think you are.  If the
give any other identifying information about the recipient, so
certainly implement that.  Another solution is to use SSL.
For now, it's pretty obvious that if you send to an IP, you didn't
That's correct.
you're blindly sending to whoever answers that IP.
Another feature for later is an option to encrypt your wallet.
service issues.  Certainly before another sending method is
It would be nice to only need the Bitcoin address and have the IP
worked out behind the scenes.  Might have privacy or denial of
There's at least one node who's inbound IP keeps changing all the
implemented, there's plenty of time now to fully think through the
design and make sure it's the best way.
time within the same class B.  Maybe every time the program is
run.  I wasn't expecting that.
Do you mind if I CC the rest of this to bitcoin-list or
Cryptography?
Sweet, I was looking for a group like that on Usenet at one point to see
what I would use if I needed, and nothing really fit.  I'm sure Google
groups is a lot easier to post to.
There are some scenarios where a Usenet or Google group could be used as
a supplemental defence.  Bitcoin is at its most vulnerable in the
beginning when the total network CPU power is small.  That's offset by
the fact that the incentive to attack it is also low when it's small.
Hopefully the easy solution of just growing up and getting past that
stage will work.  If not, there are ways a Google group could help, if
it really came to that.
We definitely have similar interests!
You know, I think there were a lot more people interested in the 90's,
but after more than a decade of failed Trusted Third Party based systems
(Digicash, etc), they see it as a lost cause.  I hope they can make the
distinction, that this is the first time I know of that we're trying a
non-trust based system.
The existing transaction line will change.
You're right, sorry about that.  It's the bug that was fixed in 0.1.3.
The communications thread would get blocked, so you would make
connections, but they would go silent after a while.  When you found a
block, you couldn't broadcast it to the network, so it didn't get into
the chain.  You weren't receiving anything either to know that the
network had gone on without you, until you restarted it.
The bug is also what caused bitcoin.exe to fail to exit.  The
communications thread was blocked and failed to exit.  Bitcoin does a
careful shutdown in case it might be in the middle of an important
transaction, but actually it's completely safe to kill it.
This is all fixed in 0.1.3.  If you give me your IP, I'll send you some
coins.
It's not like a race where if one car is twice as fast, it'll always
win.  It's an SHA-256 that takes less than a microsecond, and each guess
has an independent chance of success.  Each computer's chance of finding
a hash collision is linearly proportional to it's CPU power.  A computer
that's half as fast would get half as many coins.
Let me know how it goes.  If you have any trouble with it, send me your
debug.log file.  I can often figure out what went wrong just from that.
Thanks, I hadn't seen that yet.  It looks very well presented.
There was an older one that's been running for a long time that
publishes its hashes to Usenet.  I'm surprised this one isn't
using Usenet, although it is kind of difficult to get access to
post to Usenet in an automated way these days.  If they can get a
magazine or newspaper to publish their hashes, it would work a lot
easier in court for their purposes.  Bitcoin and all timestamp
servers share the basic functionality of periodically collecting
things into blocks and hashing them into a chain.
Right, the credit field stays 0.00 until it matures, then it'll be
50.00.  Do you think it would be clearer if I left the credit
field blank until it matures?  I should put some text in the
transaction details (when you double click on it) explaining how
it works.  (was it obvious you can doubleclick on a line for
details?)
Be sure to upgrade to v0.1.3 if you haven't already.  This version
has really stabilized things.
Normally I would keep the symbols in, but they increased the size of the EXE from 6.5MB to 50MB so I
just couldn't justify not stripping them.  I guess I made the wrong decision, at least for this early
version.  I'm kind of surprised there was a crash, I've tested heavily and haven't had an outright
exception for a while.  Come to think of it, there isn't even an exception print at the end of
debug.log.  I've been testing on XP SP2, maybe SP3 is something.
I've attached bitcoin.exe with symbols.  (gcc symbols for gdb, if you're using MSVC I can send you an
MSVC build with symbols)
Thanks for your help!
I was temporarily able to reproduce the bug and narrowed it down to the "mapAddresses.count" in the
following code.  It was absolutely the last piece of code to go in and mainly only got tested with the
MSVC build.  It's not essential and I'm inclined to turn off optimization and delete the section of code
until I figure out what's going on.
I'm attaching a dbg exe you can try that deletes the line of code and turns off optimization.  I'm not able
to reproduce it anymore at the moment.
I isolated the problem.  If I spawn a thread and do
mapAddresses.count, even as the very first thing in the program,
it segfaults.  The workaround is to needlessly call
mapAddresses.count in the main thread once and it's fine from then
on.  I hate to blame the compiler, and I've never had a GCC
compiler bug before, but this feels like one.  Maybe some bit of
init code it tries to optimize out if it's not called at least once
in the same thread, or some STL optimization that's not thread
friendly.  I'm really dismayed to have this botch up the release
after all that stress testing.
The attached file: bitcoin-0.1.1.rar (filesize 2,132,686) is the
version where I deleted the mapAddresses.count line, and that
should be the safest version.  (that was the only use of
mapAddresses.count) If you could try this version and confirm
that the crash is fixed, I'd appreciate it.
OK, thanks.  The one in bitcoin-0.1.1-exe-dbg.rar is the same build as in bitcoin-0.1.1.rar.
I forgot, when you build debug on MSVC, it uses the debug versions of the runtime DLLs, which aren't
included with Windows distributions.  Actually, MSVC 6.0's runtime (MSVC60.DLL) is the last version that
shipped preinstalled on Windows, which is why the continued interest in that ancient version of the
compiler.  Later Visual C versions can't create a standalone EXE that doesn't require additional runtime
packages installed.
I can't use MSVC 6.0 for the release because its optimization of the SHA-256 routines is too slow.
I've attached a copy of the debug runtime DLLs.  (They're redistributable
Well this doesn't look good.  After you upgraded to 0.1.2, your node responded to one or two messages
and then stopped replying to messages.  It's still accepting connections and seems to be alive on
IRC.  That could happen if ThreadSocketHandler or ThreadMessageHandler is hung or crashed or
blocked.  Usually when there's an exception or other problem, it only stops the affected thread and
everything else keeps running.
I'm attaching the msvc debug version in case you need it.
Could you send me your debug.log?
The gcc debug version is attached.
gdb is easier to use than you'd think.  gdb.exe is the only file.  You run
gdb bitcoin.exe
then type "run"
then if it crashes, type "backtrace" for a stack dump, or it may do it automatically.  (The stack trace
doesn't always go far enough back unfortunately)
OK, so no crash or exception window or anything.  debug.log is all I need then.
It looks like there's a "select failed: 10038" error (the sockets select function failed) and then network
communication goes quiet after that (except for IRC which is still working).  I've never had select fail
before.  It looks like sockets is somehow partially hosed.  At least now I know what's wrong now.
You should restart it.  It's not doing anything right now.  I don't know if it'll just get the "select failed"
error again, or be fine for a while.
If I can't think of anything else, I can always shut down and restart sockets if it gets hosed like that.  I'm
sure everyone who's written an internet app like a browser or p2p app had to slog through all the ways
the Internet can trash you.  The Internet is a brutal, rough and tumble place.
The issue of bitcoin.exe still running after you close it is a known issue.  It does a careful shutdown of
everything to be extra safe, in case some important transaction is in progress, but it's completely fine
and totally safe to just kill it if it doesn't exit on its own.  I'll have to work on figuring out what's getting
hung up.  I may just have it kill itself after a timeout.
I believe I've fixed the bug related to "select failed: 10038"
(error WSAENOTSOCK).  The select error is not a big deal, but it
led the communications thread to get blocked on a socket that
should have been in non-blocking mode but wasn't.  It never came
up until now because as long as select never failed, receive would
never be called unless there was data.
Without this fix, your node's communication sometimes goes dead.
Connections are still made, but no data is passed.  Any generated
blocks would probably not be accepted since you can't broadcast
them and other nodes will leave your branch behind.  That's why
Generate doesn't run when you're not connected.
This could also have caused bitcoin.exe to fail to exit.  There's
no reason for shutdown to wait for the com thread, so I made it
only wait for the message processing thread.  I'll do a more
thorough forced shutdown later.
Looks like your node's com thread just now got blocked on this
bug again.  It went for a few hours this time before it did.
Version 0.1.3 exe attached.
It definitely looks like 0.1.3 solved it.  It was getting so there
were so many zombie nodes, I was having a hard time getting a
reply to any of my messages.  Now, four inventory messages go out,
four getdata messages come back.
Did you get any "not accepted" blocks? The connectivity bug could
have caused a generated block not to be accepted if the node
wasn't able to broadcast at the time.  Once the status is above 5
or so it's safely accepted.
Unfortunately, I can't receive incoming connections from where I
am, which has made things more difficult.  Your node receiving
incoming connections was the main thing keeping the network going
the first day or two.
You can send to my Bitcoin address if you want to, but you won't
get to see the full transfer sequence:
1NSwywA5Dvuyw89sfs3oLPvLiDNGf48cPD
You could always findstr /c:"version message" debug.log and send a
test to some random person you're connected to near the end of the
list.  The ones ending in port 8333 can receive connections.
I just thought of something.  Eventually there'll be some interest
in brute force scanning bitcoin addresses to find one with the
first few characters customized to your name, kind of like getting
a phone number that spells out something.  Just by chance I have
my initials.
Could you send me the debug.log from the 0.1.3 crash?
I can usually get a lot just from that.
I'll send you the debug builds shortly.
Here's the 0.1.3 MSVC debug build
and the gcc debug build w/gdb.exe
Definitely the disk full.  I completely put off disk full
handling until a later version.  Probably about time I did it now.
Well, that's a relief
If you build the dependencies, let me know how that goes.
Everything is always harder to build on Windows than Linux.  I've
always hated projects with a lot of big dependencies, but there's
no avoiding it, each one is essential.
I still haven't figured out how you managed to get a read
exception rather than a write exception when your disk filled up.
It's unlikely but maybe possible that the incident could have
messed up your block data file.  In that case, it might manifest
as a similar exception again, or if your block count in the status
bar stopped going up, that would also indicate a problem.  As of
this moment it's at 375 blocks.
If there is a problem, it could easily be solved by deleting your
block files, as follows:
It'll then re-download the block chain.  Your transactions and
generated blocks show as 0/unconfirmed until it's done downloading.
The crucial file to backup is wallet.dat.  If bitcoin is running
then you have to backup the whole %appdata%\bitcoin directory
including the database subdirectory, but even if it's not running
it certainly feels safer to always backup the whole directory.
The database unfortunately names its files "log.0000000001".  To
the rest of the world, "log" means delete-at-will, but to database
people it means delete-and-lose-everything-in-your-other-files.  I
tried to put them out of harm's way by putting them in the
database subdirectory.  Later I'll write code to flush the logs
after every wallet change so wallet.dat will be standalone safe
almost all the time
I hate duplicating code, but the compiler forces us.  Copy the body
of the function above it, like this:
The modified version of serialize.h is attached.
BTW, in my tests, VC8 produced an EXE that would only run on
systems that had VC8 installed on them.  The error it gives
is extremely vague.  I think they expect you to install a
package during setup, but bitcoin doesn't have a setup.
My testing has been with MSVC 6.0 SP6 and GCC 3.4.5.
GCC is the release build.  There's nothing wrong with the
MSVC 6.0 build other than its optimization of the SHA routines
for generating blocks is slow
Thanks for starting that topic on ASC, your understanding of bitcoin is
spot on.  Some of their responses were rather Neanderthal, although I
guess they're so used to being anti-fiat-money that anything short of
gold isn't good enough.  They concede that something is flammable, but
argue that it'll never burn because there'll never be a spark.  Once
it's backed with cash, that might change, but I'd probably better
refrain from mentioning that in public anymore until we're closer to
ready to start.  I think we'll get flooded with newbies and we need to
get ready first.
What we need most right now is website writing.  My writing is not that
great, I'm a much better coder.  Maybe you could create the website on
sourceforge, which is currently blank.  If you can write a FAQ, I can
give you a compilation of my replies to questions in e-mail and forums
for facts and details and ideas.
Codewise, there's not much that's easy right now.  One thing that's
needed is an interface for server side scripting languages such as Java,
Python, PHP, ASP, etc.  Bitcoin would be running on the web server, and
server side script could call it to do transactions.  It's Windows, so I
guess OLE/COM is the interface.
One easy thing that really helps is to run a node that can accept
incoming connections (forward port 8333 on your firewall) to make sure
that new users who try it out have someone to connect to.  If they run
it and get no connections, they'll probably just give up.
That would be great!  I added you (dmp1ce) as a dev to the sourceforge
project and gave you access to edit the web space and everything.
Definitely.  This will be an absolutely essential feature once things
get going, making it so you can lock your wealth up with strong
encryption and back it up more securely than any physical safe.  So far
I've been putting it off in favour of other features because it's not
crucial yet until bitcoins start to have value.
I plan to work on the escrow feature next, which is needed to make
actual trades for physical stuff safer and before backing the currency
with fiat money can begin.
Thanks!  Right now there are a lot of people on the network who can't
receive incoming connections, so every node that can really helps.
Having more helps keep down the "(not accepted)" issue for now until I
reduce the chances of that happening in v0.1.6.
I guess one answer for the FAQ should be how to set up your firewall to
forward port 8333 so you can receive incoming connections.  The question
could be something like "what if I have 0 connections" and that could be
the answer that it might be because the nodes you can connect with is
limited if you don't set that up.
Here's a compilation of questions I've answered in forums and e-mail
that should help you see what questions are frequently asked and some
answers I've used.  It's not intended to use all or most of the material
here, just pick and choose.  This is just a dump of everything I've
answered.
Some issues that we don't have easy answers for are best not to bring
up.  Casual users seems content to assume that the system works as
stated (which it does), and getting into the design details just opens a
can of worms that can't be answered without a deep understanding of the
system.  The advanced questions I've received have mostly been unique
per person and best answered individually.
It's the total number of blocks in the block chain, meaning the
network's block chain, which everyone has a copy of.  Every Bitcoin node
displays the same number and it goes up about every 10 minutes whenever
someone generates a block.  When you haven't had it running for a while,
once you're connected it spins up rapidly as it downloads what was
generated while you were gone to catch up.  I'm not sure exactly how to
describe it (that would fit on the status bar in 1 word, maybe 2 words
max), any ideas?
The blocks number in the status column next to your transactions is the
number of blocks that have come after that transaction.  Your
transaction is essentially "in" that many blocks.
Right.  I'm trying to think of more clear wording for that, maybe "%d
network blocks" or "%d block chain".
What rate of not-accepted did you see?  I didn't see anything unusual on
my end.  If you had more than, say, 4 in a row, that would be abnormal
and probably a loss of network communication.  If it's scattered and
less than 25%, just random bad luck.  It's normal and harmless to
randomly get some per cent of not-accepted, and of course randomness can
sometimes bunch up and look like a pattern.
The idea of an option to View/Hide unaccepted blocks is a good one, as
well as View/Hide all generated blocks so you can more easily see
incoming transactions.  Seeing the unaccepted blocks is just annoying
and frustrating.  Everyone faces the same rate of unaccepted, it's just
a part of the process.  It would probably be best to default to hide
unaccepted blocks, so as not to show giving and taking away something
that never was, and not show new generated blocks at all until they have
at least one confirmation.  It would only mean finding out you have a
generated block 15 minutes later than normal, and then you still have
119 blocks to go before it matures anyway.  This is on the to-do list
for v0.1.6.
[note: I have some improvements in 0.1.6 to reduce this problem somewhat,
and it'll also improve when the network is larger]
Transactions sent to a bitcoin address will always say "from: unknown".
The transaction only tells who it's to.  Sending by bitcoin address
has a number of problems, but it's so nice having the fallback option to
be able to send to anyone whether they're online or not.  There are a
number of ideas to try to improve things later.  For now, if things work
out like the real world where the vast majority of transactions are with
merchants, they'll pretty much always make sure to set up to receive by
IP.  The P2P file sharing networks seem fairly successful at getting a
large percentage of their users to set up their firewalls to forward a port.
I badly wanted to find some way to include a comment with indirect
transfers, but there just wasn't a way to do it.  Bitcoin uses EC-DSA, which
was essential for making the block chain compact enough to be practical with
today's technology because its signatures are an order of magnitude smaller
than RSA.  But EC-DSA can't encrypt messages like RSA, it can only be used
to verify signatures.
The "Generated (not accepted)" normally happens if two nodes find a
block at close to the same time, one of them will not be accepted.  It's
normal and unavoidable.  I plan in v0.1.6 to hide those, since they're
just confusing and annoying and there's no reason for users to have to
see them.  While the network is still small like it is now, if you can't
receive incoming connections you're at more of a disadvantage because
you can't receive block announcements as directly.
Right, the credit field stays 0.00 until it matures, then it'll be
50.00.  BTW, you can doubleclick on a line for details.
There is only one global chain.
The existing Visa credit card network processes about 15 million
Internet purchases per day worldwide.  Bitcoin can already scale much
larger than that with existing hardware for a fraction of the cost.  It
never really hits a scale ceiling.  If you're interested, I can go over
the ways it would cope with extreme size.
By Moore's Law, we can expect hardware speed to be 10 times faster in 5
years and 100 times faster in 10.  Even if Bitcoin grows at crazy
adoption rates, I think computer speeds will stay ahead of the number of
transactions.
I don't anticipate that fees will be needed anytime soon, but if it
becomes too burdensome to run a node, it is possible to run a node that
only processes transactions that include a transaction fee.  The owner
of the node would decide the minimum fee they'll accept.  Right now,
such a node would get nothing, because nobody includes a fee, but if
enough nodes did that, then users would get faster acceptance if they
include a fee, or slower if they don't.  The fee the market would settle
on should be minimal.  If a node requires a higher fee, that node would
be passing up all transactions with lower fees.  It could do more volume
and probably make more money by processing as many paying transactions
as it can.  The transition is not controlled by some human in charge of
the system though, just individuals reacting on their own to market forces.
A key aspect of Bitcoin is that the security of the network grows as the
size of the network and the amount of value that needs to be protected
grows.  The down side is that it's vulnerable at the beginning when it's
small, although the value that could be stolen should always be smaller
than the amount of effort required to steal it.  If someone has other
motives to prove a point, they'll just be proving a point I already concede.
My choice for the number of coins and distribution schedule was an
educated guess.  It was a difficult choice, because once the network is
going it's locked in and we're stuck with it.  I wanted to pick
something that would make prices similar to existing currencies, but
without knowing the future, that's very hard.  I ended up picking
something in the middle.  If Bitcoin remains a small niche, it'll be
worth less per unit than existing currencies.  If you imagine it being
used for some fraction of world commerce, then there's only going to be
21 million coins for the whole world, so it would be worth much more per
unit.  Values are 64-bit integers with 8 decimal places, so 1 coin is
represented internally as 100000000.  There's plenty of granularity if
typical prices become small.  For example, if 0.001 is worth 1 Euro,
then it might be easier to change where the decimal point is displayed,
so if you had 1 Bitcoin it's now displayed as 1000, and 0.001 is
displayed as 1.
Ripple is interesting in that it's the only other system that does
something with trust besides concentrate it into a central server.
For the actual risk, multiply the 0.1% by the probability that the buyer
is an attacker with a huge network of computers.
For micropayments, you can safely accept the payment immediately.  The
size of the payment is too small for the effort to steal it.
Micropayments are almost always for intellectual property, where there's
no physical loss to the merchant.  Anyone trying to steal a micropayment
would probably not be a paying customer anyway, and if they want to
steal intellectual property they can use the file sharing networks.
Currently, businesses accept a certain chargeoff rate.  I believe the
risk with 1 or even 0 confirming blocks will be much less than the rate
of chargebacks on verified credit card transactions.
The usual scam against a merchant that doesn't wait for confirming
blocks would be to send a payment to a merchant, then quickly try to
propagate a double-spend to the network before the merchant's copy. What
the merchant can do is broadcast his transaction and then monitor the
network for any double-spend copies.  The thief would not be able to
broadcast during the monitoring period or else the merchant's node would
receive a copy.  The merchant would only have to monitor for a minute or
two until most of the network nodes have his version and it's too late
for the thief's version to catch up and reach many nodes.  With just a
minute or two delay, the chance of getting away without paying could be
made much too low to scam.  A thief usually needs a high probability of
getting an item for free to make it worthwhile.  Using a lot of CPU
power to do the brute force attack discussed in the paper in addition to
the above scam would not increase the thief's chances very much.
Anything that grants access to something, like something that takes a
while to download, access to a website, web hosting, a subscription or
service, can be cancelled a few minutes later if the transaction is
rejected.
It's not communicated.  The formula is hardcoded in the program and
every node does the same calculation to know what difficulty is required
for the next block.  If someone diverged from the formula, their block
would not be accepted by the majority.
It's free open source.  It's the MIT license, which just requires some
disclaimer text be kept with the source code, other than that you can do
just about anything you want with it.  The source is included in the
main download.
I'll always announce new versions there.  Automatic update, or at least
notification of new versions, is definitely on the list.
[this inflation discussion was before the transaction fee mechanism and
fixed plan of 21 million coins was posted, so it may not be as
applicable anymore]
You're still thinking as if the difficulty level will be so easy that
people will be able to generate all the bitcoins they want.
Imagine you have to run your computer 24/7 for a month to generate 1
cent.  After a year, you could generate 12 cents.  That's not going to
make it so people can just generate all the bitcoin they want for spending.
The value of bitcoins would be relative to the electricity consumed to
produce them.  All modern CPUs save power when they're idle.  If you run
a computational task 24/7, not letting it idle, it uses significantly
more power, and you'll notice it generates more heat.  The extra wattage
consumed goes straight to your power bill, and the value of the bitcoins
you produce would be something less than that.
No, they can't make money that way.  It would cost them more in
electricity than they'd be selling the bitcoins for.
Historically, people have taken up scarce commodities as money, if
necessary taking up whatever is at hand, such as shells or stones.  Each
has a kernel of usefulness that helped bootstrap the process, but the
monetary value ends up being much more than the functional value alone.
Most of the value comes from the value that others place in it.  Gold,
for instance, is pretty, non-corrosive and easily malleable, but most of
its value is clearly not from that.  Brass is shiny and similar in
colour.  The vast majority of gold sits unused in vaults, owned by
governments that could care less about its prettiness.
Until now, no scarce commodity that can be traded over a communications
channel without a trusted third party has been available.  If there is a
desire to take up a form of money that can be traded over the Internet
without a TTP, then now that is possible.
Actually, that is handled.  There's a moving average that compensates
for the total effort being expended so that the total production is a
constant.  As computers get more powerful, the difficulty increases to
compensate.
There's gold for one.  The supply of gold increases by about 2%-3% per
year.  Any fiat currency typically averages more inflation than that.
to solve the proof-of-work problem faster?
The difficulty is controlled by a moving average that compensates for
the total effort being expended to keep the total production constant.
As computers get more powerful, the difficulty increases to compensate.
Identities are not used, and there's no reliance on recourse.  It's all
prevention.
There is no reliance on identifying anyone.  As you've said, it's
futile and can be trivially defeated with sock puppets.
The credential that establishes someone as real is the ability to
supply CPU power.
This is a version 2 problem that I believe can be solved fairly
satisfactorily for most applications.
The race is to spread your transaction on the network first.  Think 6
degrees of freedom -- it spreads exponentially.  It would only take
something like 2 minutes for a transaction to spread widely enough
that a competitor starting late would have little chance of grabbing
very many nodes before the first one is overtaking the whole network.
During those 2 minutes, the merchant's nodes can be watching for a
double-spent transaction.  The double-spender would not be able to
blast his alternate transaction out to the world without the merchant
getting it, so he has to wait before starting.
If the real transaction reaches 90% and the double-spent tx reaches
10%, the double-spender only gets a 10% chance of not paying, and 90%
chance his money gets spent.  For almost any type of goods, that's
not going to be worth it for the scammer.
Information based goods like access to website or downloads are
non-fencible.  Nobody is going to be able to make a living off
stealing access to websites or downloads.  They can go to the file
sharing networks to steal that.  Most instant-access products aren't
going to have a huge incentive to steal.
If a merchant actually has a problem with theft, they can make the
customer wait 2 minutes, or wait for something in e-mail, which many
already do.  If they really want to optimize, and it's a large
download, they could cancel the download in the middle if the
transaction comes back double-spent.  If it's website access,
typically it wouldn't be a big deal to let the customer have access
for 5 minutes and then cut off access if it's rejected.  Many such
sites have a free trial anyway.
[in response to a question about scale]
100,000 block generating nodes is a good ballpark large-scale size
to think about.  Propagating a transaction across the whole network
twice would consume a total of US$ 0.02 of bandwidth at today's
prices.  In practice, many would be burning off excess allocated
bandwidth or unlimited plans with one of the cheaper backbones.
There could be millions of SPV clients.  They only matter in how
many transactions they generate.  If they pay 1 or 2 cents
transaction fees, they pay for themselves.  I've coded it so you
can pay any optional amount of transaction fees you want.  When the
incentive subsidy eventually tapers off, it may be necessary to put
a market-determined transaction fee on your transactions to make
sure nodes process them promptly.
To think about what a really huge transaction load would look like,
I look at the existing credit card network.  I found some more
estimates about how many transactions are online purchases.  It's
about 15 million tx per day for the entire e-commerce load of the
Internet worldwide.  At 1KB per transaction, that would be 15GB of
bandwidth for each block generating node per day, or about two DVD
movies worth.  Seems do-able even with today's technology.
Important to remember, even if Bitcoin caught on at dot-com rates
of growth, it would still take years to become any substantial
fraction of all transactions.  I believe hardware has already
recently become strong enough to handle large scale, but if there's
any doubt about that, bandwidth speeds, prices, disk space and
computing power will be much greater by the time it's needed.
It's not like a race where if one car is twice as fast, it'll always
win.  It's an SHA-256 that takes less than a microsecond, and each guess
has an independent chance of success.  Each computer's chance of finding
a hash collision is linearly proportional to it's CPU power.  A computer
that's half as fast would get half as many coins.
[question about what to backup]
The files are in "%appdata%\Bitcoin", that's the directory to
backup.
%appdata% is per-user access privilege.  Most new programs like
Firefox store their settings files there, despite the headwind of
Microsoft changing the directory name with every Windows release
and being full of spaces and so long it runs off the screen.
[question about what to backup]
The directory is "%appdata%\Bitcoin"
It has spaces in it so you need the quotes
On XP it would typically be:
Backup that whole directory.  All data files are in that
directory.  There are no temporary files.
[question about what to backup]
The crucial file to backup is wallet.dat.  If bitcoin is running
then you have to backup the whole %appdata%\bitcoin directory
including the database subdirectory, but even if it's not running
it certainly feels safer to always backup the whole directory.
The database unfortunately names its files "log.0000000001".  To
the rest of the world, "log" means delete-at-will, but to database
people it means delete-and-lose-everything-in-your-other-files.  I
tried to put them out of harm's way by putting them in the
database subdirectory.  Later I'll write code to flush the logs
after every wallet change so wallet.dat will be standalone safe
almost all the time.
Hal sort of alluded to the possibility that it could be seen as a
long-odds investment.  I would be surprised if 10 years from now
we're not using electronic currency in some way, now that we know
a way to do it that won't inevitably get dumbed down when the
trusted third party gets cold feet.
Once it gets bootstrapped, there are so many applications if you
could effortlessly pay a few cents to a website as easily as dropping
coins in a vending machine.
[this next bit turned out to be very controversial.  there is extreme
prejudice against spam solutions, especially proof-of-work.]
It can already be used for pay-to-send e-mail.  The send dialog is
resizeable and you can enter as long of a message as you like.
It's sent directly when it connects.  The recipient doubleclicks
on the transaction to see the full message.  If someone famous is
getting more e-mail than they can read, but would still like to
have a way for fans to contact them, they could set up Bitcoin and
give out the IP address on their website.  "Send X bitcoins to my
priority hotline at this IP and I'll read the message personally."
Subscription sites that need some extra proof-of-work for their
free trial so it doesn't cannibalize subscriptions could charge
bitcoins for the trial.
[again, I don't know why I'm including this, as it's best to stay
away from claims about spam.  people automatically react violently
against any suggestion of a spam solution.]
Then you could earn a nice profit by setting up pay-per-send
e-mail addresses and collecting all the spam money.  You could
sell it back to spammers who don't have big enough botnets to
generate their own, helping bootstrap the currency's value.  As
more people catch on, they'll set up more and more phony addresses
to harvest it.  By the time the book "How I got rich exploiting
spammers and you can too" is coming out, there'll be too many fake
addresses and the spammers will have to give up.
One more factor that would mitigate spam if POW tokens have value:
there would be a profit motive for people to set up massive
quantities of fake e-mail accounts to harvest POW tokens from
spam.  They'd essentially be reverse-spamming the spammers with
automated mailboxes that collect their POW and don't read the
message.  The ratio of fake mailboxes to real people could become
too high for spam to be cost effective.
The process has the potential to establish the POW token's value
in the first place, since spammers that don't have a botnet could
buy tokens from harvesters.  While the buying back would
temporarily let more spam through, it would only hasten the
self-defeating cycle leading to too many harvesters exploiting the
spammers.
Interestingly, one of the e-gold systems already has a form of
spam called "dusting".  Spammers send a tiny amount of gold dust
in order to put a spam message in the transaction's comment field.
If the system let users configure the minimum payment they're
willing to receive, or at least the minimum that can have a
message with it, users could set how much they're willing to get
paid to receive spam.
Ironic if we end up having to choose between economic liberty and
conservation.
Unfortunately, proof of work is the only solution I've found to
make p2p e-cash work without a trusted third party.  Even if I
wasn't using it secondarily as a way to allocate the initial
distribution of currency, PoW is fundamental to coordinating the
network and preventing double-spending.
If it did grow to consume significant energy, I think it would
still be less wasteful than the labour and resource intensive
conventional banking activity it would replace.  The cost would be
an order of magnitude less than the billions in banking fees that
pay for all those brick and mortar buildings, skyscrapers and junk
mail credit card offers.
Indeed, Bitcoin is a distributed secure timestamp server for
transactions.  A few lines of code could create a transaction with
an extra hash in it of anything that needs to be timestamped.
I should add a command to timestamp a file that way.
From a thread on p2presearch which starts with my rant about trust
being the root weakness of all conventional financial systems.
I've developed a new open source P2P e-cash system called Bitcoin.  It's
completely decentralized, with no central server or trusted parties,
because everything is based on crypto proof instead of trust.  Give it a
try, or take a look at the screenshots and design paper:
Download Bitcoin v0.1 at http://www.bitcoin.org
The root problem with conventional currency is all the trust that's
required to make it work.  The central bank must be trusted not to
debase the currency, but the history of fiat currencies is full of
breaches of that trust.  Banks must be trusted to hold our money and
transfer it electronically, but they lend it out in waves of credit
bubbles with barely a fraction in reserve.  We have to trust them with
our privacy, trust them not to let identity thieves drain our accounts.
Their massive overhead costs make micropayments impossible.
A generation ago, multi-user time-sharing computer systems had a similar
problem.  Before strong encryption, users had to rely on password
protection to secure their files, placing trust in the system
administrator to keep their information private.  Privacy could always
be overridden by the admin based on his judgment call weighing the
principle of privacy against other concerns, or at the behest of his
superiors.  Then strong encryption became available to the masses, and
trust was no longer required.  Data could be secured in a way that was
physically impossible for others to access, no matter for what reason,
no matter how good the excuse, no matter what.
It's time we had the same thing for money.  With e-currency based on
cryptographic proof, without the need to trust a third party middleman,
money can be secure and transactions effortless.
One of the fundamental building blocks for such a system is digital
signatures.  A digital coin contains the public key of its owner.  To
transfer it, the owner signs the coin together with the public key of
the next owner.  Anyone can check the signatures to verify the chain of
ownership.  It works well to secure ownership, but leaves one big
problem unsolved: double-spending.  Any owner could try to re-spend an
already spent coin by signing it again to another owner.  The usual
solution is for a trusted company with a central database to check for
double-spending, but that just gets back to the trust model.  In its
central position, the company can override the users, and the fees
needed to support the company make micropayments impractical.
Bitcoin's solution is to use a peer-to-peer network to check for
double-spending.  In a nutshell, the network works like a distributed
timestamp server, stamping the first transaction to spend a coin.  It
takes advantage of the nature of information being easy to spread but
hard to stifle.  For details on how it works, see the design paper at
The result is a distributed system with no single point of failure.
Users hold the crypto keys to their own money and transact directly with
each other, with the help of the P2P network to check for double-spending.
It's similar in that it uses digital signatures for coins, but different
in the approach to privacy and preventing double-spending.  The
recipient of a Bitcoin payment is able to check whether it is the first
spend or not, and second-spends are not accepted.  There isn't an
off-line mode where double-spenders are caught and shamed after the
fact, because that would require participants to have identities.
To protect privacy, key pairs are used only once, with a new one for
every transaction.  The owner of a coin is just whoever has its private key.
Of course, the biggest difference is the lack of a central server.  That
was the Achilles heel of Chaumian systems; when the central company shut
down, so did the currency.
There is a limited supply of money.  Circulation will be 21,000,000
coins.  Transactions only transfer ownership.
Thank you for your questions,
Indeed, it is much like Pekunio in the concept of spraying redundant
copies of every transaction to a number of peers on the network, but the
implementation is not a reputation network like Wizard Rabbit Treasurer.
In fact, Bitcoin does not use reputation at all.  It sees the network
as just a big crowd and doesn't much care who it talks to or who tells
it something, as long as at least one of them relays the information
being broadcast around the network.  It doesn't care because there's no
way to lie to it.  Either you tell it crypto proof of something, or it
ignores you.
As trust systems go, Ripple is unique in spreading trust around rather
than concentrating it.
[I've been asked at least 4 other times "have you heard of Ripple?"]
It's fully operational and the network is growing.  If you try the
software, e-mail me your Bitcoin address and I'll send you a few coins.
We just need to spread the word and keep getting more people interested.
Here's a link to the original introduction of the paper on the
Cryptography mailing list.  (Inflation issues were superseded by changes
I made later to support transaction fees and the limited circulation
plan.  This link is a moving target, this archive page is just a certain
number of days back and the discussion will keep scrolling off to the
next page.)
A little follow up when the software was released.
My description of how Bitcoin solves the Byzantine Generals' problem:
Oh crap, I got your sourceforge usernames mixed up, sorry about that.  I
clicked on the wrong e-mail when I was looking for your username.  You
now have access.
Your FAQ looks good so far!
You can create whatever you want on bitcoin.sourceforge.net.  Something
to get new users up to speed on what Bitcoin is and how to use it and
why, and clean and professional looking would help make it look well
established.  The site at bitcoin.org was designed in a more
professorial style when I was presenting the design paper on the
Cryptography list, but we're moving on from that phase.
You should probably change the part about "distribute them under several
keys".  When the paper says that it means for the software to do it, and
it does.  For privacy reasons, the software already uses a different key
for every transaction, so every piece of money in your wallet is already
on a different key.  The exception is when using a bitcoin address,
everything sent to the same bitcoin address is on the same key, which is
a privacy risk if you're trying to be anonymous.  The EC-DSA key size is
very strong (sized for the future), we don't practically have to worry
about a key getting broken, but if we did there's the advantage that
someone expending the massive computing resources would only break one
single transaction's worth of money, not someone's whole account.  The
details about how to backup your wallet files is in the Q&A dump and
also it's explained in readme.txt and definitely belongs in the FAQ.
Oh I see, you're trying to address byronm's concern on freedomainradio.
I see what you mean about the password feature being useful to address
that argument.  Banks let anyone who has your name and account number
drain your account, and you're not going to get it back from Nigeria.
If someone installs a keylogger on your computer, they could just as
easily get your bank password and transfer money out of your account.
Once we password encrypt the wallet, we'll be able to make a clearer
case that we're much more secure than banks.  We use strong encryption,
while banks still let anyone who has your account info draw money from
your account.
They have Wordpress built in, you might not need to set up any database
stuff manually.  I enabled the Wordpress feature and added you as an
admin, account sirius-m, e-mail sirius-m@users.sourceforge.net.  I'm not
sure how it works out the password for access, maybe it's just based on
being logged in to sourceforge.
They also have support for MediaWiki if you want it.
In case you still need it, here's the accounts and passwords for mysql.
# Access this project's databases over the Internet
We shouldn't try to use security against identity theft as a selling
point, since it leads into these counter arguments.  The current banking
model is already tested and the actual loss percentage is known.  Even
if ours is probably better, it's an unknown, so people can imagine
anything.  The uncertainty about what the average loss percentage will
be is greater than the likely loss percentage itself.
It's already an improvement, and like you say, there must be better
themes to choose from.
It would be good to make the download link go directly to the download area:
https://sourceforge.net/project/showfiles.php?group_id=244765
I haven't found any way to gain admin control over the mediawiki
feature.  It thinks I'm a different S_nakamoto from the one that has
admin access:
I tried deleting and re-enabling the feature, no help.  Oh well.
You're right, that was it.  I went in and granted us access using the
alternate account.
I like your idea of at least moving the FAQ into the wiki.  I've seen
other projects that use the wiki for the FAQ or even the whole site.  If
you can figure out how to make it so regular users can edit things, then
anyone who wants to can help.
The site layout is looking nicer.  More impressive looking.
There are a lot of things you can say on the sourceforge site that I
can't say on my own site.  Even so, I'm uncomfortable with explicitly
saying "consider it an investment".  That's a dangerous thing to say and
you should delete that bullet point.  It's OK if they come to that
conclusion on their own, but we can't pitch it as that.
A few details: the FAQ says "see section 2.3", but the sections aren't
numbered.  Also, could you delete the last sentence on the FAQ "They are
planned to be hidden in v0.1.6, since they're just confusing and
annoying and there's no reason for users to have to see them." -- that's
not really something I meant to say publicly.
The links to sites to help set up 8333 port forwarding is great.
favicon is a nice touch.
Someone came up with the word "cryptocurrency"... maybe it's a word we
should use when describing Bitcoin, do you like it?
Sourceforge is so slow right now I can't even get the login page to
load.  Maybe due to the site reorg they just did.  I'll keep trying and
try to get you that logo stats thing.
Thanks, I've been really busy lately.
I registered username "satoshi".  Since there's no SSL login, I want to
mainly use that account with sub-admin powers and use the admin account
as little as possible.  I created a "Moderators" group to give my
satoshi account as much editing control as possible without the ability
to overthrow everything.
There's something weird with the download bar on the right covering
things up, like on the new account registration it covers up the entry
fields unless you make the browser really wide, and the homepage it
covers up the screenshots.  (with Firefox)
I know this sounds really retarded, but I still haven't been able to get
the sourceforge login page to load, so I haven't been able to read it
either.  https://sourceforge.net/account/login.php
Hal isn't currently actively involved.  He helped me a lot defending the
design on the Cryptography list, and with initial testing when it was
first released.  He carried this torch years ago with his Reusable Proof
Of Work (RPOW).
I'm not going to be much help right now either, pretty busy with work,
and need a break from it after 18 months development.
It would help if there was something for people to use it for.  We need
an application to bootstrap it.  Any ideas?
There are donors I can tap if we come up with something that needs
funding, but they want to be anonymous, which makes it hard to actually
do anything with it.
That's a good point that since you know how many coins exist and how
fast new ones are created, you could set a support price based on the
amount of legacy currency you have and be sure you'll have enough to
meet all demands.  I had imagined an auction, but it would be far
simpler and more confidence inspiring to back it at a specific exchange
rate.
Offering currency to back bitcoins would attract freebie seekers, with
the benefit of attracting a lot of publicity.  At first it would mostly
be seen as a way to get free money for your computer's idle time.  Maybe
pitched like help support the future of e-commerce and get a little
money for your computer's spare cycles.  As people cash in and actually
get paid, word would spread exponentially.
It might help to keep the minimum transaction size above an amount which
a typical user would be able to accumulate with one computer, so that
users have to trade with each other for someone to collect enough to
cash in.  Aggregators would set up shop to buy bitcoins in smaller
increments, which would add confidence in users ability to sell bitcoins
if there are more available buyers than just you.
People would obviously be sceptical at first that the backing will hold
up against an onslaught of people trying to get the free money, but as
the competition raises the proof-of-work difficulty, it should become
clear that bitcoins stay scarce.  People will see that they can't just
get all the bitcoins they want.  It would establish a minimum value
under bitcoins enabling them to be used for other purposes if,
hopefully, other purposes are waiting for something to use.
That would be more powerful if there was also some narrow product market
to use it for.  Some virtual currencies like Tencent's Q coin have made
headway with virtual goods.  It would be sweet if there was some way to
horn in on a market like that as the official virtual currency gets
clamped down on with limitations.  Not saying it can't work without
something, but a ready specific transaction need that it fills would
increase the certainty of success.
Basically like an eBay site with user reviews to try to establish which
sellers can be trusted.  The escrow feature will help but not solve
everything.  It would be far more work to set up such a site than just
to set up a single exchange site of your own, and there won't be enough
users to make it go until later.  I'm thinking it wouldn't make sense to
make an eBay type site until later.
Even if you had automation, you'd probably want to review orders
manually before processing them anyway.  It wouldn't be hard to process
orders by hand, especially at first.  You could always set a minimum
order size to keep orders more infrequent.
That's great, I could probably get a donor to send currency to you which
you convert to euros and pay out through methods that are convenient for
users.  I don't want to do an exchange business myself, but it can be
done independently of me.  Like you say, there is more software
development to be done first, and also I'd like to keep trying for a
while to think of a bootstrap application to use bitcoins for.  I've had
some ideas that could only be done before an exchange exists.
BTW, I tried to buy bitcoin.com before I started but there was no
chance, it's owned by a professional domain speculator.  It's normal for
open source projects to have .org so it's not so bad.
Glad that worked, it's a pain that the dependencies are so big and hard
to build.  Some of them give little attention to the Windows build.
Next time I update to the latest versions, maybe I'll lay everything out
in one directory tree and bundle the whole thing up into a giant archive.
I'm not sure they had wxPack before.  I'm glad they got that so everyone
doesn't have to build wxWidgets themselves.  OpenSSL is the harder one
to build.
I reduced the EXE size by running strip.exe on it to take out the debug
symbols.  That's with mingw.  That's the better compiler, I only used VC
for debugging.
Now that I think about it, you've put your finger on the most important
missing feature right now that would make an order of magnitude
difference in the number of nodes.  Without auto-run, we'll almost never
retain nodes after an initial tryout interest.  Auto-running as a
minimized tray icon by default was the key to success for the early file
sharing networks.  It wouldn't have been appropriate for v0.1.0 when
stability wasn't a given yet, but now it's good and stable.  This is a
must-have feature for the next release so any users that come back to
try the new version we hopefully retain this time.
I think the most user friendly way of doing auto-run is putting an icon
in the Startup folder.  I see OpenOffice.org and a number of other
things on my computer do it that way.  The other way, creating a runas
registry entry, is not easily visible or editable by users, I've never
liked that much.  I guess what we want is an auto-run option that's on
by default, if the option is changed then it creates or deletes the
startup icon.
While it's tempting to do a Linux port, once we do it we have that extra
work with every release from then on.  I'd rather put it off a while
longer.  Auto-run might give us 300% more nodes while Linux might give
us 3% more.  Linux would help server farms, but actually we'd like to
favour individual users.  Someone reported that it works fine in WinE.
That's great, that's a good step forward.
Yes, I worked out the sourceforge login problem, it was some tricky
thing on the login page that exposed a quirky bug in a browser add-in.
Thanks for that.  I'm still merging in some changes I had that need to
go in before any next release.  Some things based on questions and
feedback I've received that'll reduce confusion.  I'll probably enable
multi-proc generating support, and hopefully make it safe to just backup
wallet.dat to backup your money.  It's good to be coding again!
I'm going to hide the transaction fee setting, which is completely not
needed and only serves to confuse people.  It was only there for testing
and demonstration of a technical detail that can only be needed in the
far away future, if ever, but was necessary to implement at the
beginning to make it possible later.
What was the problem with the shortcut in the startup folder?  If you
could send me the code, I'd like to take another look and see if I can
see what the problem was.  The first strcat in the registry code should
be strcpy, otherwise it would fail intermittently.  If the same code was
in the shortcut one, maybe that was the problem.
It's encouraging to see more people taking an interest such as that
NewLibertyStandard site.  I like his approach to estimating the value
based on electricity.  It's educational to see what explanations people
adopt.  They may help discover a simplified way of understanding it that
makes it more accessible to the masses.  Many complex concepts in the
world have a simplistic explanation that satisfies 80% of people, and a
complete explanation that satisfies the other 20% who see the flaws in
the simplistic explanation.
I got it, I see you checked in the startup folder code before changing
it to registry.  I don't see any visible problems in the code.  I guess
it depends what exactly the problem was with it not always working by
default.  Was there a Vista/UAC security problem?
It's possible Bitcoin ran and bailed out because something was wrong.
debug.log should tell something if that was the case.  What OS are you
using?  I wonder if we need Admin privilege and don't realize it.  Stuff
that requires Admin can't start on startup on Vista.
Program shortcuts have multiple tabs of settings with lots of little
details.  I'll try the startup folder code and see if I can reproduce
the problem.  Every other systray icon on my computer is in the startup
folder, and it makes it easy for users to manage all their autoruns in
one place.  The things in the registry key tend to be devious hidden
bloatware.
I implemented the code to flush wallet.dat whenever it's closed so we'll
be able to tell users they only need to backup wallet.dat.  You can
restore just wallet.dat and it'll re-download the rest.  I'll have to do
another stress test before release.
Yeah, I put back your startup folder shortcut code and it started fine
for me too on XP and Vista.  For good measure, I changed it to make the
shortcut settings look identical to one I manually created.  I set the
working directory to where the EXE is since that's where debug.log is
created, otherwise windows puts it in some weird directory.  I didn't
change the setup script yet.
I checked everything in to SVN (thanks for setting that up)
- multi-proc generate
- flush wallet.dat after every change so the DB doesn't leave that stuff
in the transaction logs
- view menu checkbox to hide all generated coins so you can see just
your payment transactions
- disabled transaction fee option
- made the minimize to tray options similar to Firefox's MinimizeToTray
- bunch of other misc changes since the 0.1.5 release
I made it not show non-accepted generated coins.  It won't show
generated coins until they have at least one confirmation (one block
linked after it), so usually they'll just never be seen.  Occasionally a
generated coin that was displayed might disappear because it became not
accepted later.  I don't think anyone would notice the occasional
non-accepteds if we didn't point them out in the UI.  People have told
me they find it annoying to have to look at them, as they're permanently
displayed in the transaction record.
I still have more testing to do.  I guess we gotta test Windows 7 now.
I haven't had any reports of crashes in v0.1.5.  It's been rock solid
for me on Windows.  I think it must be Wine related.  If you get another
crash in Wine and it prints anything on the terminal, e-mail me and I
may be able to figure out what happened, maybe something I can work
around.  Martti and I have been working on a new version to release soon
and it would be nice to get any Wine fixes in there.
Those don't look like anything to worry about.  Probably functions
unimplemented by Wine that are harmlessly stubbed out.
You can delete debug.log occasionally if you don't want to take the disk
space.  It's just status messages that help with debugging.
bitcoin.sourceforge.net looks fine now.  Maybe sourceforge was doing
some maintenance.
Doesn't work right now.
Sourceforge is just so darn slow.  I don't know what else to do though.
It's such a standard, more often than not any given project has a
projectname.sourceforge.net site.  When I see whatever.sourceforge.net
in a google search, I assume that's the official site.
Is there a way to make Bitweaver allow users to edit (and maybe delete)
their own messages in the forum?
Getting antsy to port to Linux?  It's not a decision to be taken lightly
because once it's done, it doubles my testing and building workload.
Although I am worried about Liberty's Wine crashes.
I've tried to be as portable as possible and use standard C stuff
instead of Windows calls.  The threading is _beginthread which is part
of the standard C library.  wxWidgets has wxCriticalSection stuff we can
use.  The sockets code is send/recv stuff which I think is the same as
unix because Microsoft ported sockets from BSD.  We need direct control
over sockets, it wouldn't be a good idea to get behind an abstraction
layer.  wxWidgets is a good place to look for cross-platform support
functions.  I want to avoid #ifdefing up the code if we can.  Anything
that's used more than once probably becomes a function in util.cpp that
has the #ifdef in it.
BTW, I have a lot of uncommitted changes right now because it includes
some crucial protocol transitions that can't be unleashed on the network
until I've tested the heck out of it.  It shouldn't be too much longer.
Can you make the setup uninstall the Startup folder icon?  I figure it
should install and uninstall an icon in a regular program group, and
just uninstall the Startup folder one.  I guess it doesn't matter that
much whether it installs and uninstalls the Startup folder icon or just
uninstalls it.
I'll convert the CriticalSection code to wxCriticalSection and upload it
to SVN (it's a little tricky).  I don't know what to do for
TryEnterCriticalSection though.  I think I'm almost ready to check
everything in.
You're probably right, it's about time to do a linux build.  I've been
working on getting my linux machine set up and building the dependencies.
The easy solution I took was to look at the wxWidgets source code and
see how they did it.  They just mapped it to wxMutex on non-MSW, which
does have TryEnter, so that mapped in perfectly.
I checked in all my backlog of changes to SVN, including the overhaul of
CCriticalSection in util.h and OpenSSL's mutex callback in util.cpp to
do everything with wxWidgets when not on Windows.
If we get it working on Linux, I'll run my test suite against it here
off-network first, then we can give an unreleased build to
LibertyStandard to test for a while before going public.
I fixed some non-portable stuff I came across:
If there's any other unportable stuff you know of I should fix, let me know.
I think I'll move debug.log and db.log into the same directory as the
data files (%appdata%\Bitcoin), rather than whatever the current
directory happens to be.
heapchk() is just a MSVCRT debugging thing that's not being used.  It
can be a no-op on Linux.  OpenSSL automatically uses /dev/urandom to
seed on Linux, so RandAddSeedPerfmon can also be a no-op.
Don't let it connect to the network before we've tested it thoroughly
off-net.  If you have two computers, unplug the internet and use
"bitcoin -connect=<iplinux.  -connect will allow you to connect to non-routable addresses
like 192.168.x.x.  We don't want to reflect badly on the reliability of
the network if it throws off some malformed crud we hadn't thought to
check for yet, or discovers something else anti-social to do on the network.
I have time that I can do some testing when you've got something
buildable to test.  I can include it in the stress test I'm currently
running on the changes so far.
Great, I've been looking forward to working on the Linux build.
If you connect to Freenode's hidden service, then they tell you they've
also banned TOR from that due to abuse and it kicks you off.  There's a
several step procedure you can do to run a password utility on unix and
e-mail request an account that you could login with, but that's getting
pretty complicated.  I wonder if we could get away with applying for one
account and then everyone use the same account?  I suppose the IRC
server probably limits accounts to one login, or some admin might not
like to see a dozen logins on the same account.
Besides the IRC part, how did your test of proxy go?  Since you've been
connected before, your addr.dat contains known node addresses, but
without IRC to know which ones are online, it takes a long time to find
them.  There are normally 1 to 3 other nodes besides you that can accept
incoming connections, and existing nodes that already know you would
eventually connect to you.  How many connections did you get, and how
long did it take?  I guess to know whether it successfully connected
outbound through TOR you'd need to search debug.log for "connected".
To originally connect with TOR without connecting normally once to get
seeded, you'd have to know the address of an existing node that can
accept incoming connections and seed it like this:
bitcoin -proxy=127.0.0.1:9050 -addnode=<ip of a node
If some nodes that accept incoming connects were willing to have their
IP coded into the program, it could seed automatically.  Or some IP seed
addresses posted on a Wiki page with the instructions.
Another option is to search the world again for an IRC server that
doesn't ban TOR nodes.  Or if we could get someone to set one up.  IRC
servers ban TOR because they have actual text chat on them... if there
was one with just bots and junk then it wouldn't care.  Probably should
post a question on the forum or the mailing list and see if anyone knows
one.
Another problem is that TOR users can't accept incoming connections, and
we have so few that can.  If everyone goes to TOR, there won't be any
nodes to connect to.
We have a shortage of nodes that can accept incoming connections.  It
generally ranges from 2 to 4 lately.  We need to emphasize the
importance to people of setting up port forwarding on their router.
Every P2P file sharing program has instructions how to do it.  We should
have a paragraph on the bitcoin.sourceforge.net homepage urging people
to set up port forwarding to accept incoming connections, and a link to
a site that describes how to do it for each router.
It was almost there.  I fixed a few things and got it to finish
compiling but I don't know the system libraries to link to so there's
undefined references galore.
I changed the makefile to look for things under /usr/local and in their
default "make install" locations.  I wrote what I did and switches I
used in build-unix.txt.  I'm currently using wxWidgets 2.8.9 for now
because it's the same version as on Windows and I don't want to wonder
if there's version change issues at the same time as platform change.
2.8.10 or 2.9.0 are probably fine though.  I went with the
single-library compile of wxWidgets since we're linking to almost every
library anyway.
I added xpm files, which is what they use everywhere else but Windows
instead of RC files.  They're clever C files that define graphics in
static arrays.  The bitcoin icon has 5 different versions but I couldn't
figure out how that works in xpm so I only put the biggest one.  Maybe
on GTK it scales it for you.  I don't know if these are right or what,
but they compile.
Just letting you know I'm still working on the Linux build so we don't
duplicate work.  I got it linked and ran it and working through runtime
issues like getting it switched to load bitmaps from xpm instead of
resources.
There are debian packages available for some of the dependencies instead
of having to compile them ourselves:
I need to see if Berkeley DB or Boost have packages.
We'll shared-link OpenSSL, I'm pretty sure it's always preinstalled on
Linux.  GTK has to be shared linked.  I'm not completely sure if it's
preinstalled by default.
I merged the linux changes into the main trunk on SVN.  It compiles and
runs now.  I think all the problems are in the UI.  The menus quickly
quit working and it doesn't repaint when it's supposed to unless I
resize it, and the UI is getting some segfaults.  Shouldn't be too hard
to debug with gdb.  I haven't tested if it plays nice with other nodes
yet so keep it off-net.
build-unix.txt and makefile.unix added
debug.log moved to the data directory "%appdata%/bitcoin/debug.log"
7 inbound and 2 outbound sounds about as expected.
My last SVN commit included an overhaul of the code that selects the
order of addresses to connect to, trying them in the order of most
recently seen online, so it should get connected in a more reasonable
amount of time if IRC is unavailable.  IRC is really only needed to seed
the first connection, but we've been using it as a crutch to get
connected faster.
That would be great.  It's only TOR users that need it, so in the
instructions saying "bitcoin -proxy=127.0.0.1:9050 -addnode=<someipsomeip could be an actual static IP, with the wiki free-for-all
add-your-ip list nearby or a link to it.  There should be a link to that optional step, add your IP to this list now that you can accept incoming
if you're static.
Do you think anonymous people are looking to be completely stealth, as
in never connect once without TOR so nobody knows they use bitcoin, or
just want to switch to TOR before doing any transactions?  It's just if
you want to be completely stealth that you'd have to go through the
-proxy -addnode manual seeding.  It would be very easy to fumble that
up; if you run bitcoin normally to begin with it immediately
automatically starts connecting.
Now that the forum on bitcoin.sourceforge.net is catching on, we really
should look for somewhere that freehosts full blown forum software.  The
bitweaver forum feature is just too lightweight.  I assume the "Forum"
tab on the homepage can link out to wherever the forum is hosted.
I've seen projects that have major following just from forum talk and
pie-in-the-sky planning without even having any code yet.  Having a lot
of forum talk gives a project more presence on the net, more search
hits, makes it look big, draws new users in, helps solve support
questions, hashes out what features are most of wanted.
It would be a big plus if it could support SSL, at least for the login
page if not sitewide.  Multiple people on the forum have expressed
interest in TOR/I2P, and those users need SSL because a lot of TOR exit
nodes are probably password scrapers run by identity thieves.  A lot of
the core interest in Bitcoin is going to be from the privacy crowd.
Any ideas where we can get a free forum?  Maybe we should look at where
some other projects have their forums hosted for ideas where to look.
It works reliably on Linux now, except if it uses wxMessageBox() outside
the GUI thread, it'll crash because non-GUI threads can't open a window
on Linux.  I haven't got to fixing that yet.  I've been running my
stress test on it and it's functioning normally.
Most of wxWidgets is not thread-safe to use in threads other than the UI
thread, but as a rule of thumb on Windows anything not UI related is OK.
It turns out its more thread-unsafe on GTK.  I replaced a bunch of
stuff at once so I don't know if it was just one thing (probably
Repaint), but I have to assume even any wx function that uses wxString
is not safe to use outside the UI thread.  So dang, there goes all the
nice wxWidgets portability support functions.  I left a few simple
things like wxThread::GetCPUCount() that I checked the source and it's
all numerical, and wxMutex has to be safe or it'd be useless.
There's an issue that if you exit and run it again right away, it can't
bind port 8333.  The port frees up after about a minute.  Unless I'm
missing something, I am closing the socket before exit, so I don't know
what else I can do.  Maybe this is just something about Linux that it
takes a minute to free up a port you had bound.  Possibly a security
feature so some trojan doesn't kill the web server and quickly jump into
its place and pick up all the client retries.
Still gotta figure out how to do the xpm version of the icon correctly.
I wonder if the database dat files are interchangeable with Windows.
bitcoin-linux-0.1.6-test1.tar.bz2 attached
The Linux build is ready for testing on the network.  It seems solid.  I
sent the executable as an attachment in the previous e-mail, but if the
mail server didn't let it through (it's 12MB), you can download it here:
In the debug.log, it requests the block list, receives the block list,
then begins uploading the list of blocks requested.  It doesn't receive
the blocks, but it didn't run long enough for me to be sure it would
have had time yet.  Everything else looks normal.
How long did you run it?  It could take a few minutes to start
downloading the blocks.  Especially if you're on a cable modem, the
uplink can be much lower bandwidth so it would take some time to upload
the block request list.
If you run it again and it still doesn't download blocks, keep it
running for several hours at least and then send me the debug.log.  That
should give it time for my node to connect to you and I could see what
it says on my side and correlate it with your debug.log.
You're right about the minimize on close option, there's no reason that
can't be separate.  Martti originally had it separate and I made it a
sub-option, my bad.  I'll change it back.
I'm not really a fan of that type of forum layout.  The thread list only
fits about 4 threads on a page, posts are treated like news articles or
blog posts with reply comments at the bottom.  It's more of a social
networking site, not really conducive to technical discussion.
I'm thinking phpBB or IPB or similar.  One line of text per thread,
small fonts, efficient use of vertical space.  Most people are already
familiar with the interface.
About how long did it take to start?  It could be the node that you
happened to request from is slow.  The slow start is consistent with the
slow download speed.
I'd like to look at your current debug.log file and try to understand
what's going.  It might just be a really slow connection on the other
side, or maybe something's wrong and failed and retried.  Taking too
long could confuse other users.
Martti, how long did it take to start downloading blocks when you ran
it, and how fast did it download?
It already uses SO_REUSEADDR so it can bind to the port if it's in
TIME_WAIT state after being closed.  The only time it should fail to
bind is when the program really is already running.  It's important that
two copies of Bitcoin not run on the same machine at once because they
would be modifying the database at the same time.  There is never any
need to run two on one machine as coin generation will now use multiple
processors automatically.
I'm not sure what those lib errors are, I'll do some searching.
Thanks for that, I see what happened.  Because the first one was slow,
it ended up requesting the blocks from everybody else, which only bogged
everything down.  I can fix this, I just need to think a while about the
right way.
There's no risk in shutting down while there are unconfirmed.  When you
make a transaction or new block, it immediately broadcasts it to the
network.  After that, the increasing #/confirmed number is just
monitoring the outcome.  There's nothing your node does during that time
to promote the acceptance.
Now that I think about it, when you close Bitcoin, it closes the main
window immediately but in the background continues running to finish an
orderly flush and shutdown of the database.  Before I implemented that,
it was annoying having a dead hung unresponsive window hanging around.
Until it finishes the orderly shutdown in the background, the port would
be locked, and this is an important protection to make sure another copy
can't touch the database until it's done.  I haven't seen the shutdown
take more than a few seconds.
In Wine, there's no way for the Windows version to do SO_REUSEADDR, so
that would add 60 seconds (on my system) of TIME_WAIT after the port is
closed.
If you need to transfer between two copies, you could send it to the
other's bitcoin address.  The receiving copy doesn't have to be online
at the time.
The command line to use a different data directory is
For example, on Linux, the default directory is (don't use ~)
You shouldn't normally have any need to use this switch.  It still won't
let you run two instances at once.
You really don't want to keep running in Wine, you're getting database
errors (db.log).  You probably developed these rituals of transferring
to a fresh install to cope with database corruption.  If there is a way
to lose unconfirmed blocks, it would have to be the database errors.
Any problems you find in the Linux build can be fixed.  The Wine
incompatibility deep inside Berkeley DB is unfixable.
I think GCC 4.3.3 on the Linux build optimized the SHA-256 code better
than the old GCC 3.4.5 on Windows.  When I was looking for the best
SHA-256 code, there was a lot of hand tuned highly optimized SHA1 code
available, but not so much for SHA-256 yet.  I should see if I can
upgrade MinGW to 4.3.x to get them on a level playing field.
You got a lot done with the Linux build, autostart, minimize to tray,
setup and everything, it's really appreciated.  Good luck on your C++
project.
I see what happened.  All your sockets went dead somehow.  You had no
communication with the network, but because you had 8 zombie
connections, it thought it was still online and kept generating blocks.
You can tell this is happening when your blocks are numbered
sequentially, without other people's blocks interspersed, like:
It's implausible that you would be the only one to find blocks for 6
blocks in a row like that.
When you exited and restarted, it connected and downloaded 45 blocks
that the network found in your absence.  Since your blocks were not
broadcast to the network immediately, the network went on without them.
It sounds like you had exactly the same problem on Wine.  There's
clearly something about socket handling on Linux that's effecting it
either way.
I'll start researching this.  Ultimately if I can't find the root of the
problem, I'll have to make some kind of mechanism to watch for an
absence of messages and disconnect.  The only workaround for you right
now would be to exit and restart more often.
All but one of your node connections went dead at the same time, one
shortly after.  IRC was still working, so it wasn't that you were
offline from the internet.
I wonder if the status of blocks should say "#/unconfirmed" all the way
up to maturity (119/unconfirmed then 120 blocks) instead.  The meaning
of the number isn't as strong for blocks as for transactions.
I think it would be an improvement not to count one's own blocks as
confirmations.  A drawback would be that the status numbers shown by
different nodes would not match.  The status number would no longer be
coordinated with the maturity countdown on blocks either.  A lighter
option would be a special case only if all confirmations are your own.
I fixed a few places I found where it was possible for a socket to get
an error and not get disconnected.  If your connections go dead again,
it should disconnect and reconnect them.  I also implemented an
inactivity timeout as a fallback.
This also includes a partial fix for the slow initial block download.
You should run with the "-debug" switch to get some additional debug.log
information I added that'll help if there are more problems.
Right now (04:50 GMT) my node is connecting to yours and getting zombie
connections each time.  The socket isn't returning an error, just zombie
without notice.  If you're running the linux build right now, it would
be interesting to see what the log says on your side.
test3:
I've added specific code to detect zombie sockets.  It'll detect if the
socket hasn't sent or received any data within 60 seconds of connecting,
and detect if data is queued to send and hasn't sent for 3 minutes.
I think I may have weakened the reconnect speed in test2.  In test3 I'm
making it more determined to reconnect quickly.
I added checking to track whether other nodes received your generated
blocks.  If none did, it'll warn you in the description:
"Generated - Warning: This block was not received by any other nodes and
will probably not be accepted!"
The status can go to "#/offline?" for blocks or transactions you create
if they don't get out to any other nodes.
With all this, it should be impossible not to notice as soon as it
screws up.  It should hopefully disconnect all the zombie sockets.
After that, whether it's able to make some good connections, or sockets
is completely hosed and it stays at 0 connections, I don't know.
If this doesn't work, I guess I'll look at the sourcecode of some other
P2P apps like BitTorrent and see how they deal with this stuff.  Maybe
there's some magic flag or procedure to bash the sockets system back to
life.
I added MSG_DONTWAIT to the send and recv calls in case they forgot the
socket is non-blocking.  If that doesn't work, there's now the catch-all
solution: another thread monitors the send/recv thread and terminates
and restarts it if it stops.  It prints "*** Restarting
ThreadSocketHandler ***" in debug.log, and an error message displays on
the status bar for a while.
Before terminating, it tries closing the socket that's hung.  If that
works, it doesn't have to resort to terminating.
I ran a test where it terminated the thread about 1000 times without
trouble, so it should be safe.  The terminate on linux is
pthread_cancel, which throws it into C++'s exception handler.
The thread calls we were using didn't have terminate, so I created our
own wrappers in util.h to use CreateThread on windows and pthread_create
on linux, instead of:
_beginthread is windows only and lacks terminate
boost::thread is really attractive, but lacks terminate
wxThread requires you to create a class for every function you might
call (yuck)
I created a forum on Zetaboards, InvisionFree's new site that they're
migrating to.
I made an admin account you can use to upgrade your own account to admin:
BTW, the admin pages have a huge blank space at the top, you have to
scroll down.
It doesn't support SSL, but none of them do.  I replaced the ugly
default orange and blue theme with the Frostee theme, which was the only
decent looking theme I could find after extensive searching.  Searching
for themes is futile, there are thousands of rubbish themes.  It turns
out the solution is to look at button sets instead
(http://resources.zetaboards.com/forum/1000328/)
I only created two subforums to begin with.  I'll create new ones as the
need arises.  I like to start with a flat namespace until there's enough
items to justify subsections.  Technical Support makes sense as a
separate section to get that stuff out of the main spotlight so our
dirty laundry isn't in everyone's face, and to make people feel more
free to report bugs there.  Mostly only devs and people checking on a
bug need read the Technical Support section.
linux-0.1.6-test5 solved Liberty's zombie socket problem.  The
MSG_DONTWAIT fixed the root cause, it's not having to terminate and
restart the thread.  The sockets are marked non-blocking already, so I
don't understand why.  Maybe it forgot.  I suppose if a socket fails and
the OS closes it then there's nothing left to remember it was
non-blocking, but then accessing a closed handle should return
immediately with an error.  There's no MSG_DONTWAIT on Windows, marking
the socket as nonblocking is the only way, so if anyone runs the Windows
version in Wine it will have to rely on terminating the thread.
The only problem now is the DB exceptions he's getting.
I had expected those to be a Wine problem, but he's getting them on
Linux just the same.  He tried moving the datadir to a different drive,
no help.  I've never gotten them.  I'm running a stress test that
continuously generates a lot of activity and DB access and never got it.
He has Ubuntu 64-bit and I have 32-bit, so I'm assuming that's the
difference.  Is your Linux machine 64-bit or 32-bit?  Have you ever had
a DB exception? (see db.log also)  Now that the zombie problem is fixed
in test5, could you start running it on your Linux machine?  We could
use a 3rd vote to get a better idea of what we're dealing with here.
The DB exception is uncaught, so it'll stop the program if you get it.
BTW, zetaboards insists on displaying "Member #", so you better sign up
soon and grab a good account number.
I'd better install 64-bit then.  I imagine it's something about the
32-bit version of Berkeley DB on 64-bit Linux.
BTW, in things like the feature list credits, do you want me to refer to
you as sirius-m or Martti Malmi?  I think most projects go by real names
for consistency.
At first glance, bitcoinshop.com looks better.  bitcoinexchange.com
might be better than bitcoinx.com.
Be careful where you search domain names, many will front-run you.  Even
network solutions, although they've said they won't if you use their
whois page not the homepage.  The only safe place is
http://www.internic.com/whois.html
I have an idea for a workaround, but it depends on what files the errors
are on.  If you've accumulated several errors in db.log, could you send
it to me? (even if it's rather simple and boring)  Is the file listed
always blkindex.dat, or does it include addr.dat or wallet.dat too?
What do you see as the benefits of switching the wiki?
Some I can think of:
SSL
get away from sourceforge's unreliable hosting
everything not logged by sourceforge
The forum feature is about as weak as bitweaver.  We need a full blown
forum software for that.
My priority right now is to get a forum going, either phpBB or similar.
What do you think of the zetaboards option?  Should we go ahead with that?
That's a good idea to go in a more web-publishing CMS type direction
like Drupal.  That's a better fit and can produce a better looking
website than a wiki.  I think I was wrong about wiki.  Only a few
specific people will do any website design work and those people can go
ahead and have a separate login.  In that case, login integration with
the forum doesn't matter much.  For security, I'd almost rather have a
different login than be constantly checking the forum with the same
login that could pwn the website.
Drupal's forum is less bad than the wikis, but still a long way from
something I would want to use.
zetaboards pros and cons:
pros:
- we don't have to worry about bandwidth
- they handle the backend management and security patches
con:
- lack of SSL
- lack of privacy, everything is logged
- lack of control over the php code for customization
- no CAPTCHA, and if they add one later it might be unacceptable flash
- ads (could pay to get rid of them later if we care enough)
- there's always the risk they abruptly cancel the site for some petty
reason
test 7:
Backup your data directory before running this, just in case.
Workaround for the Db::open/Db::close "Bad file descriptor" exception.
Might also make the initial block download faster.  The workaround is to
open the database handles and keep them open for the duration of the
program, which is actually the more common thing to do anyway.  If we're
not closing and opening all the time, the error shouldn't get a chance
to happen.
The one exception is wallet.dat, which I still close after writing is
finished so I can flush the transaction logs into the dat file, making
the dat file standalone.  That way if someone does a backup while
Bitcoin is running, they'll get a wallet.dat that is valid by itself
without the database transaction logs.
This is a restructuring of the database handling, so we might find some
new deadlocks.  Usually if it deadlocks, either the UI will stop
repainting, or it'll stop using CPU even though it still says Generating.
Another issue I thought of with zetaboards: most free forum sites won't
let you export the user account database if you want to move.  I don't
know why I don't see any other software projects using a free forum, but
I have to assume there might be a reason we would discover later.
If you can install phpBB3 on your VPS, that's probably the better option.
From what I've seen on other forums, if the cost of bandwidth becomes
an issue, a small Google Adwords (text links) at the top generates more
than the cost of bandwidth even for very low value traffic like gaming.
This would be much higher value traffic well targeted for high paying
gold merchant keywords and VPN hosts.  It could eventually be a valuable
revenue stream you wouldn't want to give away to some free site.
I want to pre-announce some of the features in version 0.2 on the forum
and try to get some anticipation going.  Even if hardly anyone else is
posting, I have seen project forums where most of the posts are the
author announcing what's going on with the latest changes.  Users can
see progress going on, see that it's improving and supported and not
abandonware.  It's a little like a blog in that case, but easier for
users to use it as a searchable FAQ and better organized.  Whenever I
google search software questions, most of the hits are forum posts.
Finally an easy one.  I see a way that could happen on a long operation
such as the initial download.  The TryLock bug is unrelated to the db
stuff.  Fix will be in test8.
I've been able to reproduce the db::open/close exception 3 times now on
32-bit linux by hitting it with a continuous flood of non-stop requests.
It looks like even periodically closing the wallet.dat database to
flush it gets the db::close exceptions.  I'm disabling the wallet flush
feature on Linux.  On Linux we'll never close a database handle until
we're ready to exit.  So far with this disabled, no exceptions.
I'm also implementing the orderly initial block download.  Instead of
naively requesting all the blocks at once, it'll request batches of 500
at a time.  This way, it'll receive the blocks before the retry timeout,
so it shouldn't go requesting it from other nodes unless it actually
doesn't receive them or it's too slow.  The change is in the requestee's
side, so this functionality won't be visible until your initial block
download is coming from a node that has the new version.
I'm going to test this some more before sending test8.
Thanks.  The db::open/close errors confirm the pattern.
More interesting is the zombie sockets activity towards the end, and the
socket thread monitor tripped but didn't get it going again.  Was the
machine disconnected from the net?  MSG_DONTWAIT in test5 solved the
zombie problem for Liberty.  What test version were you running?  (I
should print the test version in the log)
That's great, this is going to fun!  I'll research what people say about
the two.
I've been configuring the SMF forum.  They're saying SMF is better
written than phpBB and more reliable, so if I can get SMF to look right,
that's the preferable choice.
Most forums run vBulletin (big-boards.com lists 1376 vBulletin, 275
Invision, 245 phpBB and 41 SMF), so if you don't look like vBulletin or
Invision, it looks like you compromised because you couldn't afford
vBulletin.  SMF's UI started out further away from the standard look,
but I've been able to use CSS to make it look more like the others.
I've done as much as I can with CSS, the rest requires editing PHP files
and uploading images.  The forum doesn't have a built in file
upload/edit admin feature, it's added separately as the SMF File Manager
mod.  I uploaded the mod but some files need to be chmod 777 so it can
install.  If you go to Admin-Apply Mod, it offers to do it automatically if you enter an ftp login.
Someone says you might also have to
The error in the error log is:
failed to open stream: Permission denied
(I'm sure that's just the first file)
Is it OK to go live with this SMF installation when I'm finished
configuring it?  I should be able to point forum.bitcoin.org to it.
Liberty reports that linux-test8 has been running smoothly.  My tests
have been running fine as well.  The Linux version looks fully
stabilized to me.
Good news: he says he made his first sale of bitcoins.  Someone bought
out all he had.  I had been wondering whether it would be buyers or sellers.
DNS entry.
I'm thinking of merging the bitcoin.org information with your site
content so I can switch the whole bitcoin.org domain over.  We need to
replace the current bitcoin.org site with a user-oriented site before
the release.
If the website and forum switch at the same time, then forum.bitcoin.org
isn't necessary unless we want it that way for looks.
Have you decided on the CMS to use?  I should research Drupal and other
CMSes and see what's the most popular.
The linux version, setup exe, tor option and better website/forum will
all increase the percentage of visitors who can use it, and the
autostart and minimize to tray will increase how many keep running it.
All those factors multiply together.
It's good to start low and only have the price go up.
I really like that he explains the concept that the cost of electricity
is a minimum floor under the price.  At a minimum you either have to pay
the cost in electricity or pay someone the cost of production to make
them for you.
Thanks, that worked, I got File Manager installed with SSH.  I also
uploaded a few themes into Drupal.  I haven't thoroughly gone through
all the available themes yet.
Looked around at CMSes, Drupal and Joomla are popular.  Consensus is
Joomla has a better selection of themes and is easier to learn, though
Drupal may be more intuitive for programmers and customization.  Joomla
better for CMS, Drupal better for blogs.  Drupal's URLs are search
engine friendly, Joomla not.
Both have SMF bridge modules available.  For future reference, Drupal's
is named "SMFforum Integration".
I'll go ahead with setting up Drupal then.
I don't think we should make the site https by default.  It's still very
unusual for the public part of sites to be https, probably because it
introduces potential technical complications, delays and greater server
load.  As a user I'm a little annoyed when it takes time to verify the
identity of some no-name site I casually came across.  For me it seems
like https sites fail to load a lot more often.
The important thing is to have SSL available for those who need it.
Those who need SSL I think know to try inserting an "s" after http and
see if it works.  SMF has code that changes all the links to https if
the URL handed in is https.
We could add a note on the registration page that if you want SSL, you
can change http to https at any time and approve the self-signed
certificate, or a link that does it, and the TOR page can mention it too.
We can look into getting a certificate later when things have settled
down.  With Class 1, no changes are allowed for a year, which is a risk
if we find issues with the current host and have to change IP.
We need to do a continuity transition with bitcoin.org so the search
engines don't think this is a new site and reset the site start date and
PR data.  Google allows a certain number of properties like IP address
or content of the site to change without deleting your site history.  To
play it safe, when the IP address changes, the content better stay the
same and vice versa.  Even though not much rank has accumulated yet, the
original start date becomes extremely important if the site gets popular
later.
Steps:
1) copy the current bitcoin.org index.html to the new server exactly as-is.
2) switch the bitcoin.org DNS entry.
3) keep working on the drupal site behind the scenes.
4) after google has had time to update its records, we can switch over
to the drupal site.
The timing works out well because we can switch to the new forum now and
release the drupal site later when we're ready.
I'll see if I can figure out how to temporarily move drupal aside to
drupal.php or /drupal/ or something where we can still easily get in and
work on it.
Drupal's .htaccess file which uses mod_rewrite to allow clean URLs
without the ? parameter is not working because its changes are rejected
because Apache is not configured with "AllowOverride All".  This is
needed to make Drupal coexist with the other site the way we want.
I need access to change these files to fix it:
Here's the planned fix.  If you do it yourself, please still give me
access to httpd.conf in case I need to change it again later.
This probably requires Apache to be restarted after.
(apache2ctl graceful)
The bitcoin.org DNS change went through about 12 hours ago.  I'll wait
another 12 hours and then change the Forum tab on
bitcoin.sourceforge.net to go to http://www.bitcoin.org/smf/
For future reference, the changes in SMF to update the base url were:
server settings-   themes and layout-   there's a path in smileys and message icons
The Bitweaver menu editor is broken, I can't change the Forum link.  The
"create and edit menu items" page comes up blank for me:
http://bitcoin.sourceforge.net/nexus/menu_items.php?menu_id=2
You try it, I'm stumped.
The Forum link should be changed to:
Thanks, I haven't settled on a theme yet.  My first experiment was to
try something besides yet another blue site.  Another line of thought is
that it should be like a bank website, stately, professional and
official looking to support confidence in financial matters.
The logo's a little too Disco/web-1990's.  I still like your bitweaver
one better, I recreated it with text as a placeholder for now.  When the
theme is more settled, I'll think about a matching logo.
Good idea about the Sourceforge tag, we can use all the graphics we can get.
I have more to do before we go live, and we need to give the search
engines more time.
What Windows version/browser doesn't font anti-aliasing work on?  IE 6
on XP anti-aliases, and versions below that have less than 1% market share.
There's a transaction fee of 0.01 per KB after the first 1KB for
oversized transactions.  The first 1KB is free, small transactions are
typically 250 bytes.  Doubleclick on the transaction.  Think of it like
postage by weight.
The solution is an extra dialog when sending, something like "This is an
oversized transaction and requires a transaction fee of 0.20bc.  Is this
OK?"  (is that text good enough or any improvements?)  I have the code
already, I'll put it in.
Then we wouldn't have to explain the 10,000.20bc transaction, but may
still have to explain who the transaction fee goes to.
That's strange, I've seen Firefox 3.5 on XP anti-alias large fonts.
Well anyway, your way is safer.
I changed it back to text for now though so I can keep tweaking the
colours.  Drupal puts the <spanthat's fine for testing.
I added some instruction text on the homepage below the screenshots.
True.  I suppose the dialog could make it worse by giving people a
chance to experiment with breaking it up.
I'm making some changes.  The largest free transaction will be 60KB, or
about 27,000bc if made of 50bc inputs.  I hope that's high enough that
the transaction fee should rarely ever come up.  v0.2 nodes will take
free transactions until the block size is over 200K, with priority given
to smaller transactions.
It's best if you don't talk about this transaction fee stuff in public.
It's there for flood control.  We don't want to give anyone any ideas.
You found an infrequent bug in CreateTransaction.  It wrote the
transaction for 10000.20 with a fee of 0.22.  If you look at the
transaction on the sender's side, it'll be a debit 10000.42 with
transaction fee 0.22.  The bug was that it had to make a rare third pass
on calculating the fee, and incorrectly added the first pass' fee to the
amount being sent.  Will fix.
I added the sourceforge tracker to bitcoin.sourceforge.net.  The
complete selection of links is below if you want a different one.
I had it on bitcoin.org for a minute, but took it off.  It breaks the
lock in SSL mode with a mixed content warning, "partially encrypted" and
"contains unauthenticated content".  Anyway, do we really want
sourceforge tracking everyone?  It's more privacy friendly without it.
I went ahead and put the new Drupal site online.  Enough time has passed
for a safe transition, and the site looks good.  There's more work I
should do on the theme, but it's good enough so far.  This is a huge
improvement over the old bitcoin.org page.
I wasn't satisfied with my custom2 theme.  It felt crowded, the
header/logo seemed wrong and the heavy left margin stationery style is
outdated.
custom3 online now is a more standard layout similar to a lot of
commercial software homepages.  Maybe it's just me, but I really like
the random blue squares.
Most of the fixes are on the sender's side, so if you were downloading the network upgrades to 0.2.
How long did the initial download take?
Here's the planned release announcement text.  Probably releasing shortly.
- Multi-processor support for coin generation
- Proxy support for use with TOR
- Fixed some slowdowns in the initial block download
- Various refinements to keep the network running smoothly
We also have a new forum at http://www.bitcoin.org/smf/ if you have any
questions.
Thanks to <PRESIDIO_ANONYMIZED_PERSON> (sirius-m) for his coding work and for hosting
the new site and forum, and thanks to New Liberty Standard for testing
the Linux version.
- Multi-processor support for coin generation
- Proxy support for use with TOR
- Fixed some slowdowns in the initial block download
We also have a new forum at http://www.bitcoin.org/smf/
Many thanks to Martti (sirius-m) for all his development work, and to
New Liberty Standard for his help with testing the Linux version.
Thanks for creating the maintenance account, it would have been
impossible to do all that without it.  I'm really always going to need
it.  OK, I changed the password to a 20 character random password.
That's a good domain.  People rarely type domain names anymore, they use
autocomplete or click links on search engines.
I need to make a way for you to programmatically get new generated
bitcoin addresses.  Either that or you could have them send to your IP
address, but then you have to rely on them to put the order number in
the comment.
When generating the new address, there can be an option to add an entry
to the address book associated with the address, so the received
transaction will be labelled.  I kinda hid the labels after early users
found them confusing, but it would be very helpful for this application.
You have to widen up the comment column to see them.
Are you going to manually review and enter orders, at least to begin
with?  I sure would.
I'm thinking I should move the UI in the direction of having the user
ask for their bitcoin address when they want one.  "give me a bitcoin to
receive a payment with".  I suppose next to the send button, there would
by a receive button, you press it and it says "here's a new address to
use, here's the button to copy it to the clipboard, do you want to label
it?" and maybe some explanation about why you shouldn't reuse addresses.
Or maybe just a "New Address" button next to the address box that you
should hit each time to change it.
I had been wondering why everyone keeps harping on no-UI, when already
you can run it with only a small icon on the tray, which is common for
server services on Windows.  So I guess this is why.  I had chalked it
up to unix snobbery if they couldn't abide a tiny little icon on a
desktop they never see.
Not opening any windows is easy, but it may fail because the gtk
libraries aren't there.  wxWidgets has __WXBASE__ for "Only wxBase, no
GUI features".  You could try building for that instead of __WXGTK__ and
see what happens.  It would be preferable if there's any way to do it as
a command line switch on the same executable, rather than yet another
build variation to release.
How much memory do you have to work with?  Bitcoin necessarily takes a
fair bit of memory; about 75MB on Windows.  Is that a problem?
Command line control is one of the next things on the list.  I want to
design the API carefully.
Receiving payments is the part that has a lot of design choices to be
made.  The caller needs to identify the transactions of interest, that's
where the one-bitcoin-address-per-transaction model helps.  Searching
the comments text for an order number is another possibility.  There's
polled, asking what has been received to the given bitcoin address, and
event driven.  I guess in event driven, bitcoin would be told to run a
command line when a certain amount is received to a certain bitcoin address.
You're right, I was looking at a test run with 250,000 blocks... duh.
A normal one shows 17MB memory usage and 10MB VM size.
You could always exchange for Liberty Reserve.  It's an online currency
similar to e-Bullion, Pecunix or Webmoney that allows exchanges no
questions asked and with privacy.
LR and the others are hard to buy but easy to cash out.  Hard to buy
because exchangers are very cautious about getting ripped off by
reversed payments, so they require more details and holding time.
Cashing out is very easy.  LR is non-reversible, so there are oodles of
exchanges eager to turn LR into any kind of payment.
Bitcoin is the reverse, in that it's easy to get Bitcoins just by
generating them.  It would be easy for customers to go
bitcoin-just want to save the money, then just bitcoin-
There's also the idea BTC2PSC had to sell paysafecards for bitcoins.
Either online delivery by sending the card number by e-mail, or delivery
of the unopened physical card in the mails.  There are many variations
of these cards.  In some countries, they're called Gift Cards, and can
be used wherever credit cards are accepted.  I think they're used more
by people who don't have the credit history to get a real credit card,
so they buy gift cards themselves to pay for things that require a
credit card.
Don't rush ahead and get yourself rejected from all the payment options
before you've had time to see if there's a better approach.  I suggest
you wait before contacting any more payment processors.  You may get
ideas from things other users come up with and try.
Just some random incomplete ideas: There may be a way to position it as
an intermediate credit for micropayments for some virtual good or
something.  Or maybe if the payments are only in one direction.  If you
only buy bitcoins, then you're only sending money out not taking
people's money, that would still be useful to peg the currency.  That
might be payment for computer time.
Credit card is only one way.  Don't even talk about the idea of
returning money to customer's credit cards.  Credit card companies hate
that.
In any case, any payment processor is going to expect you to be selling
something real.
Do you have electronic transfer or paper cheque in your country? (even
if only within Europe)
Is there any way to find out what the missing shared libraries are?  It
would help to know.
It probably needs the gtk libraries, in which case you'll have the same
problem with the 64-bit version.  I would like to have a single
executable that can also run on a UI-less system, but I'm not sure how
on linux to link to things but still be able to run and not use them if
the library is not present.  Maybe we should statically link the GTK.
Licensewise, it's LGPL, but since it's only used on unix, that would be
OK.  (we can't link LGPL stuff on windows because we provide the OpenSSL
DLL, but on linux OpenSSL comes with the OS)
My 64-bit (debug stripped) executable is attached.  It includes untested
changes that are not in SVN yet: UI changes and the wallet fSpent flag
resync stuff.
I've been researching options for interprocess calling.  I want
something that will be easy for a variety of server side languages to
call, particularly PHP.  Cross-platform to windows is a plus.
I'm not sure if I want it to be something that can be accessed across
the network.  That would introduce security issues.  If it can only be
accessed on the local system, then local security authentication covers
it, and it is incapable of being hacked remotely.
At surface level, not looking into any details yet, the current front
runners are:
its a security question
Is it possible to open a socket that can only be accessed locally?
I must have accidentally typed j instead of z.  It's bz2 format.  Rename
to .tar.bz2 or just do tar -jxvf
What was the reason for this change?
wxFormBuilder turns the (c) symbol into UTF-8 automatically.  On
wxWidgets-2.8.9 ansi, it shows as a copyright symbol with an extra trash
character, which this hack fixes up for the non-unicode (ansi) case.
Good, then no need to consider d-bus.  Is there something like IPC
sockets on Windows?  I guess we could look how wx does it, or maybe the
XML-RPC library will already know what to do.  Windows has named pipes,
maybe that's the best analogue.
I don't think I want to invent my own RPC protocol, I want to use an
existing standard.  PHP, Java, Python or anything will be able to talk
to the server directly the same way the command line commands do.
I'm going to start reading on XML-RPC.  It's coming up in searches as
the most widely used protocol and widely supported.  PHP includes it in
its standard libraries.
I noticed this in the docs for wxSocketServer::Accept(bool wait = true):
"If wait is true and there are no pending connections to be accepted, it
will wait for the next incoming connection to arrive.  **Warning: This
will block the GUI."
wxWidgets is pathologically single-threaded.  Not only single-threaded,
but must-be-the-GUI-thread-ed.  Even for something as non-UI as
wxStandardPaths I got nailed.  All this is fine for UI code, since this
is the same constraint placed by Windows anyway, but for UI-less server
daemon code, wx calls are uncertain.
Status of my research currently:
For PHP, Python, etc to access the server, we need to use regular
sockets.  I think we can make it local-only by binding to localhost
only, so it can only be accessed through the loopback.  They say it's
also watertight to simply check the IP of connections received and
disconnect anything not 127.0.0.1.  May as well do both.
XML-RPC is a bit fat.  There are 4 libraries for C++ but they're all big
and hard to build, dependencies, license issues.  Some posters complain
all the C++ and PHP XML-RPC libraries are buggy.
JSON-RPC is a simpler more elegant standard.  It's simple enough I could
use a generic JSON parser.
PHP, Python and Java all have good implementations of JSON-RPC.
I'm currently leaning towards JSON-RPC.
Maybe the current difficulty of buying LR is already the limit of how
easy it can get in that direction.
Every conventional payment method has refutability as their way to cope
with their lack of passwords and crypto.  The system is wide open to
copying plaintext credit card numbers and account numbers, and they deal
with it by reversing the transaction after the fact.  The system works
for physical goods that have to be delivered somewhere, and services
which can't be resold.  It's a problem when it interfaces with precious
metals and currency conversion.
The first step of being easy in one direction, bitcoin-of established value, goes a long way.  Even those who don't use the
conversion still benefit from knowing that they could.  Trading bitcoin
becomes an easier way to trade the ability to claim LR, similar to how
paper money was once the right to claim gold.  Nobody has to ever
actually claim the LR to get the benefit of having the option that they
could if they wanted to.
A lot of times you just need a minuscule amount of online currency.  The
hassle of buying the other online currencies is too much for buying a
small amount.  The ease of getting a small amount of bitcoin may help
bootstrap an ecosystem of sellers of micropayment sized online goods
selling to that market.  If the sellers can get LR for bitcoins, they're
happy, and that may be subsidized at first by investors who want to buy
bc in large lots.
The main thing holding online currencies back is the lack of an easy way
to get a small amount of currency.  Bitcoin opens that up.  It'll be the
only online currency that's both easy to cash out and easy to get a
small amount.  It'll just be the usual harder difficulty to buy a large
amount.
Right, I'll change it to this so it doesn't get broken again:
The JSON-RPC implementation is going well.  I'm using boost::asio for
sockets.  JSON-RPC can be plain socket or HTTP, but it seems most other
implementations are HTTP, so I made my own simple HTTP headers.  For
JSON parsing I'm using JSON Spirit, which makes full use of STL and has
been really nice to use.  It's header-only so it's no added build work,
and small enough to just add it to our source tree.  MIT license.  This
should all be working in a few more days.
The forum sure is taking off.  I didn't expect to have so much activity
so fast.
Does Drupal have any special multi-language support, or do you just
create copies of pages by hand?
BlueSky offered to do translation on the forum.  If you create a
www.bitcoin.org/zh/ copy of the site and give him an account with just
the ability to create new pages and edit text, he'll probably translate
the site into Chinese for you and maybe maintain it.
I didn't make any changes to Drupal code.  The only thing other than
installing themes was the .htaccess file (which really is needed, it
didn't work in the global config file).
It was only SMF where I made some PHP changes.
You might find it preferable not to translate it into your own language.
Often the standard answer about legalities is that it's only intended
for people in other countries.  Translating it into your home language
weakens that argument.
I uploaded my JSON-RPC and command line implementation to SVN.  I'm
waiting to post on the forum when I've had more time to think about the
commands.  At least some method names are going to change.
To enable the RPC server, add the switch -server.  It's not on by default.
Client commands are without any switches, as such:
Applications would normally use JSON-RPC directly, not command line.
I haven't tested my JSON-RPC server with anything else yet.  If you do,
please tell me how it goes.  You're using Python, right?
Getting the Linux version to run without the GTK installed will be a
separate task.
I will probably relent and do that.  I can move init and shutdown into
init.cpp or start.cpp or something, link only wxbase and not link ui.o
and uibase.o.
wxWidgets is mostly Windows people, they wouldn't know much about GTK.
Don't you have an Ubuntu laptop you can test and compile on so you don't
have to toy with the vps?
Hurray, I got it on the first go.
Could you send me the Python code you used?  So if I do some testing
later I don't have to figure it out myself.
I see it calls gtk-init-check in wxApp::Initialize.
I can subclass Initialize, call the original one while suppressing the
error message and ignore the return value.  It seems to be working.
Any suggestions what to name the command line switches and how to
describe them?  Is there any traditional standard?  I'm currently using:
-daemon (or -d)   (Enables RPC and runs in the background)
-server           (Enables RPC)
This is working.  A few more things and I'll upload it.
We'll need to tell people to install the GTK libraries.  Do you remember
the apt-get command to install GTK, and can you install it without
having a GUI installed?
Good, that gives them a little sense of ownership and responsibility.
I hope we get at least one .mo file for the software translation in time
to put into the 0.3 release.
I put it at bitcoin.org/download/linux64-0.2.7.1.tar.gz.  You can delete
it when you've got it.
I thought about what might cause the problem you're having and made a
change that this build includes.  This might have been unsafe code,
although it would probably always get lucky.
If you still suspect this code, for testing you could change it to:
const char* wxGetTranslation(const char* pszEnglish)
Could you send me the debug.log?
Does it still do it if you didn't do getinfo?
You could comment out the CreateThreads listed below, then re-enable
them one at a time until it does it again.  Then we would know which
thread the problem is in.
That narrows it down a lot.  It didn't print any IRC activity in
debug.log, so I guess it couldn't have gotten past the RecvUntil.
Eyeballing it I don't see anything obvious.  I guess it would have to be
either in ConnectSocket or RecvUntil.
Try it with the attached irc.cpp and net.cpp and send me the debug.log.
Or you could run it in gdb and step through ThreadIRCSeed
or u to step over and up out of routines.
It's in RecvUntil, but I still can't see anything wrong with it.  The
only thing I can think of is if the socket is receiving a spew of
characters.
Try this irc.cpp.  debug.log may grow rapidly so be ready to kill it.
It's in util.c ParseString.  I'm guessing the problem is incompatibility
between the type "unsigned int" and the type of str.npos, which is
size_type.
Try changing the two "unsigned int"s to "size_type".
Actually, please try this instead, this is more correct:
Comparing unsigned int -1 (0xffffffff) with long unsigned int -1
(0xffffffffffffffff) results in the unsigned int being promoted to
64-bit, which is 0x00000000ffffffff != 0xffffffffffffffff.
There's a blog writer who wants to write a story about Bitcoin, but I
don't have time right now to answer his questions.  Would you be
interested in answering his questions if I refer him to you?  We might
get a good link out of it.
The blog is
I've also been busy with other things for the last month and a half.  I
just now downloaded my e-mail since the beginning of April.  I mostly
have things sorted and should be back to Bitcoin shortly.  Glad that
you've been handling things in my absence.  Congrats on your first
transaction!
As I recall, the code was nearly ready for a 0.3 release.  I think all
it needed was a little testing time and to install the new icon xpm.
The JSON API functions are complete.  I wanted to take another fresh
look at them in case I think of any better function names before
committing.  I ought to write some sample code showing the proper way to
use them, particularly with polling for received transactions.  When I
left off, I was thinking about bolting a payment mechanism onto a free
upload server software as an example.  It would make sense to actually
build one practical application with the API before releasing it.  You
don't realise the problems with an API until you actually try to use it.
If bandwidth is a problem, delete my link in the "0.3 almost ready"
thread.  I just don't want to upload it to sourceforge for a quickie
share for a day or two, possibly taking it down immediately if there's a
bug.  Sourceforge has a policy of not allowing removal of files once
they're added, and it's a pain to upload to.  I'll delete the file once
the release is ready.
BTW, it's looking like I may be able to get us some money soon to cover
web host costs, back your exchange service, etc, in the form of cash in
the mail.  Can you receive it and act as the project's treasurer?
I got a donation offer for $2000 USD.  I need to get your postal mailing
address to have him send to.  And yes, he wants to remain anonymous, so
please keep the envelope's origin private.
I think we should de-emphasize the anonymous angle.  With the popularity
of bitcoin addresses instead of sending by IP, we can't give the
impression it's automatically anonymous.  It's possible to be
pseudonymous, but you have to be careful.  If someone digs through the
transaction history and starts exposing information people thought was
anonymous, the backlash will be much worse if we haven't prepared
expectations by warning in advance that you have to take precautions if
you really want to make that work.  Like Tor says, "Tor does not
magically encrypt all of your Internet activities.  Understand what Tor
does and does not do for you."
Also, anonymous sounds a bit shady.  I think the people who want
anonymous will still figure it out without us trumpeting it.
I made some changes to the bitcoin.org homepage.  It's not really
crucial to update the translations.  I tend to keep editing and
correcting for some time afterwards, so if they want to update, they
should wait.
I removed the word "anonymous", and the sentence about "anonymity
means", although you worded it so carefully "...CAN be kept hidden..."
it was a shame to remove it.
Instead, I added Tor instructions at the bottom, with instructions for
how to stay anonymous (pseudonymous) directly after the Tor
instructions: "If you want to remain anonymous (pseudonymous, really),
be careful not to reveal any information linking your bitcoin addresses
to your identity, and use a new bitcoin address for each payment you
receive."
It helps that it can now seed automatically through Tor.
Even though it doesn't say anonymous until the bottom, I think anonymous
seekers would already suspect it based on all the other attributes like
no central authority to take your ID info and the way bitcoin addresses
look.
I uploaded 0.3.0 beta to sourceforge and updated the links on
bitcoin.org.  I still need to post the announcement message on the forum
and mailing list.  Here's what I've prepared:
Announcing version 0.3 of Bitcoin, the P2P cryptocurrency!  Bitcoin is a
digital currency using cryptography and a distributed network to replace
the need for a trusted central server.  Escape the arbitrary inflation
risk of centrally managed currencies!  Bitcoin's total circulation is
limited to 21 million coins.  The coins are gradually being released to
the networks nodes based on the CPU power they contribute.  You can get
a share of them just by installing the software and contributing your
idle CPU time.
Actually, "tabs for sent and received transactions" sounds really
immature if it doesn't have that already.  "Transaction filter tabs"
sounds better.
I'm still editing it a little more and then I'll e-mail it to
bitcoin-list and send it to the cryptography list.
"Get it at http://www.bitcoin.org or read the forum to find out more."
Announcing version 0.3 of Bitcoin, the P2P cryptocurrency!  Bitcoin is a
digital currency using cryptography and a distributed network to replace
the need for a trusted central server.  Escape the arbitrary inflation
risk of centrally managed currencies!  Bitcoin's total circulation is
limited to 21 million coins.  The coins are gradually released to the
network's nodes based on the CPU power they contribute, so you can get a
share of them by contributing your idle CPU time.
Probably not an issue anymore, but might be a good idea to delete or update
that wiki page.
Is it possible for the translators (at least the more trusted ones) to
have user accounts on drupal so they can update their translated text
directly?  The user accounts on drupal appear to be pretty weak.  I
created a satoshi account and it can't even edit the side bar stuff,
just the main text of pages.  I don't think user accounts can access any
of the admin stuff.  Do you think it's safe, or do you feel insecure
about doing that?  If you're worried, maybe there's a way to lock just
the english version of the homepage.
It would be nice if when I need to make changes to the homepage, I could
enlist someone like Xunie to do the rote work of reflecting it to all
the translations instead of having to do all that work myself.  (many
light changes don't require understanding the language to fix the
translated pages)
It’s recommended that you stop Bitcoin before backing it up to make sure
the backup will be correct."
You did some research when choosing hosting, this was a well chosen one,
right?  It seems like it would be a tremendous hassle to change, and
we've had good luck with this one.  Cheaper will usually have some
offsetting drawback in quality.
I wonder if that extra memory is just disk cache or something.
I take it you haven't received anything from that donor yet?  He seemed
pretty certain he was going to send it, maybe more.  (if you get
anything, we need to keep private for him the fact that we got a donation)
Please promise me you won't make a switch now.  The last thing we need
is switchover hassle on top of the slashdot flood of work we've got now.
I'm losing my mind there are so many things that need to be done.
Also, it would suck to be on a smaller, less reliable host just to save
a measly $20.
I will try to think of a polite way to ask the donor if he sent it, but
right now there are other higher priority things that are going to bump
even that for a few days.
Would a donation of bitcoins help in the short term?
That's great!  I'll let him know it was received and thank him.
It might be a long time before we get another donation like that, we
should save a lot of it.
Spend what you need on hosting.  Email me a simple accounting when you
take out money for expenses, like:
$100-200 is chump change if they're a serious company, it would only
make us sound small.
What they need most is confidence they can convert it to fiat currency.
That VOIP company essentially said so in a recent post.  The best
thing we can do is make sure there's cash available to cash out and
support and steady the conversion rate.
The money is leveraged better that way too.  Theoretically, imagine 10
businesses have their eye on a $100 bill being offered for bitcoins, but
don't actually cash out because they know it's there if they need it.
That one $100 bill allowed 10 different people to act like their 5000
bitcoins were equivalent to $100.
I think we should allocate $1000 at this point to your exchange.
Interesting, so how is the balance between purchases of coins and cash
going?
Btw, are you able to use my builds of bitcoind on your host, or do you
have to build it yourself?
They probably couldn't have gotten that large of a trade on
bitcoinmarket.com.
Wish I could figure out how to fix that.  What version of GLIBCXX does
your system have?
Make sure you upgrade to Bitcoin 0.3.3 as soon as possible.
I think our problem may be that we have forum notifications on, like
e-mail you when you receive a PM, but we don't have e-mail verification
of new accounts.  Can someone put someone else's e-mail address without
verifying it, then have stuff sent there?  We need to stop that right
away before it gets used for something bad.  Either disallow all
notification, or make sure e-mail addresses are verified.
I'm more inclined to disallow notifications or anything where the forum
sends you e-mail.  I kinda like not requiring e-mail verification.  But
if that's the only way to make sure we don't send e-mails to un-verified
addresses, then we could do that.
If we request to get off of PBL, we'd better make sure we've got the
problem secured first.
I changed Registration-Activation".  I assume that means it e-mail verifies.
"Member Activation
When this option is enabled any members registering to the forum will
have a activation link emailed to them which they must click before they
can become full members"
I think that's the only way to make sure the forum can't be used to send
to other people's e-mail addresses and potentially use it to spam.
Please upgrade to 0.3.6 ASAP to get an important bugfix.
Oh great, now we're screwed.
We probably got spam blocked because we were allowing registrations
without e-mail verification.  But now that we've enabled it, our
verification e-mails are blocked.
There could still be some existing user accounts created before the
registration requirement being used by spammers.
We're kind of in a jam here.  Can you make sure there's nothing else you
can think of that might be acting as an open e-mail gateway or way for
spammers to use our system for putting out spam?  Check the e-mail logs
and see if there's been a lot of traffic and what it's from.  If you can
figure out what the problem was and shut it down, then after you're sure
it's fixed, request PBL to take us off the block list.
If there's a way to prohibit the forum from sending e-mail
notifications, maybe we should do that.
For "normal members" I disabled "Request notification on replies" and
"Request notification on new topics".
I'm pretty sure there's a notification option for when you receive PMs,
but I don't see a way to disable it.  If we have to, I guess we could
edit the php code.
Here's the info about PBL again.
I think our problem may be that we have forum notifications on, like
e-mail you when you receive a PM, but we don't have e-mail verification
of new accounts.  Can someone put someone else's e-mail address without
verifying it, then have stuff sent there?  We need to stop that right
away before it gets used for something bad.  Either disallow all
notification, or make sure e-mail addresses are verified.
I'm more inclined to disallow notifications or anything where the forum
sends you e-mail.  I kinda like not requiring e-mail verification.  But
if that's the only way to make sure we don't send e-mails to un-verified
addresses, then we could do that.
If we request to get off of PBL, we'd better make sure we've got the
problem secured first.
I changed Registration-Activation".  I assume that means it e-mail verifies.
"Member Activation
When this option is enabled any members registering to the forum will
have a activation link emailed to them which they must click before they
can become full members"
I think that's the only way to make sure the forum can't be used to send
to other people's e-mail addresses and potentially use it to spam.
Are PM notifications still disabled?  (All we really need is disable the
forum's access to the mail server)
Right, forgot about that.
Hopefully theymos was right that the PBL is the source of the problem.
This is single-player computer game based on Windows Minesweeper version.
Would you be so kind to add us to the http://www.bitcoin.org/trade page?
Thank you.
I noticed my custom captcha stuff is gone.  I guess it got lost in an
upgrade?  What are we doing for captcha now?  If we only have default
captcha, we'd be getting flooded with spam accounts.  Do I need to
re-integrate the custom captcha stuff or do we have another solution now?
I reuploaded the changes.  For future reference, the files in Sources
with customisations are:
Let me know whenever you do an upgrade so I can make sure all my changes
survived.
Hopefully the 1.1.x line is mature and updates are infrequent.  We
shouldn't upgrade to 2.0.  I made a ton of customisations that wouldn't
be compatible, and I kind of prefer the look of 1.1 over 2.0 anyway.
The captcha url has mycode=4 added to it, and the register page has
extra hidden mycode=2 through 5 images so any automated thing wouldn't
know which one to pick.  Everything that uses captcha has to have that
mycode=4 thing added.  Something in sending personal messages also uses
captcha.
Bitcoin.org has been down for several hours.
Do you know what caused that outage?  Did it need to be rebooted, or was
it a DoS or something?  The IP was pingable during the outage.
Did you get back to davidonpda about his doing a mirror backup?  I think
that's a really good idea.  Do you do any backups, or the VPS do any for
you automatically?
It should be Gavin.  I trust him, he's responsible, professional, and
technically much more linux capable than me.
(I don't know Xunie, but he hasn't posted for months and he was a goofball)
Thanks, did you finish moving bitcoinexchange to another server?
Mind if I add you to the Project Developers list on the Contact page?
You wrote some code before so you should be there.  It would have to be
your real name for consistency.  If you want to have an e-mail address
listed, I'll make an image out of it so it doesn't attract spam.
Version 0.3.18 is now available.
Changes:
- Fixed a wallet.dat compatibility problem if you downgraded from 0.3.17
and then upgraded again
- IsStandard() check to only include known transaction types in blocks
- Jgarzik's optimisation to speed up the initial block download a little
The main addition in this release is the Accounts-based JSON-RPC
commands that Gavin's been working on (more details at
BTW, password hashes = passwords.  It's easy to break the hash of short
passwords people use on forums.
6 chars = 3 difficulty
7 chars = 410 difficulty
8 chars = 25418 difficulty
+1
Even with encryption, a trusted storage place is better.
You're the best person to do it.
EFF is really important.  We want to have a good relationship with them.
We're the type of project they like; they've helped the TOR project
and done a lot to protect P2P file sharing.
The paper was published in 2008.
Someone needs to correct Wikipedia; it incorrectly says the paper was
published in 2009.  The paper was released earlier than the software.
Martti should give you the Drupal admin password.
I was very interested to read your b-money page. I’m getting ready to release a paper that expands on your ideas into a complete working system. Adam Back (hashcash.org) noticed the similarities and pointed me to your site.I need to find out the year of publication of your b-money page for the citation in my paper. It’ll look like:
You can download a pre-release draft at
Feel free to forward it to anyone else you think would be interested. Title: Electronic Cash Without a Trusted Third Party
Thanks for letting me know about your paper. I’ll take a look at it and let you know if I have any comments or questions.
I wanted to let you know, I just released the full implementation of the paper I sent you a few months ago, Bitcoin v0.1. Details, download and screenshots are at www.bitcoin.orgI think it achieves nearly all the goals you set out to solve in your b-money paper.
The system is entirely decentralized, without any server or trusted parties. The network infrastructure can support a full range of escrow transactions and contracts, but for now the focus is on the basics of money and transactions.
There was a discussion of the design on the Cryptography mailing list. Hal Finney gave a good high-level overview:
Abstract.  A purely peer-to-peer version of electronic cash would allow online
payments to be sent directly from one party to another without going through a
financial institution.  Digital signatures provide part of the solution, but the main
benefits are lost if a trusted third party is still required to prevent double-spending.
We propose a solution to the double-spending problem using a peer-to-peer network.
The network timestamps transactions by hashing them into an ongoing chain of
hash-based proof-of-work, forming a record that cannot be changed without redoing
the proof-of-work.  The longest chain not only serves as proof of the sequence of
events witnessed, but proof that it came from the largest pool of CPU power.  As
long as a majority of CPU power is controlled by nodes that are not cooperating to
attack the network, they'll generate the longest chain and outpace attackers.  The
network itself requires minimal structure.  Messages are broadcast on a best effort
basis, and nodes can leave and rejoin the network at will, accepting the longest
proof-of-work chain as proof of what happened while they were gone.
Commerce on the Internet has come to rely almost exclusively on financial institutions serving as
trusted third parties to process electronic payments.  While the system works well enough for
most transactions, it still suffers from the inherent weaknesses of the trust based model.
Completely non-reversible transactions are not really possible, since financial institutions cannot
avoid mediating disputes.  The cost of mediation increases transaction costs, limiting the
minimum practical transaction size and cutting off the possibility for small casual transactions,
and there is a broader cost in the loss of ability to make non-reversible payments for nonreversible services.  With the possibility of reversal, the need for trust spreads.  Merchants must
be wary of their customers, hassling them for more information than they would otherwise need.
A certain percentage of fraud is accepted as unavoidable.  These costs and payment uncertainties
can be avoided in person by using physical currency, but no mechanism exists to make payments
over a communications channel without a trusted party.
What is needed is an electronic payment system based on cryptographic proof instead of trust,
allowing any two willing parties to transact directly with each other without the need for a trusted
third party.  Transactions that are computationally impractical to reverse would protect sellers
from fraud, and routine escrow mechanisms could easily be implemented to protect buyers.  In
this paper, we propose a solution to the double-spending problem using a peer-to-peer distributed
timestamp server to generate computational proof of the chronological order of transactions.  The
system is secure as long as honest nodes collectively control more CPU power than any
cooperating group of attacker nodes.
We define an electronic coin as a chain of digital signatures.  Each owner transfers the coin to the
next by digitally signing a hash of the previous transaction and the public key of the next owner
and adding these to the end of the coin.  A payee can verify the signatures to verify the chain of
ownership
The problem of course is the payee can't verify that one of the owners did not double-spend
the coin.  A common solution is to introduce a trusted central authority, or mint, that checks every
transaction for double spending.  After each transaction, the coin must be returned to the mint to
issue a new coin, and only coins issued directly from the mint are trusted not to be double-spent.
The problem with this solution is that the fate of the entire money system depends on the
company running the mint, with every transaction having to go through them, just like a bank.
We need a way for the payee to know that the previous owners did not sign any earlier
transactions.  For our purposes, the earliest transaction is the one that counts, so we don't care
about later attempts to double-spend.  The only way to confirm the absence of a transaction is to
be aware of all transactions.  In the mint based model, the mint was aware of all transactions and
decided which arrived first.  To accomplish this without a trusted party, transactions must be
publicly announced [1], and we need a system for participants to agree on a single history of the
order in which they were received.  The payee needs proof that at the time of each transaction, the
majority of nodes agreed it was the first received.
The solution we propose begins with a timestamp server.  A timestamp server works by taking a
hash of a block of items to be timestamped and widely publishing the hash, such as in a
newspaper or Usenet post [2-5].  The timestamp proves that the data must have existed at the
time, obviously, in order to get into the hash.  Each timestamp includes the previous timestamp in
its hash, forming a chain, with each additional timestamp reinforcing the ones before it.
To implement a distributed timestamp server on a peer-to-peer basis, we will need to use a proofof-work system similar to Adam Back's Hashcash [6], rather than newspaper or Usenet posts.
The proof-of-work involves scanning for a value that when hashed, such as with SHA-256, the
hash begins with a number of zero bits.  The average work required is exponential in the number
of zero bits required and can be verified by executing a single hash.
For our timestamp network, we implement the proof-of-work by incrementing a nonce in the
block until a value is found that gives the block's hash the required zero bits.  Once the CPU
effort has been expended to make it satisfy the proof-of-work, the block cannot be changed
without redoing the work.  As later blocks are chained after it, the work to change the block
would include redoing all the blocks after it The proof-of-work also solves the problem of determining representation in majority decision
making.  If the majority were based on one-IP-address-one-vote, it could be subverted by anyone
able to allocate many IPs.  Proof-of-work is essentially one-CPU-one-vote.  The majority
decision is represented by the longest chain, which has the greatest proof-of-work effort invested
in it.  If a majority of CPU power is controlled by honest nodes, the honest chain will grow the
fastest and outpace any competing chains.  To modify a past block, an attacker would have to
redo the proof-of-work of the block and all blocks after it and then catch up with and surpass the
work of the honest nodes.  We will show later that the probability of a slower attacker catching up
diminishes exponentially as subsequent blocks are added.
To compensate for increasing hardware speed and varying interest in running nodes over time,
the proof-of-work difficulty is determined by a moving average targeting an average number of
blocks per hour.  If they're generated too fast, the difficulty increases.
The steps to run the network are as follows:
1) New transactions are broadcast to all nodes.
2) Each node collects new transactions into a block.
3) Each node works on finding a difficult proof-of-work for its block.
4) When a node finds a proof-of-work, it broadcasts the block to all nodes.
5) Nodes accept the block only if all transactions in it are valid and not already spent.
6) Nodes express their acceptance of the block by working on creating the next block in the
chain, using the hash of the accepted block as the previous hash.
Nodes always consider the longest chain to be the correct one and will keep working on
extending it.  If two nodes broadcast different versions of the next block simultaneously, some
nodes may receive one or the other first.  In that case, they work on the first one they received,
but save the other branch in case it becomes longer.  The tie will be broken when the next proofof-work is found and one branch becomes longer; the nodes that were working on the other branch will then switch to the longer one.
New transaction broadcasts do not necessarily need to reach all nodes.  As long as they reach
many nodes, they will get into a block before long.  Block broadcasts are also tolerant of dropped
messages.  If a node does not receive a block, it will request it when it receives the next block and
realizes it missed one.
By convention, the first transaction in a block is a special transaction that starts a new coin owned
by the creator of the block.  This adds an incentive for nodes to support the network, and provides
a way to initially distribute coins into circulation, since there is no central authority to issue them.
The steady addition of a constant of amount of new coins is analogous to gold miners expending
resources to add gold to circulation.  In our case, it is CPU time and electricity that is expended.
The incentive can also be funded with transaction fees.  If the output value of a transaction is
less than its input value, the difference is a transaction fee that is added to the incentive value of
the block containing the transaction.  Once a predetermined number of coins have entered
circulation, the incentive can transition entirely to transaction fees and be completely inflation
free.
The incentive may help encourage nodes to stay honest.  If a greedy attacker is able to
assemble more CPU power than all the honest nodes, he would have to choose between using it
to defraud people by stealing back his payments, or using it to generate new coins.  He ought to
find it more profitable to play by the rules, such rules that favour him with more new coins than
everyone else combined, than to undermine the system and the validity of his own wealth.
Once the latest transaction in a coin is buried under enough blocks, the spent transactions before
it can be discarded to save disk space.  To facilitate this without breaking the block's hash,
transactions are hashed in a Merkle Tree [7][2][5], with only the root included in the block's hash.
Old blocks can then be compacted by stubbing off branches of the tree.  The interior hashes do
not need to be stored.  A block header with no transactions would be about 80 bytes.  If we suppose blocks are
generated every 10 minutes, 80 bytes * 6 * 24 * 365 = 4.2MB per year.  With computer systems
typically selling with 2GB of RAM as of 2008, and Moore's Law predicting current growth of
1.2GB per year, storage should not be a problem even if the block headers must be kept in
memory.
It is possible to verify payments without running a full network node.  A user only needs to keep
a copy of the block headers of the longest proof-of-work chain, which he can get by querying
network nodes until he's convinced he has the longest chain, and obtain the Merkle branch
linking the transaction to the block it's timestamped in.  He can't check the transaction for
himself, but by linking it to a place in the chain, he can see that a network node has accepted it,
and blocks added after it further confirm the network has accepted it.
As such, the verification is reliable as long as honest nodes control the network, but is more
vulnerable if the network is overpowered by an attacker.  While network nodes can verify
transactions for themselves, the simplified method can be fooled by an attacker's fabricated
transactions for as long as the attacker can continue to overpower the network.  One strategy to
protect against this would be to accept alerts from network nodes when they detect an invalid
block, prompting the user's software to download the full block and alerted transactions to
confirm the inconsistency.  Businesses that receive frequent payments will probably still want to
run their own nodes for more independent security and quicker verification.
Although it would be possible to handle coins individually, it would be unwieldy to make a
separate transaction for every cent in a transfer.  To allow value to be split and combined,
transactions contain multiple inputs and outputs.  Normally there will be either a single input
from a larger previous transaction or multiple inputs combining smaller amounts, and at most two
outputs: one for the payment, and one returning the change, if any, back to the sender.
It should be noted that fan-out, where a transaction depends on several transactions, and those
transactions depend on many more, is not a problem here.  There is never the need to extract a
complete standalone copy of a transaction's history.
The traditional banking model achieves a level of privacy by limiting access to information to the
parties involved and the trusted third party.  The necessity to announce all transactions publicly
precludes this method, but privacy can still be maintained by breaking the flow of information in
another place: by keeping public keys anonymous.  The public can see that someone is sending
an amount to someone else, but without information linking the transaction to anyone.  This is
similar to the level of information released by stock exchanges, where the time and size of
individual trades, the "tape", is made public, but without telling who the parties were.
As an additional firewall, a new key pair should be used for each transaction to keep them
from being linked to a common owner.  Some linking is still unavoidable with multi-input
transactions, which necessarily reveal that their inputs were owned by the same owner.  The risk
is that if the owner of a key is revealed, linking could reveal other transactions that belonged to
the same owner.
We consider the scenario of an attacker trying to generate an alternate chain faster than the honest
chain.  Even if this is accomplished, it does not throw the system open to arbitrary changes, such
as creating value out of thin air or taking money that never belonged to the attacker.  Nodes are
not going to accept an invalid transaction as payment, and honest nodes will never accept a block
containing them.  An attacker can only try to change one of his own transactions to take back
money he recently spent.
The race between the honest chain and an attacker chain can be characterized as a Binomial
Random Walk.  The success event is the honest chain being extended by one block, increasing its
lead by +1, and the failure event is the attacker's chain being extended by one block, reducing the
gap by -1.
The probability of an attacker catching up from a given deficit is analogous to a Gambler's
Ruin problem.  Suppose a gambler with unlimited credit starts at a deficit and plays potentially an
infinite number of trials to try to reach breakeven.  We can calculate the probability he ever
reaches breakeven, or that an attacker ever catches up with the honest chain, as follows [8]:
p = probability an honest node finds the next block
q = probability the attacker finds the next block
qz = probability the attacker will ever catch up from z blocks behind
Given our assumption that p > q, the probability drops exponentially as the number of blocks the
attacker has to catch up with increases.  With the odds against him, if he doesn't make a lucky
lunge forward early on, his chances become vanishingly small as he falls further behind.
We now consider how long the recipient of a new transaction needs to wait before being
sufficiently certain the sender can't change the transaction.  We assume the sender is an attacker
who wants to make the recipient believe he paid him for a while, then switch it to pay back to
himself after some time has passed.  The receiver will be alerted when that happens, but the
sender hopes it will be too late.
The receiver generates a new key pair and gives the public key to the sender shortly before
signing.  This prevents the sender from preparing a chain of blocks ahead of time by working on
it continuously until he is lucky enough to get far enough ahead, then executing the transaction at
that moment.  Once the transaction is sent, the dishonest sender starts working in secret on a
parallel chain containing an alternate version of his transaction.
The recipient waits until the transaction has been added to a block and z blocks have been
linked after it.  He doesn't know the exact amount of progress the attacker has made, but
assuming the honest blocks took the average expected time per block, the attacker's potential
progress will be a Poisson distribution with expected value:
To get the probability the attacker could still catch up now, we multiply the Poisson density for
each amount of progress he could have made by the probability he could catch up from that point:
Rearranging to avoid summing the infinite tail of the distribution...
Converting to C code...
Running some results, we can see the probability drop off exponentially with z.
Solving for P less than 0.1%...
12.  Conclusion
We have proposed a system for electronic transactions without relying on trust.  We started with
the usual framework of coins made from digital signatures, which provides strong control of
ownership, but is incomplete without a way to prevent double-spending.  To solve this, we
proposed a peer-to-peer network using proof-of-work to record a public history of transactions
that quickly becomes computationally impractical for an attacker to change if honest nodes
control a majority of CPU power.  The network is robust in its unstructured simplicity.  Nodes
work all at once with little coordination.  They do not need to be identified, since messages are
not routed to any particular place and only need to be delivered on a best effort basis.  Nodes can
leave and rejoin the network at will, accepting the proof-of-work chain as proof of what
happened while they were gone.  They vote with their CPU power, expressing their acceptance of
valid blocks by working on extending them and rejecting invalid blocks by refusing to work on
them.  Any needed rules and incentives can be enforced with this consensus mechanism.
I've developed a new open source P2P e-cash system called Bitcoin.  It's
completely decentralized, with no central server or trusted parties,
because everything is based on crypto proof instead of trust.  Give it a
try, or take a look at the screenshots and design paper:
Download Bitcoin v0.1 at http://www.bitcoin.org
The root problem with conventional currency is all the trust that's
required to make it work.  The central bank must be trusted not to
debase the currency, but the history of fiat currencies is full of
breaches of that trust.  Banks must be trusted to hold our money and
transfer it electronically, but they lend it out in waves of credit
bubbles with barely a fraction in reserve.  We have to trust them with
our privacy, trust them not to let identity thieves drain our accounts.
Their massive overhead costs make micropayments impossible.
A generation ago, multi-user time-sharing computer systems had a similar
problem.  Before strong encryption, users had to rely on password
protection to secure their files, placing trust in the system
administrator to keep their information private.  Privacy could always
be overridden by the admin based on his judgment call weighing the
principle of privacy against other concerns, or at the behest of his
superiors.  Then strong encryption became available to the masses, and
trust was no longer required.  Data could be secured in a way that was
physically impossible for others to access, no matter for what reason,
no matter how good the excuse, no matter what.
It's time we had the same thing for money.  With e-currency based on
cryptographic proof, without the need to trust a third party middleman,
money can be secure and transactions effortless.
One of the fundamental building blocks for such a system is digital
signatures.  A digital coin contains the public key of its owner.  To
transfer it, the owner signs the coin together with the public key of
the next owner.  Anyone can check the signatures to verify the chain of
ownership.  It works well to secure ownership, but leaves one big
problem unsolved: double-spending.  Any owner could try to re-spend an
already spent coin by signing it again to another owner.  The usual
solution is for a trusted company with a central database to check for
double-spending, but that just gets back to the trust model.  In its
central position, the company can override the users, and the fees
needed to support the company make micropayments impractical.
Bitcoin's solution is to use a peer-to-peer network to check for
double-spending.  In a nutshell, the network works like a distributed
timestamp server, stamping the first transaction to spend a coin.  It
takes advantage of the nature of information being easy to spread but
hard to stifle.  For details on how it works, see the design paper at
The result is a distributed system with no single point of failure.
Users hold the crypto keys to their own money and transact directly with
each other, with the help of the P2P network to check for double-spending.
Bitcoin 0.2 is here!
Download (Windows, and now Linux version available)
New Features
Satoshi Nakamoto
- Multi-processor support for coin generation
- Proxy support for use with TOR
- Fixed some slowdowns in the initial block download
We also have a new forum at
Many thanks to Martti (sirius-m) for all his development work, and to
New Liberty Standard for his help with testing the Linux version.
Announcing the release of Bitcoin, a new open source peer-to-peer
electronic cash system that's completely decentralized, with no central
server or trusted parties.  Users hold the crypto keys to their own
money and transact directly with each other, with the help of the P2P
network to check for double-spending.
Windows NT/2000/XP/Vista.  Open source C++ code is included.
Download: http://www.bitcoin.org
- Unpack the files into a directory
- Run BITCOIN.EXE
- It automatically connects to other nodes
If you can keep a node running that accepts incoming connections, you'll
really be helping the network a lot.  Port 8333 on your firewall needs
to be open to receive incoming connections.
You can get coins by getting someone to send you some, or turn on
Options->Generate Coins to run a node and generate blocks.  I made the
proof-of-work difficulty ridiculously easy to start with, so for a
little while in the beginning a typical PC will be able to generate
coins in just a few hours.  It'll get a lot harder when competition
makes the automatic adjustment drive up the difficulty.  Generated coins
must wait 120 blocks to mature before they can be spent.
There are two ways to send money.  If the recipient is online, you can
enter their IP address and it will connect, get a new public key and
send the transaction with comments.  If the recipient is not online, it
is possible to send to their Bitcoin address, which is a hash of their
public key that they give you.  They'll receive the transaction the next
time they connect and get the block it's in.  This method has the
disadvantage that no comment information is sent, and a bit of privacy
may be lost if the address is used multiple times, but it is a useful
alternative if both users can't be online at the same time or the
recipient can't receive incoming connections.
Total circulation will be 21,000,000 coins.  It'll be distributed to
network nodes when they make blocks, with the amount cut in half every 4
years.
first 4 years: 10,500,000 coins
next 4 years: 5,250,000 coins
next 4 years: 2,625,000 coins
next 4 years: 1,312,500 coins
etc...
When that runs out, the system can support transaction fees if needed.
It's based on open market competition, and there will probably always be
nodes willing to process transactions for free.
Announcing version 0.3 of Bitcoin, the P2P cryptocurrency!  Bitcoin is a
digital currency using cryptography and a distributed network to replace
the need for a trusted central server.  Escape the arbitrary inflation
risk of centrally managed currencies!  Bitcoin's total circulation is
limited to 21 million coins.  The coins are gradually released to the
network's nodes based on the CPU power they contribute, so you can get a
share of them by contributing your idle CPU time.
What's new:
- Command line and JSON-RPC control
- Includes a daemon version without GUI
- Transaction filter tabs
- 20% faster hashing
- Hashmeter performance display
- Mac OS X version (thanks to Laszlo)
- German, Dutch and Italian translations (thanks to DataWraith, Xunie
and Joozero)
Get it at www.bitcoin.org, and read the forum to find out more.
This is a minor release to add some DoS protection.
Changes:
- Added some DoS limits, though it's still far from DoS resistant.
- Removed "safe mode" alerts.
It's similar in that it uses digital signatures for coins, but different
in the approach to privacy and preventing double-spending.  The
recipient of a Bitcoin payment is able to check whether it is the first
spend or not, and second-spends are not accepted.  There isn't an
off-line mode where double-spenders are caught and shamed after the
fact, because that would require participants to have identities.
To protect privacy, key pairs are used only once, with a new one for
every transaction.  The owner of a coin is just whoever has its private key.
Of course, the biggest difference is the lack of a central server.  That
was the Achilles heel of Chaumian systems; when the central company shut
down, so did the currency.
There is a limited supply of money.  Circulation will be 21,000,000
coins.  Transactions only transfer ownership.
Thank you for your questions,
That's do-able.  It can be programmed to follow any set of rules.
I see Bitcoin as a foundation and first step if you want to implement
programmable P2P social currencies like Marc's ideas and others
discussed here.  First you need normal, basic P2P currency working.
Once that is established and proven out, dynamic smart money is an easy
next step.
I love the idea of virtual, non-geographic communities experimenting
with new economic paradigms.
Indeed, it is much like Pekunio in the concept of spraying redundant
copies of every transaction to a number of peers on the network, but the
implementation is not a reputation network like Wizard Rabbit Treasurer.
In fact, Bitcoin does not use reputation at all.  It sees the network
as just a big crowd and doesn't much care who it talks to or who tells
it something, as long as at least one of them relays the information
being broadcast around the network.  It doesn't care because there's no
way to lie to it.  Either you tell it crypto proof of something, or it
ignores you.
As trust systems go, Ripple is unique in spreading trust around rather
than concentrating it.
It would be best to refer to the C++ source code.  I plan to implement
interfaces for using the software to send and receive transactions from
any language, so server side code can easily use it for web based
e-commerce sites.
It's fully operational and the network is growing.  If you try the
software, e-mail me your Bitcoin address and I'll send you a few coins.
We just need to spread the word and keep getting more people interested.
I'll forward the release introduction in the next message.
I have been following the recent development about the block size limit. The initial purpose of block size limit is to limit the bandwidth so that it is easy for people to record the blockchain on their computer rather than on some cloud-based center authorities. In this way, the DOS attack with an enormous fake block can also be prevented. At that time, 1M is a good number to keep the network going and,Â therefore, the experiment.
As Bitcoin grows, the number should grow too. I believe a number suitable for mid-term, perhaps, is around 200M, which is sufficient for a transaction rate much higher than the sum of any current center authority banks.
However, that would cause insane traffic for most people. The Lightning thing is also not a perfect solution, as it made a second level architect, it need more trust and may encourage center authority and Paypal-like companies.
The blockchain is designed so that the whole blockchain is not needed to verify itself. People only need one hash to make sure that the entire blockchain is genuine. So the limit can be removed. Any hard limits thatÂ prevent people fromÂ using Bitcoin as frequently as they want toÂ should not exist. To solve the traffic problem, nodes can exchange theÂ hash stream only and verify it against information provided by full nodes;Â the security of the whole blockchain, scalability, and speed can both be achieved. This can be a temporary solution. Network speed and storage space should be able to increase in the future so that big block is possible for all the clients(even for mobile clients) in time.
In this way, the proof-of-work should always be carefully verified before itÂ startsÂ the receiving process to prevent a DOS attack against the network. Moreover, theÂ router's IP should also be checked to avoid a single user broadcastingÂ an insane number of transactionsÂ (fees may apply in this situation).
I believe thatÂ Bitcoin is not only an experiment anymore. It is a newborn currency. Removing the limit will remove its final barrier. But still, decades are needed. The community needs to be united to bring it along, even though I can't be there anymore.
I have been following the recent block size debates through the mailing list.  I had hoped the debate would resolve and that a fork proposal would achieve widespread consensus.  However with the formal release of Bitcoin XT 0.11A, this looks unlikely to happen, and so I am forced to share my concerns about this very dangerous fork.
The developers of this pretender-Bitcoin claim to be following my original vision, but nothing could be further from the truth.  When I designed Bitcoin, I designed it in such a way as to make future modifications to the consensus rules difficult without near unanimous agreement.  Bitcoin was designed to be protected from the influence of charismatic leaders, even if their name is Gavin Andresen, Barack Obama, or Satoshi Nakamoto.  Nearly everyone has to agree on a change, and they have to do it without being forced or pressured into it.  By doing a fork in this way, these developers are violating the "original vision" they claim to honour.
They use my old writings to make claims about what Bitcoin was supposed to be.  However I acknowledge that a lot has changed since that time, and new knowledge has been gained that contradicts some of my early opinions.  For example I didn't anticipate pooled mining and its effects on the security of the network.  Making Bitcoin a competitive monetary system while also preserving its security properties is not a trivial problem, and we should take more time to come up with a robust solution.  I suspect we need a better incentive for users to run nodes instead of relying solely on altruism.
If two developers can fork Bitcoin and succeed in redefining what "Bitcoin" is, in the face of widespread technical criticism and through the use of populist tactics, then I will have no choice but to declare Bitcoin a failed project.  Bitcoin was meant to be both technically and socially robust.  This present situation has been very disappointing to watch unfold.
Version 0.1.5 is now available.  It includes the fix for the problem
Nicholas had, checking for disk full and changes to try to improve
things that were confusing.
Special thanks to Nicholas and Dustin for all their help and feedback!
Another factor that would mitigate spam if POW tokens have value:
there would be a profit motive for people to set up massive
quantities of fake e-mail accounts to harvest POW tokens from
spam.  They'd essentially be reverse-spamming the spammers with
automated mailboxes that collect their POW and don't read the
message.  The ratio of fake mailboxes to real people could become
too high for spam to be cost effective.
The process has the potential to establish the POW token's value
in the first place, since spammers that don't have a botnet could
buy tokens from harvesters.  While the buying back would
temporarily let more spam through, it would only hasten the
self-defeating cycle leading to too many harvesters exploiting the
spammers.
Interestingly, one of the e-gold systems already has a form of
spam called "dusting".  Spammers send a tiny amount of gold dust
in order to put a spam message in the transaction's comment field.
If the system let users configure the minimum payment they're
willing to receive, or at least the minimum that can have a
message with it, users could set how much they're willing to get
paid to receive spam.
I would be surprised if 10 years from now we're not using
electronic currency in some way, now that we know a way to do it
that won't inevitably get dumbed down when the trusted third party
gets cold feet.
It could get started in a narrow niche like reward points,
donation tokens, currency for a game or micropayments for adult
sites.  Initially it can be used in proof-of-work applications
for services that could almost be free but not quite.
It can already be used for pay-to-send e-mail.  The send dialog is
resizeable and you can enter as long of a message as you like.
It's sent directly when it connects.  The recipient doubleclicks
on the transaction to see the full message.  If someone famous is
getting more e-mail than they can read, but would still like to
have a way for fans to contact them, they could set up Bitcoin and
give out the IP address on their website.  "Send X bitcoins to my
priority hotline at this IP and I'll read the message personally."
Subscription sites that need some extra proof-of-work for their
free trial so it doesn't cannibalize subscriptions could charge
bitcoins for the trial.
It might make sense just to get some in case it catches on.  If
enough people think the same way, that becomes a self fulfilling
prophecy.  Once it gets bootstrapped, there are so many
applications if you could effortlessly pay a few cents to a
website as easily as dropping coins in a vending machine.
Announcing the first release of Bitcoin, a new electronic cash
system that uses a peer-to-peer network to prevent double-spending.
It's completely decentralized with no server or central authority.
Windows only for now.  Open source C++ code is included.
- Unpack the files into a directory
- Run BITCOIN.EXE
- It automatically connects to other nodes
If you can keep a node running that accepts incoming connections,
you'll really be helping the network a lot.  Port 8333 on your
firewall needs to be open to receive incoming connections.
The software is still alpha and experimental.  There's no guarantee
the system's state won't have to be restarted at some point if it
becomes necessary, although I've done everything I can to build in
extensibility and versioning.
You can get coins by getting someone to send you some, or turn on
Options->Generate Coins to run a node and generate blocks.  I made
the proof-of-work difficulty ridiculously easy to start with, so
for a little while in the beginning a typical PC will be able to
generate coins in just a few hours.  It'll get a lot harder when
competition makes the automatic adjustment drive up the difficulty.
Generated coins must wait 120 blocks to mature before they can be
spent.
There are two ways to send money.  If the recipient is online, you
can enter their IP address and it will connect, get a new public
key and send the transaction with comments.  If the recipient is
not online, it is possible to send to their Bitcoin address, which
is a hash of their public key that they give you.  They'll receive
the transaction the next time they connect and get the block it's
in.  This method has the disadvantage that no comment information
is sent, and a bit of privacy may be lost if the address is used
multiple times, but it is a useful alternative if both users can't
be online at the same time or the recipient can't receive incoming
connections.
Total circulation will be 21,000,000 coins.  It'll be distributed
to network nodes when they make blocks, with the amount cut in half
every 4 years.
first 4 years: 10,500,000 coins
next 4 years: 5,250,000 coins
next 4 years: 2,625,000 coins
next 4 years: 1,312,500 coins
etc...
When that runs out, the system can support transaction fees if
needed.  It's based on open market competition, and there will
probably always be nodes willing to process transactions for free.
I mean a node only needs the pending-tx pool for the best branch it
has.  The branch that it currently thinks is the best branch.
That's the branch it'll be trying to make a block out of, which is
all it needs the pool for.
I think I've got the peer networking broadcast mechanism covered.
Each node sends its neighbours an inventory list of hashes of the
new blocks and transactions it has.  The neighbours request the
items they don't have yet.  If the item never comes through after a
timeout, they request it from another neighbour that had it.  Since
all or most of the neighbours should eventually have each item,
even if the coms get fumbled up with one, they can get it from any
of the others, trying one at a time.
The inventory-request-data scheme introduces a little latency, but
it ultimately helps speed more by keeping extra data blocks off the
transmit queues and conserving bandwidth.
I believe I've worked through all those little details over the
last year and a half while coding it, and there were a lot of them.
The functional details are not covered in the paper, but the
sourcecode is coming soon.  I sent you the main files.
(available by request at the moment, full release soon)
Right, it's ECC digital signatures.  A new key pair is used for every
transaction.
It's not pseudonymous in the sense of nyms identifying people, but it
is at least a little pseudonymous in that the next action on a coin
can be identified as being from the owner of that coin.
There is no reliance on identifying anyone.  As you've said, it's
futile and can be trivially defeated with sock puppets.
The credential that establishes someone as real is the ability to
supply CPU power.
Section 11 calculates the worst case under attack.  Typically, 5 or
10 blocks is enough for that.  If you're selling something that
doesn't merit a network-scale attack to steal it, in practice you
could cut it closer.
This is a version 2 problem that I believe can be solved fairly
satisfactorily for most applications.
The race is to spread your transaction on the network first.  Think 6
degrees of freedom -- it spreads exponentially.  It would only take
something like 2 minutes for a transaction to spread widely enough
that a competitor starting late would have little chance of grabbing
very many nodes before the first one is overtaking the whole network.
During those 2 minutes, the merchant's nodes can be watching for a
double-spent transaction.  The double-spender would not be able to
blast his alternate transaction out to the world without the merchant
getting it, so he has to wait before starting.
If the real transaction reaches 90% and the double-spent tx reaches
10%, the double-spender only gets a 10% chance of not paying, and 90%
chance his money gets spent.  For almost any type of goods, that's
not going to be worth it for the scammer.
Information based goods like access to website or downloads are
non-fencible.  Nobody is going to be able to make a living off
stealing access to websites or downloads.  They can go to the file
sharing networks to steal that.  Most instant-access products aren't
going to have a huge incentive to steal.
If a merchant actually has a problem with theft, they can make the
customer wait 2 minutes, or wait for something in e-mail, which many
already do.  If they really want to optimize, and it's a large
download, they could cancel the download in the middle if the
transaction comes back double-spent.  If it's website access,
typically it wouldn't be a big deal to let the customer have access
for 5 minutes and then cut off access if it's rejected.  Many such
sites have a free trial anyway.
I'll try and hurry up and release the sourcecode as soon as possible to serve as a reference to help clear up all these implementation questions.
Only the buyer signs, and there's no blinding.
Identities are not used, and there's no reliance on recourse.  It's all prevention.
No challenges or secret shares.  A basic transaction is just what you see in the figure in section 2.  A signature (of the buyer) satisfying the public key of the previous transaction, and a new public key (of the seller) that must be satisfied to spend it the next time.
Right, if it's equal in length, ties are broken by keeping the earliest one received.
There's no need for reporting of "proof of double spending" like that.  If the same chain contains both spends, then the block is invalid and rejected.
Same if a block didn't have enough proof-of-work.  That block is invalid and rejected.  There's no need to circulate a report about it.  Every node could see that and reject it before relaying it.
If there are two competing chains, each containing a different version of the same transaction, with one trying to give money to one person and the other trying to give the same money to someone else, resolving which of the spends is valid is what the whole proof-of-work chain is about.
We're not "on the lookout" for double spends to sound the alarm and catch the cheater.  We merely adjudicate which one of the spends is valid.  Receivers of transactions must wait a few blocks to make sure that resolution has had time to complete.  Would be cheaters can try and simultaneously double-spend all they want, and all they accomplish is that within a few blocks, one of the spends becomes valid and the others become invalid.  Any later double-spends are immediately rejected once there's already a spend in the main chain.
Even if an earlier spend wasn't in the chain yet, if it was already in all the nodes' pools, then the second spend would be turned away by all those nodes that already have the first spend.
Right.  They also refresh whenever a new transaction comes in, so L pretty much contains everything in A all the time.
It's a Hashcash style SHA-256 proof-of-work (partial pre-image of zero), not a signature.
If you're thinking of it as a CPU-intensive digital signing, then you may be thinking of a race to finish a long operation first and the fastest always winning.
The proof-of-work is a Hashcash style SHA-256 collision finding.  It's a memoryless process where you do millions of hashes a second, with a small chance of finding one each time.  The 3 or 4 fastest nodes' dominance would only be proportional to their share of the total CPU power.  Anyone's chance of finding a solution at any time is proportional to their CPU power.
There will be transaction fees, so nodes will have an incentive to receive and include all the transactions they can.  Nodes will eventually be compensated by transaction fees alone when the total coins created hits the pre-determined ceiling.
Right.
Every transaction is one of these.  Section 9, Combining and Splitting Value.
Bitcoin v0.1 Alpha Release
Announcing the first release of Bitcoin, a new electronic cash system that uses a peer-to-peer network to prevent double-spending. It's completely decentralized with no server or trusted parties.
It's currently Windows only for now. Open source C++ code is included.
Download link: bitcoin-0.1.3.rar
- Unpack the files into a directory
- Run BITCOIN.EXE
- It automatically connects to other nodes
If you can keep a node running that accepts incoming connections, you'll really be helping the network a lot. Port 8333 on your firewall needs to be open to receive incoming connections.
The software is still alpha and experimental. There's no guarantee the system's state won't have to be restarted at some point if it becomes necessary, although I've done everything I can to build in extensibility and versioning.
You can get coins by getting someone to send you some, or turn on Options->Generate Coins to run a node and generate blocks. I made the proof-of-work difficulty ridiculously easy to start with, so for a little while in the beginning a typical PC will be able to generate coins in just a few hours. It'll get a lot harder when competition makes the automatic adjustment drive up the difficulty. Generated coins must wait 120 blocks to mature before they can be spent.
There are two ways to send money. If the recipient is online, you can enter their IP address and it will connect, get a new public key and send the transaction with comments. If the recipient is not online, it is possible to send to their Bitcoin address, which is a hash of their public key that they give you. They'll receive the transaction the next time they connect and get the block it's in. This method has the disadvantage that no comment information is sent, and a bit of privacy may be lost if the address is used multiple times, but it is a useful alternative if both users can't be online at the same time or the recipient can't receive incoming connections.
Total circulation will be 21,000,000 coins. It'll be distributed to network nodes when they make blocks, with the amount cut in half every 4 years.
first 4 years: 10,500,000 coins
next 4 years: 5,250,000 coins
next 4 years: 2,625,000 coins
next 4 years: 1,312,500 coins
When that runs out, the system can support transaction fees if needed. It's based on open market competition, and there will probably always be nodes willing to process transactions for free.
Bitcoin is a new design for a fully peer-to-peer electronic cash system. A C++ implementation is under development for release as an open source project.
Main properties:
- Double-spending is prevented with a peer-to-peer network.
- No mint or other trusted parties.
- Participants can be anonymous.
The network works in parallel to generate a chain of Hashcash style proof-of-work. The proof-of-work chain is the key to solving the Byzantine Generals' Problem of synchronising the global view and generating computational proof of the majority consensus without having to trust anyone.
Here's my client-mode implementation so far.  Client-only mode only
records block headers and doesn't use the tx index.  It can't generate, but
it can still send and receive transactions.  It's not fully finished for
use by end-users, but it doesn't matter because it's a complete no-op if
fClient is not enabled.  At this point it's mainly documentation showing
the cut-lines for client-only re-implementers.
With fClient=true, I've only tested the header-only initial download.
A little background.  CBlockIndex contains all the information of the block
header, so to operate with headers only, I just maintain the CBlockIndex
structure as usual.  The nFile/nBlockPos are null, since the full block is
not recorded on disk.
The code to gracefully switch between client-mode on/off without deleting
blk*.dat in between is not implemented yet.  It would mostly be a matter of
having non-client LoadBlockIndex ignore block index entries with null block
pos.  That would make it re-download those as full blocks.  Switching back
to client-mode is no problem, it doesn't mind if the full blocks are there.
If the initial block download becomes too long, we'll want client mode as
an option so new users can get running quickly.  With graceful switch-off
of client mode, they can later turn off client mode and have it download
the full blocks if they want to start generating.  They should rather just
use a getwork miner to join a pool instead.
Client-only re-implementations would not need to implement EvalScript at
all, or at most just implement the five ops used by the standard
transaction templates.