def update_channel_state(channel_id, asset, commit=None, revokes=None, cursor=None): from picopayments_hub import api state = db.load_channel_state(channel_id, asset, cursor=cursor) unnotified_revokes = db.unnotified_revokes(channel_id=channel_id) unnotified_commit = db.unnotified_commit(channel_id=channel_id, cursor=cursor) unnotified_revoke_secrets = [x["revoke_secret"] for x in unnotified_revokes] if commit is not None: state = api.mpc_add_commit( state=state, commit_rawtx=commit["rawtx"], commit_script=commit["script"] ) if revokes is not None: # TODO will not set revokes as unnotified # currently not a problem as its only used for hub to client # but its begging to be missused!! state = api.mpc_revoke_all(state=state, secrets=revokes) cursor.execute("BEGIN TRANSACTION;") db.save_channel_state( channel_id, state, h2c_unnotified_commit=unnotified_commit, unnotified_revoke_secrets=unnotified_revoke_secrets, cursor=cursor ) cursor.execute("COMMIT;") return state
def sync_hub_connection(handle, next_revoke_secret_hash, payments, commit, revokes): cursor = sql.get_cursor() hub_connection = db.hub_connection(handle=handle, cursor=cursor) _update_channel_state(hub_connection, commit, revokes, cursor) _process_payments(handle, payments, hub_connection, cursor) _balance_channel(handle, cursor) next_revoke_secret = create_secret() # create next spend secret # load unnotified c2h_id = hub_connection["c2h_channel_id"] h2c_id = hub_connection["h2c_channel_id"] h2c_commit = db.unnotified_commit(channel_id=h2c_id) c2h_revokes = db.unnotified_revokes(channel_id=c2h_id) receive_payments = db.unnotified_payments(payee_handle=handle) # save sync data h2c_commit_id = None if h2c_commit: h2c_commit_id = h2c_commit.pop("id") _save_sync_data(cursor, handle, next_revoke_secret_hash, receive_payments, h2c_commit_id, c2h_revokes, c2h_id, next_revoke_secret) hub_key = db.channel_payer_key(id=h2c_id) return ({ "receive": receive_payments, "commit": h2c_commit, "revokes": [r["revoke_secret"] for r in c2h_revokes], "next_revoke_secret_hash": next_revoke_secret["secret_hash"] }, hub_key["wif"])
def update_channel_state(channel_id, asset, commit=None, revokes=None, cursor=None): from picopayments_hub import api state = db.load_channel_state(channel_id, asset, cursor=cursor) unnotified_revokes = db.unnotified_revokes(channel_id=channel_id) unnotified_commit = db.unnotified_commit(channel_id=channel_id, cursor=cursor) unnotified_revoke_secrets = [ x["revoke_secret"] for x in unnotified_revokes ] if commit is not None: state = api.mpc_add_commit(state=state, commit_rawtx=commit["rawtx"], commit_script=commit["script"]) if revokes is not None: # FIXME will not set revokes as unnotified # currently not a problem as its only used for hub to client # but its begging to be missused!! state = api.mpc_revoke_all(state=state, secrets=revokes) cursor.execute("BEGIN TRANSACTION;") db.save_channel_state(channel_id, state, h2c_unnotified_commit=unnotified_commit, unnotified_revoke_secrets=unnotified_revoke_secrets, cursor=cursor) cursor.execute("COMMIT;") return state
def sync_hub_connection(handle, next_revoke_secret_hash, payments, commit, revokes): cursor = sql.get_cursor() hub_connection = db.hub_connection(handle=handle, cursor=cursor) _update_channel_state(hub_connection, commit, revokes, cursor) _process_payments(handle, payments, hub_connection, cursor) _balance_channel(handle, cursor) next_revoke_secret = create_secret() # create next spend secret # load unnotified c2h_id = hub_connection["c2h_channel_id"] h2c_id = hub_connection["h2c_channel_id"] h2c_commit = db.unnotified_commit(channel_id=h2c_id) c2h_revokes = db.unnotified_revokes(channel_id=c2h_id) receive_payments = db.unnotified_payments(payee_handle=handle) # save sync data h2c_commit_id = None if h2c_commit: h2c_commit_id = h2c_commit.pop("id") _save_sync_data( cursor, handle, next_revoke_secret_hash, receive_payments, h2c_commit_id, c2h_revokes, c2h_id, next_revoke_secret ) hub_wif = load_wif() return ( { "receive": receive_payments, "commit": h2c_commit, "revokes": [r["revoke_secret"] for r in c2h_revokes], "next_revoke_secret_hash": next_revoke_secret["secret_hash"] }, hub_wif )
def load_connection_data(handle, new_c2h_commit=None, new_h2c_revokes=None, cursor=None): from picopayments_hub import api # TODO this is getting dangerous, used in lib and verify, split it up! # connection data connection = db.hub_connection(handle=handle, cursor=cursor) if not connection: raise err.HandleNotFound(handle) asset = connection["asset"] terms = db.terms(id=connection["terms_id"], cursor=cursor) # h2c data h2c_state = db.load_channel_state( connection["h2c_channel_id"], connection["asset"], cursor=cursor ) if new_h2c_revokes is not None: h2c_state = api.mpc_revoke_all(state=h2c_state, secrets=new_h2c_revokes) h2c_deposit_address = deposit_address(h2c_state) h2c_transferred = get_transferred_quantity(h2c_state) h2c_deposit = get_balances(h2c_deposit_address, [asset])[asset] # TODO remove now impossable unnotified commit? h2c_unnotified_commit = db.unnotified_commit( channel_id=connection["h2c_channel_id"], cursor=cursor ) # c2h data c2h_state = db.load_channel_state( connection["c2h_channel_id"], connection["asset"], cursor=cursor ) if new_c2h_commit is not None: c2h_state = api.mpc_add_commit( state=c2h_state, commit_rawtx=new_c2h_commit["rawtx"], commit_script=new_c2h_commit["script"] ) c2h_transferred = get_transferred_quantity(c2h_state) # payments send_payments_sum = db.send_payments_sum(handle=handle, cursor=cursor) recv_payments_sum = db.recv_payments_sum(handle=handle, cursor=cursor) payments_sum = recv_payments_sum - send_payments_sum # sendable (what this channel can send to another) sendable_amount = c2h_transferred + payments_sum - h2c_transferred assert sendable_amount >= 0 # receivable (what this channel can receive from another) receivable_amount = h2c_deposit + c2h_transferred - payments_sum assert receivable_amount >= 0 return { "connection": connection, "h2c_state": h2c_state, "h2c_expired": is_expired(h2c_state, etc.expire_clearance), "c2h_state": c2h_state, "c2h_expired": is_expired(c2h_state, etc.expire_clearance), "h2c_unnotified_commit": h2c_unnotified_commit, "sendable_amount": sendable_amount, "receivable_amount": receivable_amount, "terms": terms, }
def load_connection_data(handle, new_c2h_commit=None, new_h2c_revokes=None, cursor=None): from picopayments_hub import api # FIXME this is getting dangerous, used in lib and verify, split it up! # connection data connection = db.hub_connection(handle=handle, cursor=cursor) if not connection: raise err.HandleNotFound(handle) asset = connection["asset"] terms = db.terms(id=connection["terms_id"], cursor=cursor) # h2c data h2c_state = db.load_channel_state(connection["h2c_channel_id"], connection["asset"], cursor=cursor) if new_h2c_revokes is not None: h2c_state = api.mpc_revoke_all(state=h2c_state, secrets=new_h2c_revokes) h2c_deposit_address = deposit_address(h2c_state) h2c_transferred = get_transferred_quantity(h2c_state) h2c_deposit = get_balances(h2c_deposit_address, [asset])[asset] h2c_unnotified_commit = db.unnotified_commit( channel_id=connection["h2c_channel_id"], cursor=cursor) # c2h data c2h_state = db.load_channel_state(connection["c2h_channel_id"], connection["asset"], cursor=cursor) if new_c2h_commit is not None: c2h_state = api.mpc_add_commit(state=c2h_state, commit_rawtx=new_c2h_commit["rawtx"], commit_script=new_c2h_commit["script"]) c2h_transferred = get_transferred_quantity(c2h_state) # payments send_payments_sum = db.send_payments_sum(handle=handle, cursor=cursor) recv_payments_sum = db.recv_payments_sum(handle=handle, cursor=cursor) payments_sum = recv_payments_sum - send_payments_sum # sendable (what this channel can send to another) sendable_amount = c2h_transferred + payments_sum - h2c_transferred assert sendable_amount >= 0 # receivable (what this channel can receive from another) receivable_amount = h2c_deposit + c2h_transferred - payments_sum assert receivable_amount >= 0 return { "connection": connection, "h2c_state": h2c_state, "h2c_expired": is_expired(h2c_state, etc.expire_clearance), "c2h_state": c2h_state, "c2h_expired": is_expired(c2h_state, etc.expire_clearance), "h2c_unnotified_commit": h2c_unnotified_commit, # FIXME remove "sendable_amount": sendable_amount, "receivable_amount": receivable_amount, "terms": terms, }