def close_cooperatively(self, closing_sig: bytes): """ Attempts to close the channel immediately by providing a hash of the channel's balance proof signed by the receiver. This signature must correspond to the balance proof stored in the passed channel state. """ if self.state == Channel.State.closed: log.error('Channel must not be closed already to be closed cooperatively.') return None log.info('Attempting to cooperatively close channel to {} created at block #{}.'.format( self.receiver, self.block )) current_block = self.core.web3.eth.blockNumber receiver_recovered = verify_closing_sig( self.sender, self.block, self.balance, closing_sig, self.core.channel_manager.address ) if not is_same_address(receiver_recovered, self.receiver): log.error('Invalid closing signature.') return None tx = create_signed_contract_transaction( self.core.private_key, self.core.channel_manager, 'cooperativeClose', [ self.receiver, self.block, self.balance, self.balance_sig, closing_sig ] ) self.core.web3.eth.sendRawTransaction(tx) log.debug('Waiting for settle confirmation event...') event = get_event_blocking( self.core.channel_manager, 'ChannelSettled', from_block=current_block + 1, argument_filters={ '_sender_address': self.sender, '_receiver_address': self.receiver, '_open_block_number': self.block } ) if event: log.debug('Successfully closed channel in block {}.'.format(event['blockNumber'])) self.state = Channel.State.closed return event else: log.error('No event received.') return None
def test_verify_closing_sign(channel_manager_address: str): sig = sign_close(RECEIVER_PRIVATE_KEY, SENDER_ADDR, 315832, 13, channel_manager_address) receiver_recovered = verify_closing_sig(SENDER_ADDR, 315832, 13, sig, channel_manager_address) assert is_same_address(receiver_recovered, RECEIVER_ADDR)
def test_verify_closing_sign(channel_manager_address: str): sig = sign_close( RECEIVER_PRIVATE_KEY, SENDER_ADDR, 315832, 13, channel_manager_address ) receiver_recovered = verify_closing_sig(SENDER_ADDR, 315832, 13, sig, channel_manager_address) assert is_same_address(receiver_recovered, RECEIVER_ADDR)