Skip to content

Commit

Permalink
Merge pull request #185 from breez/savage-message-signing
Browse files Browse the repository at this point in the history
Add signing and verifying message docs
  • Loading branch information
dangeross authored Mar 3, 2025
2 parents 5238319 + fd6678f commit 27b1298
Show file tree
Hide file tree
Showing 20 changed files with 540 additions and 31 deletions.
8 changes: 8 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -127,15 +127,23 @@ jobs:
- build-packages
name: Check C# snippets
runs-on: ubuntu-latest
env:
DOTNET_INSTALL_DIR: "${{ github.workspace }}/dotnet"
steps:
- name: Checkout repo
uses: actions/checkout@v4

- name: Install Mono
run: sudo apt-get update && sudo apt-get install -y mono-complete

- name: Setup dotnet
uses: actions/setup-dotnet@v4
with:
dotnet-version: '7.0.x'

- name: Setup nuget
uses: nuget/setup-nuget@v2

- name: Download archived package
uses: actions/download-artifact@v4
with:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
book
.DS_Store
.idea
*.sln
*.nupkg
51 changes: 51 additions & 0 deletions snippets/csharp/Messages.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using Breez.Sdk;

public class MessagesSnippets
{
public void SignMessage(BlockingBreezServices sdk)
{
// ANCHOR: sign-message
var message = "<message to sign>";
try
{
var signMessageRequest = new SignMessageRequest(message);
var signMessageResponse = sdk.SignMessage(signMessageRequest);

// Get the node info for your pubkey
var info = sdk.NodeInfo();

var signature = signMessageResponse?.signature;
var pubkey = info?.id;

Console.WriteLine($"Pubkey: {pubkey}");
Console.WriteLine($"Signature: {signature}");
}
catch (Exception)
{
// Handle error
}
// ANCHOR_END: sign-message
}

public void CheckMessage(BlockingBreezServices sdk)
{
// ANCHOR: check-message
var message = "<message>";
var pubkey = "<pubkey of signer>";
var signature = "<message signature>";
try
{
var checkMessageRequest = new CheckMessageRequest(message, pubkey, signature);
var checkMessageResponse = sdk.CheckMessage(checkMessageRequest);

var isValid = checkMessageResponse?.isValid;

Console.WriteLine($"Signature valid: {isValid}");
}
catch (Exception)
{
// Handle error
}
// ANCHOR_END: check-message
}
}
41 changes: 41 additions & 0 deletions snippets/dart_snippets/lib/messages.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'package:dart_snippets/sdk_instance.dart';
import 'package:breez_sdk/bridge_generated.dart';

Future<SignMessageResponse> signMessage() async {
// ANCHOR: sign-message
SignMessageRequest signMessageRequest = SignMessageRequest(
message: "<message to sign>",
);
SignMessageResponse signMessageResponse = await breezSDK.signMessage(
req: signMessageRequest,
);

// Get the node info for your pubkey
NodeState? info = await breezSDK.nodeInfo();

String signature = signMessageResponse.signature;
String? pubkey = info?.id;

print("Pubkey: $pubkey");
print("Signature: $signature");
// ANCHOR_END: sign-message
return signMessageResponse;
}

Future<CheckMessageResponse> checkMessage() async {
// ANCHOR: check-message
CheckMessageRequest checkMessageRequest = CheckMessageRequest(
message: "<message>",
pubkey: "<pubkey of signer>",
signature: "<message signature>",
);
CheckMessageResponse checkMessageResponse = await breezSDK.checkMessage(
req: checkMessageRequest,
);

bool isValid = checkMessageResponse.isValid;

print("Signature valid: $isValid");
// ANCHOR_END: check-message
return checkMessageResponse;
}
58 changes: 58 additions & 0 deletions snippets/go/messages.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package example

import (
"log"

"github.com/breez/breez-sdk-go/breez_sdk"
)

func SignMessage() {
// ANCHOR: sign-message
message := "<message to sign>"

signMessageRequest := breez_sdk.SignMessageRequest{
Message: message,
}
signMessageResponse, err := sdk.SignMessage(signMessageRequest)
if err != nil {
log.Printf("Error: %#v", err)
return
}

// Get the node info for your pubkey
info, err := sdk.NodeInfo()
if err != nil {
log.Printf("Error: %#v", err)
return
}

signature := signMessageResponse.Signature
pubkey := info.Id

log.Printf("Pubkey: %v", pubkey)
log.Printf("Signature: %v", signature)
// ANCHOR_END: sign-message
}

