From 2e970d4505fbc91abddfaa29642a2dbe1a43b85e Mon Sep 17 00:00:00 2001 From: skoupidi Date: Wed, 19 Jun 2024 20:07:50 +0300 Subject: [PATCH] script/research/gg: updated to latest darkfi code --- script/research/gg/Cargo.toml | 9 ++--- script/research/gg/src/main.rs | 63 ++++++++++++++++++++++++++-------- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/script/research/gg/Cargo.toml b/script/research/gg/Cargo.toml index b8f5dbf6e..7bffe47a4 100644 --- a/script/research/gg/Cargo.toml +++ b/script/research/gg/Cargo.toml @@ -3,7 +3,7 @@ name = "gg" version = "0.4.1" description = """\ Genesis Generator, a command-line utility to generate,\ -display and verify a bs58 encoded Darkfi genesis block\ +display and verify a base64 encoded Darkfi genesis block\ """ authors = ["Dyne.org foundation "] repository = "https://github.com/darkrenaissance/darkfi" @@ -14,7 +14,7 @@ edition = "2021" [dependencies] # Darkfi -darkfi = {path = "../../../", features = ["validator"]} +darkfi = {path = "../../../", features = ["bs58", "validator"]} darkfi_money_contract = {path = "../../../src/contract/money", features = ["no-entrypoint", "client"]} darkfi-contract-test-harness = {path = "../../../src/contract/test-harness"} darkfi-sdk = {path = "../../../src/sdk"} @@ -29,8 +29,3 @@ sled = "0.34.7" [patch.crates-io] halo2_proofs = {git="https://github.com/parazyd/halo2", branch="v4"} halo2_gadgets = {git="https://github.com/parazyd/halo2", branch="v4"} -blake2b_simd = {git="https://github.com/parazyd/blake2_simd", branch="impl-common"} - -[lints] -workspace = true - diff --git a/script/research/gg/src/main.rs b/script/research/gg/src/main.rs index 1dc35c06d..055697db5 100644 --- a/script/research/gg/src/main.rs +++ b/script/research/gg/src/main.rs @@ -30,7 +30,7 @@ use darkfi::{ tx::{ContractCallLeaf, Transaction, TransactionBuilder}, util::{encoding::base64, parse::decode_base10, path::expand_path, time::Timestamp}, validator::{utils::deploy_native_contracts, verification::verify_genesis_block}, - zk::{empty_witnesses, halo2::Field, ProvingKey, ZkCircuit}, + zk::{empty_witnesses, ProvingKey, ZkCircuit}, zkas::ZkBinary, Result, }; @@ -40,7 +40,7 @@ use darkfi_money_contract::{ }; use darkfi_sdk::{ crypto::{contract_id::MONEY_CONTRACT_ID, FuncId, Keypair, SecretKey}, - pasta::pallas, + pasta::{group::ff::PrimeField, pallas}, ContractCall, }; use darkfi_serial::{deserialize_async, serialize_async, AsyncEncodable}; @@ -76,6 +76,12 @@ enum Subcmd { GenerateTx { /// Amount to mint for this genesis transaction amount: String, + + /// Optional contract spend hook to use + spend_hook: Option, + + /// Optional user data to use + user_data: Option, }, } @@ -98,7 +104,8 @@ async fn main() -> Result<()> { match args.command { Subcmd::Display => { let genesis_block = read_block().await; - println!("{genesis_block:#?}"); + // TODO: display in more details + println!("{genesis_block:?}"); } Subcmd::Generate { txs_folder, genesis_timestamp } => { @@ -148,28 +155,56 @@ async fn main() -> Result<()> { // Create an overlay over whole blockchain let blockchain = Blockchain::new(&sled_db)?; let overlay = BlockchainOverlay::new(&blockchain)?; - deploy_native_contracts(&overlay).await?; + deploy_native_contracts(&overlay, 0).await?; - verify_genesis_block(&overlay, &genesis_block).await?; + verify_genesis_block(&overlay, &genesis_block, 0).await?; println!("Genesis block {hash} verified successfully!"); } - Subcmd::GenerateTx { amount } => { + Subcmd::GenerateTx { amount, spend_hook, user_data } => { let mut buf = String::new(); stdin().read_to_string(&mut buf)?; - let Ok(bytes) = bs58::decode(&buf.trim()).into_vec() else { - eprintln!("Error: Failed to decode stdin buffer"); - exit(2); - }; - let secret = deserialize_async::(&bytes).await?; + let secret = SecretKey::from_str(buf.trim())?; let keypair = Keypair::new(secret); if let Err(e) = f64::from_str(&amount) { eprintln!("Invalid amount: {e:?}"); exit(2); } - let amount = decode_base10(&amount, 8, false)?; + let amount = decode_base10(&amount, 8, true)?; + + let spend_hook = match spend_hook { + Some(s) => match FuncId::from_str(&s) { + Ok(s) => Some(s), + Err(e) => { + eprintln!("Invalid spend hook: {e:?}"); + exit(2); + } + }, + None => None, + }; + + let user_data = match user_data { + Some(u) => { + let bytes: [u8; 32] = match bs58::decode(&u).into_vec()?.try_into() { + Ok(b) => b, + Err(e) => { + eprintln!("Invalid user data: {e:?}"); + exit(2); + } + }; + + match pallas::Base::from_repr(bytes).into() { + Some(v) => Some(v), + None => { + eprintln!("Invalid user data"); + exit(2); + } + } + } + None => None, + }; // Grab mint proving keys and zkbin let (pks, _) = vks::get_cached_pks_and_vks()?; @@ -193,8 +228,8 @@ async fn main() -> Result<()> { let builder = GenesisMintCallBuilder { keypair, amount, - spend_hook: FuncId::none(), - user_data: pallas::Base::ZERO, + spend_hook, + user_data, mint_zkbin, mint_pk, };