feat: add verify message support for LDK Node backend

This commit is contained in:
Evan Kaloudis
2026-03-26 20:01:46 -04:00
parent 3f4b8cfe06
commit f387869598
9 changed files with 80 additions and 12 deletions
+1
View File
@@ -591,6 +591,7 @@ export default class CLNRest {
supportsPeers = () => true;
supportsMessageSigning = () => true;
supportsMessageVerification = () => true;
requiresVerifyPubkey = () => false;
supportsAddressMessageSigning = () => false;
supportsLnurlAuth = () => true;
supportsOnchainBalance = () => true;
+1
View File
@@ -421,6 +421,7 @@ export default class EmbeddedLND extends LND {
supportsPeers = () => true;
supportsMessageSigning = () => true;
supportsMessageVerification = () => true;
requiresVerifyPubkey = () => false;
supportsAddressMessageSigning = () => true;
supportsLnurlAuth = () => true;
supportsOnchainBalance = () => true;
+8 -5
View File
@@ -1702,10 +1702,12 @@ export default class EmbeddedLdkNode {
return { signature };
};
verifyMessage = async (data: { msg: string; signature: string }) => {
const { msg, signature } = data;
// Get the node's public key to verify against
const pubkey = await LdkNode.node.nodeId();
verifyMessage = async (data: {
msg: string;
signature: string;
pubkey: string;
}) => {
const { msg, signature, pubkey } = data;
const valid = await LdkNode.signing.verifySignature({
message: msg,
signature,
@@ -1948,7 +1950,8 @@ export default class EmbeddedLdkNode {
// ========================================================================
supportsMessageSigning = () => true;
supportsMessageVerification = () => false;
supportsMessageVerification = () => true;
requiresVerifyPubkey = () => true;
supportsLnurlAuth = () => true;
supportsOnchainBalance = () => true;
supportsOnchainSends = () => true;
+1
View File
@@ -872,6 +872,7 @@ export default class LND {
supportsPeers = () => true;
supportsMessageSigning = () => true;
supportsMessageVerification = () => true;
requiresVerifyPubkey = () => false;
supportsLnurlAuth = () => true;
supportsOnchainBalance = () => true;
supportsOnchainSends = () => true;
+1
View File
@@ -709,6 +709,7 @@ export default class LightningNodeConnect {
supportsPeers = () => true;
supportsMessageSigning = () => this.permSignMessage;
supportsMessageVerification = () => true;
requiresVerifyPubkey = () => false;
supportsAddressMessageSigning = () => true;
supportsLnurlAuth = () => true;
supportsOnchainBalance = () => true;
+2
View File
@@ -1026,6 +1026,8 @@
"views.Settings.SignMessage.noAddressForVerification": "No address provided for on-chain verification",
"views.Settings.SignMessage.noDataReceived": "No data received from sign operation",
"views.Settings.SignMessage.signOperationFailed": "Sign operation not supported",
"views.Settings.SignMessage.pubkeyToVerify": "Pubkey of signer",
"views.Settings.SignMessage.pleaseEnterPubkey": "Please enter the pubkey of the signer",
"views.Settings.SignMessage.verificationOperationFailed": "Verification operation not supported",
"views.Settings.Language.title": "Language",
"views.Settings.Currency.title": "Currency",
+3 -1
View File
@@ -7,6 +7,7 @@ interface VerificationRequest {
msg: string;
signature: string;
addr?: string;
pubkey?: string;
}
export default class MessageSignStore {
@@ -233,7 +234,8 @@ export default class MessageSignStore {
this.signingMode === 'lightning'
? BackendUtils.verifyMessage({
msg: data.msg,
signature: data.signature
signature: data.signature,
pubkey: data.pubkey
})
: BackendUtils.verifyMessageWithAddr(
data.msg,
+1
View File
@@ -191,6 +191,7 @@ class BackendUtils {
supportsMessageSigning = () => this.call('supportsMessageSigning');
supportsMessageVerification = () =>
this.call('supportsMessageVerification');
requiresVerifyPubkey = () => this.call('requiresVerifyPubkey');
supportsLnurlAuth = () => this.call('supportsLnurlAuth');
supportsOnchainBalance = () => this.call('supportsOnchainBalance');
supportsOnchainSends = () => this.call('supportsOnchainSends');
+62 -6
View File
@@ -40,12 +40,14 @@ interface SignVerifyMessageState {
messageToSign: string;
messageToVerify: string;
signatureToVerify: string;
pubkeyToVerify: string;
selectedIndex: number;
signingMethodIndex: number;
selectedAddress: string;
signingMode: string;
supportsAddressMessageSigning: boolean;
supportsMessageVerification: boolean;
requiresVerifyPubkey: boolean;
loading: boolean;
}
@@ -61,12 +63,14 @@ export default class SignVerifyMessage extends React.Component<
messageToSign: '',
messageToVerify: '',
signatureToVerify: '',
pubkeyToVerify: '',
selectedIndex: 0,
signingMethodIndex: 0,
selectedAddress: '',
signingMode: 'lightning',
supportsAddressMessageSigning: false,
supportsMessageVerification: true,
requiresVerifyPubkey: false,
loading: false
};
@@ -93,6 +97,10 @@ export default class SignVerifyMessage extends React.Component<
this.setState({ supportsMessageVerification: false });
}
if (BackendUtils.requiresVerifyPubkey()) {
this.setState({ requiresVerifyPubkey: true });
}
this.handleRouteParams(route?.params || {});
};
@@ -225,6 +233,7 @@ export default class SignVerifyMessage extends React.Component<
messageToSign: '',
messageToVerify: '',
signatureToVerify: '',
pubkeyToVerify: '',
selectedAddress: ''
});
@@ -609,7 +618,7 @@ export default class SignVerifyMessage extends React.Component<
'views.Settings.SignMessage.success'
)}
/>
{pubkey && (
{pubkey && !this.state.requiresVerifyPubkey && (
<View style={styles.copyBoxContainer}>
<CopyBox
heading={localeString(
@@ -674,10 +683,12 @@ export default class SignVerifyMessage extends React.Component<
const {
messageToVerify,
signatureToVerify,
pubkeyToVerify,
selectedAddress,
signingMode
signingMode,
requiresVerifyPubkey,
supportsAddressMessageSigning
} = this.state;
const { supportsAddressMessageSigning } = this.state;
if (!messageToVerify || messageToVerify.trim() === '') {
Alert.alert(
@@ -695,6 +706,16 @@ export default class SignVerifyMessage extends React.Component<
return false;
}
if (
requiresVerifyPubkey &&
(!pubkeyToVerify || pubkeyToVerify.trim() === '')
) {
Alert.alert(
localeString('views.Settings.SignMessage.pleaseEnterPubkey')
);
return false;
}
if (
supportsAddressMessageSigning &&
signingMode === 'onchain' &&
@@ -863,6 +884,8 @@ export default class SignVerifyMessage extends React.Component<
text
);
}}
autoCorrect={false}
autoCapitalize="none"
multiline
style={{
height: 100
@@ -881,7 +904,7 @@ export default class SignVerifyMessage extends React.Component<
}}
onPress={() => {
if (this.validateSigningInput()) {
signMessage(messageToSign);
signMessage(messageToSign.trim());
}
}}
/>
@@ -938,6 +961,8 @@ export default class SignVerifyMessage extends React.Component<
);
}}
locked={loading}
autoCorrect={false}
autoCapitalize="none"
multiline
style={{
height: 100
@@ -964,6 +989,8 @@ export default class SignVerifyMessage extends React.Component<
text
);
}}
autoCorrect={false}
autoCapitalize="none"
multiline
style={{
height: 100
@@ -972,6 +999,33 @@ export default class SignVerifyMessage extends React.Component<
/>
</View>
{this.state.requiresVerifyPubkey && (
<View style={styles.form}>
<Text
style={{
...styles.text,
color: themeColor('secondaryText')
}}
>
{localeString(
'views.Settings.SignMessage.pubkeyToVerify'
)}
</Text>
<TextInput
value={this.state.pubkeyToVerify}
onChangeText={(text: string) => {
this.handleTextInputChange(
'pubkeyToVerify',
text
);
}}
autoCorrect={false}
autoCapitalize="none"
locked={loading}
/>
</View>
)}
{this.renderVerificationResult()}
<View style={styles.button}>
@@ -1010,6 +1064,7 @@ export default class SignVerifyMessage extends React.Component<
const {
messageToVerify,
signatureToVerify,
pubkeyToVerify,
selectedAddress,
signingMode
} = this.state;
@@ -1021,8 +1076,9 @@ export default class SignVerifyMessage extends React.Component<
const { supportsAddressMessageSigning } = this.state;
const verifyRequest = {
msg: messageToVerify,
signature: signatureToVerify,
msg: messageToVerify.trim(),
signature: signatureToVerify.trim(),
pubkey: pubkeyToVerify.trim() || undefined,
addr:
supportsAddressMessageSigning && signingMode === 'onchain'
? selectedAddress