From e8475be83918fe80a4ead6aead34018f7e98ea00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hakan=20Karaku=C5=9F?= Date: Mon, 27 Nov 2023 16:15:24 +0300 Subject: [PATCH] from bristol function --- bristol/add.txt | 381 +++++++++++++++++++++++++++++++++++++++++++++++ bristol/test.txt | 8 + src/circuit.rs | 100 ++++++++++++- src/gates.rs | 48 +++++- src/lib.rs | 1 + src/main.rs | 5 + src/utils.rs | 9 ++ src/wire.rs | 1 + 8 files changed, 547 insertions(+), 6 deletions(-) create mode 100644 bristol/add.txt create mode 100644 bristol/test.txt diff --git a/bristol/add.txt b/bristol/add.txt new file mode 100644 index 0000000..cf2d6f4 --- /dev/null +++ b/bristol/add.txt @@ -0,0 +1,381 @@ +376 504 +2 64 64 +1 64 + +2 1 63 127 376 XOR +2 1 62 126 375 XOR +2 1 61 125 374 XOR +2 1 60 124 373 XOR +2 1 59 123 372 XOR +2 1 58 122 371 XOR +2 1 57 121 370 XOR +2 1 56 120 369 XOR +2 1 55 119 368 XOR +2 1 54 118 367 XOR +2 1 53 117 366 XOR +2 1 52 116 365 XOR +2 1 51 115 364 XOR +2 1 50 114 363 XOR +2 1 49 113 362 XOR +2 1 48 112 361 XOR +2 1 47 111 360 XOR +2 1 46 110 359 XOR +2 1 45 109 358 XOR +2 1 44 108 357 XOR +2 1 43 107 356 XOR +2 1 42 106 355 XOR +2 1 41 105 354 XOR +2 1 40 104 353 XOR +2 1 39 103 352 XOR +2 1 38 102 351 XOR +2 1 37 101 350 XOR +2 1 36 100 349 XOR +2 1 35 99 348 XOR +2 1 34 98 347 XOR +2 1 33 97 346 XOR +2 1 32 96 345 XOR +2 1 31 95 344 XOR +2 1 30 94 343 XOR +2 1 29 93 342 XOR +2 1 28 92 341 XOR +2 1 27 91 340 XOR +2 1 26 90 339 XOR +2 1 25 89 338 XOR +2 1 24 88 337 XOR +2 1 23 87 336 XOR +2 1 22 86 335 XOR +2 1 21 85 334 XOR +2 1 20 84 333 XOR +2 1 19 83 332 XOR +2 1 18 82 331 XOR +2 1 17 81 330 XOR +2 1 16 80 329 XOR +2 1 15 79 328 XOR +2 1 14 78 327 XOR +2 1 13 77 326 XOR +2 1 12 76 325 XOR +2 1 11 75 324 XOR +2 1 10 74 323 XOR +2 1 9 73 322 XOR +2 1 8 72 321 XOR +2 1 7 71 320 XOR +2 1 6 70 319 XOR +2 1 5 69 318 XOR +2 1 4 68 317 XOR +2 1 3 67 316 XOR +2 1 2 66 315 XOR +2 1 1 65 314 XOR +2 1 0 64 440 XOR +2 1 0 64 377 AND +2 1 65 377 129 XOR +2 1 1 377 128 XOR +2 1 128 129 130 AND +2 1 130 377 378 XOR +2 1 66 378 132 XOR +2 1 2 378 131 XOR +2 1 131 132 133 AND +2 1 133 378 379 XOR +2 1 67 379 135 XOR +2 1 3 379 134 XOR +2 1 134 135 136 AND +2 1 136 379 380 XOR +2 1 68 380 138 XOR +2 1 4 380 137 XOR +2 1 137 138 139 AND +2 1 139 380 381 XOR +2 1 69 381 141 XOR +2 1 5 381 140 XOR +2 1 140 141 142 AND +2 1 142 381 382 XOR +2 1 70 382 144 XOR +2 1 6 382 143 XOR +2 1 143 144 145 AND +2 1 145 382 383 XOR +2 1 71 383 147 XOR +2 1 7 383 146 XOR +2 1 146 147 148 AND +2 1 148 383 384 XOR +2 1 72 384 150 XOR +2 1 8 384 149 XOR +2 1 149 150 151 AND +2 1 151 384 385 XOR +2 1 73 385 153 XOR +2 1 9 385 152 XOR +2 1 152 153 154 AND +2 1 154 385 386 XOR +2 1 74 386 156 XOR +2 1 10 386 155 XOR +2 1 155 156 157 AND +2 1 157 386 387 XOR +2 1 75 387 159 XOR +2 1 11 387 158 XOR +2 1 158 159 160 AND +2 1 160 387 388 XOR +2 1 76 388 162 XOR +2 1 12 388 161 XOR +2 1 161 162 163 AND +2 1 163 388 389 XOR +2 1 77 389 165 XOR +2 1 13 389 164 XOR +2 1 164 165 166 AND +2 1 166 389 390 XOR +2 1 78 390 168 XOR +2 1 14 390 167 XOR +2 1 167 168 169 AND +2 1 169 390 391 XOR +2 1 79 391 171 XOR +2 1 15 391 170 XOR +2 1 170 171 172 AND +2 1 172 391 392 XOR +2 1 80 392 174 XOR +2 1 16 392 173 XOR +2 1 173 174 175 AND +2 1 175 392 393 XOR +2 1 81 393 177 XOR +2 1 17 393 176 XOR +2 1 176 177 178 AND +2 1 178 393 394 XOR +2 1 82 394 180 XOR +2 1 18 394 179 XOR +2 1 179 180 181 AND +2 1 181 394 395 XOR +2 1 83 395 183 XOR +2 1 19 395 182 XOR +2 1 182 183 184 AND +2 1 184 395 396 XOR +2 1 84 396 186 XOR +2 1 20 396 185 XOR +2 1 185 186 187 AND +2 1 187 396 397 XOR +2 1 85 397 189 XOR +2 1 21 397 188 XOR +2 1 188 189 190 AND +2 1 190 397 398 XOR +2 1 86 398 192 XOR +2 1 22 398 191 XOR +2 1 191 192 193 AND +2 1 193 398 399 XOR +2 1 87 399 195 XOR +2 1 23 399 194 XOR +2 1 194 195 196 AND +2 1 196 399 400 XOR +2 1 88 400 198 XOR +2 1 24 400 197 XOR +2 1 197 198 199 AND +2 1 199 400 401 XOR +2 1 89 401 201 XOR +2 1 25 401 200 XOR +2 1 200 201 202 AND +2 1 202 401 402 XOR +2 1 90 402 204 XOR +2 1 26 402 203 XOR +2 1 203 204 205 AND +2 1 205 402 403 XOR +2 1 91 403 207 XOR +2 1 27 403 206 XOR +2 1 206 207 208 AND +2 1 208 403 404 XOR +2 1 341 404 468 XOR +2 1 92 404 210 XOR +2 1 28 404 209 XOR +2 1 209 210 211 AND +2 1 211 404 405 XOR +2 1 342 405 469 XOR +2 1 340 403 467 XOR +2 1 93 405 213 XOR +2 1 29 405 212 XOR +2 1 212 213 214 AND +2 1 214 405 406 XOR +2 1 343 406 470 XOR +2 1 339 402 466 XOR +2 1 94 406 216 XOR +2 1 30 406 215 XOR +2 1 215 216 217 AND +2 1 217 406 407 XOR +2 1 338 401 465 XOR +2 1 31 407 218 XOR +2 1 344 407 471 XOR +2 1 337 400 464 XOR +2 1 95 407 219 XOR +2 1 218 219 220 AND +2 1 220 407 408 XOR +2 1 345 408 472 XOR +2 1 336 399 463 XOR +2 1 96 408 222 XOR +2 1 32 408 221 XOR +2 1 221 222 223 AND +2 1 223 408 409 XOR +2 1 346 409 473 XOR +2 1 335 398 462 XOR +2 1 97 409 225 XOR +2 1 33 409 224 XOR +2 1 224 225 226 AND +2 1 226 409 410 XOR +2 1 347 410 474 XOR +2 1 334 397 461 XOR +2 1 98 410 228 XOR +2 1 34 410 227 XOR +2 1 227 228 229 AND +2 1 229 410 411 XOR +2 1 333 396 460 XOR +2 1 35 411 230 XOR +2 1 348 411 475 XOR +2 1 332 395 459 XOR +2 1 99 411 231 XOR +2 1 230 231 232 AND +2 1 232 411 412 XOR +2 1 349 412 476 XOR +2 1 331 394 458 XOR +2 1 100 412 234 XOR +2 1 36 412 233 XOR +2 1 233 234 235 AND +2 1 235 412 413 XOR +2 1 350 413 477 XOR +2 1 330 393 457 XOR +2 1 101 413 237 XOR +2 1 37 413 236 XOR +2 1 236 237 238 AND +2 1 238 413 414 XOR +2 1 351 414 478 XOR +2 1 329 392 456 XOR +2 1 102 414 240 XOR +2 1 38 414 239 XOR +2 1 239 240 241 AND +2 1 241 414 415 XOR +2 1 328 391 455 XOR +2 1 39 415 242 XOR +2 1 352 415 479 XOR +2 1 327 390 454 XOR +2 1 103 415 243 XOR +2 1 242 243 244 AND +2 1 244 415 416 XOR +2 1 353 416 480 XOR +2 1 326 389 453 XOR +2 1 104 416 246 XOR +2 1 40 416 245 XOR +2 1 245 246 247 AND +2 1 247 416 417 XOR +2 1 354 417 481 XOR +2 1 325 388 452 XOR +2 1 105 417 249 XOR +2 1 41 417 248 XOR +2 1 248 249 250 AND +2 1 250 417 418 XOR +2 1 355 418 482 XOR +2 1 324 387 451 XOR +2 1 106 418 252 XOR +2 1 42 418 251 XOR +2 1 251 252 253 AND +2 1 253 418 419 XOR +2 1 323 386 450 XOR +2 1 43 419 254 XOR +2 1 356 419 483 XOR +2 1 322 385 449 XOR +2 1 107 419 255 XOR +2 1 254 255 256 AND +2 1 256 419 420 XOR +2 1 357 420 484 XOR +2 1 321 384 448 XOR +2 1 108 420 258 XOR +2 1 44 420 257 XOR +2 1 257 258 259 AND +2 1 259 420 421 XOR +2 1 358 421 485 XOR +2 1 320 383 447 XOR +2 1 109 421 261 XOR +2 1 45 421 260 XOR +2 1 260 261 262 AND +2 1 262 421 422 XOR +2 1 359 422 486 XOR +2 1 319 382 446 XOR +2 1 110 422 264 XOR +2 1 46 422 263 XOR +2 1 263 264 265 AND +2 1 265 422 423 XOR +2 1 318 381 445 XOR +2 1 47 423 266 XOR +2 1 360 423 487 XOR +2 1 317 380 444 XOR +2 1 111 423 267 XOR +2 1 266 267 268 AND +2 1 268 423 424 XOR +2 1 361 424 488 XOR +2 1 316 379 443 XOR +2 1 112 424 270 XOR +2 1 48 424 269 XOR +2 1 269 270 271 AND +2 1 271 424 425 XOR +2 1 362 425 489 XOR +2 1 315 378 442 XOR +2 1 113 425 273 XOR +2 1 49 425 272 XOR +2 1 272 273 274 AND +2 1 274 425 426 XOR +2 1 363 426 490 XOR +2 1 314 377 441 XOR +2 1 114 426 276 XOR +2 1 50 426 275 XOR +2 1 275 276 277 AND +2 1 277 426 427 XOR +2 1 115 427 279 XOR +2 1 51 427 278 XOR +2 1 278 279 280 AND +2 1 280 427 428 XOR +2 1 116 428 282 XOR +2 1 52 428 281 XOR +2 1 281 282 283 AND +2 1 283 428 429 XOR +2 1 117 429 285 XOR +2 1 53 429 284 XOR +2 1 284 285 286 AND +2 1 286 429 430 XOR +2 1 118 430 288 XOR +2 1 54 430 287 XOR +2 1 287 288 289 AND +2 1 289 430 431 XOR +2 1 119 431 291 XOR +2 1 55 431 290 XOR +2 1 290 291 292 AND +2 1 292 431 432 XOR +2 1 120 432 294 XOR +2 1 56 432 293 XOR +2 1 293 294 295 AND +2 1 295 432 433 XOR +2 1 370 433 497 XOR +2 1 121 433 297 XOR +2 1 57 433 296 XOR +2 1 296 297 298 AND +2 1 298 433 434 XOR +2 1 371 434 498 XOR +2 1 369 432 496 XOR +2 1 122 434 300 XOR +2 1 58 434 299 XOR +2 1 299 300 301 AND +2 1 301 434 435 XOR +2 1 372 435 499 XOR +2 1 368 431 495 XOR +2 1 123 435 303 XOR +2 1 59 435 302 XOR +2 1 302 303 304 AND +2 1 304 435 436 XOR +2 1 367 430 494 XOR +2 1 60 436 305 XOR +2 1 373 436 500 XOR +2 1 366 429 493 XOR +2 1 124 436 306 XOR +2 1 305 306 307 AND +2 1 307 436 437 XOR +2 1 374 437 501 XOR +2 1 365 428 492 XOR +2 1 125 437 309 XOR +2 1 61 437 308 XOR +2 1 308 309 310 AND +2 1 310 437 438 XOR +2 1 375 438 502 XOR +2 1 364 427 491 XOR +2 1 126 438 312 XOR +2 1 62 438 311 XOR +2 1 311 312 313 AND +2 1 313 438 439 XOR +2 1 376 439 503 XOR + diff --git a/bristol/test.txt b/bristol/test.txt new file mode 100644 index 0000000..339f4e8 --- /dev/null +++ b/bristol/test.txt @@ -0,0 +1,8 @@ +278356 78623 +2 32 32 +1 32 + +2 1 10 15 16 NOT +2 1 15 17 18 NOT + + diff --git a/src/circuit.rs b/src/circuit.rs index 61326c8..088766f 100644 --- a/src/circuit.rs +++ b/src/circuit.rs @@ -1,10 +1,13 @@ -use crate::{traits::{gate::GateTrait, wire::WireTrait}, gates::NotGate}; +use std::collections::HashMap; + +use crate::{traits::{gate::GateTrait, circuit::CircuitTrait}, gates::{NotGate, AndGate, XorGate}, wire::Wire}; +use crate::utils::read_lines; pub struct Circuit { pub input_sizes: Vec, pub output_sizes: Vec, pub gates: Vec>, - pub wires: Vec> + pub wires: Vec } impl Circuit { @@ -18,6 +21,93 @@ impl Circuit { } } +impl CircuitTrait for Circuit { + fn evaluate(&self) { + + } + + fn from_bristol(file: &str) -> Self { + let mut nog: usize = 0; // number of gates + let mut now: usize = 0; // number of wires + let mut input_sizes = Vec::::new(); + let mut output_sizes = Vec::::new(); + let mut gates = Vec::>::new(); + let mut wire_indices = HashMap::new(); + + for (i, line) in read_lines(file).unwrap().enumerate() { + if let Ok(line_str) = line { + if i == 0 { + let mut words = line_str.split_whitespace(); + nog = words.next().unwrap().parse().unwrap(); + now = words.next().unwrap().parse().unwrap(); + } + else if i == 1 { + let mut words = line_str.split_whitespace(); + for _ in 0..words.next().unwrap().parse().unwrap() { + let x: usize = words.next().unwrap().parse().unwrap(); + input_sizes.push(x); + } + } + else if i == 2 { + let mut words = line_str.split_whitespace(); + for _ in 0..words.next().unwrap().parse().unwrap() { + let x: usize = words.next().unwrap().parse().unwrap(); + output_sizes.push(x); + } + } + else if line_str != "" { + let mut words = line_str.split_whitespace(); + let noi = words.next().unwrap().parse().unwrap(); // number of inputs + let noo = words.next().unwrap().parse().unwrap(); // number of outputs + let input_wires = (0..noi).map(|_| wire_indices.entry(words.next().unwrap().parse::().unwrap()).or_insert(Wire::new()).to_owned()).collect(); + let output_wires = (0..noo).map(|_| wire_indices.entry(words.next().unwrap().parse::().unwrap()).or_insert(Wire::new()).to_owned()).collect(); + let gate_type = words.next().unwrap(); + + if gate_type.to_lowercase() == "not" { + let gate = NotGate { + input_wires, + output_wires, + }; + gates.push(Box::new(gate)); + } + else if gate_type.to_lowercase() == "and" { + let gate = AndGate { + input_wires, + output_wires, + }; + gates.push(Box::new(gate)); + } + else if gate_type.to_lowercase() == "xor" { + let gate = XorGate { + input_wires, + output_wires, + }; + gates.push(Box::new(gate)); + } + else { + panic!("unknown gate type"); + } + } + } + } + + assert_eq!(nog, gates.len()); + assert_eq!(wire_indices.keys().min().unwrap().to_owned(), 0); + assert_eq!(wire_indices.keys().max().unwrap().to_owned(), now - 1); + + return Circuit { + input_sizes, + output_sizes, + gates, + wires: wire_indices.values().cloned().collect::>(), + } + } + + fn generate_commitment_tree(&self) { + + } +} + #[cfg(test)] mod tests { use super::*; @@ -27,5 +117,11 @@ mod tests { let circuit = Circuit::new(); assert!(circuit.output_sizes[0] == 32); } + + #[test] + fn test_bristol() { + let circuit = Circuit::from_bristol("bristol/add.txt"); + assert!(circuit.output_sizes[0] == 64); + } } diff --git a/src/gates.rs b/src/gates.rs index 048af0a..fd54cf4 100644 --- a/src/gates.rs +++ b/src/gates.rs @@ -3,12 +3,12 @@ use crate::{wire::Wire, traits::gate::GateTrait}; // Every gate has a type parameter COM, which is a bit commitment scheme which can be hash based or schnorr based. // Every gate has an array of input wire pointers. pub struct NotGate { - pub input_wires: Vec<*mut Wire>, - pub output_wires: Vec<*mut Wire>, + pub input_wires: Vec, + pub output_wires: Vec, } impl NotGate { - pub fn new(input_wires: Vec<*mut Wire>, output_wires: Vec<*mut Wire>) -> Self { + pub fn new(input_wires: Vec, output_wires: Vec) -> Self { return NotGate { input_wires, output_wires, @@ -20,4 +20,44 @@ impl GateTrait for NotGate { fn create_challenge_script(&self) -> String { return "NotGate".to_string(); } -} \ No newline at end of file +} + +pub struct AndGate { + pub input_wires: Vec, + pub output_wires: Vec, +} + +impl AndGate { + pub fn new(input_wires: Vec, output_wires: Vec) -> Self { + return AndGate { + input_wires, + output_wires, + } + } +} + +impl GateTrait for AndGate { + fn create_challenge_script(&self) -> String { + return "NotGate".to_string(); + } +} + +pub struct XorGate { + pub input_wires: Vec, + pub output_wires: Vec, +} + +impl XorGate { + pub fn new(input_wires: Vec, output_wires: Vec) -> Self { + return XorGate { + input_wires, + output_wires, + } + } +} + +impl GateTrait for XorGate { + fn create_challenge_script(&self) -> String { + return "NotGate".to_string(); + } +} diff --git a/src/lib.rs b/src/lib.rs index 33fbd5a..a7b4d25 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,3 +2,4 @@ pub mod traits; pub mod gates; pub mod wire; pub mod circuit; +pub mod utils; diff --git a/src/main.rs b/src/main.rs index e7a11a9..e4a8856 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,8 @@ +use bitvmrs::{circuit::Circuit, traits::circuit::CircuitTrait}; + fn main() { println!("Hello, world!"); + let circuit = Circuit::from_bristol("bristol/add.txt"); + println!("{}", circuit.input_sizes[0]); + } diff --git a/src/utils.rs b/src/utils.rs index e69de29..6e47346 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -0,0 +1,9 @@ +use std::fs::File; +use std::io::{self, BufRead}; +use std::path::Path; + +pub fn read_lines

(filename: P) -> io::Result>> +where P: AsRef, { + let file = File::open(filename)?; + Ok(io::BufReader::new(file).lines()) +} diff --git a/src/wire.rs b/src/wire.rs index 6ed05bb..228a3da 100644 --- a/src/wire.rs +++ b/src/wire.rs @@ -7,6 +7,7 @@ use bitcoin::ScriptBuf; use bitcoin::Target; use rand::Rng; +#[derive(Clone, Debug)] pub struct Wire { pub preimages: Option<[Target; 2]>, pub hashes: [Target; 2],