May 132013
 

I haven’t been updating the blog lately because I have been fervently involved in building a Bitcoin machine that can buy, sell, and integrate third party bitcoin businesses right from a standing kiosk. My brother and I will be showcasing the machine at the Bitcoin 2013 conference for everyone to use. More information about the product can be found at our website here. I hope to begin updating frequently once again! Stay tuned!

Robocoin

Jan 252013
 

Visualize and analyze the Bitcoin block chain with the most advanced publicly available web-based analysis tool to date. By provably combining related bitcoin addresses into owners and constructing a visualized payment network of these owners, the Block Viewer provides new and more useful information for those looking for a better way to track payments and people.

Block Viewer

The side bar provides additional information about the owner, including links to time-division snapshots of the owner network. Click on a date and follow transaction chains through the day. This feature is still experimental but can be an extremely powerful way to quickly cut through payment obfuscation techniques.

The Block Viewer is about 1.5 weeks behind at the moment (the time division graphs are almost a month behind), but the server has been re-enabled and is updating the graphs right now. Submit addresses you know to have an identity with the “Identify” link in the menu bar and make the tool more useful by labeling owners! (Right now it scrapes Bitcoin-OTC and BitcoinTalk forum signatures to initially seed the labels).

Catch me on the forums for questions and concerns. Check out the source on Github. Enjoy!

Dec 182012
 

After the drama surrounding Instagram’s new Terms of Usage, all of us at Cloudsnap thought it would be pretty cool to give people a choice in where they store their photos. As a result, we created a tool that migrated their accounts from Instagram to Flickr! After a good day of crunching, we posted our application up on Hacker News where it held the #1 spot for several hours. Building the application was pretty straightforward, though some idiosyncrasies with the Flickr API made it a bit more frustrating then it had to be – particularly their image upload endpoint. The API was XML, OAuth 1, and the image upload required a multi-part post – a deadly combination. Their API claims to have a full REST implementation, though GET and POST requests can be used interchangeably on almost all of their endpoints which was weird.

After about 14 hours of our service going online, we have already helped over 1,000 users move over 300,000 photos to Flickr. We used Iron.Io to help us scale each user migration process, which so far has handled the move beautifully. The only issue with them as it stands is that we had to compile our project at home using the same infrastructure they use as they merely execute and not attempt to compile the binaries them on their end.

Anyway, check it out, and Free The Photos! -> http://freethephotos.com/

Screen Shot 2012-12-19 at 8.51.07 AM

 Posted by at 12:00 am
Oct 302012
 

Hubot is a program that sits in on chat rooms and can prove to be incredibly useful or incredibly useless depending on the implementation – from alerting you of recent changes to your company github repository to dropping “that’s what she said’ jokes at unsuspecting double entendres. Created by Github, they claim that “Hubot is your company’s robot. Install him in your company to dramatically improve and reduce employee efficiency.” In this post, I just want to quickly demonstrate a plugin I wrote one night that allows people in the room play chess:

# Description:
#   Play a game of chess!
#
# Dependencies:
#   "chess": "0.1.3"
#
# Configuration:
#   None
#
# Commands:
#   hubot chess me - Creates a new game between yourself and another person in the room
#   hubot chess status - Gets the current state of the board
#   hubot chess move <to> - Moves a piece to the coordinate position using standard chess notation
#
# Author:
#   thallium205
#
 
Chess = require 'chess'
 
module.exports = (robot) ->
  robot.respond /chess me$/i, (msg) ->
    robot.brain.data.chess = Chess.create()
    boardToFen robot.brain.data.chess.getStatus(), (status, fen) ->
      msg.send 'White\'s turn.'
      msg.send 'http://chessup.net/php/pictureParser.php?fen=' + fen + '&coord=on&.png'
  robot.respond /chess status/i, (msg) ->
    try
      boardToFen robot.brain.data.chess.getStatus(), (status, fen) ->
        msg.send status
        msg.send 'http://chessup.net/php/pictureParser.php?fen=' + fen + '&coord=on&.png'
    catch e
      msg.send e
 
  robot.respond /chess move (.*)/i, (msg) ->
    try
      robot.brain.data.chess.move msg.match[1]
      boardToFen robot.brain.data.chess.getStatus(), (status, fen) ->
        msg.send status
        msg.send 'http://chessup.net/php/pictureParser.php?fen=' + fen + '&coord=on&.png'
    catch e
      msg.send e
 
