Score:0

วิธีสร้างข้อ จำกัด ในตัวดำเนินการบิตกะขวาใน Circom

ธง nz

วิธีสร้างข้อจำกัดในตัวดำเนินการ bitwise shift ขวาใน ภาษาวงจร circom?

ฉันกำลังพยายามทำสิ่งต่อไปนี้:

ปรากมา circom 2.0.0;

แม่แบบ MAIN() {

    อินพุตสัญญาณ v;
    ประเภทเอาต์พุตสัญญาณ

    พิมพ์ <== v >> 5;
}

ส่วนประกอบหลัก = MAIN();

ฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด [T3001]: ไม่อนุญาตให้ใช้ข้อจำกัดที่ไม่ใช่กำลังสอง!
   ââ "/Users/ilia/compiling/main-circom/main.circom":68:5
   â
68 â พิมพ์ <== v >> 5;
   â ^^^^^^^^^^^^^^^ พบที่นี่
   â
   = ติดตามการโทร:
     -> หลัก

ฉันคิดว่าสิ่งนี้เกี่ยวข้องกับข้อเท็จจริงที่ว่า v >> 5 นิพจน์ไม่สามารถแสดงซ้ำเป็นนิพจน์กำลังสองโดย คอมไพเลอร์ circom.

ฉันพยายามเขียนนิพจน์ใหม่ให้เป็นกำลังสอง อาจเกี่ยวข้องกับการเขียนการมอบหมายและข้อ จำกัด เป็นสองการดำเนินการแยกกัน แต่ฉันไม่แน่ใจว่าข้อ จำกัด การตรวจสอบความถูกต้องที่เหมาะสมสำหรับการเปลี่ยนแปลงที่ถูกต้องคืออะไร

ในแง่ของกรณีทดสอบฉันคาดหวัง พิมพ์ เป็น $5$ เมื่อไร โวลต์ เป็น $168$ ตัวอย่างเช่น.

kr flag
คำถามเกี่ยวกับการเขียนโปรแกรมอยู่นอกหัวข้อใน Crypto SE
meshcollider avatar
gb flag
การเลื่อนไปทางขวาด้วย n บิตจะเหมือนกับการหารด้วย 2^n ดังนั้นคุณสามารถใช้เพื่อจำกัด (คูณอีกด้านด้วย 2^n และใช้มาสก์เพื่อล้างบิตล่าง) คุณสามารถใช้การมอบหมายด้วย `
nz flag
ฉันถูกนำไปที่ stackexchange นี้เมื่อฉันถามคำถามเกี่ยวกับ Circom บน StackOverflow... ฉันเหนื่อย: `ประเภท > 5; พิมพ์ * 32 === v & 0xE0;` แต่ตอนนี้ฉันได้รับ "ไม่อนุญาตให้ใช้ข้อ จำกัด ที่ไม่ใช่กำลังสอง" ในบรรทัด `type * 32 === v & 0xE0`
nz flag
ฉันจะสร้างข้อจำกัดสำหรับตัวดำเนินการ & ระดับบิตได้อย่างไร ดูที่ circumlib แล้ว แต่ไม่พบอะไรที่ตรงใจเลย ดูแค่ `& 1` แต่นั่นยังไม่ธรรมดาพอที่ฉันไม่คิดว่า
nz flag
ฉันได้ลองสิ่งนี้เพื่อสร้างข้อจำกัดใน & ตัวดำเนินการ: `ตรวจสอบสัญญาณ; ตรวจสอบ
kelalaka avatar
in flag
ใครเป็นคนนำคำถามนี้ไปที่นี่? มีคำถามและคำตอบของ SageMath อยู่แล้ว แต่สิ่งนี้นอกหัวข้อใช่ไหม
nz flag
ฉันถูกนำไปที่ stackexchange ที่นี่: https://stackoverflow.com/questions/70891895/how-to-pass-function-argument-by-reference-in-circom#comment125326319_70891895 โดยให้เหตุผลว่า "crypto.stackexchange.com อาจ เหมาะสมกว่าสำหรับคำถามที่เกี่ยวข้องกับ ZKP"
Score:1
ธง gb

วิธีแก้ปัญหาโดยใช้ตัวเปรียบเทียบ LessThan จาก วงรอบ:

//... นำเข้าเครื่องเปรียบเทียบจาก circumlib ...

แม่แบบ MAIN() {

    อินพุตสัญญาณ v;
    ประเภทเอาต์พุตสัญญาณ
    ตรวจสอบสัญญาณ _v;
    องค์ประกอบน้อยกว่า = LessThan (8);

    พิมพ์ <-- v >> 5;
    check_v <== พิมพ์*32;
    // ใช้ circomlib LessThan เพื่อตรวจสอบว่า (v - check_v) < 32
    lessThan.in[0] <== v - check_v;
    lessThan.in[1] <== 32;    
    lessThan.out === 1;
}

ส่วนประกอบหลัก = MAIN();
```
nz flag
ใช่มันได้ผล ขอขอบคุณ! `ส่วนประกอบน้อยกว่า = LessThan(8); // เต็ม 8 บิต น้อยกว่าใน[0]
meshcollider avatar
gb flag
หวาน! อัปเดตคำตอบของฉันด้วยรหัสสุดท้ายแล้ว เราควรทำความสะอาดความคิดเห็นเหล่านี้
Score:0
ธง nz

