# Path: database.py
# def txn_required(func):
#     @functools.wraps(func)
#     def _func(*args, **kwargs):
#         txn = current_txn()
#         if txn:
#             return func(*args, **kwargs)
#         else:
#             return run_in_transaction(func, txn_name=func.__name__, *args, **kwargs)
#     return _func
# 
# class TxnAbort(Exception):
#     def __init__(self, callback=None, *args, **kwargs):
#         self.__callback = callback
#         self.__args = args
#         self.__kwargs = kwargs
#         
#     @property
#     def callback(self):
#         if self.__callback:
#             return lambda: self.__callback(*self.__args, **self.__kwargs)
#         else:
#             return None
#             
#     def __call__(self):
#         cb = self.callback
#         if cb: return cb()
# 
# @contextmanager
# def Transaction(name="*UNKNOWN*", flags=DEFAULT_TXN_FLAGS):
#         txn = begin_txn(flags)
#         txn.set_name(name)
#         txn_log.debug("TXN BEGIN %s", repr(txn))
#         try:
#             yield txn
#         except Exception as e:
#             txn_log.debug("TXN ABORT %s", repr(txn)) 
#             abort_txn()
#             raise
#         txn_log.debug("TXN COMMIT %s", repr(txn))
#         commit_txn()


import eventlet
import genesisblock
import msgs
import jserialize as js
import bserialize as bs
import logging
import settings
import database
import transactions
import struct
    import sys
    import time
        import debug
from utils import *
from database import txn_required, TxnAbort, Transaction
    @property
    def hash(self): return self.block.hash
    @property
    def hexhash(self): return h2h(self.hash)
    @property
    def prev(self): return self.block.prev
    
    @staticmethod
    def iter_blocks():
        i = 0
        while True:
            try:
                yield Block.get_by_number(i)
            except KeyError:
                raise StopIteration
            i += 1
            
    @staticmethod
    def get_by_hash(h):
        log.debug("getting block %s", h2h(h))
        return Block.frombinary(chain.get(h))[0]
    @staticmethod
    def get_by_number(num):
        h = blknums.get(str(num))
        return Block.get_by_hash(h)
        
    @staticmethod
    def exist_by_hash(h):
        return chain.has_key(h)
    @staticmethod

# Path: database.py
# def txn_required(func):
#     @functools.wraps(func)
#     def _func(*args, **kwargs):
#         txn = current_txn()
#         if txn:
#             return func(*args, **kwargs)
#         else:
#             return run_in_transaction(func, txn_name=func.__name__, *args, **kwargs)
#     return _func
# 
# class TxnAbort(Exception):
#     def __init__(self, callback=None, *args, **kwargs):
#         self.__callback = callback
#         self.__args = args
#         self.__kwargs = kwargs
#         
#     @property
#     def callback(self):
#         if self.__callback:
#             return lambda: self.__callback(*self.__args, **self.__kwargs)
#         else:
#             return None
#             
#     def __call__(self):
#         cb = self.callback
#         if cb: return cb()
# 
# @contextmanager
# def Transaction(name="*UNKNOWN*", flags=DEFAULT_TXN_FLAGS):
#         txn = begin_txn(flags)
#         txn.set_name(name)
#         txn_log.debug("TXN BEGIN %s", repr(txn))
#         try:
#             yield txn
#         except Exception as e:
#             txn_log.debug("TXN ABORT %s", repr(txn)) 
#             abort_txn()
#             raise
#         txn_log.debug("TXN COMMIT %s", repr(txn))
#         commit_txn()


# Path: blockchain.py
import eventlet
import genesisblock
import msgs
import jserialize as js
import bserialize as bs
import logging
import settings
import database
import transactions
import struct
    import sys
    import time
        import debug
from utils import *
from database import txn_required, TxnAbort, Transaction

    @property
    def hash(self): return self.block.hash
    @property
    def hexhash(self): return h2h(self.hash)
    @property
    def prev(self): return self.block.prev
    
    @staticmethod
    def iter_blocks():
        i = 0
        while True:
            try:
                yield Block.get_by_number(i)
            except KeyError:
                raise StopIteration
            i += 1
            
    @staticmethod
    def get_by_hash(h):
        log.debug("getting block %s", h2h(h))
        return Block.frombinary(chain.get(h))[0]
    @staticmethod
    def get_by_number(num):
        h = blknums.get(str(num))
        return Block.get_by_hash(h)
        
    @staticmethod
    def exist_by_hash(h):
        return chain.has_key(h)
    @staticmethod

    def exist_by_number(num):