Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wip: automated generation of random txplans for effecthash testing #4879

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion crates/core/transaction/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ penumbra-proto = {workspace = true, default-features = true}
penumbra-sct = {workspace = true, default-features = false}
penumbra-shielded-pool = {workspace = true, default-features = false}
penumbra-stake = {workspace = true, default-features = false}
penumbra-tct = {workspace = true, default-features = true}
penumbra-tct = {workspace = true, default-features = true, features = ["arbitrary"] }
penumbra-txhash = {workspace = true, default-features = false}
poseidon377 = {workspace = true, features = ["r1cs"]}
rand = {workspace = true}
Expand All @@ -62,6 +62,7 @@ sha2 = {workspace = true}
thiserror = {workspace = true}
tokio = {workspace = true, features = ["full"], optional = true}
tracing = {workspace = true}
proptest = {workspace = true}

[dev-dependencies]
proptest = {workspace = true}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
use std::fs::File;

use decaf377::{Fq, Fr};
use decaf377_rdsa::{SpendAuth, VerificationKeyBytes};
use penumbra_asset::asset::Id;
use penumbra_fee::Fee;
use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey};
use penumbra_keys::{Address, FullViewingKey};
use penumbra_num::Amount;
use penumbra_proto::DomainType;
use penumbra_sct::epoch::Epoch;
use penumbra_shielded_pool::{Note, OutputPlan, SpendPlan};
use penumbra_stake::{Delegate, IdentityKey, Penalty, Undelegate, UndelegateClaimPlan};
use penumbra_transaction::{ActionPlan, TransactionParameters, TransactionPlan};
use proptest::prelude::*;
use proptest::strategy::ValueTree;
use proptest::test_runner::{Config, TestRunner};
use rand_core::OsRng;
use std::io::Write;

fn amount_strategy() -> impl Strategy<Value = Amount> {
let inner_uint_range = 0u128..1_000_000_000_000_000_000u128;
inner_uint_range.prop_map(|uint| Amount::from_le_bytes(uint.to_le_bytes()))
}

fn asset_id_strategy() -> impl Strategy<Value = Id> {
Just(*penumbra_asset::STAKING_TOKEN_ASSET_ID)
}

fn value_strategy() -> impl Strategy<Value = penumbra_asset::Value> {
(asset_id_strategy(), amount_strategy())
.prop_map(|(asset_id, amount)| penumbra_asset::Value { amount, asset_id })
}

fn address_strategy() -> impl Strategy<Value = Address> {
// normally we would use address::dummy, but this seems to not work properly
// for some reason (invalid key errors on computing effecthash.)
prop::strategy::LazyJust::new(|| {
let seed_phrase = SeedPhrase::generate(&mut OsRng);
let sk = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0));
let addr = sk.full_viewing_key().payment_address(0u32.into()).0;

addr
})
}

fn note_strategy(addr: Address) -> impl Strategy<Value = Note> {
value_strategy().prop_map(move |value| Note::generate(&mut OsRng, &addr, value))
}

fn spend_plan_strategy(fvk: &FullViewingKey) -> impl Strategy<Value = SpendPlan> {
let tct_strategy = any::<penumbra_tct::Position>();
let note_strategy = note_strategy(fvk.incoming().payment_address(0u32.into()).0);

(tct_strategy, note_strategy)
.prop_map(|(tct_pos, note)| SpendPlan::new(&mut OsRng, note, tct_pos))
}

fn output_plan_strategy() -> impl Strategy<Value = OutputPlan> {
(value_strategy(), address_strategy())
.prop_map(|(value, address)| OutputPlan::new(&mut OsRng, value, address))
}

fn identity_key_strategy() -> impl Strategy<Value = IdentityKey> {
let rand_bytes = prop::array::uniform32(any::<u8>());

rand_bytes.prop_map(|vk_bytes| IdentityKey(VerificationKeyBytes::<SpendAuth>::from(vk_bytes)))
}

