SHA256
Добавить Arweave viewer v2
This commit is contained in:
+1
-1
@@ -1,2 +1,2 @@
|
||||
client.version=1.12.20
|
||||
client.version=1.12.21
|
||||
server.version=1.10.8
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
# SHiNE Arweave Viewer v2 — ANS-104 / Frame v1
|
||||
|
||||
Новая версия viewer для формата, где каждый пользовательский блок хранится в Arweave как отдельный ANS-104 DataItem, а `data` DataItem содержит один `SHiNE Frame v1`.
|
||||
|
||||
Основной файл: `index.html`.
|
||||
|
||||
## Быстрый запуск
|
||||
|
||||
Через логин (ключ берётся из Solana PDA):
|
||||
|
||||
```text
|
||||
index.html?login=aidarkc&channel=books
|
||||
```
|
||||
|
||||
Напрямую через blockchain public key, без Solana:
|
||||
|
||||
```text
|
||||
index.html?key=<BASE58_BLOCKCHAIN_PUBLIC_KEY>&channel=books
|
||||
```
|
||||
|
||||
Дополнительные параметры:
|
||||
|
||||
```text
|
||||
&arweaveGateway=https://arweave.net
|
||||
&solanaRpc=https://api.mainnet-beta.solana.com
|
||||
```
|
||||
|
||||
`channel` можно не передавать. Тогда viewer ищет все DataItem пользователя с `App=test5590` и строит список каналов из найденных блоков.
|
||||
|
||||
## Что делает viewer
|
||||
|
||||
1. Если передан `login`, вычисляет PDA `user_login=<login>` программы `SHiNEPr1APdAgNBteUyBXcNovaHctpSjUu8oH2ZJdN6` и читает `blockchainKey`.
|
||||
2. Если передан `key`, использует его напрямую и не обращается к Solana.
|
||||
3. Из Ed25519/Solana public key вычисляет Arweave owner address как `base64url(SHA-256(pubkey32))`.
|
||||
4. Делает Arweave GraphQL запрос по owner + `App=test5590`; при наличии `channel` добавляет тег `c=<channel>`.
|
||||
5. Загружает payload каждого DataItem через gateway `/<DataItemId>`.
|
||||
6. Разбирает payload как SHiNE Frame v1 (`frameCode=0x0001`, header 56 bytes).
|
||||
7. Дедуплицирует повторно опубликованные одинаковые пользовательские блоки по SHA-256 Frame v1.
|
||||
8. Восстанавливает канал/сообщения тем же body parser, который использовал старый viewer.
|
||||
|
||||
## Важно
|
||||
|
||||
При фильтрации по конкретному `channel` viewer получает только блоки с соответствующим тегом `c`. Поэтому он не заявляет полную проверку глобальной `prevHash`-цепочки пользователя: между двумя блоками одного канала могут существовать блоки других каналов. SHA-256 каждого загруженного Frame вычисляется локально.
|
||||
|
||||
Старый `shine-solana-arweave-viewer/` не изменяется; новая версия лежит отдельно в `shine-solana-arweave-viewer-v2/`.
|
||||
@@ -0,0 +1,11 @@
|
||||
# SHiNE Solana Arweave Viewer
|
||||
|
||||
Основной рабочий файл:
|
||||
|
||||
- `index.html`
|
||||
|
||||
Подробное описание работы, параметров и готовых ссылок:
|
||||
|
||||
- `КАК_ЭТО_РАБОТАЕТ.md`
|
||||
|
||||
Viewer собран как автономный single-file HTML и запускается одним файлом без соседних зависимостей.
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,114 @@
|
||||
# SHiNE Solana Arweave Viewer: как это работает
|
||||
|
||||
## Что лежит в папке
|
||||
|
||||
Основной и единственный рабочий файл viewer:
|
||||
|
||||
- `index.html`
|
||||
|
||||
Это автономный single-file viewer:
|
||||
|
||||
- весь HTML внутри одного файла;
|
||||
- все стили внутри этого же файла;
|
||||
- весь JavaScript внутри этого же файла;
|
||||
- локальная копия `solana-web3` тоже встроена внутрь этого же файла.
|
||||
|
||||
Для запуска viewer достаточно открыть один `index.html`.
|
||||
|
||||
## Что делает viewer
|
||||
|
||||
Viewer открывается как обычная HTML-страница и работает полностью в браузере.
|
||||
|
||||
Он умеет:
|
||||
|
||||
- принимать логин пользователя SHiNE;
|
||||
- принимать `Solana RPC` через форму или через URL-параметр;
|
||||
- принимать `Arweave gateway` через форму или через URL-параметр;
|
||||
- сохранять эти значения в `localStorage`;
|
||||
- вычислять `user_pda` по логину для программы `shine_users`;
|
||||
- читать `PDA` напрямую из `Solana`;
|
||||
- распарсивать содержимое записи `shine_users`;
|
||||
- показывать ключи, лимиты, номер записи, блокчейн пользователя и `Arweave tx id`;
|
||||
- строить прямую ссылку на `Arweave`, если `tx id` есть в записи.
|
||||
|
||||
## Какие URL-параметры поддерживаются
|
||||
|
||||
Viewer понимает такие параметры:
|
||||
|
||||
- `login`
|
||||
- `solanaRpc`
|
||||
- `arweaveGateway`
|
||||
|
||||
Пример:
|
||||
|
||||
```text
|
||||
index.html?login=aidartest&solanaRpc=https%3A%2F%2Fsolana-rpc.publicnode.com&arweaveGateway=https%3A%2F%2Farweave.net
|
||||
```
|
||||
|
||||
## Предустановленные адреса
|
||||
|
||||
### Solana RPC
|
||||
|
||||
- `https://solana-rpc.publicnode.com`
|
||||
- `https://public.rpc.solanavibestation.com/`
|
||||
|
||||
### Arweave gateway
|
||||
|
||||
- `https://arweave.net`
|
||||
|
||||
## Почему одна из RPC может не работать
|
||||
|
||||
Адрес:
|
||||
|
||||
- `https://public.rpc.solanavibestation.com/`
|
||||
|
||||
может возвращать браузерную ошибку `403` с текстом про `Origin is not whitelisted`.
|
||||
|
||||
Это означает, что проблема обычно не в SHiNE viewer, а в CORS-политике самого RPC.
|
||||
Для HTML-страницы, открытой прямо в браузере, это обычно не лечится со стороны клиента.
|
||||
|
||||
Практически для viewer лучше использовать:
|
||||
|
||||
- `https://solana-rpc.publicnode.com`
|
||||
|
||||
## Ссылки на загруженный файл в Arweave
|
||||
|
||||
Основная ссылка:
|
||||
|
||||
- `https://isvg77xrihxyzqnjex3j4uldyao7xbsfda4uhoydtigeugovjvza.arweave.net/RKpv_vFB74zBqSX2nlFjwB37hkUYOUO7A5oMShnVTXI`
|
||||
|
||||
Та же ссылка с тестовым логином `aidartest`:
|
||||
|
||||
- `https://isvg77xrihxyzqnjex3j4uldyao7xbsfda4uhoydtigeugovjvza.arweave.net/RKpv_vFB74zBqSX2nlFjwB37hkUYOUO7A5oMShnVTXI?login=aidartest`
|
||||
|
||||
Та же ссылка с тестовым логином `aidartest` и явным рабочим RPC:
|
||||
|
||||
- `https://isvg77xrihxyzqnjex3j4uldyao7xbsfda4uhoydtigeugovjvza.arweave.net/RKpv_vFB74zBqSX2nlFjwB37hkUYOUO7A5oMShnVTXI?login=aidartest&solanaRpc=https%3A%2F%2Fsolana-rpc.publicnode.com`
|
||||
|
||||
## Что будет, если поставить devnet RPC
|
||||
|
||||
Официальный публичный `Solana devnet RPC`:
|
||||
|
||||
- `https://api.devnet.solana.com`
|
||||
|
||||
Если подставить `devnet` RPC, viewer начнёт читать именно сеть `devnet`, а не `mainnet`.
|
||||
|
||||
Но это не означает автоматически, что вся система SHiNE "стала тестовой".
|
||||
Для реальной работы в `devnet` должны совпасть сразу несколько условий:
|
||||
|
||||
- программа `shine_users` должна быть задеплоена в `devnet`;
|
||||
- в `devnet` должен существовать нужный `PDA` для логина;
|
||||
- формат записи должен совпадать;
|
||||
- данные пользователя должны реально лежать в этой тестовой сети.
|
||||
|
||||
Если этого нет, viewer просто не найдёт запись.
|
||||
|
||||
## Источник по devnet RPC
|
||||
|
||||
Официальная документация Solana:
|
||||
|
||||
- `https://solana.com/docs/references/clusters`
|
||||
|
||||
Там указан devnet endpoint:
|
||||
|
||||
- `https://api.devnet.solana.com`
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,39 @@
|
||||
# Как работает Viewer v2
|
||||
|
||||
Viewer рассчитан на новый архив SHiNE: **один пользовательский блок = один ANS-104 DataItem**.
|
||||
|
||||
### Режим 1: login + channel
|
||||
|
||||
`?login=<login>&channel=<slug>`
|
||||
|
||||
Viewer читает Solana PDA пользователя, получает `blockchainKey`, затем ищет Arweave DataItem этого владельца с тегами `App=test5590` и `c=<slug>`.
|
||||
|
||||
### Режим 2: key + channel
|
||||
|
||||
`?key=<base58 public key>&channel=<slug>`
|
||||
|
||||
Viewer пропускает Solana и сразу выполняет поиск в Arweave.
|
||||
|
||||
### Режим без channel
|
||||
|
||||
`?login=<login>` или `?key=<key>`
|
||||
|
||||
Viewer получает все доступные DataItem владельца с `App=test5590`, разбирает их и показывает восстановленные каналы.
|
||||
|
||||
### Новый блок
|
||||
|
||||
Payload DataItem:
|
||||
|
||||
```text
|
||||
uint16be frameCode = 0x0001
|
||||
bytes[32] prevHash = SHA-256(previous Frame v1)
|
||||
int32be blockSize
|
||||
int32be blockNumber
|
||||
int64be timestamp seconds
|
||||
uint16be type
|
||||
uint16be subType
|
||||
uint16be version
|
||||
bytes[N] body
|
||||
```
|
||||
|
||||
Подпись пользователя, owner и tags находятся в оболочке ANS-104 DataItem, а не в SHiNE Frame v1.
|
||||
Reference in New Issue
Block a user