Package Exports
- @unicitylabs/state-transition-sdk/lib/InvalidJsonStructureError
- @unicitylabs/state-transition-sdk/lib/InvalidJsonStructureError.js
- @unicitylabs/state-transition-sdk/lib/StateTransitionClient
- @unicitylabs/state-transition-sdk/lib/StateTransitionClient.js
- @unicitylabs/state-transition-sdk/lib/api/AggregatorClient
- @unicitylabs/state-transition-sdk/lib/api/AggregatorClient.js
- @unicitylabs/state-transition-sdk/lib/api/CertificationData
- @unicitylabs/state-transition-sdk/lib/api/CertificationData.js
- @unicitylabs/state-transition-sdk/lib/api/CertificationRequest
- @unicitylabs/state-transition-sdk/lib/api/CertificationRequest.js
- @unicitylabs/state-transition-sdk/lib/api/CertificationResponse
- @unicitylabs/state-transition-sdk/lib/api/CertificationResponse.js
- @unicitylabs/state-transition-sdk/lib/api/IAggregatorClient
- @unicitylabs/state-transition-sdk/lib/api/IAggregatorClient.js
- @unicitylabs/state-transition-sdk/lib/api/InclusionProof
- @unicitylabs/state-transition-sdk/lib/api/InclusionProof.js
- @unicitylabs/state-transition-sdk/lib/api/InclusionProofResponse
- @unicitylabs/state-transition-sdk/lib/api/InclusionProofResponse.js
- @unicitylabs/state-transition-sdk/lib/api/StateId
- @unicitylabs/state-transition-sdk/lib/api/StateId.js
- @unicitylabs/state-transition-sdk/lib/api/bft/InputRecord
- @unicitylabs/state-transition-sdk/lib/api/bft/InputRecord.js
- @unicitylabs/state-transition-sdk/lib/api/bft/RootTrustBase
- @unicitylabs/state-transition-sdk/lib/api/bft/RootTrustBase.js
- @unicitylabs/state-transition-sdk/lib/api/bft/ShardTreeCertificate
- @unicitylabs/state-transition-sdk/lib/api/bft/ShardTreeCertificate.js
- @unicitylabs/state-transition-sdk/lib/api/bft/UnicityCertificate
- @unicitylabs/state-transition-sdk/lib/api/bft/UnicityCertificate.js
- @unicitylabs/state-transition-sdk/lib/api/bft/UnicitySeal
- @unicitylabs/state-transition-sdk/lib/api/bft/UnicitySeal.js
- @unicitylabs/state-transition-sdk/lib/api/bft/UnicityTreeCertificate
- @unicitylabs/state-transition-sdk/lib/api/bft/UnicityTreeCertificate.js
- @unicitylabs/state-transition-sdk/lib/api/bft/verification/UnicityCertificateVerification
- @unicitylabs/state-transition-sdk/lib/api/bft/verification/UnicityCertificateVerification.js
- @unicitylabs/state-transition-sdk/lib/api/bft/verification/rule/InputRecordCurrentHashVerificationRule
- @unicitylabs/state-transition-sdk/lib/api/bft/verification/rule/InputRecordCurrentHashVerificationRule.js
- @unicitylabs/state-transition-sdk/lib/api/bft/verification/rule/UnicitySealHashMatchesWithRootHashRule
- @unicitylabs/state-transition-sdk/lib/api/bft/verification/rule/UnicitySealHashMatchesWithRootHashRule.js
- @unicitylabs/state-transition-sdk/lib/api/bft/verification/rule/UnicitySealQuorumSignaturesVerificationRule
- @unicitylabs/state-transition-sdk/lib/api/bft/verification/rule/UnicitySealQuorumSignaturesVerificationRule.js
- @unicitylabs/state-transition-sdk/lib/api/json-rpc/IJsonRpcResponse
- @unicitylabs/state-transition-sdk/lib/api/json-rpc/IJsonRpcResponse.js
- @unicitylabs/state-transition-sdk/lib/api/json-rpc/JsonRpcDataError
- @unicitylabs/state-transition-sdk/lib/api/json-rpc/JsonRpcDataError.js
- @unicitylabs/state-transition-sdk/lib/api/json-rpc/JsonRpcHttpTransport
- @unicitylabs/state-transition-sdk/lib/api/json-rpc/JsonRpcHttpTransport.js
- @unicitylabs/state-transition-sdk/lib/api/json-rpc/JsonRpcNetworkError
- @unicitylabs/state-transition-sdk/lib/api/json-rpc/JsonRpcNetworkError.js
- @unicitylabs/state-transition-sdk/lib/crypto/ISignature
- @unicitylabs/state-transition-sdk/lib/crypto/ISignature.js
- @unicitylabs/state-transition-sdk/lib/crypto/ISigningService
- @unicitylabs/state-transition-sdk/lib/crypto/ISigningService.js
- @unicitylabs/state-transition-sdk/lib/crypto/MintSigningService
- @unicitylabs/state-transition-sdk/lib/crypto/MintSigningService.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/DataHash
- @unicitylabs/state-transition-sdk/lib/crypto/hash/DataHash.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/DataHasher
- @unicitylabs/state-transition-sdk/lib/crypto/hash/DataHasher.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/DataHasherFactory
- @unicitylabs/state-transition-sdk/lib/crypto/hash/DataHasherFactory.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/HashAlgorithm
- @unicitylabs/state-transition-sdk/lib/crypto/hash/HashAlgorithm.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/HashError
- @unicitylabs/state-transition-sdk/lib/crypto/hash/HashError.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/IDataHasher
- @unicitylabs/state-transition-sdk/lib/crypto/hash/IDataHasher.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/IDataHasherFactory
- @unicitylabs/state-transition-sdk/lib/crypto/hash/IDataHasherFactory.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/NodeDataHasher
- @unicitylabs/state-transition-sdk/lib/crypto/hash/NodeDataHasher.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/SubtleCryptoDataHasher
- @unicitylabs/state-transition-sdk/lib/crypto/hash/SubtleCryptoDataHasher.js
- @unicitylabs/state-transition-sdk/lib/crypto/hash/UnsupportedHashAlgorithmError
- @unicitylabs/state-transition-sdk/lib/crypto/hash/UnsupportedHashAlgorithmError.js
- @unicitylabs/state-transition-sdk/lib/crypto/secp256k1/Signature
- @unicitylabs/state-transition-sdk/lib/crypto/secp256k1/Signature.js
- @unicitylabs/state-transition-sdk/lib/crypto/secp256k1/SigningService
- @unicitylabs/state-transition-sdk/lib/crypto/secp256k1/SigningService.js
- @unicitylabs/state-transition-sdk/lib/payment/IPaymentData
- @unicitylabs/state-transition-sdk/lib/payment/IPaymentData.js
- @unicitylabs/state-transition-sdk/lib/payment/ISplitPaymentData
- @unicitylabs/state-transition-sdk/lib/payment/ISplitPaymentData.js
- @unicitylabs/state-transition-sdk/lib/payment/SplitReason
- @unicitylabs/state-transition-sdk/lib/payment/SplitReason.js
- @unicitylabs/state-transition-sdk/lib/payment/SplitReasonProof
- @unicitylabs/state-transition-sdk/lib/payment/SplitReasonProof.js
- @unicitylabs/state-transition-sdk/lib/payment/TokenSplit
- @unicitylabs/state-transition-sdk/lib/payment/TokenSplit.js
- @unicitylabs/state-transition-sdk/lib/payment/asset/Asset
- @unicitylabs/state-transition-sdk/lib/payment/asset/Asset.js
- @unicitylabs/state-transition-sdk/lib/payment/asset/AssetId
- @unicitylabs/state-transition-sdk/lib/payment/asset/AssetId.js
- @unicitylabs/state-transition-sdk/lib/payment/asset/PaymentAssetCollection
- @unicitylabs/state-transition-sdk/lib/payment/asset/PaymentAssetCollection.js
- @unicitylabs/state-transition-sdk/lib/payment/error/TokenAssetCountMismatchError
- @unicitylabs/state-transition-sdk/lib/payment/error/TokenAssetCountMismatchError.js
- @unicitylabs/state-transition-sdk/lib/payment/error/TokenAssetMissingError
- @unicitylabs/state-transition-sdk/lib/payment/error/TokenAssetMissingError.js
- @unicitylabs/state-transition-sdk/lib/payment/error/TokenAssetValueMismatchError
- @unicitylabs/state-transition-sdk/lib/payment/error/TokenAssetValueMismatchError.js
- @unicitylabs/state-transition-sdk/lib/payment/predicate/builtin/BurnPredicate
- @unicitylabs/state-transition-sdk/lib/payment/predicate/builtin/BurnPredicate.js
- @unicitylabs/state-transition-sdk/lib/predicate/EncodedPredicate
- @unicitylabs/state-transition-sdk/lib/predicate/EncodedPredicate.js
- @unicitylabs/state-transition-sdk/lib/predicate/IPredicate
- @unicitylabs/state-transition-sdk/lib/predicate/IPredicate.js
- @unicitylabs/state-transition-sdk/lib/predicate/PredicateEngine
- @unicitylabs/state-transition-sdk/lib/predicate/PredicateEngine.js
- @unicitylabs/state-transition-sdk/lib/predicate/builtin/BuiltInPredicateVerifierFactory
- @unicitylabs/state-transition-sdk/lib/predicate/builtin/BuiltInPredicateVerifierFactory.js
- @unicitylabs/state-transition-sdk/lib/predicate/builtin/PayToPublicKeyPredicate
- @unicitylabs/state-transition-sdk/lib/predicate/builtin/PayToPublicKeyPredicate.js
- @unicitylabs/state-transition-sdk/lib/predicate/builtin/verification/PayToPublicKeyPredicateVerifier
- @unicitylabs/state-transition-sdk/lib/predicate/builtin/verification/PayToPublicKeyPredicateVerifier.js
- @unicitylabs/state-transition-sdk/lib/predicate/verification/IPredicateVerifier
- @unicitylabs/state-transition-sdk/lib/predicate/verification/IPredicateVerifier.js
- @unicitylabs/state-transition-sdk/lib/predicate/verification/IPredicateVerifierFactory
- @unicitylabs/state-transition-sdk/lib/predicate/verification/IPredicateVerifierFactory.js
- @unicitylabs/state-transition-sdk/lib/predicate/verification/PredicateVerifier
- @unicitylabs/state-transition-sdk/lib/predicate/verification/PredicateVerifier.js
- @unicitylabs/state-transition-sdk/lib/serialization/BigintConverter
- @unicitylabs/state-transition-sdk/lib/serialization/BigintConverter.js
- @unicitylabs/state-transition-sdk/lib/serialization/HexConverter
- @unicitylabs/state-transition-sdk/lib/serialization/HexConverter.js
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborDeserializer
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborDeserializer.js
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborError
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborError.js
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborMap
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborMap.js
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborMapEntry
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborMapEntry.js
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborReader
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborReader.js
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborSerializer
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/CborSerializer.js
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/MajorType
- @unicitylabs/state-transition-sdk/lib/serialization/cbor/MajorType.js
- @unicitylabs/state-transition-sdk/lib/smt/LeafInBranchError
- @unicitylabs/state-transition-sdk/lib/smt/LeafInBranchError.js
- @unicitylabs/state-transition-sdk/lib/smt/LeafOutOfBoundsError
- @unicitylabs/state-transition-sdk/lib/smt/LeafOutOfBoundsError.js
- @unicitylabs/state-transition-sdk/lib/smt/PathVerificationResult
- @unicitylabs/state-transition-sdk/lib/smt/PathVerificationResult.js
- @unicitylabs/state-transition-sdk/lib/smt/SparseMerkleTreePathUtils
- @unicitylabs/state-transition-sdk/lib/smt/SparseMerkleTreePathUtils.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/FinalizedBranch
- @unicitylabs/state-transition-sdk/lib/smt/plain/FinalizedBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/FinalizedLeafBranch
- @unicitylabs/state-transition-sdk/lib/smt/plain/FinalizedLeafBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/FinalizedNodeBranch
- @unicitylabs/state-transition-sdk/lib/smt/plain/FinalizedNodeBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/PendingBranch
- @unicitylabs/state-transition-sdk/lib/smt/plain/PendingBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/PendingLeafBranch
- @unicitylabs/state-transition-sdk/lib/smt/plain/PendingLeafBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/PendingNodeBranch
- @unicitylabs/state-transition-sdk/lib/smt/plain/PendingNodeBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/SparseMerkleTree
- @unicitylabs/state-transition-sdk/lib/smt/plain/SparseMerkleTree.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/SparseMerkleTreePath
- @unicitylabs/state-transition-sdk/lib/smt/plain/SparseMerkleTreePath.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/SparseMerkleTreePathStep
- @unicitylabs/state-transition-sdk/lib/smt/plain/SparseMerkleTreePathStep.js
- @unicitylabs/state-transition-sdk/lib/smt/plain/SparseMerkleTreeRootNode
- @unicitylabs/state-transition-sdk/lib/smt/plain/SparseMerkleTreeRootNode.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/FinalizedBranch
- @unicitylabs/state-transition-sdk/lib/smt/sum/FinalizedBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/FinalizedLeafBranch
- @unicitylabs/state-transition-sdk/lib/smt/sum/FinalizedLeafBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/FinalizedNodeBranch
- @unicitylabs/state-transition-sdk/lib/smt/sum/FinalizedNodeBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/PendingBranch
- @unicitylabs/state-transition-sdk/lib/smt/sum/PendingBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/PendingLeafBranch
- @unicitylabs/state-transition-sdk/lib/smt/sum/PendingLeafBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/PendingNodeBranch
- @unicitylabs/state-transition-sdk/lib/smt/sum/PendingNodeBranch.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/SparseMerkleSumTree
- @unicitylabs/state-transition-sdk/lib/smt/sum/SparseMerkleSumTree.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/SparseMerkleSumTreePath
- @unicitylabs/state-transition-sdk/lib/smt/sum/SparseMerkleSumTreePath.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/SparseMerkleSumTreePathStep
- @unicitylabs/state-transition-sdk/lib/smt/sum/SparseMerkleSumTreePathStep.js
- @unicitylabs/state-transition-sdk/lib/smt/sum/SparseMerkleSumTreeRootNode
- @unicitylabs/state-transition-sdk/lib/smt/sum/SparseMerkleSumTreeRootNode.js
- @unicitylabs/state-transition-sdk/lib/transaction/CertifiedMintTransaction
- @unicitylabs/state-transition-sdk/lib/transaction/CertifiedMintTransaction.js
- @unicitylabs/state-transition-sdk/lib/transaction/CertifiedTransferTransaction
- @unicitylabs/state-transition-sdk/lib/transaction/CertifiedTransferTransaction.js
- @unicitylabs/state-transition-sdk/lib/transaction/ITransaction
- @unicitylabs/state-transition-sdk/lib/transaction/ITransaction.js
- @unicitylabs/state-transition-sdk/lib/transaction/MintTransaction
- @unicitylabs/state-transition-sdk/lib/transaction/MintTransaction.js
- @unicitylabs/state-transition-sdk/lib/transaction/MintTransactionState
- @unicitylabs/state-transition-sdk/lib/transaction/MintTransactionState.js
- @unicitylabs/state-transition-sdk/lib/transaction/PayToScriptHash
- @unicitylabs/state-transition-sdk/lib/transaction/PayToScriptHash.js
- @unicitylabs/state-transition-sdk/lib/transaction/Token
- @unicitylabs/state-transition-sdk/lib/transaction/Token.js
- @unicitylabs/state-transition-sdk/lib/transaction/TokenId
- @unicitylabs/state-transition-sdk/lib/transaction/TokenId.js
- @unicitylabs/state-transition-sdk/lib/transaction/TokenType
- @unicitylabs/state-transition-sdk/lib/transaction/TokenType.js
- @unicitylabs/state-transition-sdk/lib/transaction/TransferTransaction
- @unicitylabs/state-transition-sdk/lib/transaction/TransferTransaction.js
- @unicitylabs/state-transition-sdk/lib/transaction/verification/rule/CertifiedMintTransactionVerificationRule
- @unicitylabs/state-transition-sdk/lib/transaction/verification/rule/CertifiedMintTransactionVerificationRule.js
- @unicitylabs/state-transition-sdk/lib/transaction/verification/rule/CertifiedTransferTransactionVerificationRule
- @unicitylabs/state-transition-sdk/lib/transaction/verification/rule/CertifiedTransferTransactionVerificationRule.js
- @unicitylabs/state-transition-sdk/lib/transaction/verification/rule/InclusionProofVerificationRule
- @unicitylabs/state-transition-sdk/lib/transaction/verification/rule/InclusionProofVerificationRule.js
- @unicitylabs/state-transition-sdk/lib/util/BitString
- @unicitylabs/state-transition-sdk/lib/util/BitString.js
- @unicitylabs/state-transition-sdk/lib/util/InclusionProofUtils
- @unicitylabs/state-transition-sdk/lib/util/InclusionProofUtils.js
- @unicitylabs/state-transition-sdk/lib/util/StringUtils
- @unicitylabs/state-transition-sdk/lib/util/StringUtils.js
- @unicitylabs/state-transition-sdk/lib/util/TypedArrayUtils
- @unicitylabs/state-transition-sdk/lib/util/TypedArrayUtils.js
- @unicitylabs/state-transition-sdk/lib/verification/IVerificationContext
- @unicitylabs/state-transition-sdk/lib/verification/IVerificationContext.js
- @unicitylabs/state-transition-sdk/lib/verification/VerificationError
- @unicitylabs/state-transition-sdk/lib/verification/VerificationError.js
- @unicitylabs/state-transition-sdk/lib/verification/VerificationResult
- @unicitylabs/state-transition-sdk/lib/verification/VerificationResult.js
- @unicitylabs/state-transition-sdk/lib/verification/VerificationStatus
- @unicitylabs/state-transition-sdk/lib/verification/VerificationStatus.js
Readme
State Transition SDK
Overview
The State Transition SDK is a TypeScript library that provides an off-chain token transaction framework. Tokens are managed, stored, and transferred off-chain with only cryptographic commitments published on-chain, ensuring privacy while preventing double-spending through single-spend proofs. This is a low-level SDK, that supports transferring tokens, making payments, and splitting tokens. In this system, tokens are self-contained entities containing complete transaction history and cryptographic proofs attesting to their current state (ownership, value, etc.). State transitions are verified through consultation with blockchain infrastructure (Unicity) to produce proof of single spend.
Key Features
- Off-chain Privacy: Cryptographic commitments contain no information about tokens, their state, or transaction nature
- Horizontal Scalability: Millions of transaction commitments per block capability
- Zero-Knowledge Transactions: Observers cannot determine if commitments refer to token transactions or other processes
- Offline Transaction Support: Create and serialize transactions without network connectivity
- TypeScript Support: Full type safety and modern development experience
- Modular Architecture: Pluggable address schemes, predicates, and token types
Installation
npm install @unicitylabs/state-transition-sdkQuick Start
Note: for examples, see further down in the Examples section or browse around in the tests folder of this SDK.
Core Components
StateTransitionClient
The main SDK interface for token operations:
submitCertificationRequest()- Submit transaction to aggregatorgetInclusionProof()- Retrieve inclusion proof for a commitment
Transaction Flow
- Minting: Create new tokens
- Transfer: Submit state transitions between owners
Transfer flow
Prerequisites Recipient knows some info about token, like token type for generating address.
A[Start]
A --> B[Recipient Generates Address]
B --> C[Recipient Shares Address with Sender]
C --> D[Sender Creates Transaction]
D --> E[Sender Submits Transaction]
E --> F[Sender Retrieves Inclusion Proof]
F --> G[Sender Creates Certified Transaction]
G --> H[Sender Updates Token with Certified Transaction]
H --> I[Sender Sends Token to Recipient]
I --> J[End]Architecture
Token Structure
Token {
genesis: CertifiedMintTransaction {
transaction: MintTransaction {
sourceStateHash: MintTransactionState,
lockScript: IPredicate,
recipient: PayToScriptHash,
tokenId: TokenId,
tokenType: TokenType,
data: Uint8Array
},
inclusionProof: InclusionProof
},
transactions: [
CertifiedTransferTransaction {
transaction: TransferTransaction {
sourceStateHash: DataHash,
lockScript: IPredicate,
recipient: PayToScriptHash,
x: Uint8Array,
data: Uint8Array
},
inclusionProof: InclusionProof
},
...
]
}Privacy Model
- Commitment-based: Only cryptographic commitments published on-chain
- Self-contained: Tokens include complete transaction history
- Zero-knowledge: No information leaked about token or transaction details
- Minimal footprint: Blockchain only stores commitment hashes
Security Features
- Double-spend prevention: Enforced through inclusion proofs
- Cryptographic verification: All state transitions cryptographically verified
- Predicate flexibility: Multiple ownership models supported
- Provenance tracking: Complete audit trail in token history
Development
Building
npm run buildTesting
Run unit and integration tests. NB! Integration tests require docker to be installed.
npm testRun unit tests only.
npm run test:unitRun integration tests only.
npm run test:integrationRun end-to-end tests only.
AGGREGATOR_URL='https://gateway-test.unicity.network' npm run test:e2eLinting
Lint all code (source and tests):
npm run lintLint with auto-fix:
npm run lint:fixNetwork Configuration
- Test Gateway:
https://gateway-test.unicity.network - Default Token Type: Configurable via TokenType enum
Examples
Minting Tokens
tests/examples/mint/ExampleTest.ts
Token Transfer
tests/examples/transfer/ExampleTest.ts
Token Splitting
tests/examples/split/ExampleTest.ts
Unicity Signature Standard
The Unicity Network uses a standardized signature format to ensure data integrity and cryptographic proof of ownership. All cryptographic operations use the secp256k1 elliptic curve, SHA-256 hashing, and 33-byte compressed public keys.
The standard is designed for efficiency and broad compatibility across different programming environments, including Node.js, browsers, and Go.
Signature Format
A Unicity signature is a 65-byte array, structured as the concatenation of three components: [R || S || V].
| Component | Size (bytes) | Offset | Description |
|---|---|---|---|
| R | 32 | 0 | The R value of the ECDSA signature. |
| S | 32 | 32 | The S value of the ECDSA signature. |
| V | 1 | 64 | The recovery ID (0 or 1). This value allows for the recovery of the public key directly from the signature. |
Process Overview
1. Signing
The raw message data is first hashed using SHA-256. The resulting 32-byte hash is then signed using the signer's 32-byte secp256k1 private key to produce the 65-byte signature.
2. Verification The verifier hashes the original message using SHA-256. Using this hash and the signature, the verifier recovers the public key. The recovered key is then serialized into the compressed format and compared byte-for-byte against the expected 33-byte compressed public key to confirm validity.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
- Repository: GitHub
- Issues: GitHub Issues
- Gateway API:
https://gateway-test.unicity.network
Note: This SDK is part of the Unicity ecosystem. For production use, ensure you understand the security implications and test thoroughly in the testnet environment.