mirror of
https://github.com/nbd-wtf/nostr-tools.git
synced 2025-12-09 08:38:50 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
901445dea1 | ||
|
|
91b67cd0d5 | ||
|
|
1e696e0f3b | ||
|
|
4b36848b2d | ||
|
|
3cb351a5f4 | ||
|
|
5db1934fa4 |
10
README.md
10
README.md
@@ -30,11 +30,11 @@ let event = {
|
||||
kind: 1,
|
||||
created_at: Math.floor(Date.now() / 1000),
|
||||
tags: [],
|
||||
content: 'hello'
|
||||
content: 'hello',
|
||||
pubkey: getPublicKey(privateKey)
|
||||
}
|
||||
|
||||
event.id = getEventHash(event)
|
||||
event.pubkey = getPublicKey(privateKey)
|
||||
event.sig = signEvent(event, privateKey)
|
||||
|
||||
let ok = validateEvent(event)
|
||||
@@ -102,13 +102,13 @@ event.sig = signEvent(event, sk)
|
||||
|
||||
let pub = relay.publish(event)
|
||||
pub.on('ok', () => {
|
||||
console.log(`{relay.url} has accepted our event`)
|
||||
console.log(`${relay.url} has accepted our event`)
|
||||
})
|
||||
pub.on('seen', () => {
|
||||
console.log(`we saw the event on {relay.url}`)
|
||||
console.log(`we saw the event on ${relay.url}`)
|
||||
})
|
||||
pub.on('failed', reason => {
|
||||
console.log(`failed to publish to {relay.url}: ${reason}`)
|
||||
console.log(`failed to publish to ${relay.url}: ${reason}`)
|
||||
})
|
||||
|
||||
await relay.close()
|
||||
|
||||
@@ -4,7 +4,6 @@ const {
|
||||
validateEvent,
|
||||
verifySignature,
|
||||
signEvent,
|
||||
getEventHash,
|
||||
getPublicKey
|
||||
} = require('./lib/nostr.cjs')
|
||||
|
||||
@@ -35,15 +34,15 @@ test('validate event', () => {
|
||||
})
|
||||
|
||||
test('check signature', async () => {
|
||||
expect(await verifySignature(event)).toBeTruthy()
|
||||
expect(verifySignature(event)).toBeTruthy()
|
||||
})
|
||||
|
||||
test('sign event', async () => {
|
||||
let sig = await signEvent(unsigned, privateKey)
|
||||
let hash = getEventHash(unsigned)
|
||||
let pubkey = getPublicKey(privateKey)
|
||||
let authored = {...unsigned, pubkey}
|
||||
|
||||
let signed = {...unsigned, id: hash, sig, pubkey}
|
||||
let sig = signEvent(authored, privateKey)
|
||||
let signed = {...authored, sig}
|
||||
|
||||
expect(await verifySignature(signed)).toBeTruthy()
|
||||
expect(verifySignature(signed)).toBeTruthy()
|
||||
})
|
||||
|
||||
19
event.ts
19
event.ts
@@ -3,7 +3,6 @@ import {sha256} from '@noble/hashes/sha256'
|
||||
|
||||
import {utf8Encoder} from './utils'
|
||||
|
||||
|
||||
/* eslint-disable no-unused-vars */
|
||||
export enum Kind {
|
||||
Metadata = 0,
|
||||
@@ -17,7 +16,7 @@ export enum Kind {
|
||||
ChannelMetadata = 41,
|
||||
ChannelMessage = 42,
|
||||
ChannelHideMessage = 43,
|
||||
ChannelMuteUser = 44,
|
||||
ChannelMuteUser = 44
|
||||
}
|
||||
|
||||
export type Event = {
|
||||
@@ -41,6 +40,9 @@ export function getBlankEvent(): Event {
|
||||
}
|
||||
|
||||
export function serializeEvent(evt: Event): string {
|
||||
if (!validateEvent(evt))
|
||||
throw new Error("can't serialize event with wrong or missing properties")
|
||||
|
||||
return JSON.stringify([
|
||||
0,
|
||||
evt.pubkey,
|
||||
@@ -57,9 +59,10 @@ export function getEventHash(event: Event): string {
|
||||
}
|
||||
|
||||
export function validateEvent(event: Event): boolean {
|
||||
if (event.id !== getEventHash(event)) return false
|
||||
if (typeof event.content !== 'string') return false
|
||||
if (typeof event.created_at !== 'number') return false
|
||||
if (typeof event.pubkey !== 'string') return false
|
||||
if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false
|
||||
|
||||
if (!Array.isArray(event.tags)) return false
|
||||
for (let i = 0; i < event.tags.length; i++) {
|
||||
@@ -73,10 +76,12 @@ export function validateEvent(event: Event): boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
export function verifySignature(
|
||||
event: Event & {id: string; sig: string}
|
||||
): boolean {
|
||||
return secp256k1.schnorr.verifySync(event.sig, event.id, event.pubkey)
|
||||
export function verifySignature(event: Event & {sig: string}): boolean {
|
||||
return secp256k1.schnorr.verifySync(
|
||||
event.sig,
|
||||
getEventHash(event),
|
||||
event.pubkey
|
||||
)
|
||||
}
|
||||
|
||||
export function signEvent(event: Event, key: string): string {
|
||||
|
||||
8
nip19.ts
8
nip19.ts
@@ -17,7 +17,7 @@ export function decode(nip19: string): {
|
||||
type: string
|
||||
data: ProfilePointer | EventPointer | string
|
||||
} {
|
||||
let {prefix, words} = bech32.decode(nip19, 1000)
|
||||
let {prefix, words} = bech32.decode(nip19, 1500)
|
||||
let data = new Uint8Array(bech32.fromWords(words))
|
||||
|
||||
if (prefix === 'nprofile') {
|
||||
@@ -87,7 +87,7 @@ export function noteEncode(hex: string): string {
|
||||
function encodeBytes(prefix: string, hex: string): string {
|
||||
let data = secp256k1.utils.hexToBytes(hex)
|
||||
let words = bech32.toWords(data)
|
||||
return bech32.encode(prefix, words, 1000)
|
||||
return bech32.encode(prefix, words, 1500)
|
||||
}
|
||||
|
||||
export function nprofileEncode(profile: ProfilePointer): string {
|
||||
@@ -96,7 +96,7 @@ export function nprofileEncode(profile: ProfilePointer): string {
|
||||
1: (profile.relays || []).map(url => utf8Encoder.encode(url))
|
||||
})
|
||||
let words = bech32.toWords(data)
|
||||
return bech32.encode('nprofile', words, 1000)
|
||||
return bech32.encode('nprofile', words, 1500)
|
||||
}
|
||||
|
||||
export function neventEncode(event: EventPointer): string {
|
||||
@@ -105,7 +105,7 @@ export function neventEncode(event: EventPointer): string {
|
||||
1: (event.relays || []).map(url => utf8Encoder.encode(url))
|
||||
})
|
||||
let words = bech32.toWords(data)
|
||||
return bech32.encode('nevent', words, 1000)
|
||||
return bech32.encode('nevent', words, 1500)
|
||||
}
|
||||
|
||||
function encodeTLV(tlv: TLV): Uint8Array {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "nostr-tools",
|
||||
"version": "1.1.0",
|
||||
"version": "1.1.1",
|
||||
"description": "Tools for making a Nostr client.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -98,7 +98,7 @@ test('listening (twice) and publishing', async () => {
|
||||
content: 'nostr-tools test suite'
|
||||
}
|
||||
event.id = getEventHash(event)
|
||||
event.sig = await signEvent(event, sk)
|
||||
event.sig = signEvent(event, sk)
|
||||
|
||||
relay.publish(event)
|
||||
return expect(
|
||||
|
||||
Reference in New Issue
Block a user