Replying to Avatar Anthony Accioly

Hi nostr:nprofile1qqs827g8dkd07zjvlhh60csytujgd3l9mz7x807xk3fewge7rwlukxgpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszrnhwden5te0dehhxtnvdakz7qgswaehxw309ahx7um5wghx6mmd9usjfpck, I’m sorry to bother you, but I’ve just confirmed that Citrine is also experiencing the “store more than one replaceable event per kind and pubkey” issue as described by nostr:nprofile1qqsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqppemhxue69uhkummn9ekx7mp0qythwumn8ghj7anfw3hhytnwdaehgu339e3k7mf0qyghwumn8ghj7mn0wd68ytnhd9hx2tch2deau below.

nostr:nevent1qqszpw6fuypscee284eap44kjcrusvdl97jrhpd0xkrwq3wfmcc9ndspypmhxue69uhksctkv4hzuctrvd5k7mre9eek7cmfv9kz76twvfhhsq3qgcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqxpqqqqqqzrnj7sq

I have the delete events option enabled, but Citrine is still returning more than one kind 10002 event for my pubkey.

Since folks may not want to open Citrine to the internet, I wrote a quick script with `nostr-tools` (sorry, I’m not a JavaScript person at all) to reproduce the problem below. Just replace the IP address and pubkey. My local Citrine instance is currently storing and returning several different kind 10002 events for my pubkey.

```javascript

import WebSocket from 'ws'

import { Relay, useWebSocketImplementation } from 'nostr-tools/relay'

useWebSocketImplementation(WebSocket);

const relay = await Relay.connect('ws://192.168.1.1:4869');

console.log(`connected to ${relay.url}`)

const pk = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

let eventCount = 0

relay.subscribe([

{

kinds: [10002],

authors: [pk],

},

], {

onevent(event) {

console.log('got event:', event)

eventCount++

},

oneose() {

console.log('Got', eventCount, 'events')

relay.close()

}

})

```

Could you please have a look when you have a chance?

nostr:nprofile1qqsw9n8heusyq0el9f99tveg7r0rhcu9tznatuekxt764m78ymqu36cpz4mhxue69uhhyetvv9ujuat50phjummwv5hszymhwden5te0wahhgtn4w3ux7tn0dejj7qg4waehxw309an8yetwwvh82arcduhx7mn99uuwx66a and nostr:nprofile1qqsrhuxx8l9ex335q7he0f09aej04zpazpl0ne2cgukyawd24mayt8gprfmhxue69uhhq7tjv9kkjepwve5kzar2v9nzucm0d5hszxmhwden5te0wfjkccte9emk2um5v4exucn5vvhxxmmd9uq3xamnwvaz7tmhda6zuat50phjummwv5hsx7c9z9 are also currently working on fixing this in HAVEN + katru.

#devstr

Last update of the day. Some folks asked for a version of my crappy script that preserves the latest relay list, and someone also suggested adding a “license” to it. So here you go. Thanks, nostr:nprofile1qqs8h057dewjchkpp2etmjkvd9chzr7j09m5ra4jsvq4ls60usya73qpz4mhxue69uhkummnw3ezummcw3ezuer9wchsz9thwden5te0wfjkccte9ejxzmt4wvhxjme0qy88wumn8ghj7mn0wvhxcmmv9ue77sja, for the idea.

```javascript

// Remove all outdated kind 10002 events

// SPDX-License-Identifier: Unlicense

// SPDX-FileCopyrightText: 2024 Anthony Accioly

import WebSocket from 'ws'

import { Relay, useWebSocketImplementation } from 'nostr-tools/relay'

import { finalizeEvent, getPublicKey, sortEvents } from 'nostr-tools/pure'

import * as nip19 from 'nostr-tools/nip19'

useWebSocketImplementation(WebSocket);

const relay = await Relay.connect('ws://192.168.1.1:4869');

const sk = nip19.decode('nsec1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa').data

const pk = getPublicKey(sk)

console.log(`connected to ${relay.url}`)

const kind10002Events = []

relay.subscribe([

{

kinds: [10002],

authors: [pk],

},

], {

onevent(event) {

kind10002Events.push(event)

},

async oneose() {

const eventCount = kind10002Events.length

console.log('Got', eventCount, 'kind 10002 events')

try {

await removeAllOutdatedKind10002Events();

} catch (error) {

console.error('Error removing outdated events:', error);

}

relay.close()

}

})

async function removeAllOutdatedKind10002Events() {

if (kind10002Events.length === 0) {

console.log('No kind 10002 events to remove')

return

}

const [firstEvent, ...outdatedEvents] = sortEvents(kind10002Events);

console.log('Most recent kind 10002 event:', firstEvent);

if (outdatedEvents.length === 0) {

console.log('No outdated kind 10002 events to remove')

return

}

const deleteEvent = finalizeEvent({

kind: 5,

created_at: Math.floor(Date.now() / 1000),

// Event tags with id and kind

tags: outdatedEvents.flatMap(e => [['e', e.id], ['k', '10002']]),

content: 'Deleting outdated kind 10002 events',

}, sk)

console.log('Delete event:', deleteEvent)

try {

await relay.publish(deleteEvent);

console.log('Deleted', outdatedEvents.length, 'kind 10002 events');

} catch (error) {

console.error('Error publishing delete event:', error);

}

}

```

Haven doesn’t honour delete requests at the moment. One way to work around this is to delete the Outbox database and re-import your notes from well-behaved relays. Once you have a single kind 10002 event in your Outbox relay, avoid changing your relay settings (easier said than done, but it’s the only workaround I’ve found until either Amethyst or Haven/Khatru is updated).

nostr:nevent1qqs8pj23nwav4e352086d7eawq4w28lqus7yp4l6ey8vvj7uvux97tgpypmhxue69uhksctkv4hzuctrvd5k7mre9eek7cmfv9kz76twvfhhsq3qa6we08n7zsv2na689whc9hykpq4q6sj3kaauk9c2dm8vj0adlajqxpqqqqqqzv39a9a

#devnostr #kind10002writeLoop #amethyst #haven #citrine

Reply to this note

Please Login to reply.