boardToFen = (status, callback) ->
  fen = [[],[],[],[],[],[],[],[]]
  blank = 0
  lastRank = 0
  for square in status.board.squares
    if lastRank isnt square.rank
      if blank isnt 0
        fen[lastRank - 1].push(blank)
        blank = 0        
    if square.piece is null
      blank = blank + 1
    else
      if square.piece.type is 'pawn'
        if blank is 0          
          fen[square.rank - 1].push(if square.piece.side.name is 'white' then 'P' else 'p')
        else
          fen[square.rank - 1].push(blank)
          fen[square.rank - 1].push(if square.piece.side.name is 'white' then 'P' else 'p')
          blank = 0
      else
        if blank is 0
          fen[square.rank - 1].push(if square.piece.side.name is 'white' then square.piece.notation.toUpperCase() else square.piece.notation.toLowerCase())
        else
          fen[square.rank - 1].push(blank)
          fen[square.rank - 1].push(if square.piece.side.name is 'white' then square.piece.notation.toUpperCase() else square.piece.notation.toLowerCase())
          blank = 0
    lastRank = square.rank
  for rank in fen
    rank = rank.join()
  fen = fen.reverse().join('/').replace(/,/g,'')
 
  msg = ''
  if status.isCheck
    msg += 'Check! '
  if status.isCheckmate
    msg += 'Checkmate! '
  if status.isRepetition
    msg += 'Threefold Repetition!  A draw can be called. '
  if status.isStalemate
    msg += 'Stalemate! '
  if Object.keys(status.notatedMoves).length > 0
    if status.notatedMoves[Object.keys(status.notatedMoves)[0]].src.piece.side.name is 'white' then msg += 'White\'s turn. ' else msg += 'Black\'s turn.'
 
  callback msg, fen

The hard work was already done for me by a great javascript chess library ‘chess’, though I am no stranger to creating a chess board from scratch so I can definitely appreciate the thankless work that went into that. The only part that had to be done on my part was to iterate through the chess board and convert the piece positions to FEN notation which is a format that gives a lot of portability to representing a chess board. From there, the string was merely plugged into a website that generates board states from it, and then the plugin returns the picture’s url to the chatroom:

I feel creating a plugin is pretty straight forward – you can check out their huge repository of already approved scripts here. Submitting a new script requires a pull request to their repository, which is what this plugin is waiting for -> https://github.com/github/hubot-scripts/pull/620

Sep 112012
 

After a lot of good feedback in the forums I have decided to take a radically different approach to visualizing the bitcoin block chain. The fundamental problem with the visualizer as it stands right now is that it does not take into account closely related owners and the probability that they are in fact also the same person. It also prohibits the end user from really exploring the macro relationships between other owners. As a result, the new visualization I am working on will be more like how google maps works where a fully zoomed out maps allows you see continents, major countries, etc. As you zoom in, the map gets more detailed. This concept will be applied to the visualization – where a fully zoomed out map will let you see the largest owners – ie: mt gox, satoshi dice, etc. As you zoom in, you see the smaller owners. You will only be able to search by address, which would be like typing in a zip code into google maps where it will zoom in right to the owner but you can see all the nodes around it.

Circle radius will be denoted by the amount of times they have sent and received from other owners (they will also be labelled if they were identified to real-life entities like screen names). Lines will visualize two 2 dimensions: thickness will be amount sent and color will be how recent it was sent where hotter colors are very recent while cooler colors are old.

I am currently rebuilding the owner network to include the times when people sent money to other owners, so that will take a couple days to build. I have also been adding more websites the program scrapes to associate owners to real life screen names. I need to figure out a good library I can use which can help me display several of these “layers” (the top being the least detailed, the bottom being the most detailed) in an efficient manner and stitch them together.

Below is a time lapse organization of a small subsection of the ownership network – with the wikileaks owner being at the start node. Each one of these tiny nodes can provably represent 1 to over 500,000 bitcoin addresses – each edge represents a payment to another owner. A group of them can represent potentially millions of addresses. Watch how closely grouped owner nodes begin to materialize – a truly incredible grouping that totally blasts the anonymity of the network out of the water. Can you spot Mt. Gox – bitcoin’s largest exchange while listening to some Maple Leaf Rag? (I apologize for the video quality in advance)

The final product can be found here!

STAY TUNED!

 Posted by at 12:00 am
Aug 282012
 