func CheckMessage() {
// ANCHOR: check-message
message := "<message>"
pubkey := "<pubkey of signer>"
signature := "<message signature>"

checkMessageRequest := breez_sdk.CheckMessageRequest{
Message: message,
Pubkey: pubkey,
Signature: signature,
}
checkMessageResponse, err := sdk.CheckMessage(checkMessageRequest)
if err != nil {
log.Printf("Error: %#v", err)
return
}

isValid := checkMessageResponse.IsValid

log.Printf("Signature valid: %v", isValid)
// ANCHOR_END: check-message
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.example.kotlinmpplib

import breez_sdk.*

class Messages {
fun signMessage(sdk: BlockingBreezServices) {
// ANCHOR: sign-message
val message = "<message to sign>"
try {
val signMessageRequest = SignMessageRequest(message)
val signMessageResponse = sdk.signMessage(signMessageRequest)

// Get the node info for your pubkey
val info = sdk.nodeInfo()

val signature = signMessageResponse?.signature
val pubkey = info?.id

// Log.v("Breez", "Pubkey: ${pubkey}")
// Log.v("Breez", "Signature: ${signature}")
} catch (e: Exception) {
// handle error
}
// ANCHOR_END: sign-message
}

fun checkMessage(sdk: BlockingBreezServices) {
// ANCHOR: check-message
val message = "<message>"
val pubkey = "<pubkey of signer>"
val signature = "<message signature>"
try {
val checkMessageRequest = CheckMessageRequest(message, pubkey, signature)
val checkMessageResponse = sdk.checkMessage(checkMessageRequest)

val isValid = checkMessageResponse?.isValid

// Log.v("Breez", "Signature valid: ${isValid}")
} catch (e: Exception) {
// handle error
}
// ANCHOR_END: check-message
}

}
40 changes: 40 additions & 0 deletions snippets/python/src/messages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import logging
import breez_sdk


def sign_message(sdk_services):
# ANCHOR: sign-message
message = "<message to sign>"
try:
sign_message_request = breez_sdk.SignMessageRequest(message)
sign_message_response = sdk_services.sign_message(sign_message_request)

# Get the node info for your pubkey
info = sdk_services.node_info()

signature = sign_message_response.signature
pubkey = info.id

logging.debug(f"Pubkey: {pubkey}")
logging.debug(f"Signature: {signature}")
except Exception as error:
logging.error(error)
raise
# ANCHOR_END: sign-message

def check_message(sdk_services):
# ANCHOR: check-message
message = "<message>"
pubkey = "<pubkey of signer>"
signature = "<message signature>"
try:
check_message_request = breez_sdk.CheckMessageRequest(message, pubkey, signature)
check_message_response = sdk_services.check_message(check_message_request)

is_valid = check_message_response.is_valid

logging.debug(f"Signature valid: {is_valid}")
except Exception as error:
logging.error(error)
raise
# ANCHOR_END: check-message
35 changes: 35 additions & 0 deletions snippets/react-native/messages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import {
checkMessage,
nodeInfo,
signMessage
} from '@breeztech/react-native-breez-sdk'

const exampleSignMessage = async () => {
// ANCHOR: sign-message
const signMessageResponse = await signMessage({
message: '<message to sign>'
})

// Get the node info for your pubkey
const info = await nodeInfo()

const signature = signMessageResponse.signature
const pubkey = info.id

console.log(`Pubkey: ${pubkey}`)
console.log(`Signature: ${signature}`)
// ANCHOR_END: sign-message
}

const exampleCheckMessage = async () => {
// ANCHOR: check-message
const checkMessageResponse = await checkMessage({
message: '<message>',
pubkey: '<pubkey of signer>',
signature: '<message signature>'
})
const isValid = checkMessageResponse.isValid

console.log(`Signature valid: ${isValid}`)
// ANCHOR_END: check-message
}
4 changes: 1 addition & 3 deletions snippets/react-native/pay_onchain.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import {
type OnchainPaymentLimitsResponse,
type PrepareOnchainPaymentResponse,
fetchReverseSwapFees,
inProgressOnchainPayments,
onchainPaymentLimits,
payOnchain,
prepareOnchainPayment,
SwapAmountType,
maxReverseSwapAmount
SwapAmountType
} from '@breeztech/react-native-breez-sdk'

const exampleFetchReverseSwapLimits = async () => {
Expand Down
14 changes: 7 additions & 7 deletions snippets/rust/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion snippets/rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ anyhow = "1"
bip39 = { version = "2", features = ["rand"] }
breez-sdk-core = { git = "https://github.com/breez/breez-sdk", tag = "0.6.1" }
log = "0.4"
tokio = "1.29"
tokio = "1.41"
4 changes: 2 additions & 2 deletions snippets/rust/src/lnurl_auth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ async fn auth(sdk: Arc<BreezServices>) -> Result<()> {
// keyauth://domain.com/auth?key=val
let lnurl_auth_url = "lnurl1dp68gurn8ghj7mr0vdskc6r0wd6z7mrww4excttvdankjm3lw3skw0tvdankjm3xdvcn6vtp8q6n2dfsx5mrjwtrxdjnqvtzv56rzcnyv3jrxv3sxqmkyenrvv6kve3exv6nqdtyv43nqcmzvdsnvdrzx33rsenxx5unqc3cxgeqgntfgu";

if let Ok(LnUrlAuth { data: ad }) = parse(lnurl_auth_url).await {
match sdk.lnurl_auth(ad).await {
if let Ok(LnUrlAuth { data }) = parse(lnurl_auth_url).await {
match sdk.lnurl_auth(data).await {
Ok(LnUrlCallbackStatus::Ok) => {
info!("Successfully authenticated")
}
Expand Down
6 changes: 3 additions & 3 deletions snippets/rust/src/lnurl_pay.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ async fn pay(sdk: Arc<BreezServices>) -> Result<()> {
// lnurl1dp68gurn8ghj7mr0vdskc6r0wd6z7mrww4excttsv9un7um9wdekjmmw84jxywf5x43rvv35xgmr2enrxanr2cfcvsmnwe3jxcukvde48qukgdec89snwde3vfjxvepjxpjnjvtpxd3kvdnxx5crxwpjvyunsephsz36jf
let lnurl_pay_url = "lightning@address.com";

if let Ok(LnUrlPay { data: pd }) = parse(lnurl_pay_url).await {
let amount_msat = pd.min_sendable;
if let Ok(LnUrlPay { data, .. }) = parse(lnurl_pay_url).await {
let amount_msat = data.min_sendable;
let use_trampoline = true;
let optional_comment = Some("<comment>".to_string());
let optional_payment_label = Some("<label>".to_string());

sdk.lnurl_pay(LnUrlPayRequest {
data: pd,
data,
amount_msat,
use_trampoline,
comment: optional_comment,
Expand Down
Loading

0 comments on commit 27b1298

Please sign in to comment.