diff --git a/nip13/helpers.go b/nip13/helpers.go new file mode 100644 index 0000000..33eb8c4 --- /dev/null +++ b/nip13/helpers.go @@ -0,0 +1,25 @@ +package nip13 + +const ( + maxSafeAscii = 126 + minSafeAscii = 35 + availableSafeAscii = maxSafeAscii - minSafeAscii +) + +func uintToStringCrazy(num uint64) string { + nchars := 1 + num/availableSafeAscii + chars := make([]byte, nchars) + + i := 0 + for { + if num < availableSafeAscii { + chars[i] = byte(num + minSafeAscii) + break + } else { + chars[i] = byte(num/availableSafeAscii + minSafeAscii) + num -= availableSafeAscii + i++ + } + } + return string(chars) +} diff --git a/nip13/nip13.go b/nip13/nip13.go index ee01d4c..9198031 100644 --- a/nip13/nip13.go +++ b/nip13/nip13.go @@ -80,7 +80,7 @@ func Generate(event *nostr.Event, targetDifficulty int, timeout time.Duration) ( start := time.Now() for { nonce++ - tag[1] = strconv.FormatUint(nonce, 10) + tag[1] = uintToStringCrazy(nonce) if Difficulty(event.GetID()) >= targetDifficulty { return event, nil } diff --git a/nip13/nip13_test.go b/nip13/nip13_test.go index 3d1821d..ccd7393 100644 --- a/nip13/nip13_test.go +++ b/nip13/nip13_test.go @@ -100,8 +100,8 @@ func testNonceTag(t *testing.T, event *nostr.Event, commitment int) { if tag[0] != "nonce" { t.Errorf("tag[0] = %q; want 'nonce'", tag[0]) } - if n, err := strconv.ParseInt(tag[1], 10, 64); err != nil || n < 1 { - t.Errorf("tag[1] = %q; want an int greater than 0", tag[1]) + if len(tag[1]) < 0 { + t.Errorf("tag[1] = %q; want a nonce character", tag[1]) } if n, err := strconv.Atoi(tag[2]); err != nil || n != commitment { t.Errorf("tag[2] = %q; want %d", tag[2], commitment)