Перейти к основному содержимому

Berry Club: как читать живую доску и разбирать одну эпоху

Используйте этот walkthrough, когда живую доску читать легко, но нужен один понятный путь к исторической реконструкции.

Начните с живой доски. Если этого уже достаточно для ответа, на этом можно остановиться.

Переходите к Transactions API только тогда, когда вопрос становится историческим: «как Berry Club выглядел в одной более ранней эпохе и какие draw-вызовы сделали доску именно такой?»

Эти shell-примеры работают и с публичными RPC и Transactions endpoint-ами. Если FASTNEAR_API_KEY уже задан в окружении, FastNear-вызовы автоматически пробросят его как bearer-заголовок.

Живая доска Berry Club

Источник
Mainnet RPC get_lines
Блок
194588754

Обновляем живую доску через 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. Восстановите одну более раннюю эпоху

Когда нужна история, держите путь коротким:

  1. ограничьте одну эпоху
  2. получите кандидатные draw-транзакции для berryclub.ek.near
  3. раскройте эти хеши
  4. проиграйте массивы 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-записей.

Связанные руководства