* UnicodeEncodeError on non-ASCII MySQLdb connect params.

* Bugs affecting bytea hashin?
      File "Abe/DataStore.py", line 1539, in import_block
        tx['tx_id'] = store.import_tx(tx, pos == 0)
      File "Abe/DataStore.py", line 1875, in import_tx
        store.intin(tx['lockTime']), len(tx['tx'])))
      File "Abe/DataStore.py", line 418, in sql
        store.cursor.execute(cached, params)
    IntegrityError: duplicate key value violates unique constraint "tx_tx_hash_key"

    Failed to catch up {'blkfile_number': 1, 'dirname': '/home/bitcoin/.bitcoin', 'c
    hain_id': None, 'id': Decimal('1'), 'blkfile_offset': 434255480}
    Traceback (most recent call last):
      File "Abe/DataStore.py", line 2220, in catch_up
        try:
      File "Abe/DataStore.py", line 2243, in catch_up_dir
        while (True):
      File "Abe/DataStore.py", line 2359, in import_blkdat
        chain_ids = frozenset([] if chain_id is None else [chain_id])
      File "Abe/DataStore.py", line 1655, in import_block
        (block_id, txin_id, oblock_id))
      File "Abe/DataStore.py", line 418, in sql
        store.cursor.execute(cached, params)
    TransactionRollbackError: deadlock detected
    DETAIL:  Process 8102 waits for ShareLock on transaction 3744470; blocked by pro
    cess 20041.
    Process 20041 waits for ShareLock on transaction 3744468; blocked by process 8102.
    HINT:  See server log for query details.
    CONTEXT:  SQL statement "SELECT 1 FROM ONLY "public"."block" x WHERE "block_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"

* Compress standard txout scripts by representing them as a pubkey_id
  and script type.  Multi-signature outputs require thought; leave
  pubkey_id null and retain the script for starters.

* Support new script types.  Fix the firstbits table on upgrade.
  Recent non-zero outputs showing as Unknown:
  tx_hash=b728387a3cf1dfcff1eef13706816327907f79f9366a7098ee48fc0c00ad2726,
  Bitcoin 140921, 64:f816...d335 CHECKSIG.
  tx_hash=9740e7d646f5278603c04706a366716e5e87212c57395e0d24761c0ae784b2c6,
  Bitcoin 141460, 76:4c55...652e CHECKSIG.  Various in Bitcoin 150951:
  DUP HASH160 0: EQUALVERIFY CHECKSIG.
  tx_hash=9969603dca74d14d29d1d5f56b94c7872551607f8c2d6837ab9715c60721b50e,
  Bitcoin 154012, 8:04678afd04678afd DROP SHA256 32:894e...e95c EQUAL,
  redeemed with 7:04678afd0467.
  tx_hash=0e842d4d66bc1c30a88f17eefa1e3436c6524aca39e9ad358edf380daf7a49ab,
  Bitcoin 163368, 33:024d...d5f7 CHECKSIG, 32-byte pubkey, redeemed
  with 73:3046...8d01.
  tx_hash=b8fd633e7713a43d5ac87266adc78444669b987a56b3a65fb92d58c2c4b0e84d,
  Bitcoin 163685, raw 142a9bc5447d664c1d0141392a842d23dba45c4f13b175.
  tx_hash=60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1,
  Bitcoin 164467, 1 65:04cc...8ac4 65:0461...42af 2 CHECKMULTISIG,
  multisig script, redeemed with 0: 71:3044...2b01.
  tx_hash=f003f0c1193019db2497a675fd05d9f2edddf9b67c59e677c48d3dbd4ed5f00b,
  Bitcoin 165116, raw
  76a91407e761706c63b36e5a328fab1d94e9397f40704d88b0.
  tx_hash=fa735229f650a8a12bcf2f14cca5a8593513f0aabc52f8687ee148c9f9ab6665,
  Bitcoin 166533, IFDUP IF 2SWAP VERIFY 2OVER DEPTH.
  tx_hash=b38bb421d9a54c58ea331c4b4823dd498f1e42e25ac96d3db643308fcc70503e,
  Bitcoin 168910, DUP DUP DUP.
  tx_hash=9c08a4d78931342b37fd5f72900fb9983087e6f46c4a097d8a1f52c74e28eaf6,
  Bitcoin 170052, HASH160 20:19a7...960e EQUAL, pay-to-script-hash,
  redeemed with 37:5121...51ae.
  tx_hash=c0b69d1e5ed13732dbd704604f7c08bc96549cc556c464aa42cc7525b3897987,
  Bitcoin 170766, 3 DROP DROP 1, redeemed with 1.
  tx_hash=aea682d68a3ea5e3583e088dcbd699a5d44d4b083f02ad0aaf2598fe1fa4dfd4,
  Bitcoin 170877, MIN 3 EQUAL, redeemed with 1:03 1:03.
  Cf. http://blockchain.info/strange-transactions

