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

You could try to delete the older events using kind 5.

Reply to this note

Please Login to reply.

Discussion

Yep, this is a good mitigation strategy. But if nothing changes on either side, unfortunately, Amethyst will still write new events every time I change my relay settings, and we’ll soon be back to the same problem.

Until greenart7c3 can work his magic, here's another one of my awful scripts to delete all kind 10002 events from a relay, following nostr:nprofile1qqs8h057dewjchkpp2etmjkvd9chzr7j09m5ra4jsvq4ls60usya73qpz4mhxue69uhkummnw3ezummcw3ezuer9wchsz9thwden5te0wfjkccte9ejxzmt4wvhxjme0qy88wumn8ghj7mn0wvhxcmmv9ue77sja's advice above. It works with Citrine but not with Haven (Haven is silently ignoring delete events).

nostr:nprofile1qqsw9n8heusyq0el9f99tveg7r0rhcu9tznatuekxt764m78ymqu36cpz4mhxue69uhhyetvv9ujuat50phjummwv5hszymhwden5te0wahhgtn4w3ux7tn0dejj7qg4waehxw309an8yetwwvh82arcduhx7mn99uuwx66a, is supporting NIP-09 (Event deletion requests) something you feel strongly against, or is this just something that haven't been implemented yet / possible bug?

My impression from this line is that delete events should be working: https://github.com/bitvora/haven/blob/b51529221e3df04de22b73840e2b3cc3ed6b898c/main.go#L247

```javascript

import WebSocket from 'ws'

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

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

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

useWebSocketImplementation(WebSocket);

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

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

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

const pk = getPublicKey(sk)

let eventCount = 0

let eventTemplate = {

kind: 5,

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

tags: [],

content: 'Deleting all kind 10002 events',

}

relay.subscribe([

{

kinds: [10002],

authors: [pk],

},

], {

onevent(event) {

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

eventTemplate.tags.push(['e', event.id], ['k', '10002'])

eventCount++

},

async oneose() {

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

if (eventCount > 0) {

const signedEvent = finalizeEvent(eventTemplate, sk)

console.log('Deletion event:', signedEvent)

await relay.publish(signedEvent)

}

relay.close()

}

})

```

what are 10002 events and why delete them?

10002 events are events containing a list of your Inbox/Outbox relays—see: https://nostr-nips.com/nip-65

I’m deleting them because some relays are retaining outdated events and lists. When Amethyst downloads an outdated list from a relay, it sends a new 10002 event with the latest list. Since relays aren’t deleting old events and Amethyst isn’t filtering to show only the most recent event, users who switch relays frequently (like me) end up receiving a ton of redundant 10002 events, often triggering rate limits, etc.

Not sure if I’m explaining this clearly, but I hope it makes sense.