iris-grpc-proto

Crates.ioiris-grpc-proto
lib.rsiris-grpc-proto
version0.1.0
created_at2025-12-02 18:08:54.346259+00
updated_at2025-12-02 18:08:54.346259+00
descriptionNockchain gRPC protobuf definitions
homepagehttps://nockbox.org
repositoryhttps://github.com/nockbox/iris-rs
max_upload_size
id1962341
size97,876
Auri (h33p)

documentation

https://docs.rs/iris-grpc-proto

README

iris-grpc-proto

gRPC protobuf definitions and conversions for nockbox-wallet.

This crate provides protobuf type definitions compatible with nockchain's gRPC API, along with conversion traits to/from iris-nockchain-types.

Overview

This crate bridges the gap between:

  • nockchain's gRPC server - Full-featured blockchain node with Nock VM
  • nockbox-wallet - Lightweight, no_std compatible wallet client

Architecture

iris-nockchain-types (no_std, custom types)
          ↕ conversion layer
    iris-grpc-proto (std, protobuf)
          ↕ tonic/gRPC
    nockchain server (nockchain-types)

Key Differences Handled

Type Mappings

iris-nockchain-types Protobuf nockchain-types
iris_ztd::Belt Belt { value: u64 } nockchain_math::Belt
iris_ztd::Digest ([Belt; 5]) Hash (5 Belt fields) Hash ([Belt; 5])
Nicks (usize) Nicks { value: u64 } Nicks (usize)
BlockHeight (usize) BlockHeight { value: u64 } BlockHeight(Belt)
Version enum NoteVersion { value: u32 } Version enum

Implementation Notes

  1. NoteData Serialization: Currently simplified - full implementation requires proper noun serialization
  2. Public Fields: Made key fields public in iris-nockchain-types for gRPC conversions:
    • Name: first, last
    • Pkh: m, hashes
    • PkhSignature: tuple field (Vec of PublicKey/Signature pairs)
    • MerkleProof: root, path
    • Hax: tuple field (Vec of Digest)
  3. Signature Conversion: Converts between iris_crypto::Signature (UBig c/s fields) and protobuf EightBelt arrays

Usage

gRPC Client

use iris_grpc_proto::client::{PublicNockchainGrpcClient, BalanceRequest};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Connect to Nockchain server
    let mut client = PublicNockchainGrpcClient::connect("http://localhost:50051").await?;

    // Get balance for an address
    let balance = client.wallet_get_balance(
        &BalanceRequest::Address("address_base58".to_string())
    ).await?;

    println!("Found {} notes", balance.notes.len());

    // Send a transaction
    let raw_tx = /* build your RawTx */;
    let response = client.wallet_send_transaction(raw_tx).await?;

    Ok(())
}

Type Conversions

use iris_grpc_proto::{pb, convert};
use iris_nockchain_types::RawTx;

// Convert wallet transaction to protobuf
let raw_tx: RawTx = /* ... */;
let pb_tx: pb::common::v2::RawTransaction = raw_tx.into();

Proto Files

The .proto files are copied from nockchain's nockapp-grpc-proto crate:

  • nockchain/common/v1/primitives.proto - Basic types (Belt, Hash, etc.)
  • nockchain/common/v1/blockchain.proto - V0 transaction types
  • nockchain/common/v2/blockchain.proto - V1 transaction types with witnesses
  • nockchain/public/v2/nockchain.proto - gRPC service definitions

Features

  • ✅ Full gRPC client for Nockchain public API
    • wallet_get_balance - Get wallet balance (with automatic pagination)
    • wallet_send_transaction - Send signed transactions
    • transaction_accepted - Check transaction acceptance status
  • ✅ Complete type conversions between iris-nockchain-types and protobuf
  • ✅ Proper error handling with typed ClientError

TODO

  • Implement proper NoteData serialization/deserialization (currently marked with todo!())
  • Add comprehensive conversion tests
  • Add reverse conversions (protobuf → iris-nockchain-types) where needed
  • Consider WASM compatibility for client-side gRPC-web

Building

cargo build -p iris-grpc-proto

The build process automatically generates Rust code from .proto files using tonic-build.

Commit count: 72

cargo fmt