fn delegate_plan_strategy() -> impl Strategy<Value = Delegate> {
let epoch_index_strategy = 0..10000u64;
let unbonded_amount_strategy = amount_strategy();
let delegation_amount_strategy = amount_strategy();

(
identity_key_strategy(),
epoch_index_strategy,
unbonded_amount_strategy,
delegation_amount_strategy,
)
.prop_map(
|(validator_identity, epoch_index, unbonded_amount, delegation_amount)| Delegate {
validator_identity,
epoch_index,
unbonded_amount,
delegation_amount,
},
)
}

fn undelegate_plan_strategy() -> impl Strategy<Value = Undelegate> {
let epoch_index_strategy = 0..10000u64;
let unbonded_amount_strategy = amount_strategy();
let delegation_amount_strategy = amount_strategy();
(
identity_key_strategy(),
epoch_index_strategy,
unbonded_amount_strategy,
delegation_amount_strategy,
)
.prop_map(
|(validator_identity, epoch_index, unbonded_amount, delegation_amount)| Undelegate {
validator_identity,
from_epoch: Epoch {
index: epoch_index,
start_height: epoch_index,
},
unbonded_amount,
delegation_amount,
},
)
}

fn undelegate_claim_plan_strategy() -> impl Strategy<Value = UndelegateClaimPlan> {
let penalty_bps = 0..100u64;
let unbonding_start_height_strategy = 1000..100000u64;
(
identity_key_strategy(),
penalty_bps,
amount_strategy(),
unbonding_start_height_strategy,
)
.prop_map(
|(validator_identity, penalty_bps, unbonding_amount, unbonding_start_height)| {
UndelegateClaimPlan {
validator_identity,
penalty: Penalty::from_bps(penalty_bps),
unbonding_amount,
balance_blinding: Fr::rand(&mut OsRng),
proof_blinding_r: Fq::rand(&mut OsRng),
proof_blinding_s: Fq::rand(&mut OsRng),
unbonding_start_height,
}
},
)
}

fn action_plan_strategy(fvk: &FullViewingKey) -> impl Strategy<Value = ActionPlan> {
prop_oneof![
spend_plan_strategy(fvk).prop_map(ActionPlan::Spend),
output_plan_strategy().prop_map(ActionPlan::Output),
delegate_plan_strategy().prop_map(ActionPlan::Delegate),
undelegate_plan_strategy().prop_map(ActionPlan::Undelegate),
undelegate_claim_plan_strategy().prop_map(ActionPlan::UndelegateClaim),
/*
validator_definition_strategy().prop_map(ActionPlan::ValidatorDefinition),
swap_plan_strategy().prop_map(ActionPlan::Swap),
swap_claim_plan_strategy().prop_map(ActionPlan::SwapClaim),
ibc_action_strategy().prop_map(ActionPlan::IbcAction),*/
]
}

fn actions_vec_strategy(fvk: &FullViewingKey) -> impl Strategy<Value = Vec<ActionPlan>> {
prop::collection::vec(action_plan_strategy(fvk), 2..5)
}

fn transaction_parameters_strategy() -> impl Strategy<Value = TransactionParameters> {
let expiry_height = 0u64..10000000000u64;
let chain_id = prop::string::string_regex(r"[a-z]+-[0-9]+").unwrap();
let fee = value_strategy().prop_map(|fee_value| Fee(fee_value));

(expiry_height, chain_id, fee).prop_map(|(expiry_height, chain_id, fee)| {
TransactionParameters {
expiry_height,
chain_id,
fee,
}
})
}

fn transaction_plan_strategy(fvk: &FullViewingKey) -> impl Strategy<Value = TransactionPlan> {
(actions_vec_strategy(fvk), transaction_parameters_strategy()).prop_map(|(actions, params)| {
TransactionPlan {
actions,
transaction_parameters: params,
detection_data: None,
memo: None,
}
})
}

fn main() {
let mut runner = TestRunner::new(Config::default());
let test_vectors_dir = "src/bin/test_vectors";
std::fs::create_dir_all(test_vectors_dir).expect("failed to create test vectors dir");

let rng = OsRng;

for i in 0..100 {
let seed_phrase = SeedPhrase::generate(rng);
let sk = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0));
let fvk = sk.full_viewing_key();
let value_tree = transaction_plan_strategy(fvk)
.new_tree(&mut runner)
.expect("Failed to create new tree");
let transaction_plan = value_tree.current();

