Take an array of blockchain objects (references to previous block) and re-construct a valid block chain. Handle edge cases like duplicate previous blocks or multiple blocks with the same name. Use recursion to handle re-constructing a divergent chain and take the longer one.