miden-objects 0.17.0-rc.5

Canonical Protobuf representations for Miden protocol objects
Documentation
use std::env;
use std::path::PathBuf;

use prost::Message;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("cargo::rerun-if-changed=proto");

    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?);
    let proto_dir = manifest_dir.join("proto");
    let files = [
        "primitives.proto",
        "block_number.proto",
        "account.proto",
        "asset.proto",
        "protocol_config.proto",
        "note.proto",
        "transaction.proto",
        "block.proto",
        "partial_blockchain.proto",
        "transaction_inputs.proto",
        "transaction_effects.proto",
        "batch.proto",
    ];

    let mut compiler = protox::Compiler::new([&proto_dir])?;
    compiler.include_imports(true);
    compiler.open_files(files.iter().map(|file| proto_dir.join(file)))?;
    let descriptors = compiler.file_descriptor_set();

    let out_dir = PathBuf::from(env::var("OUT_DIR")?);
    std::fs::write(out_dir.join("miden_objects_descriptor.bin"), descriptors.encode_to_vec())?;

    let mut prost = prost_build::Config::new();
    prost.out_dir(out_dir);
    for message in ["primitives.Felt", "primitives.Word", "primitives.ExecutionProof"] {
        prost.message_attribute(
            message,
            quote::quote!(#[derive(::miden_protobuf::ProtoDecodeValue)]).to_string(),
        );
    }
    miden_protobuf::build::configure_proto_decode_fields(
        &mut prost,
        &descriptors,
        [
            ".primitives.MastForest",
            ".account.AccountId",
            ".account.AccountIdV1",
            ".transaction.TransactionInputs",
            ".transaction.TransactionInputsV1",
            ".transaction.ProvenBatch",
            ".transaction.ProposedBatch",
            ".transaction.ProvenTransaction",
            ".blockchain.SignedBlock",
            ".blockchain.BlockBody",
            ".blockchain.OutputNoteBatch",
            ".blockchain.IndexedOutputNote",
            ".blockchain.BlockAccountUpdate",
            ".transaction.BatchAccountUpdate",
            ".transaction.TxAccountUpdate",
            ".transaction.InputNotes",
            ".transaction.InputNote",
            ".transaction.AuthenticatedInputNote",
            ".transaction.OutputNote",
            ".transaction.RawOutputNote",
            ".transaction.RawOutputNotes",
            ".transaction.PublicOutputNote",
            ".note.Note",
            ".note.PartialNote",
            ".note.PartialNoteMetadata",
            ".blockchain.PartialBlockchain",
            ".blockchain.BlockHeader",
            ".blockchain.ValidatorConfig",
            ".primitives.Signature",
            ".primitives.PublicKey",
            ".account.PartialAccount",
            ".account.PartialVault",
            ".account.PartialStorage",
            ".account.PartialStorageMap",
            ".primitives.PartialSmt",
            ".primitives.SmtOpening",
            ".primitives.IndexedSmtLeaf",
            ".primitives.SmtLeaf",
            ".account.AccountUpdateDetails",
            ".account.AccountPatch",
            ".account.AccountStoragePatch",
            ".account.StorageSlotPatch",
            ".account.StorageValuePatch",
            ".transaction.TransactionHeader",
            ".transaction.TransactionEffects",
            ".transaction.TransactionEffectsV1",
            ".transaction.PrivateOutputNote",
            ".transaction.InputNoteCommitment",
            ".note.NoteHeader",
            ".note.NoteDetails",
            ".note.NoteMetadata",
            ".asset.Asset",
            ".asset.AssetId",
            ".account.StorageMapPatch",
            ".account.StorageMapPatchEntries",
            ".account.AccountStorageHeader",
            ".account.AccountStorageHeader.StorageSlot",
            ".account.AccountHeader",
            ".account.PrivateAccountUpdate",
            ".note.NoteInclusionProof",
            ".transaction.ForeignAccountSlotName",
            ".transaction.TransactionArgs",
            ".transaction.NoteArgument",
            ".transaction.TransactionScript",
            ".account.AccountVaultPatch",
            ".account.AccountVaultPatchEntry",
            ".account.AccountWitness",
            ".primitives.MmrDelta",
            ".primitives.AdviceInputs",
            ".primitives.MerkleStore",
            ".primitives.AdviceMap",
            ".note.NoteRecipient",
            ".note.NoteScript",
            ".note.NoteAttachments",
            ".note.NoteAttachment",
            ".note.NoteStorage",
            ".account.AccountCode",
            ".blockchain.NextProtocolConfig",
            ".note.NoteId",
            ".primitives.AdviceStack",
            ".blockchain.FeeParameters",
            ".blockchain.BlockNumber",
            ".blockchain.TrackedMmrLeaf",
            ".account.StorageMapEntry",
            ".primitives.AdviceMapEntry",
            ".primitives.MerkleStoreNode",
            ".primitives.SmtLeafEntryList",
            ".primitives.IndexedDigest",
            ".primitives.PartialSmtNodeLevel",
            ".primitives.PartialSmtNode",
            ".transaction.TransactionId",
            ".asset.AssetClass",
            ".account.StorageSlotId",
            ".primitives.SmtLeafEntry",
            ".primitives.SparseMerklePath",
            ".primitives.MerklePath",
            ".protocol_config.ProtocolConfig",
            ".protocol_config.ProofVerificationConfig",
            ".protocol_config.ProofSecurityPolicy",
            ".protocol_config.KernelConfig",
        ],
    )?;
    prost.field_attribute(
        ".primitives.MastForest.encoded",
        quote::quote!(#[proto_decode(bytes = crate::decoded::primitives::UntrustedMastForest)])
            .to_string(),
    );
    prost.field_attribute(
        ".primitives.PublicKey.key.ecdsa_k256_keccak",
        quote::quote!(#[proto_decode(bytes = crate::decoded::primitives::Canonical<
            miden_protocol::crypto::dsa::ecdsa_k256_keccak::PublicKey
        >)])
        .to_string(),
    );
    prost.field_attribute(
        ".primitives.Signature.signature.ecdsa_k256_keccak",
        quote::quote!(#[proto_decode(bytes = crate::decoded::primitives::Canonical<
            miden_protocol::crypto::dsa::ecdsa_k256_keccak::Signature
        >)])
        .to_string(),
    );
    prost.compile_fds(descriptors)?;
    Ok(())
}