This is a cross post from my announcement on the bitcoin forums about my latest project! It should be noted that this is definitely only the beginning and I plan on actively developing this application – the queries that can be created from the ownership network have the potential to be extremely powerful… it’s just my job to show people why! The visualizer is only a very rough release intended for bitcoin power users – cleaning the client interface (and adding awesome amounts of derived data that isn’t being shown) is a priority. The launch has been going relatively smooth – but after a pervasive bug that resulted in duplicate owners and fragmented same-owner sub-graphs spotted by one of the users, I can safely say the data is now correct.

http://blockviewer.com

I would like to announce the start of a new project that attempts to not only give everyone an interactive way to visualize and interact with the block chain, but to also have an easy and fun way to determine addresses owned by the same person and how that person interacts with others: http://blockviewer.com/#/owns/1HB5XMLmzFVj8ALj6mfBsbifRoD4miY36v

In the above screenshot, the owner in the middle has 43 addresses that are all owned by him:

In addition to knowing all linked addresses, a high level network of “owners” has been constructed which can also track payments between other high level owner addresses as well:

Here we can see this owner entity received 183 payments from others, and sent 27 payments to other owners. Expanding one of the owners out of the folders, it is revealed that he sent 127.37 BTC to another person (who happens to control 5 addresses).

This application exploits the weakness identified in Satoshi’s original paper (pg.6 sec. 10) where he stated that “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.” This application has constructed this high level owner network on top of the normal block chain, which is also traversable by simply clicking:

If you would like more information on how I did this, check out my use case here: http://toolongdidntread.com/bitcoin/the-bitcoin-social-network-part-1/ (Note: this database does not explicitly identify forum users yet. I will be enabling that information later on.)

The block chain is a graph, why are we not displaying it as such? If you would like to your public address against it, simply type in your address in the search box and select “Owner Address”. If all worked well, it will have all the other addresses that have been linked to you through the weakness, and you can see how well it determined where you sent BTC to other people.

KNOWN ISSUES:
There are so many it’s tough to even begin. This is definitely a “Use At Your Own Risk” as it is bound to crash, get turned off, shut down at any time for maintenance, etc.
The queries stop after 5000 nodes have been returned to protect the server. I hope to implement pagination soon.
The API allows you to download subgraphs in a standardized .gexf data format that can be used by graph visualization tools like Gephi. This will still stop queries after returning 5000 nodes.
The visualizer and client-side javascript is a mess. I will be cleaning it up quite a bit.
It’s not very user friendly at the moment, nodes are difficult to click on, and the documentation is pretty ugly. I wanted to get this out anyway so power users could check it out.
At the moment, I am using blockchain.info’s API that rate limits me which results in data that is probably like a day old. If piuk has it in his heart to forgive me for crashing his server, I would love another API key

Anyway, I built this because its so much easier to track payments using the block chain as a graph instead of pulling up HUGE lists that are on blockchain.info. The database is colossal, and its only getting bigger. Think of this as more of a sleuthing tool I can’t wait to hear your comments, suggestions, ideas, and the inevitable troll who says its a scam. Thanks!

Nov 082011
 

 I am reopening this blog!  Every Tuesday and Friday will hold a new post containing current projects, side projects, and other items encountered that involve computer science in some way.  I hope to change the focus a bit to try and make it a bit more appealing and also limit the main discussion to 5 sentences or less.  I am under the conviction that anything longer is too boring.  So please subscribe – I promise to have some great topics that I hope some will find interesting!

 Posted by at 9:10 pm
Jul 032011
 

I just wanted to dedicate today’s post to my latest project being submitted to the Paypal Developer Challenge! Voting will be opening today, and I would really be happy if you could vote for it! Please go to the voting page and click on ”Vote For Your Favorite Apps”. After logging in with your Paypal account, scroll down to the bottom and you will find “I Need A Ride” (or, you know, Cltr-F). Below is my application video submission, you can also download it yourself from the Android Marketplace here -> https://market.android.com/details?id=mobi.ineedaride

UPDATE: It appears Paypal has closed voting for the time being. It should open up again anytime now, but please keep checking!

Jun 222011
 

After four years of blogging for a club I was involved in, I find myself at a loss of where I can go to share ideas and push around information. As a result, this site has been created with the purpose of serving related articles on various types of projects I find myself involved in on a daily basis – from Android development, Bitcoin development, puzzles, and server administration to random tidbits of news and tricks. Posts are going to emulate the countless websites that have written valuable “How-To” articles I find exceedingly helpful. I hope some will find this useful as well!