Skip to content

Commit

Permalink
Merge pull request #3 from ramonamela/master
Browse files Browse the repository at this point in the history
Read latter step challenge fully working
  • Loading branch information
ramonamela authored Nov 13, 2024
2 parents 01f3dfe + 189f8ef commit f5d5247
Show file tree
Hide file tree
Showing 4 changed files with 350 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ def __init__(self, base_path: str):
# self.fail_actor = "verifier"
self.fail_actor = "prover"
# self.fail_step = "1234567890"
self.fail_step = "0"
# self.fail_step = None
# self.fail_step = "0"
self.fail_step = None
# self.fail_type = "--fail-execute"
# self.fail_type = "--fail-hash"
self.fail_type = "--fail-pc"
Expand All @@ -48,11 +48,11 @@ def __init__(self, base_path: str):
and self.fail_input
)

self.fail_read = False
self.fail_read = True
self.fail_actor_read = "prover"
# This is the latter one
# self.fail_read_type = ReadErrorType.BEFORE
self.fail_read_type = ReadErrorType.SAME
self.fail_read_type = ReadErrorType.BEFORE
# self.fail_read_type = ReadErrorType.SAME
self.fail_read_position = ReadErrorPosition.ONE
# DO NOT CHANGE THIS AS OF NOW (WE HARDCODE THE EXAMPLE)
self.fail_read_step = 16
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -451,19 +451,29 @@ def __call__(
read_trace_prover_public_keys=bitvmx_protocol_setup_properties_dto.bitvmx_prover_winternitz_public_keys_dto.read_trace_prover_public_keys,
amount_of_bits_per_digit_checksum=bitvmx_protocol_setup_properties_dto.bitvmx_protocol_properties_dto.amount_of_bits_per_digit_checksum,
)
trigger_wrong_latter_step_1_challenge_script = (
self.trigger_wrong_latter_step_1_challenge_script_generator_service(
signature_public_keys=[
bitvmx_protocol_setup_properties_dto.verifier_signature_public_key
],
)
trigger_wrong_latter_step_1_challenge_script = self.trigger_wrong_latter_step_1_challenge_script_generator_service(
signature_public_keys=[
bitvmx_protocol_setup_properties_dto.verifier_signature_public_key
],
trace_words_lengths=trace_words_lengths,
read_trace_words_lengths=read_trace_words_lengths,
amount_of_bits_wrong_step_search=bitvmx_protocol_setup_properties_dto.bitvmx_protocol_properties_dto.amount_of_bits_wrong_step_search,
choice_read_search_prover_public_keys_list=bitvmx_protocol_setup_properties_dto.bitvmx_prover_winternitz_public_keys_dto.choice_read_search_prover_public_keys_list,
trace_prover_public_keys=bitvmx_protocol_setup_properties_dto.bitvmx_prover_winternitz_public_keys_dto.trace_prover_public_keys,
read_trace_prover_public_keys=bitvmx_protocol_setup_properties_dto.bitvmx_prover_winternitz_public_keys_dto.read_trace_prover_public_keys,
amount_of_bits_per_digit_checksum=bitvmx_protocol_setup_properties_dto.bitvmx_protocol_properties_dto.amount_of_bits_per_digit_checksum,
)
trigger_wrong_latter_step_2_challenge_script = (
self.trigger_wrong_latter_step_2_challenge_script_generator_service(
signature_public_keys=[
bitvmx_protocol_setup_properties_dto.verifier_signature_public_key
],
)
trigger_wrong_latter_step_2_challenge_script = self.trigger_wrong_latter_step_2_challenge_script_generator_service(
signature_public_keys=[
bitvmx_protocol_setup_properties_dto.verifier_signature_public_key
],
trace_words_lengths=trace_words_lengths,
read_trace_words_lengths=read_trace_words_lengths,
amount_of_bits_wrong_step_search=bitvmx_protocol_setup_properties_dto.bitvmx_protocol_properties_dto.amount_of_bits_wrong_step_search,
choice_read_search_prover_public_keys_list=bitvmx_protocol_setup_properties_dto.bitvmx_prover_winternitz_public_keys_dto.choice_read_search_prover_public_keys_list,
trace_prover_public_keys=bitvmx_protocol_setup_properties_dto.bitvmx_prover_winternitz_public_keys_dto.trace_prover_public_keys,
read_trace_prover_public_keys=bitvmx_protocol_setup_properties_dto.bitvmx_prover_winternitz_public_keys_dto.read_trace_prover_public_keys,
amount_of_bits_per_digit_checksum=bitvmx_protocol_setup_properties_dto.bitvmx_protocol_properties_dto.amount_of_bits_per_digit_checksum,
)

return BitVMXBitcoinScriptsDTO(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,190 @@
from abc import abstractmethod
from typing import List

from bitcoinutils.keys import PublicKey

from bitvmx_protocol_library.bitvmx_protocol_definition.entities.bitvmx_protocol_properties_dto import (
BitVMXProtocolPropertiesDTO,
)
from bitvmx_protocol_library.script_generation.entities.business_objects.bitcoin_script import (
BitcoinScript,
)
from bitvmx_protocol_library.winternitz_keys_handling.scripts.verify_digit_signature_nibbles_service import (
VerifyDigitSignatureNibblesService,
)
from bitvmx_protocol_library.winternitz_keys_handling.scripts.verify_digit_signature_single_word_service import (
VerifyDigitSignatureSingleWordService,
)


class GenericTriggerWrongLatterStepChallengeScriptGeneratorService:

def __init__(self):
self.verify_input_nibble_message_from_public_keys = VerifyDigitSignatureNibblesService()
self.verify_input_single_word_from_public_keys = VerifyDigitSignatureSingleWordService()

def __call__(
self,
signature_public_keys: List[str],
trace_words_lengths: List[int],
read_trace_words_lengths: List[int],
amount_of_bits_wrong_step_search: int,
choice_read_search_prover_public_keys_list: List[List[List[str]]],
trace_prover_public_keys: List[List[str]],
read_trace_prover_public_keys: List[List[str]],
amount_of_bits_per_digit_checksum: int,
) -> BitcoinScript:
script = BitcoinScript()
script.append("OP_DROP")
script.append(1)
for signature_public_key in signature_public_keys:
script.extend(
[
PublicKey(hex_str=signature_public_key).to_x_only_hex(),
"OP_CHECKSIGVERIFY",
]
)
for choice_list in reversed(choice_read_search_prover_public_keys_list):
self.verify_input_single_word_from_public_keys(
script=script,
public_keys=choice_list[0],
amount_of_bits=amount_of_bits_wrong_step_search,
to_alt_stack=True,
)

self.verify_input_nibble_message_from_public_keys(
script=script,
public_keys=trace_prover_public_keys[-self._trace_last_step_index - 1],
n0=trace_words_lengths[-self._trace_last_step_index - 1],
bits_per_digit_checksum=amount_of_bits_per_digit_checksum,
to_alt_stack=True,
)

words_lengths = [2, 3, 3]
for word_length in words_lengths:
for i in range(word_length - 1, -1, -1):
script.append("OP_FROMALTSTACK")
for _ in range(i * 4):
script.extend(["OP_DUP", "OP_ADD"])
if i < word_length - 1:
script.append("OP_ADD")

amount_of_published_bits = amount_of_bits_wrong_step_search * len(
choice_read_search_prover_public_keys_list
)

amount_of_remaining_bits = amount_of_published_bits

script.append(0)
while amount_of_remaining_bits > 24:
script.append("OP_FROMALTSTACK")
amount_of_remaining_bits -= amount_of_bits_wrong_step_search
for _ in range(amount_of_remaining_bits - 24):
script.extend(["OP_DUP", "OP_ADD"])
script.append("OP_ADD")

script.append(0)
while amount_of_remaining_bits > 12:
script.append("OP_FROMALTSTACK")
amount_of_remaining_bits -= amount_of_bits_wrong_step_search
for _ in range(amount_of_remaining_bits - 12):
script.extend(["OP_DUP", "OP_ADD"])
script.append("OP_ADD")

script.append(0)
while amount_of_remaining_bits > 0:
script.append("OP_FROMALTSTACK")
amount_of_remaining_bits -= amount_of_bits_wrong_step_search
for _ in range(amount_of_remaining_bits):
script.extend(["OP_DUP", "OP_ADD"])
script.append("OP_ADD")

script.extend([5, "OP_PICK", 2, "OP_PICK", "OP_LESSTHAN"])

script.append("OP_IF")

script.extend(["OP_2DROP", "OP_2DROP", "OP_2DROP"])
script.append("OP_ELSE")

script.extend([5, "OP_ROLL", 2, "OP_ROLL", "OP_EQUALVERIFY"])
script.extend([3, "OP_PICK", 1, "OP_PICK", "OP_LESSTHAN"])

script.append("OP_IF")

script.extend(["OP_2DROP", "OP_2DROP"])

script.append("OP_ELSE")

script.extend([3, "OP_ROLL", 1, "OP_ROLL", "OP_EQUALVERIFY"])
script.append("OP_LESSTHAN")
script.append("OP_EQUALVERIFY")

script.append("OP_ENDIF")

script.append("OP_ENDIF")

self.verify_input_nibble_message_from_public_keys(
script=script,
public_keys=trace_prover_public_keys[-self._trace_address_index - 1],
n0=trace_words_lengths[-self._trace_address_index - 1],
bits_per_digit_checksum=amount_of_bits_per_digit_checksum,
to_alt_stack=True,
)

read_trace_address_index = BitVMXProtocolPropertiesDTO.read_write_address_position

self.verify_input_nibble_message_from_public_keys(
script=script,
public_keys=read_trace_prover_public_keys[-read_trace_address_index - 1],
n0=read_trace_words_lengths[-read_trace_address_index - 1],
bits_per_digit_checksum=amount_of_bits_per_digit_checksum,
to_alt_stack=False,
)

script.append(0)

amount_of_address_nibbles = read_trace_words_lengths[-read_trace_address_index - 1]
for i in range(amount_of_address_nibbles):
script.append(amount_of_address_nibbles - i)
script.append("OP_ROLL")
script.append("OP_FROMALTSTACK")
script.append("OP_EQUAL")
script.append("OP_ADD")

script.append(amount_of_address_nibbles)
script.append("OP_EQUAL")
return script

@property
@abstractmethod
def _trace_last_step_index(self):
pass

@property
@abstractmethod
def _trace_address_index(self):
pass


class TriggerWrongLatterStep1ChallengeScriptGeneratorService(
GenericTriggerWrongLatterStepChallengeScriptGeneratorService
):
pass
@property
def _trace_last_step_index(self):
return BitVMXProtocolPropertiesDTO.read_1_last_step_position

@property
@abstractmethod
def _trace_address_index(self):
return BitVMXProtocolPropertiesDTO.read_1_address_position


class TriggerWrongLatterStep2ChallengeScriptGeneratorService(
GenericTriggerWrongLatterStepChallengeScriptGeneratorService
):
pass
@property
def _trace_last_step_index(self):
return BitVMXProtocolPropertiesDTO.read_2_last_step_position

@property
@abstractmethod
def _trace_address_index(self):
return BitVMXProtocolPropertiesDTO.read_2_address_position
Loading

0 comments on commit f5d5247

Please sign in to comment.