Пример #1
0
def set_onchain_secret(
        state: MediatorTransferState,
        channelidentifiers_to_channels: typing.ChannelMap,
        secret: typing.Secret,
        secrethash: typing.SecretHash,
        block_number: typing.BlockNumber,
) -> typing.List[Event]:
    """ Set the secret to all mediated transfers.

    The secret should have been learned from the secret registry.
    """
    state.secret = secret

    for pair in state.transfers_pair:
        payer_channel = channelidentifiers_to_channels[
            pair.payer_transfer.balance_proof.channel_identifier
        ]
        channel.register_onchain_secret(
            payer_channel,
            secret,
            secrethash,
            block_number,
        )

        payee_channel = channelidentifiers_to_channels[
            pair.payee_transfer.balance_proof.channel_identifier
        ]
        channel.register_onchain_secret(
            channel_state=payee_channel,
            secret=secret,
            secrethash=secrethash,
            secret_reveal_block_number=block_number,
        )

    # Like the off-chain secret reveal, the secret should never be revealed
    # on-chain if there is a waiting transfer.
    if state.waiting_transfer:
        payer_channel = channelidentifiers_to_channels[
            state.waiting_transfer.transfer.balance_proof.channel_identifier
        ]
        channel.register_onchain_secret(
            channel_state=payer_channel,
            secret=secret,
            secrethash=secrethash,
            secret_reveal_block_number=block_number,
        )

        unexpected_reveal = EventUnexpectedSecretReveal(
            secrethash=secrethash,
            reason='The mediator has a waiting transfer.',
        )
        return [unexpected_reveal]

    return list()
Пример #2
0
def set_offchain_secret(
        state: MediatorTransferState,
        channelidentifiers_to_channels: typing.ChannelMap,
        secret: typing.Secret,
        secrethash: typing.SecretHash,
) -> typing.List[Event]:
    """ Set the secret to all mediated transfers. """
    state.secret = secret

    for pair in state.transfers_pair:
        payer_channel = channelidentifiers_to_channels[
            pair.payer_transfer.balance_proof.channel_identifier
        ]
        channel.register_offchain_secret(
            payer_channel,
            secret,
            secrethash,
        )

        payee_channel = channelidentifiers_to_channels[
            pair.payee_transfer.balance_proof.channel_identifier
        ]
        channel.register_offchain_secret(
            payee_channel,
            secret,
            secrethash,
        )

    # The secret should never be revealed if `waiting_transfer` is not None.
    # For this to happen this node must have received a transfer, which it did
    # *not* mediate, and neverthless the secret was revealed.
    #
    # This can only be possible if the initiator reveals the secret without the
    # target's secret request, or if the node which sent the `waiting_transfer`
    # has sent another transfer which reached the target (meaning someone along
    # the path will lose tokens).
    if state.waiting_transfer:
        payer_channel = channelidentifiers_to_channels[
            state.waiting_transfer.transfer.balance_proof.channel_identifier
        ]
        channel.register_offchain_secret(
            payer_channel,
            secret,
            secrethash,
        )

        unexpected_reveal = EventUnexpectedSecretReveal(
            secrethash=secrethash,
            reason='The mediator has a waiting transfer.',
        )
        return [unexpected_reveal]

    return list()