* Highlight any objects that are not in a main chain as such.  In
  particular, don't imply that an output was "redeemed" when the
  redeeming transaction is not in the chain.

* Write a test suite.  Include reorgs and upgrades.

* Search by firstbits.

* Show firstbits on address history page.

* Consider adjusting statistics for duplicate coinbase transactions.

* Avoid duplicate in/out points on block pages by using DISTINCT or
  equivalent.  This affects blocks common to more than one chain.

* Consider fixing: /block/HASH returns "Block not found" for block not
  in any chain.

* Defunct abe.fcgi processes not letting abe.py exit.  Unseen in a while.

* Bitcoin 140176 failed to catch up: str(exception) == "1".  Should
  probably limit the kinds of exceptions that catch_up converts to
  warnings.

* Test for a portable "begin transaction" and use it.

* Consider retesting SQL flavour every time on startup.

* Add search by date/time within chain.

* Show auxiliary proof-of-work data.

* Consider porting to libbitcoin.

* Use explicit constraint names.

* Speed up initial load by disabling unneeded constraints temporarily.

* Consider showing amount of time ago along with or instead of
  absolute times.

* Perhaps rewrite adopt_orphans iteratively to avoid Python's
  recursion limit.

* Separate HTML from data access.

* Consider denormalization for performance: prevout_hash in txin,
  pubkey_hash in txout, etc.

* Support PostgreSQL BYTEA and similar binary types for improved space
  use and memory footprint.

* Factor the coin-days destroyed feature as an optional add-on.

* Slight variation in CoinDD et al. among sites indicates a bug.
  Possibly fixed and due to corrupt data.

* Clean up and document limits on search result size.

* Admin interface to reset blkfile_offset, delete chains, etc.

* Add a tool to upload transactions if bitcoind supports it.

* Perhaps write a validation module to check db data.  Begun as verify.py.

* Abstract SQL into the DataStore class.

* Report block size, raw blocks, average transactions per block, fees
  per block, ...

* Report the Merkle branch of a particular transaction to support SPV.

* Test as multithreaded or forking server.

* Perhaps support searching by hash/address non-initial substring.

* /q functions:
                      latesthash          hextarget
  decimaltarget       probability         hashestowin
  nextretarget        estimate
  avgtxsize           avgtxvalue          avgblocksize
  interval            eta                 avgtxnumber
  addressbalance      addressfirstseen    mytransactions
  reorglog

* BTC-specific /q functions:
  bcperblock          changeparams
  totalbc(future block numbers)

* Perhaps create a BlockExplorer.com compatibility mode.

* Perhaps show nethash interval statistics on the chain summary page.

* Perhaps create an "SQL script" DataStore subclass that outputs flat
  SQL INSERTs.

* Context-sensitive help as on http://blockexplorer.com.

* Simplify the process of adding new chains.

* Present Namecoin name operations as an optional add-on.

* Extract info from MultiCoin config files.

* Import transactions from the pool.

* Perhaps add coin tracking features: allow the administrator to
  specify "interesting" (e.g., suspected fraudulent) transactions and
  addresses, then add a hyperlink from objects linked to them.

* Perhaps track and report coin difficulty as proposed by casascius:
  http://forum.bitcoin.org/index.php?topic=10755.0

* Perhaps track and report collectible transaction bytes: size of
  transactions whose outputs are all spent, minus Merkle shrubbery
  needed to verify the rest.

* Perhaps support email notification about address activity.
