Why Nostr? What is Njump?
2024-03-26 23:03:46

5967820 on Nostr: #tuxdobananil #explains #nips #nip-13 # NIP-13: Prova de Trabalho (PoW) para Notas ...

#tuxdobananil #explains #nips #nip-13

# NIP-13: Prova de Trabalho (PoW) para Notas Nostr 🛠️

## Resumo

NIP-13 introduz um método para gerar e interpretar Prova de Trabalho (Proof of Work - PoW) para notas no protocolo Nostr. PoW adiciona uma prova de trabalho computacional a uma nota, servindo como um meio de dissuasão de spam.

### Dificuldade

A `dificuldade` é definida pelo número de bits zero iniciais no ID do evento NIP-01. Por exemplo, um ID com `36` bits zero iniciais tem uma dificuldade de `36`.

### Mineração

Para gerar PoW para uma nota NIP-01, usa-se uma tag `nonce`:

```json
{"content": "It's just me mining my own business", "tags": [["nonce", "1", "21"]]}
```

Durante a mineração, o segundo valor na tag `nonce` é atualizado, recalculando o ID. Se o ID atingir o número desejado de bits zero iniciais, a nota foi minerada com sucesso. É recomendado também atualizar `created_at` durante este processo.

O terceiro valor na tag `nonce` DEVE conter a dificuldade-alvo, permitindo aos clientes protegerem-se contra spammers que, por sorte, atinjam uma dificuldade maior.

### Exemplo de Nota Minerada

```json
{
"id": "000006d8c378af1779d2feebc7603a125d99eca0ccf1085959b307f64e5dd358",
"pubkey": "a48380f4cfcc1ad5378294fcac36439770f9c878dd880ffa94bb74ea54a6f243",
"created_at": 1651794653,
"kind": 1,
"tags": [
["nonce", "776797", "21"]
],
"content": "It's just me mining my own business",
"sig": "284622fc0a3f4f1303455d5175f7ba962a3300d136085b9566801bc2e0699de0c7e31e44c81fb40ad9049173742e904713c3594a1da0fc5d2382a25c11aba977"
}
```

### Validação

Segue um código de referência em C para calcular a dificuldade (número de bits zero iniciais) em um ID de evento Nostr:

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int countLeadingZeroes(const char *hex) {
int count = 0;
for (int i = 0; i < strlen(hex); i++) {
int nibble = (int)strtol((char[]){hex[i], '\0'}, NULL, 16);
if (nibble == 0) {
count += 4;
} else {
count += __builtin_clz(nibble) - 28;
break;
}
}
return count;
}

int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <hex_string>\n", argv[0]);
return 1;
}
const char *hex_string = argv[1];
int result = countLeadingZeroes(hex_string);
printf("Leading zeroes in hex string %s: %d\n", hex_string, result);
return 0;
}
```

E em JavaScript:

```javascript
function countLeadingZeroes(hex) {
let count = 0;
for (let i = 0; i < hex.length; i++) {
const nibble = parseInt(hex[i], 16);
if (nibble === 0) {
count += 4;
} else {
count += Math.clz32(nibble) - 28;
break;
}
}
return count;
}
```

### Consultando Relays por Notas com PoW

Se relays permitirem busca por prefixos, isso pode ser usado para filtrar notas de uma certa dificuldade.

### Prova de Trabalho Delegada

PoW pode ser externalizado para provedores de PoW, talvez mediante pagamento. Isso permite que clientes publiquem suas mensagens em relays restritos por PoW sem necessidade de realizar o trabalho computacional, útil para dispositivos com restrições energéticas.

## Conclusão

NIP-13 apresenta um método eficaz de incorporar Prova de Trabalho nas notas Nostr, promovendo uma rede mais resistente ao spam e permitindo a implementação de restrições baseadas em trabalho computacional de forma universal.
Author Public Key
npub1uykpm4luredxa7spwas287eewlhykl79rxauagl88ufhggvyk4tsl7w258