Skip to content

Commit

Permalink
Merge branch 'master' into utxo-retaddr
Browse files Browse the repository at this point in the history
  • Loading branch information
coderofstuff authored Sep 28, 2024
2 parents e4debfd + 035a394 commit e7a237b
Show file tree
Hide file tree
Showing 128 changed files with 702 additions and 240 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ jobs:
- name: Run cargo doc tests with features=no-asm on kaspa-hashes
run: cargo test --doc --release -p kaspa-hashes --features=no-asm

- name: Run cargo doc
run: cargo doc --release --no-deps --workspace

# test-release:
# name: Test Suite Release
# runs-on: ${{ matrix.os }}
Expand Down
4 changes: 2 additions & 2 deletions cli/src/modules/connect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ impl Connect {
let (is_public, url) = match arg_or_server_address.as_deref() {
Some("public") => {
tprintln!(ctx, "Connecting to a public node");
(true, Resolver::default().fetch(WrpcEncoding::Borsh, network_id).await.map_err(|e| e.to_string())?.url)
(true, Resolver::default().get_url(WrpcEncoding::Borsh, network_id).await.map_err(|e| e.to_string())?)
}
None => {
tprintln!(ctx, "No server set, connecting to a public node");
(true, Resolver::default().fetch(WrpcEncoding::Borsh, network_id).await.map_err(|e| e.to_string())?.url)
(true, Resolver::default().get_url(WrpcEncoding::Borsh, network_id).await.map_err(|e| e.to_string())?)
}
Some(url) => {
(false, wrpc_client.parse_url_with_network_type(url.to_string(), network_id.into()).map_err(|e| e.to_string())?)
Expand Down
3 changes: 2 additions & 1 deletion components/consensusmanager/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ mod session;

pub use batch::BlockProcessingBatch;
pub use session::{
spawn_blocking, ConsensusInstance, ConsensusProxy, ConsensusSessionBlocking, SessionLock, SessionReadGuard, SessionWriteGuard,
spawn_blocking, ConsensusInstance, ConsensusProxy, ConsensusSessionBlocking, ConsensusSessionOwned, SessionLock, SessionReadGuard,
SessionWriteGuard,
};

/// Consensus controller trait. Includes methods required to start/stop/control consensus, but which should not
Expand Down
9 changes: 5 additions & 4 deletions components/consensusmanager/src/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ impl ConsensusInstance {

/// Returns an unguarded *blocking* consensus session. There's no guarantee that data will not be pruned between
/// two sequential consensus calls. This session doesn't hold the consensus pruning lock, so it should
/// be preferred upon [`session_blocking`] when data consistency is not important.
/// be preferred upon [`session_blocking()`](Self::session_blocking) when data consistency is not important.
pub fn unguarded_session_blocking(&self) -> ConsensusSessionBlocking<'static> {
ConsensusSessionBlocking::new_without_session_guard(self.consensus.clone())
}
Expand All @@ -100,7 +100,7 @@ impl ConsensusInstance {
/// that consensus state is consistent between operations, that is, no pruning was performed between the calls.
/// The returned object is an *owned* consensus session type which can be cloned and shared across threads.
/// The sharing ability is useful for spawning blocking operations on a different thread using the same
/// session object, see [`ConsensusSessionOwned::spawn_blocking`]. The caller is responsible to make sure
/// session object, see [`ConsensusSessionOwned::spawn_blocking()`](ConsensusSessionOwned::spawn_blocking). The caller is responsible to make sure
/// that the overall lifetime of this session is not too long (~2 seconds max)
pub async fn session(&self) -> ConsensusSessionOwned {
let g = self.session_lock.read_owned().await;
Expand All @@ -109,7 +109,7 @@ impl ConsensusInstance {

/// Returns an unguarded consensus session. There's no guarantee that data will not be pruned between
/// two sequential consensus calls. This session doesn't hold the consensus pruning lock, so it should
/// be preferred upon [`session`] when data consistency is not important.
/// be preferred upon [`session()`](Self::session) when data consistency is not important.
pub fn unguarded_session(&self) -> ConsensusSessionOwned {
ConsensusSessionOwned::new_without_session_guard(self.consensus.clone())
}
Expand Down Expand Up @@ -139,7 +139,8 @@ impl Deref for ConsensusSessionBlocking<'_> {
}

/// An *owned* consensus session type which can be cloned and shared across threads.
/// See method `spawn_blocking` within for context on the usefulness of this type
/// See method `spawn_blocking` within for context on the usefulness of this type.
/// Please note - you must use [`ConsensusProxy`] type alias instead of this struct.
#[derive(Clone)]
pub struct ConsensusSessionOwned {
_session_guard: Option<SessionOwnedReadGuard>,
Expand Down
2 changes: 2 additions & 0 deletions consensus/client/src/error.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
//! The [`Error`](enum@Error) enum used by this crate

use thiserror::Error;
use wasm_bindgen::{JsError, JsValue};
use workflow_wasm::jserror::JsErrorData;
Expand Down
7 changes: 7 additions & 0 deletions consensus/client/src/hash.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
//!
//! WASM bindings for transaction hashers: [`TransactionSigningHash`](native::TransactionSigningHash)
//! and [`TransactionSigningHashECDSA`](native::TransactionSigningHashECDSA).
//!

#![allow(non_snake_case)]

use crate::imports::*;
use crate::result::Result;
use kaspa_hashes as native;
Expand Down
11 changes: 11 additions & 0 deletions consensus/client/src/header.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
//!
//! Implementation of the Block [`Header`] struct.
//!

#![allow(non_snake_case)]

use crate::error::Error;
use js_sys::{Array, Object};
use kaspa_consensus_core::hashing;
Expand Down Expand Up @@ -59,10 +65,15 @@ export interface IRawHeader {

#[wasm_bindgen]
extern "C" {
/// WASM (TypeScript) type definition for the Header-like struct: `Header | IHeader | IRawHeader`.
///
/// @category Consensus
#[wasm_bindgen(typescript_type = "Header | IHeader | IRawHeader")]
pub type HeaderT;
}

/// Kaspa Block Header
///
/// @category Consensus
#[derive(Clone, Debug, Serialize, Deserialize, CastFromJs)]
#[serde(rename_all = "camelCase")]
Expand Down
13 changes: 13 additions & 0 deletions consensus/client/src/input.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
//!
//! Implementation of the client-side [`TransactionInput`] struct used by the client-side [`Transaction`] struct.
//!

#![allow(non_snake_case)]

use crate::imports::*;
use crate::result::Result;
use crate::TransactionOutpoint;
Expand Down Expand Up @@ -33,14 +39,21 @@ export interface ITransactionInputVerboseData { }

#[wasm_bindgen]
extern "C" {
/// WASM (TypeScript) type representing `ITransactionInput | TransactionInput`
/// @category Consensus
#[wasm_bindgen(typescript_type = "ITransactionInput | TransactionInput")]
pub type TransactionInputT;
/// WASM (TypeScript) type representing `ITransactionInput[] | TransactionInput[]`
/// @category Consensus
#[wasm_bindgen(typescript_type = "(ITransactionInput | TransactionInput)[]")]
pub type TransactionInputArrayAsArgT;
/// WASM (TypeScript) type representing `TransactionInput[]`
/// @category Consensus
#[wasm_bindgen(typescript_type = "TransactionInput[]")]
pub type TransactionInputArrayAsResultT;
}

/// Inner type used by [`TransactionInput`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionInputInner {
Expand Down
14 changes: 14 additions & 0 deletions consensus/client/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
//!
//! # Client-side consensus primitives.
//!
//! This crate offers client-side primitives mirroring the consensus layer of the Kaspa p2p node.
//! It declares structs such as [`Transaction`], [`TransactionInput`], [`TransactionOutput`],
//! [`TransactionOutpoint`], [`UtxoEntry`], and [`UtxoEntryReference`]
//! that are used by the Wallet subsystem as well as WASM bindings.
//!
//! Unlike raw consensus primitives (used for high-performance DAG processing) the primitives
//! offered in this crate are designed to be used in client-side applications. Their internal
//! data is typically wrapped into `Arc<Mutex<T>>`, allowing for easy sharing between
//! async / threaded environments and WASM bindings.
//!

pub mod error;
mod imports;
mod input;
Expand Down
48 changes: 31 additions & 17 deletions consensus/client/src/outpoint.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
//!
//! Implementation of the client-side [`TransactionOutpoint`] used by the [`TransactionInput`] struct.
//!

#![allow(non_snake_case)]

use cfg_if::cfg_if;

use crate::imports::*;
use crate::result::Result;

Expand All @@ -14,6 +22,7 @@ export interface ITransactionOutpoint {
}
"#;

/// Inner type used by [`TransactionOutpoint`]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Ord, PartialOrd)]
#[serde(rename_all = "camelCase")]
pub struct TransactionOutpointInner {
Expand Down Expand Up @@ -110,26 +119,31 @@ impl TransactionOutpoint {
}
}

#[cfg_attr(feature = "wasm32-sdk", wasm_bindgen)]
impl TransactionOutpoint {
#[cfg_attr(feature = "wasm32-sdk", wasm_bindgen(constructor))]
pub fn ctor(transaction_id: TransactionId, index: u32) -> TransactionOutpoint {
Self { inner: Arc::new(TransactionOutpointInner { transaction_id, index }) }
}
cfg_if! {
if #[cfg(feature = "wasm32-sdk")] {

#[cfg_attr(feature = "wasm32-sdk", wasm_bindgen(js_name = "getId"))]
pub fn id_string(&self) -> String {
format!("{}-{}", self.get_transaction_id_as_string(), self.get_index())
}
#[wasm_bindgen]
impl TransactionOutpoint {
#[wasm_bindgen(constructor)]
pub fn ctor(transaction_id: TransactionId, index: u32) -> TransactionOutpoint {
Self { inner: Arc::new(TransactionOutpointInner { transaction_id, index }) }
}

#[cfg_attr(feature = "wasm32-sdk", wasm_bindgen(getter, js_name = transactionId))]
pub fn get_transaction_id_as_string(&self) -> String {
self.inner().transaction_id.to_string()
}
#[wasm_bindgen(js_name = "getId")]
pub fn id_string(&self) -> String {
format!("{}-{}", self.get_transaction_id_as_string(), self.get_index())
}

#[cfg_attr(feature = "wasm32-sdk", wasm_bindgen(getter, js_name = index))]
pub fn get_index(&self) -> TransactionIndexType {
self.inner().index
#[wasm_bindgen(getter, js_name = transactionId)]
pub fn get_transaction_id_as_string(&self) -> String {
self.inner().transaction_id.to_string()
}

#[wasm_bindgen(getter, js_name = index)]
pub fn get_index(&self) -> TransactionIndexType {
self.inner().index
}
}
}
}

Expand Down
13 changes: 13 additions & 0 deletions consensus/client/src/output.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
//!
//! Implementation of the client-side [`TransactionOutput`] used by the [`Transaction`] struct.
//!

#![allow(non_snake_case)]

use crate::imports::*;

#[wasm_bindgen(typescript_custom_section)]
Expand Down Expand Up @@ -28,14 +34,21 @@ export interface ITransactionOutputVerboseData {

#[wasm_bindgen]
extern "C" {
/// WASM (TypeScript) type representing `ITransactionOutput | TransactionOutput`
/// @category Consensus
#[wasm_bindgen(typescript_type = "ITransactionOutput | TransactionOutput")]
pub type TransactionOutputT;
/// WASM (TypeScript) type representing `ITransactionOutput[] | TransactionOutput[]`
/// @category Consensus
#[wasm_bindgen(typescript_type = "(ITransactionOutput | TransactionOutput)[]")]
pub type TransactionOutputArrayAsArgT;
/// WASM (TypeScript) type representing `TransactionOutput[]`
/// @category Consensus
#[wasm_bindgen(typescript_type = "TransactionOutput[]")]
pub type TransactionOutputArrayAsResultT;
}

/// Inner type used by [`TransactionOutput`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionOutputInner {
Expand Down
2 changes: 2 additions & 0 deletions consensus/client/src/result.rs
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
//! [`Result`] type alias that is bound to the [`Error`](super::error::Error) type from this crate.

pub type Result<T, E = super::error::Error> = std::result::Result<T, E>;
22 changes: 22 additions & 0 deletions consensus/client/src/serializable/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
//!
//! # Standardized JSON serialization and deserialization of Kaspa transactions.
//!
//! This module provides standardized JSON serialization and deserialization of
//! Kaspa transactions. There are two sub-modules: `numeric` and `string`.
//!
//! The `numeric` module provides serialization and deserialization of transactions
//! with all large integer values as `bigint` types in WASM or numerical values that
//! exceed the largest integer that can be represented by the JavaScript `number` type.
//!
//! The `string` module provides serialization and deserialization of transactions
//! with all large integer values as `string` types. This allows deserialization
//! via JSON in JavaScript environments and later conversion to `bigint` types.
//!
//! These data structures can be used for manual transport of transactions using JSON.
//! For more advanced use cases, please refer to `PSKT` in the [`kaspa_wallet_pskt`](https://docs.rs/kaspa_wallet_pskt)
//! crate.
//!

#![allow(non_snake_case)]

pub mod numeric;
pub mod string;

Expand Down Expand Up @@ -80,6 +101,7 @@ export interface ISerializableTransaction {

#[wasm_bindgen]
extern "C" {
/// WASM (TypeScript) representation of the `ISerializableTransaction` interface.
#[wasm_bindgen(extends = js_sys::Array, typescript_type = "ISerializableTransaction")]
pub type SerializableTransactionT;
}
8 changes: 7 additions & 1 deletion consensus/client/src/serializable/numeric.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
//! This module implements the primitives for external transaction signing.
//!
//! This module implements transaction-related primitives for JSON serialization
//! where all large integer values (`u64`) are serialized to JSON using `serde` and
//! can exceed the largest integer value representable by the JavaScript `number` type.
//! (i.e. transactions serialized using this module can not be deserialized in JavaScript
//! but may be deserialized in other JSON-capable environments that support large integers)
//!

use crate::error::Error;
use crate::imports::*;
Expand Down
5 changes: 4 additions & 1 deletion consensus/client/src/serializable/string.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
//! This module implements the primitives for external transaction signing.
//!
//! This module implements transaction-related primitives for JSON serialization
//! where all large integer values (`u64`) are serialized to and from JSON as strings.
//!

use crate::imports::*;
use crate::result::Result;
Expand Down
4 changes: 4 additions & 0 deletions consensus/client/src/sign.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
//!
//! Utilities for signing transactions.
//!

use crate::transaction::Transaction;
use core::iter::once;
use itertools::Itertools;
Expand Down
7 changes: 7 additions & 0 deletions consensus/client/src/transaction.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
//!
//! Declares the client-side [`Transaction`] type, which represents a Kaspa transaction.
//!

#![allow(non_snake_case)]

use crate::imports::*;
Expand Down Expand Up @@ -53,10 +57,13 @@ export interface ITransactionVerboseData {

#[wasm_bindgen]
extern "C" {
/// WASM (TypeScript) type representing `ITransaction | Transaction`
/// @category Consensus
#[wasm_bindgen(typescript_type = "ITransaction | Transaction")]
pub type TransactionT;
}

/// Inner type used by [`Transaction`]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionInner {
Expand Down
6 changes: 6 additions & 0 deletions consensus/client/src/utils.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
//!
//! Client-side utility functions and their WASM bindings.
//!

#![allow(non_snake_case)]

use crate::imports::*;
use crate::result::Result;
use kaspa_addresses::*;
Expand Down
Loading

0 comments on commit e7a237b

Please sign in to comment.