let json_plan = serde_json::to_string_pretty(&transaction_plan)
.expect("should be able to json tx plan");

let transaction_plan_encoded = transaction_plan.encode_to_vec();
let effect_hash_hex = hex::encode(
transaction_plan
.effect_hash(fvk)
.expect("should be able to compute effect hash")
.0,
);

let json_file_path = format!("{}/transaction_plan_{}.json", test_vectors_dir, i);
let proto_file_path = format!("{}/transaction_plan_{}.proto", test_vectors_dir, i);
let hash_file_path = format!("{}/effect_hash_{}.txt", test_vectors_dir, i);

let mut json_file = File::create(&json_file_path).expect("Failed to create JSON file");
json_file
.write_all(json_plan.as_bytes())
.expect("Failed to write JSON file");
let mut proto_file =
File::create(&proto_file_path).expect("Failed to create Protobuf file");
proto_file
.write_all(&transaction_plan_encoded)
.expect("Failed to write Protobuf file");

// Write effect hash
let mut hash_file = File::create(&hash_file_path).expect("Failed to create hash file");
hash_file
.write_all(effect_hash_hex.as_bytes())
.expect("Failed to write hash file");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1b1a2a0899bb6efbbdc725348a82dbdd2ed428f2d72000db131b94f4386c6cfd11ee61bfc6d46265198d1a44368d459bd9a67f0faa9365acad4fa1c0ac384a4f
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
964bec149b3bf5781267aaad5e78103460bc2c62d59132b20bbcd22cb0103b50224e025858c134b11b5697f8861fd1a58046b2d17f99776bd49d20bda34036a7
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
74a8c160719b4fc67367f5715586886e49573887cd1223611747c619a9fd22ed13689403ff7733396e74ac6235a7bd16c3e7246447a5c07dfb8ff96c03efed73
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ea1d7ec765531d5ab7cc232915335d9dedbc99d34f967cc62f625bd50b057c8f80088d4720a5ab6aa08bda3574e06ba956ab1199b93493f06e2507c33da2ebb1
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
f431f39675459f24e0f55b804c006861566d71c413b67f26449960d02ea7c6db2d2ca04452d83b572a8118422c749f330a8c696702ed685fda8d922fbb40f0fb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
5f16fa81c67f0cfa82ba7b36d4af59bb49c2244ea994c0ac39b5a7d94c89ed7cdeb0b6dc9c5055be57171bf725206fcaf75a98a005a724bcc8062ec49d6627cf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2596c1bc2e8ab3173316bec2233e8b41d60f9d15eb3b461e7ecf499ca8424e09f98386cecbc0eca591f724b84a29886a95f0ee5faae222359c97fcd610b80c87
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
099beffcac0cfce7dc63ba535edb7938939b7b2d33775156e7a2aa074d26d980497b1e1488dd86617d8190351c6f100cf3264ef731971c756268a4670388e94f
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
f21dc1400593fad489dc10e62cbd9cfd425a47e2a4526b7059df52f1792458148fcafcc5a0ec7edb9c13663508d8bacf3f0802344300c3c5e2fbea835ea95b09
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a14bd6108af49c174528d091d2df5a60822c484f6406ebd77ffa74a8b63f0f1ae5e994f4a1825c2d03b3a3a5a1a02c16000f37309b744df50ae8310f5cd6a921
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
5fd499f27187aa244da984d848543f4a116f08baab91b75f2dbdac4816fc4522cd269893cbc9ac606c6703c705aaaf167ec7349927f21a988b1573a4f3451157
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7f8dce388a4598c2c31862532229222ca3459a29693e73e45a6b2e47dcb04ca07e749adf39452dea3f3dbbdaeb7f6605c42162c648dabfd82c0b32820afbd9d5
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
38a32dfba353c8f3bd2a0733dd50e8548a2283add679c73564bb77cac51607f0e862cd235d06a11e75d8f5d826d975f97c6e37e264e59e644c2ad8043e945401
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
f3d19ff514a12f89e7659d937d3ac03d8715cd7009d3f2123b453772c74e4e110124f85aa436dc8fe8a5ce93ddb42cca60c05bc9c5f8799a622db775317d916b
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
314aeb2e685dc088d8f7083803498def9e1b117de4248c780514ee86cf9ed915aa08b22f014f9a3ee9fe06f627a6460f6c989ac52512c99db8710ba25ea9d506
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
24fd8972b44cd5c3595652389a6444530793860c2294d7b172765f42204786d3777d4c6b5c88ba68a7a6fa26f0e58ea3fa34a2c39bf004584608d879eaf8e39a
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
9e7121675a3118ee1d82247cb935c826d19dc0cb1ff01b42d89ea257d212e867221226fafe06eb6dee616f3cdd4d3258bc09d70020c26277614760df15b3cfe7
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
aafc29e691b1e01e7062e10baff14559c8ed6a14ef64a190ee22153e3f0b2b98552e57c3c670c2668dd905b1b788c324c7f28dc5404eacd2439a1d379e5cb787
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ea04e0693c028b89167adf81f44479bb5175008bb2694003705f1c4daead1c3c63a887d8f64b6aecf978e4e11f21c6c3d18d052e8d894077853aa856226afa86
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ddf1df2f535c61fe871ca3036dbf923dd0be2e326d8899e6bb9447a4e3b1790e5836a437e1e3a868c37e7a77d9265ae2c970f930fb5aa7a09eec8aca49757315
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
359b63734502721127f807571d3de81a725165d0a17b85baabab66cdb75e78c81c3599e106e74b58abb940c17d7fc61321622efa40047798e36ee4b43f79da2c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2c2f694e0edde1cf18da36becf0db000d1d812136dd46ed8e32ca673e5cf202de4f1c55ab606a8a0e54ad00f9587f9ec13db054399668c90c47d6145ac7437ea
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
db11ba36d9839bf0d98f227a2d816565c80d9b8124bcb81f845759a81d79a065c6ee90110693a0430e190aef7c49f01500a47a34f1336728d8139080f0fda30b
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cbc8db384279a474bd7148953ac0158e158a98eb177df35014968761825286b48b0e1c68810da29ff8afdb20fa04e0f8f730a43ac9b4a5464e2498e31d1bcf5c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
338f4032930ab3399383f5c701cff7cad8803d6ecc0941122a61c5cd1e647b4c66c49536cda493dfc8978a69cfe5a5c4b8b1953a82970d4f7c03d228848fad95
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
f2c210eaadf0a7fd1cb1331d1e3fa66d0cd813abf13c406a4d3fd409af67c2059e01031815e0cb7edeba5baf7c729a036ece433774009610a5bb01b23f53f84e
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2303c2e7de6841e10841fbc8e80a18f7435fddefb5fa2ca3d37aae08f20f618deff45e46c293e2e567425e4b38e686560f416fe9906c8d74248e8b6d07b8e3e8
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
6146bf264751974ea18ff51f6fd318d1579ab4e774943d446687c9bc66176d855f2c2355ffb5fcb9eb034efaea7c9020b9e52ab30fff342207905979563f4c2d
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3d9eb30002f66dc1c4a589572893ccea0497bf53cdae1ec900a136615faaacd9d3d283a0218ad7a905796c3c5f7c9ef7fbef63c3109b4316b5d66196c3617e86
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0e361b869381b66b84b804ef6cb8fdb7bc67eb57c13449fa3cc6ec647787c899fc6c0bac63ce8a569e122d5e6fc52a1e67549c7dc085ad773a7fba94428e130f
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7a871ebb2bdab73c60558f035623cd7a32d0467731d12d7f53b84be40186ec1a087b56f0eddbc200cdd667c8bac0f09067bd91f56209893f14dd61880e1eb0d3
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7242ed69cbc9d9a7ecf37888d1108f1858cf66903ce4cedb56866bf3480563a683b130d0e1a2b213c802dcf90198d7873799c72f7b10eaa905860d7e9ec4e19d
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
d65b69c0f2131426aa2170fd67cf4047c9b5674a13bb43b9696ec38759f9eac668b89aa8555e74e66998d81a46de55cd4c44affa31de52796e06a68b6ef07b25
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a16ddb496f0f8e2af1323f34f0ca7b3e125dd22573444ed47ef56b35996e3f9dc07bdacb5b2c42998b942cd0f34c87debb1a13ad50b0a4a885b72e85b1edc25c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
80aebf7c768f0446e297fb696436656191eee38f2d3b05b99160a065e43dbcf45554a9d1266155ae66feb1e1ea12a6633e7172394e1146a447b89a550992c2d3
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
b172ba73aaff43dbd29501560059a888329866755d82ba5f21e69b58ae6be64cef83e24c743787b00f5552dcba39066955899a5b49646bb61203b7803ffe3c3c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1f2407c06a72f856cf55db77c2161b805c69eb311bfaa13c2052d7d6881b5bcf2939f3465d0e01b47f2ea030d352dbd6e954804cec39f16681128358f62c6b9a
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
dfcabd2d5ce7bd2d53405b8ab78557a049139ca69f626fdda01c5885d5b8139f668c7221d4e6246d2f2debe884f7573d50f1bd906183c0f8f47e2c6ce2b44132
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
884ee5b927942bcbf114585c91cb019b24566a5e064f3cfd36d58a33e801423829a7d17fed3d133162d2ac2a31fdc1f48ca2d77d58a9bf4e7537ab73dca5ad73
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
97caf5f94040a348a974412b53a3dfeda2abed5e8aaf691a4f3e8e106d6ce91e12385fca4a307fcd126573c399fbbbf6501dfd3a59e3e5865ce84418d0e70724
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fec7ba703d1ec151e4f0d62b78617d84609a7b2a5c666608fc0548c59cbade7bbd0f6fd077bfece016b5dd328b3b7dd8900820d3da3b52c3c5d810835fe6c79d
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
80143485f57bc9c8239ac7ec347be082d455fce1381c9149d6fbf6a86efa315753decc15d4a273e7a341938807590b84ddf1b8ad9fcf7eaf9c0b5793caceeba5
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
71a4652ca717e3b2349f89b02904de736d73e4c15e321d164bae932fbdea63d6864e05ace7998e13183c7586059ee18860e558e049449703cafaea1b732a5d55
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7cfe311f9edc6f759df1c55eec7f425164b0213fc99a3fb41e5bdb2fd5fb7e06e56a7815680b06eb5a1eb91c3de63208f7eba35a79e018607029de5962f47214
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3384738eb65010671935b1a0337372bffd7ac70241346bdc4512bdc78a0934ec2308a6c2565e2c91ba9196fbe5f72a08795cbfb229a08f556526bdc81b1da8f9
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
b30f87b8996f2f6bdbcd464efe75c4f6ea7266f5ee0c04eb9d748d7c4f35ede0b0d4699cfe9f05e5d7f628ca6bcd262d348c29cf2987a359bd1ea15620bfca63
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
939b625e41cb47bfa2e253b1cc0affe4a0999cd1987fc0799cfd4ce44bd0e45ca00d6e6b884724371cef301544ab2b3e6146f9af3604a0519d494be138ec7de2
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
5318d8ea1be541524b2a75f2d32d690d07c097238e34001f9d4dabf7d14af41bfc864add6bb5a3c234aa73c8c82b94c33d1c5beed464383f012f748c09d39da8
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2bc465cf90759f1a7d85bca1d53fddbd32028fb41cc8b5226d77eacf4f18c134092a464773a0a63489d5ff64f444d81f5ba0fbb81f37627bf2d28128867800c3
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
105478fad84d6f7402c1da6fda0b83ef1a62f47c94e094d101ba9c945ec601bd71364bfedb76232797a66b7f048c39014b46b4707b7a0f857a8991255ca6b809
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
41f0c84f882801d29e9e77a3a23a4180b8977b63845394ee204b1575b02d40cb5c6df5d456d74b1dfe5e95873811e2c0ebc935d43052b2cb2fb10bb79d884046
Loading
Loading