An ultra-lightweight JavaScript library for Bitcoin Cash, Bitcoin, and Bitauth applications.
An ultra-lightweight JavaScript library for Bitcoin Cash, Bitcoin, and Bitauth applications.
Libauth has no dependencies and works in all JavaScript environments, including Node.js, Deno, and browsers.
Libauth is designed to be flexible, lightweight, and easily auditable. Rather than providing a single, overarching, object-oriented API, all functionality is composed from simple functions. This has several benefits:
- Flexibility – Even highly-complex functionality is built-up from simpler functions. These lower-level functions can be used to experiment, tweak, and remix your own higher-level methods without maintaining a fork of the library.
- Smaller application bundles – Applications can import only the methods they need, eliminating the unused code (via dead-code elimination).
- Better auditability – Beyond having no dependencies of its own, Libauth's functional programming approach makes auditing critical code easier: smaller bundles, smaller functions, and less churn between versions (fewer cascading changes to object-oriented interfaces).
- Fully-portable – No platform-specific APIs are ever used, so the same code paths are used across all JavaScript environments (reducing the auditable "surface area" and simplifying library development).
To get started, install @bitauth/libauth
:
npm install @bitauth/libauth
# OR
yarn add @bitauth/libauth
And import the functionality you need:
import { secp256k1 } from '@bitauth/libauth';
import { msgHash, pubkey, sig } from 'somewhere';
secp256k1.verifySignatureDERLowS(sig, pubkey, msgHash)
? console.log('🚀 Signature valid')
: console.log('❌ Signature invalid');
See Installation for more guidance on getting set up.
These guides introduce some of the high-level concepts and functionality provided by Libauth.
- Installation
- Handling Errors
- Cryptography
- Keys
- Addresses
- Verifying Transactions
- Wallets & Transaction Creation
In addition to the usage examples in these guides, note that Libauth includes comprehensive tests that can help demonstrate usage of all functionality.
For example, utilities related to hexadecimal-encoded strings are defined in hex.ts
; for thorough usage examples, see the co-located hex.spec.ts
. You can also use GitHub search to see how a particular utility is used throughout the library, e.g. splitEvery
.
Below is a partial selection of functionality provided by Libauth. If you're looking for something else, be sure to search the API Reference.
High-level utilities are composed from lower-level utilities which are also exported, so it's often possible to remix behavior in your own codebase with relatively little duplication or maintenance burden. See the Defined in ...
link on each utility's API reference page to review and copy the implementation.
Table of Contents
-
encodeBase58Address
/decodeBase58Address
-
encodeBase58AddressFormat
/decodeBase58AddressFormat
-
lockingBytecodeToBase58Address
/base58AddressToLockingBytecode
-
encodeCashAddress
/decodeCashAddress
-
lockingBytecodeToCashAddress
/cashAddressToLockingBytecode
decodeCashAddressFormatWithoutPrefix
-
encodeCashAddressVersionByte
/decodeCashAddressVersionByte
attemptCashAddressFormatErrorCorrection
-
encodeCashAddressFormat
/decodeCashAddressFormat
-
encodeCashAddressNonStandard
/decodeCashAddressNonStandard
-
hash160
(sha256
->ripemd160
) -
hash256
(sha256
->sha256
) hmacSha256
hmacSha512
instantiateHmacFunction
instantiatePbkdf2Function
pbkdf2HmacSha256
pbkdf2HmacSha512
ripemd160
secp256k1
sha1
sha256
sha512
-
bigIntToBinUint256BEClamped
/binToBigIntUint256BE
-
bigIntToBinUint64LE
(bigIntToBinUint64LEClamped
)/binToBigIntUint64LE
-
bigIntToBinUintLE
/binToBigIntUintLE
-
binToBigIntUintBE
/bigIntToBinUintBE
-
int32SignedToUnsigned
/int32UnsignedToSigned
-
numberToBinInt16LE
/binToNumberInt16LE
-
numberToBinInt32LE
/binToNumberInt32LE
numberToBinInt32TwosCompliment
-
numberToBinUintLE
/binToNumberUintLE
numberToBinUint16BE
-
numberToBinUint16LE
(numberToBinUint16LEClamped
)/binToNumberUint16LE
numberToBinUint32BE
-
numberToBinUint32LE
(numberToBinUint32LEClamped
)/binToNumberUint32LE
-
compactUintToBigInt
/bigIntToCompactUint
compactUintPrefixToSize
readCompactUint
readCompactUintMinimal
crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode
-
decodeHdKey
(decodeHdKeyUnchecked
) -
decodeHdPrivateKey
/encodeHdPrivateKey
-
decodeHdPublicKey
/encodeHdPrivateKey
deriveHdPath
deriveHdPathRelative
deriveHdPrivateNodeFromSeed
-
deriveHdPrivateNodeIdentifier
/deriveHdPublicNodeIdentifier
-
deriveHdPrivateNodeChild
/deriveHdPublicNodeChild
deriveHdPublicKey
deriveHdPublicNode
-
hdKeyVersionIsPrivateKey
/hdKeyVersionIsPublicKey
-
hdPrivateKeyToIdentifier
/hdPublicKeyToIdentifier
deriveHdPrivateNodeFromBip39Mnemonic
deriveSeedFromBip39Mnemonic
-
encodeBip39Mnemonic
/decodeBip39Mnemonic
generateBip39Mnemonic
generateDeterministicEntropy
generateHdPrivateNode
generatePrivateKey
generateRandomBytes
generateRandomSeed
minimumEventsPerEntropyBits
shannonEntropyPerEvent
validateSecp256k1PrivateKey
readBytes
readCompactUintPrefixedBin
readRemainingBytes
readUint32LE
readUint64LE
readMultiple
readItemCount
-
encodeTransaction
/decodeTransaction
(decodeTransactionUnsafe
) -
encodeTransactionOutputs
/decodeTransactionOutputs
hashTransaction
hashTransactionP2pOrder
hashTransactionUiOrder
isArbitraryDataOutput
isSimpleMultisig
isStandardOutputBytecode
isStandardOutputBytecode2023
isStandardMultisig
isWitnessProgram
createInstructionSetBCH
createInstructionSetBCH2022
createInstructionSetBCH2023
createInstructionSetBCHCHIPs
createInstructionSetXEC
createVirtualMachine
createVirtualMachineBCH
createVirtualMachineBCH2022
createVirtualMachineBCH2023
createVirtualMachineBCHCHIPs
createVirtualMachineXEC
assembleBytecode
assembleBytecodeBCH
assembleBytecodeBTC
disassembleBytecode
disassembleBytecodeBCH
disassembleBytecodeBTC
generateBytecodeMap
summarizeDebugTrace
stringifyDebugTraceSummary
summarizeStack
combineOperations
mapOverOperations
pushToStack
pushToStackChecked
pushToStackVmNumber
pushToStackVmNumberChecked
useOneStackItem
useTwoStackItems
useThreeStackItems
useFourStackItems
useSixStackItems
useOneVmNumber
useTwoVmNumbers
useThreeVmNumbers
allErrorsAreRecoverable
cashAssemblyToBin
compileScript
containsRange
createCompiler
extractBytecodeResolutions
extractEvaluationSamples
extractEvaluationSamplesRecursive
extractUnexecutedRanges
getResolutionErrors
mergeRanges
parseScript
resolveVariableIdentifier
stringifyErrors
verifyCashAssemblyEvaluationState
walletTemplateToCompilerConfiguration
walletTemplateToCompilerBCH
hdPrivateKeyToP2pkhLockingBytecode
hdPrivateKeyToP2pkhCashAddress
hdPublicKeyToP2pkhLockingBytecode
hdPublicKeyToP2pkhCashAddress
privateKeyToP2pkhLockingBytecode
privateKeyToP2pkhCashAddress
publicKeyToP2pkhLockingBytecode
publicKeyToP2pkhCashAddress
Libauth's test suite includes a set of cross-implementation Virtual Machine Bytecode (VMB) test vectors for each supported VM. See Libauth VMB Tests
for details.
CashAssembly is the assembly language used by Libauth's Wallet Templates. To learn more about CashAssembly, read the Bitauth IDE Guide.
Pull Requests welcome! Please see CONTRIBUTING.md
for details.