แก้ไข: สิ่งนี้ไม่เพียงพอในการตรวจสอบการดำเนินการกะ ดูคำตอบของ @meshcollider แทน

ตกลง ฉันไม่แน่ใจว่าถูกต้องหรือไม่ แต่นี่คือสิ่งที่ฉันคิดขึ้นมาได้

ปรากมา circom 2.0.0;

แม่แบบ MAIN() {

    อินพุตสัญญาณ v;
    ประเภทเอาต์พุตสัญญาณ

    // กำหนดสัญญาณ `type`
    // เปลี่ยน 0bXXXYYYYY เป็น 0b00000XXX
    // v เป็นสัญญาณที่เชื่อถือได้
    พิมพ์ <-- v >> 5;

    // เตรียมการตรวจสอบข้อจำกัดสำหรับ `type`
    สัญญาณ three_upper_bits;
    // 0b11100000 = 0xE0
    // v เป็นสัญญาณที่เชื่อถือได้
    three_upper_bits <-- v & 0xE0; // 3 บิตบนของ v (0bXXX00000) v เป็นได้แค่ 8 บิต

    // should_only_be_lower_bits คือ 0b000YYYYY
    // เราได้รับจาก 0bXXXYYYYY - 0bXXX00000 เพื่อรับ 0b000YYYYY
    var should_only_be_lower_bits = v - three_upper_bits;
    // เรากำลังตรวจสอบว่า should_only_be_lower_bits มีค่าน้อยกว่า 32 เท่านั้น (0b00011111)
    // ที่ยืนยันว่า three_upper_bits นั้นเก่าแก่และไม่ได้ยุ่งเหยิง
    // ถ้ามีใครไปยุ่งกับ three_upper_bits, should_only_be_lower_bits จะมีบิตที่สูงกว่า
    // และมากกว่า 32 (0b00011111).
    // โดยการทำเช่นนั้น เรายืนยันด้วยการเข้ารหัสว่า should_only_be_lower_bits อยู่ในรูปแบบ 0b000YYYYY
    สัญญาณ upper_bit_1;
    สัญญาณ upper_bit_2;
    สัญญาณ upper_bit_3;
    upper_bit_1 <-- should_only_be_lower_bits & 0x80; //0b10000000. สัญญาณนี้สามารถเป็น 0bX0000000
    upper_bit_2 <-- should_only_be_lower_bits & 0x40; //0b01000000. สัญญาณนี้สามารถเป็น 0b0X000000
    upper_bit_3 <-- should_only_be_lower_bits & 0x20; //0b00100000. สัญญาณนี้สามารถเป็น 0b00X00000
    upper_bit_1 === 0; // ยืนยันว่า 0bX0000000 คือ 0b00000000
    upper_bit_2 === 0; // ยืนยันว่า 0b0X000000 คือ 0b00000000
    upper_bit_3 === 0; // ยืนยันว่า 0b00X00000 คือ 0b00000000

    // สร้างข้อจำกัดสำหรับสัญญาณประเภท
    // 2^5 = 32
    พิมพ์ * 32 === three_upper_bits;
}

ส่วนประกอบหลัก = MAIN();

ความคิดเห็นผ่านความคิดของฉัน แต่โดยพื้นฐานแล้วฉันตรวจสอบการกำหนดสัญญาณด้วยข้อจำกัดการลบ/การคูณ

meshcollider avatar
gb flag
คุณสามารถรวมการตรวจสอบบิต `upper_bit_` สามรายการเข้าด้วยกันหากคุณใช้ 0xE0
nz flag
นั่นเป็นเรื่องจริง ฉันคิดว่าฉันต้องตรวจสอบอีกครั้งว่า v เป็นเพียง 8 บิตและไม่เกินนั้น
meshcollider avatar
gb flag
นอกจากนี้ คุณอาจเพิ่งซ่อนปัญหาไว้ที่นี่: `three_upper_bits
nz flag
@meshcollider นั่นเป็นจุดที่ดีมาก! ฉันไม่รู้ว่าฉันกำลังทำอะไรอยู่ ฉันยังไม่แน่ใจว่าวิธีใดที่ปลอดภัยในการตรวจสอบการดำเนินการ `>> 5`
Score:0
ธง nz

circomlib/circuits/sha256/shift.circom มี ส่วนประกอบที่ทำกะขวา

    var InputBits = 8;
    var ResultBits = 3;

    // แปลง v เป็นบิต
    ส่วนประกอบ n2b = Num2Bits (InputBits);
    n2b.in <== v;

    // กะ
    ส่วนประกอบ shr = ShR (InputBits, 5); //วี>>5
    สำหรับ (var i = 0; i < InputBits; i++) {
        shr.in[i] <== n2b.out[i];
    }

    // แปลงกลับเป็นตัวเลข
    ส่วนประกอบ b2n = Bits2Num (ResultBits);
    สำหรับ (var i = 0; i <ResultBits; i++) {
        b2n.in[i] <== shr.out[i];
    }
    พิมพ์ <== b2n.out;

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา