Resolve "WIP: UTXO Selection and Storage"
This commit is contained in:
@@ -7,6 +7,7 @@ import {
|
||||
secp256k1,
|
||||
sha256,
|
||||
ripemd160,
|
||||
utf8ToBin,
|
||||
} from '@bitauth/libauth';
|
||||
|
||||
/**
|
||||
@@ -19,7 +20,7 @@ export class PublicKey {
|
||||
/**
|
||||
* Construct a new Public Key.
|
||||
*
|
||||
* @param bytes {Uint8Array} The raw bytes (33) for the Public Key.
|
||||
* @param bytes The raw bytes (33) for the Public Key.
|
||||
*/
|
||||
constructor(bytes: Uint8Array) {
|
||||
// Ensure that exactly 33 Bytes are given.
|
||||
@@ -33,17 +34,30 @@ export class PublicKey {
|
||||
/**
|
||||
* Create a Public Key entity from the given hexadecimal string.
|
||||
*
|
||||
* @param publicKeyHex {string} Hexadecimal encoding of the Public Key bytes.
|
||||
* @param publicKeyBytes Uint8Array containing the Public Key bytes.
|
||||
*
|
||||
* @throws {Error} If Public Key cannot be created.
|
||||
*
|
||||
* @returns {PublicKey} The created Public Key entity.
|
||||
* @returns The created Public Key entity.
|
||||
*/
|
||||
public static fromBytes(publicKeyBytes: Uint8Array): PublicKey {
|
||||
return new PublicKey(publicKeyBytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Public Key entity from the given hexadecimal string.
|
||||
*
|
||||
* @param publicKeyHex Hexadecimal encoding of the Public Key bytes.
|
||||
*
|
||||
* @throws {Error} If Public Key cannot be created.
|
||||
*
|
||||
* @returns The created Public Key entity.
|
||||
*/
|
||||
public static fromHex(publicKeyHex: string): PublicKey {
|
||||
// Ensure that the given string is hex.
|
||||
if (!isHex(publicKeyHex)) {
|
||||
throw new Error(
|
||||
`The given string (${publicKeyHex}) is not valid hexadecimal.`
|
||||
`The given string (${publicKeyHex}) is not valid hexadecimal.`,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -57,7 +71,7 @@ export class PublicKey {
|
||||
/**
|
||||
* Derive the Hash160 for this Public Key.
|
||||
*
|
||||
* @returns {Uint8Array} The Hash160 of the Public Key.
|
||||
* @returns The Hash160 of the Public Key.
|
||||
*/
|
||||
public deriveHash160(): Uint8Array {
|
||||
// SHA256 Hash the public key.
|
||||
@@ -73,7 +87,7 @@ export class PublicKey {
|
||||
/**
|
||||
* Derive the Hash160 as Hex for this Public Key.
|
||||
*
|
||||
* @returns {string} The Hash160 of the Public Key as hex.
|
||||
* @returns The Hash160 of the Public Key as hex.
|
||||
*/
|
||||
public deriveHash160Hex(): string {
|
||||
const hash160Bytes = this.deriveHash160();
|
||||
@@ -84,7 +98,7 @@ export class PublicKey {
|
||||
/**
|
||||
* Derive the Address for this Public Key.
|
||||
*
|
||||
* @returns {Address} The Address for this Public Key.
|
||||
* @returns The Address for this Public Key.
|
||||
*/
|
||||
public deriveAddress(): Address {
|
||||
// Get the RIPEMD160 Hash of the Public Key.
|
||||
@@ -94,22 +108,48 @@ export class PublicKey {
|
||||
return Address.fromHash160(ripemd160Hash, 'P2PKH');
|
||||
}
|
||||
|
||||
public verifyMessageSchnorr(
|
||||
message: Uint8Array | string,
|
||||
signature: Uint8Array | string,
|
||||
) {
|
||||
if (typeof message === 'string') {
|
||||
message = utf8ToBin(message);
|
||||
}
|
||||
|
||||
const messageHash = sha256.hash(message);
|
||||
|
||||
return this.verifyMessageHashSchnorr(messageHash, signature);
|
||||
}
|
||||
|
||||
public verifyMessageDER(
|
||||
message: Uint8Array | string,
|
||||
signature: Uint8Array | string,
|
||||
) {
|
||||
if (typeof message === 'string') {
|
||||
message = utf8ToBin(message);
|
||||
}
|
||||
|
||||
const messageHash = sha256.hash(message);
|
||||
|
||||
return this.verifyMessageHashDER(messageHash, signature);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify that a compact message hash was signed with the corresponding Private Key.
|
||||
*
|
||||
* @param messageHash {Uint8Array} The hash of the message.
|
||||
* @param signature {Uint8Array) The signature of the message.
|
||||
* @param messageHash The hash of the message.
|
||||
* @param signature The signature of the message.
|
||||
*
|
||||
* @returns {boolean} True if signature and message hash verifies, false otherwise..
|
||||
* @returns True if signature and message hash verifies, false otherwise..
|
||||
*/
|
||||
public verifyMessageHashCompact(
|
||||
messageHash: Uint8Array,
|
||||
signature: Uint8Array
|
||||
signature: Uint8Array,
|
||||
): boolean {
|
||||
const validity = secp256k1.verifySignatureCompact(
|
||||
signature,
|
||||
this.bytes,
|
||||
messageHash
|
||||
messageHash,
|
||||
);
|
||||
|
||||
return validity;
|
||||
@@ -118,19 +158,27 @@ export class PublicKey {
|
||||
/**
|
||||
* Verify that a DER message hash was signed with the corresponding Private Key.
|
||||
*
|
||||
* @param messageHash {Uint8Array} The hash of the message.
|
||||
* @param signature {Uint8Array) The signature of the message.
|
||||
* @param messageHash The hash of the message.
|
||||
* @param signature The signature of the message.
|
||||
*
|
||||
* @returns {boolean} True if signature and message hash verifies, false otherwise..
|
||||
* @returns True if signature and message hash verifies, false otherwise..
|
||||
*/
|
||||
public verifyMessageHashDER(
|
||||
messageHash: Uint8Array,
|
||||
signature: Uint8Array
|
||||
messageHash: Uint8Array | string,
|
||||
signature: Uint8Array | string,
|
||||
): boolean {
|
||||
if (typeof messageHash === 'string') {
|
||||
messageHash = hexToBin(messageHash);
|
||||
}
|
||||
|
||||
if (typeof signature === 'string') {
|
||||
signature = hexToBin(signature);
|
||||
}
|
||||
|
||||
const validity = secp256k1.verifySignatureDER(
|
||||
signature,
|
||||
this.bytes,
|
||||
messageHash
|
||||
messageHash,
|
||||
);
|
||||
|
||||
return validity;
|
||||
@@ -139,19 +187,27 @@ export class PublicKey {
|
||||
/**
|
||||
* Verify that a Schnorr message hash was signed with the corresponding Private Key.
|
||||
*
|
||||
* @param messageHash {Uint8Array} The hash of the message.
|
||||
* @param signature {Uint8Array) The signature of the message.
|
||||
* @param messageHash The hash of the message.
|
||||
* @param signature The signature of the message.
|
||||
*
|
||||
* @returns {boolean} True if signature and message hash verifies, false otherwise..
|
||||
* @returns True if signature and message hash verifies, false otherwise..
|
||||
*/
|
||||
public verifyMessageHashSchnorr(
|
||||
messageHash: Uint8Array,
|
||||
signature: Uint8Array
|
||||
messageHash: Uint8Array | string,
|
||||
signature: Uint8Array | string,
|
||||
): boolean {
|
||||
if (typeof messageHash === 'string') {
|
||||
messageHash = hexToBin(messageHash);
|
||||
}
|
||||
|
||||
if (typeof signature === 'string') {
|
||||
signature = hexToBin(signature);
|
||||
}
|
||||
|
||||
const validity = secp256k1.verifySignatureSchnorr(
|
||||
signature,
|
||||
this.bytes,
|
||||
messageHash
|
||||
messageHash,
|
||||
);
|
||||
|
||||
return validity;
|
||||
@@ -160,7 +216,7 @@ export class PublicKey {
|
||||
/**
|
||||
* Encode the raw bytes of this Public Key to a hexadecimal representation.
|
||||
*
|
||||
* @returns {string} The raw bytes Public Key encoded as Hexadecimal.
|
||||
* @returns The raw bytes Public Key encoded as Hexadecimal.
|
||||
*/
|
||||
public toHex(): string {
|
||||
return binToHex(this.bytes);
|
||||
@@ -169,7 +225,7 @@ export class PublicKey {
|
||||
/**
|
||||
* Get the raw bytes of this Public Key.
|
||||
*
|
||||
* @returns {Uint8Array} The raw bytes of the Public Key.
|
||||
* @returns The raw bytes of the Public Key.
|
||||
*/
|
||||
public toBytes(): Uint8Array {
|
||||
// Return the raw bytes for this Public Key.
|
||||
@@ -179,7 +235,7 @@ export class PublicKey {
|
||||
/**
|
||||
* Return the hexadecimal representation of the raw bytes of the Public Key.
|
||||
*
|
||||
* @returns {string} The raw bytes of the Public Key as hexadecimal.
|
||||
* @returns The raw bytes of the Public Key as hexadecimal.
|
||||
*/
|
||||
public toString(): string {
|
||||
// Return the raw Public Key byes encoded as a hexadecimal string.
|
||||
|
||||
Reference in New Issue
Block a user