Skip to content

Commit 97d599f

Browse files
authored
Add Event.note_id bech32 format property (#49)
1 parent 649c474 commit 97d599f

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

nostr/event.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
from dataclasses import dataclass, field
44
from enum import IntEnum
55
from typing import List
6-
from secp256k1 import PrivateKey, PublicKey
6+
from secp256k1 import PublicKey
77
from hashlib import sha256
88

9+
from . import bech32
910
from .message_type import ClientMessageType
1011

1112

@@ -57,6 +58,12 @@ def id(self) -> str:
5758
return Event.compute_id(self.public_key, self.created_at, self.kind, self.tags, self.content)
5859

5960

61+
@property
62+
def note_id(self) -> str:
63+
converted_bits = bech32.convertbits(bytes.fromhex(self.id), 8, 5)
64+
return bech32.bech32_encode("note", converted_bits, bech32.Encoding.BECH32)
65+
66+
6067
def add_pubkey_ref(self, pubkey:str):
6168
""" Adds a reference to a pubkey as a 'p' tag """
6269
self.tags.append(['p', pubkey])

test/test_event.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import pytest
22
import time
3+
4+
from nostr import bech32
35
from nostr.event import Event, EncryptedDirectMessage
46
from nostr.key import PrivateKey
57

@@ -36,6 +38,44 @@ def test_event_id_recomputes(self):
3638
assert event.id != event_id
3739

3840

41+
def test_note_id_bech32_conversion(self):
42+
""" should convert the event id to its `note`-prepended bech32 form """
43+
event = Event(content="some event")
44+
assert event.note_id.startswith("note")
45+
46+
# reverse the bech32 encoding
47+
hrp, data, spec = bech32.bech32_decode(event.note_id)
48+
raw_event_id = bech32.convertbits(data, 5, 8)[:-1]
49+
50+
# Should get the same event_id back
51+
assert event.id == bytes(raw_event_id).hex()
52+
53+
54+
def test_note_id_conformity(self):
55+
""" should produce the same note ID as a known published note """
56+
"""
57+
A real-world note from fiatjaf:
58+
{
59+
"id": "deb8b23368b6c658c36cf16396927a045dee0b7707b4133d714fb67264cc10cc",
60+
"kind": 1,
61+
"pubkey": "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
62+
"created_at": 1673361254,
63+
"content": "hello",
64+
"tags": [],
65+
"sig": "f5e5e8a477c6749ef8562c23cdfec7a6917c975ec55075489cb3319b8a2ccb78317335a6850fb3a3714777b1c22611419d6c81ce4b0b88db86e2d1662bb17540"
66+
}
67+
"""
68+
event = Event(
69+
content="hello",
70+
public_key="3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
71+
created_at=1673361254,
72+
kind=1,
73+
signature="f5e5e8a477c6749ef8562c23cdfec7a6917c975ec55075489cb3319b8a2ccb78317335a6850fb3a3714777b1c22611419d6c81ce4b0b88db86e2d1662bb17540"
74+
)
75+
assert event.id == "deb8b23368b6c658c36cf16396927a045dee0b7707b4133d714fb67264cc10cc"
76+
assert event.note_id == "note1m6utyvmgkmr93smv793edyn6q3w7uzmhq76px0t3f7m8yexvzrxqw46k83"
77+
78+
3979
def test_add_event_ref(self):
4080
""" should add an 'e' tag for each event_ref added """
4181
some_event_id = "some_event_id"

0 commit comments

Comments
 (0)