Giter Club home page Giter Club logo

aleo-education's Introduction

aleo-education

Aleo Education

aleo-education's People

Contributors

d0cd avatar edgdrummond avatar zosorock avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aleo-education's Issues

Is using an elliptic curve on BLS12-377's prime subgroup order safe?

Hello,
While doing Aleo exercices I noticed something strange with the code which defines a "zero" point: https://github.com/AleoHQ/aleo-education/blob/d6013a0ba18377eaf86f645db00bf93e62287a7d/hangman/src/main.leo#L105-L106

The value used for y is 0x1ae3a4617c510eac63b05c06ca1493b1a22d9f300f5138f1ef3622fba094800170b5d44300000008508c00000000001, which is the correct "base field modulus" of BLS12-377 (https://eips.ethereum.org/EIPS/eip-2539), but in Leo this value is truncated. When displaying the content of digest.y in the program:

console.log("digest.y = {}", digest.y);

The output is:

digest.y = 9586122913090633729

This is because defining the number as field takes the value modulo the "Main subgroup order" 0x12ab655e9a2ca55660b44d1e5c37b00159aa76fed00000010a11800000000001. This can be seen in the following Python code:

>>> base_field_modulus = 0x1ae3a4617c510eac63b05c06ca1493b1a22d9f300f5138f1ef3622fba094800170b5d44300000008508c00000000001
>>> subgroup_order = 0x12ab655e9a2ca55660b44d1e5c37b00159aa76fed00000010a11800000000001
>>> base_field_modulus % subgroup_order
9586122913090633729

More generally, the Point circuit in hangman/src/main.leo represents a point with coordinates modulo subgroup_order instead of base_field_modulus. This leads to two questions:

  • Is this curve "safe" to use? Usually in EC cryptography, there are important concepts such as "the curve order" and "working in the large prime subgroup of the curve" to perform operations in a safe way.
  • Being able to compute real BLS12-377 points in Leo sounds useful. Is there a way to achieve this? (By having numbers modulo base_field_modulus instead of subgroup_order)?

By the way, thanks for this educational content! It is a great way to learn about ZK-based systems such as Aleo.

Big step

Little wonder how negligence and lack of full/proper knowledge can affect genuine productivity

Get yourself equip..

Swap & Bridge Problem

Encountering occasional discrepancies in swap and bridge transactions between Seplia and Aleo platforms. Despite successfully completing the task, the Aleo account fails to reflect the expected outcome.

Logic Flow

I noticed that some parts of the code have incomplete logic flow or missing implementations, such as the valid_char function and parts of the guess_letter function.

Here's a revised version. Kindly review and let me know if there is anything you want me to add. I am looking forward for a meaningful contribution.

Please feel free to correct is I'm wrong.

circuit Hangman {
    commitment: Point,
    revealed: [char; 20],
    used_guesses: [char; 10],
    guesses_left: u32,
    victory: bool,

    // Function to check if a character is a lowercase English alphabet letter
    function valid_char(c: char) -> bool {
        const valid_chars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
        let is_valid_char = false;

        for char in valid_chars {
            if c == char {
                is_valid_char = true;
                break;
            }
        }

        return is_valid_char;
    }
    
    // Function to initialize a new game of Hangman
    function new_game(word: [char; 20], const word_length: u32) -> Self {
        const digest: Point = Point { x: 0field, y: 258664426012969094010652733694893533536393512754914660539884262666720468348340822774968888139573360124440321458177field };
        const x: field = 7810607721416582242904415504650443951498042435501746664987470571546413371306field;
        const y: field = 1867362672570137759132108893390349941423731440336755218616442213142473202417field;
        
        let hasher = PedersenHash::new(digest, [x; 256], [y; 256]);
        let hash: Point = hasher.hash([true; 256]);

        let mut valid_word = true;
        for char in word {
            if !Hangman::valid_char(char) {
                valid_word = false;
                break;
            }
        }

        if word_length > 20 {
            valid_word = false;
        }

        if !valid_word {
            return Self {
                commitment: Point { x: 0field, y: 0field },
                revealed: ['_'; 20],
                used_guesses: ['_'; 10],
                guesses_left: 0u32,
                victory: false,
            };
        }

        return Self {
            commitment: hash,
            revealed: ['_'; 20],
            used_guesses: ['_'; 10],
            guesses_left: 10u32,
            victory: false,
        };
    }

    // Function to handle a letter guess
    function guess_letter(mut self, letter: char) -> Self {
        let mut is_valid_guess = true;

        // Check if the guessed letter is valid
        if !Hangman::valid_char(letter) {
            is_valid_guess = false;
        }

        // Check if the guessed letter has already been used
        for used_letter in self.used_guesses {
            if letter == used_letter {
                is_valid_guess = false;
                break;
            }
        }

        // Update the game state based on the guess
        if is_valid_guess {
            let mut found_letter = false;
            for (i, char) in self.revealed.iter_mut().enumerate() {
                if letter == self.word[i] {
                    *char = letter;
                    found_letter = true;
                }
            }

            if !found_letter {
                self.guesses_left -= 1;
            }
        }

        // Check for victory condition
        if self.revealed.iter().all(|&c| c != '_') {
            self.victory = true;
        }

        // Update used guesses
        for (i, used_letter) in self.used_guesses.iter_mut().enumerate() {
            if *used_letter == '_' {
                *used_letter = letter;
                break;
            }
        }

        return self;
    }
}

Swap & bridge problem

Some time bridge and swap problem
Some time
Seplia to aleo task done
But
Aleo account didn't show and

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.