From ec589912c2e253075dfa738a6283f40128238869 Mon Sep 17 00:00:00 2001 From: "Abdel @ StarkWare" Date: Wed, 31 Jul 2024 14:38:46 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20add=20misc=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/misc/issues.json | 64 +++++++++++++++++++++++++++++++++++ scripts/misc/create_issues.py | 45 ++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 docs/misc/issues.json create mode 100644 scripts/misc/create_issues.py diff --git a/docs/misc/issues.json b/docs/misc/issues.json new file mode 100644 index 00000000..23b9c3d2 --- /dev/null +++ b/docs/misc/issues.json @@ -0,0 +1,64 @@ +{ + "issues": [ + { + "title": "Implement BlockHeader Struct", + "body": "Define a `BlockHeader` struct to represent a Bitcoin block header.\n\nAcceptance Criteria:\n- Define `BlockHeader` struct with fields:\n - version: u32\n - prev_block_hash: [u8; 32]\n - merkle_root: [u8; 32]\n - timestamp: u32\n - bits: u32\n - nonce: u32\n- Use appropriate types for each field\n- Implement `Default` trait for `BlockHeader`\n\nResources:\n- ZeroSync Cairo 0 code: `block_header.cairo`\n- Bitcoin Block Header: https://developer.bitcoin.org/reference/block_chain.html#block-headers", + "labels": ["enhancement"] + }, + { + "title": "Implement read_block_header Function", + "body": "Create a function to read a block header from a byte stream.\n\nAcceptance Criteria:\n- Implement `read_block_header(reader: &mut Reader) -> Result`\n- Read each field of the block header in order\n- Handle potential read errors\n- Return a `BlockHeader` struct if successful\n\nResources:\n- ZeroSync Cairo 0 code: `block_header.cairo`\n- Shinigami codebase for error handling examples", + "labels": ["enhancement"] + }, + { + "title": "Implement validate_block_header Function", + "body": "Create a function to validate a block header.\n\nAcceptance Criteria:\n- Implement `validate_block_header(header: &BlockHeader, prev_header: &BlockHeader) -> Result<(), Error>`\n- Check that the `prev_block_hash` matches the hash of the previous block\n- Validate proof of work (difficulty target)\n- Check that the timestamp is greater than the median time of the last 11 blocks\n- Return an error if any validation check fails\n\nResources:\n- ZeroSync Cairo 0 code: `block_header.cairo`", + "labels": ["enhancement"] + }, + { + "title": "Implement ChainState Struct", + "body": "Define a `ChainState` struct to represent the current state of the blockchain.\n\nAcceptance Criteria:\n- Define `ChainState` struct with fields:\n - block_height: u32\n - total_work: u128\n - best_block_hash: [u8; 32]\n - current_target: u32\n - epoch_start_time: u32\n - prev_timestamps: [u32; 11]\n- Implement `Default` trait for `ChainState`\n\nResources:\n- ZeroSync Cairo 0 code: `block_header.cairo`", + "labels": ["enhancement"] + }, + { + "title": "Implement apply_block_header Function", + "body": "Create a function to apply a validated block header to the current chain state.\n\nAcceptance Criteria:\n- Implement `apply_block_header(state: &mut ChainState, header: &BlockHeader) -> Result<(), Error>`\n- Update `block_height`\n- Recalculate `total_work`\n- Update `best_block_hash`\n- Update `prev_timestamps` array\n- Call `adjust_difficulty` if necessary\n- Handle potential errors\n\nResources:\n- ZeroSync Cairo 0 code: `block_header.cairo`", + "labels": ["enhancement"] + }, + { + "title": "Implement adjust_difficulty Function", + "body": "Create a function to adjust the mining difficulty every 2016 blocks.\n\nAcceptance Criteria:\n- Implement `adjust_difficulty(state: &mut ChainState, header: &BlockHeader) -> Result<(), Error>`\n- Check if it's time to adjust difficulty (every 2016 blocks)\n- Calculate the time taken for the last 2016 blocks\n- Adjust the target based on the time taken, within allowed limits\n- Update `current_target` and `epoch_start_time` in `ChainState`\n- Handle potential overflow errors\n\nResources:\n- ZeroSync Cairo 0 code: `block_header.cairo`", + "labels": ["enhancement"] + }, + { + "title": "Implement bits_to_target Function", + "body": "Create a function to convert the compact `bits` representation to the full 256-bit target.\n\nAcceptance Criteria:\n- Implement `bits_to_target(bits: u32) -> Result`\n- Extract exponent and mantissa from `bits`\n- Calculate the full target value\n- Ensure the target doesn't exceed the maximum allowed value\n- Handle potential overflow errors\n\nResources:\n- ZeroSync Cairo 0 code: `block_header.cairo`", + "labels": ["enhancement"] + }, + { + "title": "Implement target_to_bits Function", + "body": "Create a function to convert a 256-bit target back to the compact `bits` representation.\n\nAcceptance Criteria:\n- Implement `target_to_bits(target: U256) -> Result`\n- Calculate the appropriate exponent and mantissa\n- Combine exponent and mantissa into the compact format\n- Ensure the result is valid and normalized\n- Handle potential overflow errors\n\nResources:\n- ZeroSync Cairo 0 code: `block_header.cairo`", + "labels": ["enhancement"] + }, + { + "title": "Implement compute_work_from_target Function", + "body": "Create a function to compute the amount of work represented by a given target.\n\nAcceptance Criteria:\n- Implement `compute_work_from_target(target: U256) -> U256`\n- Calculate work as `(2^256 - 1) / (target + 1)`\n- Handle potential division by zero\n- Optimize for efficiency if possible\n\nResources:\n- ZeroSync Cairo 0 code: `block_header.cairo`", + "labels": ["enhancement"] + }, + { + "title": "Implement compute_merkle_root Function", + "body": "Create a function to compute the Merkle root of a list of transaction hashes.\n\nAcceptance Criteria:\n- Implement `compute_merkle_root(hashes: &[[u8; 32]]) -> Result<[u8; 32], Error>`\n- Handle the case of an empty list of hashes\n- Implement the Merkle tree algorithm\n- Duplicate the last hash if there's an odd number of hashes\n- Implement the CVE-2012-2459 fix (check for duplicate hashes)\n- Return the computed Merkle root\n\nResources:\n- ZeroSync Cairo 0 code: `merkle_tree.cairo`", + "labels": ["enhancement"] + }, + { + "title": "Implement validate_and_apply_transaction Function", + "body": "Create a function to validate a transaction and apply it to the UTXO set.\n\nAcceptance Criteria:\n- Implement `validate_and_apply_transaction(tx: &Transaction, utxo_set: &mut UtxoSet) -> Result`\n- Verify transaction inputs (check if they exist in the UTXO set)\n- Validate transaction outputs (non-negative values, sum doesn't overflow)\n- Check that input amount >= output amount\n- Remove spent outputs from the UTXO set\n- Add new outputs to the UTXO set\n- Return the transaction fee\n\nResources:\n- ZeroSync Cairo 0 code: `transaction.cairo`, `block.cairo`", + "labels": ["enhancement"] + }, + { + "title": "Implement validate_and_apply_coinbase Function", + "body": "Create a function to validate and apply the coinbase transaction of a block.\n\nAcceptance Criteria:\n- Implement `validate_and_apply_coinbase(coinbase: &Transaction, height: u32, fees: u64, utxo_set: &mut UtxoSet) -> Result<(), Error>`\n- Verify that it's the first transaction in the block\n- Check that it has exactly one input with a null previous output\n- Validate the coinbase reward (block subsidy + fees)\n- Add outputs to the UTXO set\n- Handle potential errors (e.g., invalid reward amount)\n\nResources:\n- ZeroSync Cairo 0 code: `block.cairo`", + "labels": ["enhancement"] + } + ] + } \ No newline at end of file diff --git a/scripts/misc/create_issues.py b/scripts/misc/create_issues.py new file mode 100644 index 00000000..4cd113ff --- /dev/null +++ b/scripts/misc/create_issues.py @@ -0,0 +1,45 @@ +import json +import subprocess +import sys +import argparse + +def create_issue(title, body, labels): + cmd = [ + "gh", "issue", "create", + "--title", title, + "--body", body, + "--label", ",".join(labels) + ] + + try: + subprocess.run(cmd, check=True) + print(f"Successfully created issue: {title}") + except subprocess.CalledProcessError as e: + print(f"Error creating issue: {title}") + print(f"Error message: {e}") + sys.exit(1) + +def main(): + parser = argparse.ArgumentParser(description="Create GitHub issues from a JSON file.") + parser.add_argument("json_file", help="Path to the JSON file containing issue data") + args = parser.parse_args() + + try: + with open(args.json_file, "r") as f: + data = json.load(f) + except FileNotFoundError: + print(f"Error: File '{args.json_file}' not found.") + sys.exit(1) + except json.JSONDecodeError: + print(f"Error: '{args.json_file}' is not a valid JSON file.") + sys.exit(1) + + if "issues" not in data: + print("Error: The JSON file does not contain an 'issues' key.") + sys.exit(1) + + for issue in data["issues"]: + create_issue(issue["title"], issue["body"], issue["labels"]) + +if __name__ == "__main__": + main() \ No newline at end of file