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.
Published at
2024-03-26 23:03:46Event JSON
{
"id": "f3a361a21db41c278d9a052cce2dd0efafd9185645bc4786d1f8e0b1ba031489",
"pubkey": "e12c1dd7fc1e5a6efa017760a3fb3977ee4b7fc519bbcea3e73f13742184b557",
"created_at": 1711494226,
"kind": 1,
"tags": [
[
"t",
"tuxdobananil"
],
[
"t",
"explains"
],
[
"t",
"nips"
],
[
"t",
"nip"
],
[
"t",
"include"
]
],
"content": "#tuxdobananil #explains #nips #nip-13\n\n# NIP-13: Prova de Trabalho (PoW) para Notas Nostr 🛠️\n\n## Resumo\n\nNIP-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.\n\n### Dificuldade\n\nA `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`.\n\n### Mineração\n\nPara gerar PoW para uma nota NIP-01, usa-se uma tag `nonce`:\n\n```json\n{\"content\": \"It's just me mining my own business\", \"tags\": [[\"nonce\", \"1\", \"21\"]]}\n```\n\nDurante 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.\n\nO terceiro valor na tag `nonce` DEVE conter a dificuldade-alvo, permitindo aos clientes protegerem-se contra spammers que, por sorte, atinjam uma dificuldade maior.\n\n### Exemplo de Nota Minerada\n\n```json\n{\n \"id\": \"000006d8c378af1779d2feebc7603a125d99eca0ccf1085959b307f64e5dd358\",\n \"pubkey\": \"a48380f4cfcc1ad5378294fcac36439770f9c878dd880ffa94bb74ea54a6f243\",\n \"created_at\": 1651794653,\n \"kind\": 1,\n \"tags\": [\n [\"nonce\", \"776797\", \"21\"]\n ],\n \"content\": \"It's just me mining my own business\",\n \"sig\": \"284622fc0a3f4f1303455d5175f7ba962a3300d136085b9566801bc2e0699de0c7e31e44c81fb40ad9049173742e904713c3594a1da0fc5d2382a25c11aba977\"\n}\n```\n\n### Validação\n\nSegue um código de referência em C para calcular a dificuldade (número de bits zero iniciais) em um ID de evento Nostr:\n\n```c\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n#include \u003cstring.h\u003e\n\nint countLeadingZeroes(const char *hex) {\n int count = 0;\n for (int i = 0; i \u003c strlen(hex); i++) {\n int nibble = (int)strtol((char[]){hex[i], '\\0'}, NULL, 16);\n if (nibble == 0) {\n count += 4;\n } else {\n count += __builtin_clz(nibble) - 28;\n break;\n }\n }\n return count;\n}\n\nint main(int argc, char *argv[]) {\n if (argc != 2) {\n fprintf(stderr, \"Usage: %s \u003chex_string\u003e\\n\", argv[0]);\n return 1;\n }\n const char *hex_string = argv[1];\n int result = countLeadingZeroes(hex_string);\n printf(\"Leading zeroes in hex string %s: %d\\n\", hex_string, result);\n return 0;\n}\n```\n\nE em JavaScript:\n\n```javascript\nfunction countLeadingZeroes(hex) {\n let count = 0;\n for (let i = 0; i \u003c hex.length; i++) {\n const nibble = parseInt(hex[i], 16);\n if (nibble === 0) {\n count += 4;\n } else {\n count += Math.clz32(nibble) - 28;\n break;\n }\n }\n return count;\n}\n```\n\n### Consultando Relays por Notas com PoW\n\nSe relays permitirem busca por prefixos, isso pode ser usado para filtrar notas de uma certa dificuldade.\n\n### Prova de Trabalho Delegada\n\nPoW 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.\n\n## Conclusão\n\nNIP-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.",
"sig": "ba31b90a7d91b3d0baed9dd766c08fdd790c3efdb19bb41b33a963c26a72c84537af3cde8b2e17d986080b4df07e1c1f1233585c752ee530163622943562bf39"
}