Подключается одним файлом и одной функцией. Рабочий пример и код на странице приёма оплаты.
Устройство сети
Здесь собрано то, что раньше висело на главной странице. Обычному человеку эти цифры не нужны, а тому, кто хочет проверить, они пригодятся.
Текущее состояние сети всегда можно посмотреть по адресу /info, а сверку цепочки по /health. Распределение монет и крупнейших держателей видно в эксплорере.
Документация
Нода - чистый Python, только стандартная библиотека. Блок каждые 6 секунд, один валидатор, chain_id nextcoin-1. Базовый адрес https://nxt.stackworks.ru.
Информация о сети
| Параметр | Значение |
|---|---|
| chain_id | nextcoin-1 |
| Интервал | 6 секунд, PoS, один валидатор |
| Эмиссия | 1 000 000 000 NXT, генезис |
| Валидатор | - |
| Высота | - |
| Нода | Python 3, только стандартная библиотека |
| Подписи | Ed25519 (RFC 8032) |
Эндпоинты
| Метод | Путь | Описание |
|---|---|---|
| GET | /info | высота, хэш, валидатор, supply, mempool |
| GET | /chain?limit=20&offset=0&order=desc | список блоков, лимит до 100 |
| GET | /block/:height | блок по высоте |
| GET | /balance/:address | баланс и nonce |
| GET | /mempool | транзакции в очереди |
| GET | /tx/:hash | транзакция по хэшу |
| POST | /tx | отправить транзакцию |
Примеры curl
curl https://nxt.stackworks.ru/info
curl "https://nxt.stackworks.ru/chain?limit=10&order=desc"
curl https://nxt.stackworks.ru/block/0
curl https://nxt.stackworks.ru/balance/nxt1as0uf7dfpsqcfkz2wwv2dp0kgrt8x24ehfrlax
curl https://nxt.stackworks.ru/tx/783845d95fdfd7fd49f167a8f25a6921dc91efe7062788931c180cea839165e9
curl -X POST https://nxt.stackworks.ru/tx -H "Content-Type: application/json" -d '{"sender_pubkey":"...","recipient":"nxt1...","amount":2750000,"nonce":1,"fee":1000,"signature":"..."}'
Суммы в базовых единицах. 1 NXT = 1 000 000, то есть 2750000 это 2.75 NXT, а 1000 это 0.001 NXT.
Формат транзакции
{
"sender_pubkey": "64 hex - публичный ключ Ed25519",
"recipient": "nxt1 и 38 символов",
"amount": 100,
"nonce": 1,
"fee": 1,
"signature": "128 hex - R(64) + S(64)",
"hash": "64 hex - sha256 канонического JSON"
}
Поля сортируются по ключу при хэшировании. fee уходит валидатору. nonce строго по порядку, начиная с 1.
Как подписывать
Под подпись уходит не голое тело транзакции, а тело с доменной меткой. Сначала берётся канонический JSON с полями amount, fee, nonce, recipient, sender_pubkey, отсортированными по ключу и без пробелов. Затем перед ним ставится метка nextcoin-1/tx/v1: два байта её длины, сама метка, нулевой байт, потом тело. Получившийся набор байт подписывается Ed25519. Метка нужна, чтобы подпись из тестовой сети не подошла в боевой, а подпись транзакции нельзя было выдать за подпись блока.
// Готовые модули для браузера лежат в web/js: ed25519.js, nxtaddr.js, units.js.
// Они сверены с серверными chain/*.py побайтово.
const pub = pubFromPriv(privHex) // G^priv mod p
const msg = await sha256(canonicalJSON({sender_pubkey:pub, recipient, amount, nonce, fee}))
const sig = await signTx(privHex, msg, pub)
await fetch("https://nxt.stackworks.ru/tx", {
method: "POST",
headers: {"Content-Type":"application/json"},
body: JSON.stringify({sender_pubkey:pub, recipient, amount, nonce, fee, signature:sig})
})
Пагинация
// последние 10 блоков curl "https://nxt.stackworks.ru/chain?limit=10&order=desc" // следующие 10 curl "https://nxt.stackworks.ru/chain?limit=10&offset=10&order=desc"
Валидатор
Один валидатор, адрес nxt1ntc5qxd69uu5hd64dkylv9npf0qcuv2a327mhs. Собирает комиссии. Награда за блок пока не начисляется, эмиссия выключена.