Berry Club: как читать живую доску и разбирать одну эпоху
Используйте этот walkthrough, когда живую доску читать легко, но нужен один понятный путь к исторической реконструкции.
Начните с живой доски. Если этого уже достаточно для ответа, на этом можно остановиться.
Переходите к Transactions API только тогда, когда вопрос становится историческим: «как Berry Club выглядел в одной более ранней эпохе и какие draw-вызовы сделали доску именно такой?»
Эти shell-примеры работают и с публичными RPC и Transactions endpoint-ами. Если FASTNEAR_API_KEY уже задан в окружении, FastNear-вызовы автоматически пробросят его как bearer-заголовок.
Живая доска Berry Club
Обновляем живую доску через RPC...
Пока живой RPC-ответ обновляется, показывается последний сохранённый снимок.
1. Прочитайте живую доску
Это самый короткий полезный запрос:
ARGS_BASE64="$(jq -nc '{lines: [range(0;50)]}' | base64 | tr -d '\n')"
AUTH_HEADER=()
if [ -n "${FASTNEAR_API_KEY:-}" ]; then AUTH_HEADER=(-H "Authorization: Bearer $FASTNEAR_API_KEY"); fi
curl -sS https://rpc.mainnet.fastnear.com \
"${AUTH_HEADER[@]}" \
-H 'content-type: application/json' \
--data "{
\"jsonrpc\": \"2.0\",
\"id\": \"berry-live-board\",
\"method\": \"query\",
\"params\": {
\"request_type\": \"call_function\",
\"finality\": \"final\",
\"account_id\": \"berryclub.ek.near\",
\"method_name\": \"get_lines\",
\"args_base64\": \"$ARGS_BASE64\"
}
}" | jq '.result | {block_height, line_count: (.result | implode | fromjson | length)}'Этот запрос отдаёт текущую доску 50x50 прямо из контракта. Дальше нужно только декодировать каждую base64-строку в 50 цветов пикселей.
2. Восстановите одну более раннюю эпоху
Когда нужна история, держите путь коротким:
- ограничьте одну эпоху
- получите кандидатные
draw-транзакции дляberryclub.ek.near - раскройте эти хеши
- проиграйте массивы
pixelsот старых к новым
В этом примере используется узкое окно вокруг блока 97601515:
AUTH_HEADER=()
if [ -n "${FASTNEAR_API_KEY:-}" ]; then AUTH_HEADER=(-H "Authorization: Bearer $FASTNEAR_API_KEY"); fi
curl -sS https://tx.main.fastnear.com/v0/account \
"${AUTH_HEADER[@]}" \
-H 'content-type: application/json' \
--data '{
"account_id": "berryclub.ek.near",
"is_function_call": true,
"is_receiver": true,
"is_real_receiver": true,
"from_tx_block_height": 97576515,
"to_tx_block_height": 97601516,
"desc": false,
"limit": 200
}' | jq '.account_txs | map({transaction_hash, tx_block_height}) | .[-5:]'Если окно ещё нужно подобрать, сначала можно использовать /v0/blocks. Это не часть основного Berry Club-сценария.
Раскройте кандидатные хеши и оставьте только верхнеуровневые вызовы draw:
AUTH_HEADER=()
if [ -n "${FASTNEAR_API_KEY:-}" ]; then AUTH_HEADER=(-H "Authorization: Bearer $FASTNEAR_API_KEY"); fi
curl -sS https://tx.main.fastnear.com/v0/transactions \
"${AUTH_HEADER[@]}" \
-H 'content-type: application/json' \
--data '{
"tx_hashes": [
"Hq5qwsuiM2emJrqczWM9awCa7o6sTBYqYpcifUX2SUhQ",
"8tBip5M2TrozhSyepAA3tYXpyKooi5t7b9c64wXjFvfL"
]
}' | jq '.transactions[]
| select(.transaction.receiver_id == "berryclub.ek.near")
| .transaction.actions[]?.FunctionCall
| select(.method_name == "draw")
| {method_name, args: (.args | @base64d | fromjson)}'Затем проиграйте массивы pixels от старых к новым:
const board = Array.from({ length: 50 }, () => Array(50).fill(0));
for (const drawTx of drawTransactionsOldestFirst) {
for (const pixel of drawTx.args.pixels) {
if (pixel.x < 0 || pixel.x >= 50 || pixel.y < 0 || pixel.y >= 50) {
continue;
}
board[pixel.y][pixel.x] = pixel.color;
}
}В этом и состоит исторический паттерн. У Berry Club нет готового эндпоинта «доска на блоке N», поэтому старые эпохи восстанавливаются проигрыванием draw-записей.