Транзакция
Транзакция - это подписанный набор данных, который распространяется в сети и объединяется в блоки. Обычно она ссылается на предыдущие транзакции и направляет определенное количество новакоинов из них на один или несколько новых публичных ключей.
В настоящее время возможно несколько типов транзакций.
Пользовательская операция
Такие транзакции обычно используются для передачи новакоинов из непотраченных входов. Как правило, они ссылаются на непотраченные входы и создают новые выход(ы) с указанием сумм и получателей.
Coinbase
Coinbase имеет один вход с параметром 'coinbase' вместо scriptSig. В 'coinbase' могут быть любые данные, они не используются. Novacoin помещает туда текущую целевую величину в компактном формате и число произвольной точности 'extraNonce', которое увеличивается каждый раз при переволнении поля Nonce в заголовке блока. extranonce участвует в увеличении области определения функции proof of work.
Эти транзакции используются для выдачи награды майнерам Proof-of-Work. Блоки proof-of-stake также содержат транзакцию coinbase, но с пустым выходом.
Coinstake
Эти транзакции используются для предоставления доказательства в заголовке блока Proof-of-Stake. Они похожи на пользовательские транзакции, но имеют некоторые отличия:
- Первый выход должен быть пустым;
- Первый вход транзакции должен удовлетворять текущей сложности Proof-of-Stake.
- Разрешена генерация новых единиц через уплату отрицательной комиссии.
- Местом назначения второго выхода должно быть Pay-to-Pubkey (описано позже).
Общий формат транзакции
Поле | Тип | Размер | Описание |
---|---|---|---|
Версия | unsigned int | 4 | В настоящее время 1 |
Timestamp | unsigned int | 4 | Время транзакции |
Число входов | variable int | 1 - 9 | - |
Массив входов | TxIn[] | размер набора входов | Массив входов или coinbase |
Число выходов | variable int | 1 - 9 | - |
Массив выходов | TxOut[] | размер набора выходов | Массив структур выходов |
Время блокировки | unsigned int | 4 | Высота блока или timestamp, когда транзакцию считать завершенной |
Формат входа
Вход - это ссылка на выход другой транзакции. Транзакция часто содержит несколько входов. Величины указанных выходов суммируются, и сумму можно использовать в выходах этой транзакции.
Поле | Тип | Размер | Описание |
---|---|---|---|
txid | unsigned char[] | 32 | Хеш предыдущей транзакции |
n | unsigned int | 4 | Номер выхода предыдущей транзакции |
scriptSigLength | variable int | 1-9 | Длина scriptSig |
scriptSig | unsigned char[] | - | Первая половина скрипта, подписи для scriptPubKey |
nSequence | unsigned int | 4 | Номер варианта транзакции, не имеет значения, если не указано nLockTime. 0xffffffff по умолчанию, см. подробное описание. |
Формат выхода
Выход содержит инструкции для отправки новакоинов. Величина - количество сатоши (1 NVC = 1,000,000 сатоши), которое этот выход будет стоить при использовании.
Поле | Тип | Размер | Описание |
---|---|---|---|
nValue | unsigned long int | 8 | количество передаваемых сатоши(NVC/106) |
scriptPubKeyLength | variable int | 1-9 | длина scriptPubKey |
scriptPubKey | unsigned char[] | - | вторая половина скрипта, инструкции по расходованию |
Получатели
Существуют следующие типы получателей для пользовательских и coinbase транзакций:
- Публичный ключ (Pay-to-Pubkey);
- Хеш публичного ключа (Pay-to-PubkeyHash);
- Хеш скрипта (Pay-to-ScriptHash);
- Пустой получатель;
- Нестандартный скрипт.
Pay-to-Pubkey
scriptPubKey: [pubKey] OP_CHECKSIG scriptSig: [sig]
Pay-to-PubkeyHash
scriptPubKey: OP_DUP OP_HASH160 [pubKeyHash] OP_EQUALVERIFY OP_CHECKSIG scriptSig: [sig] [pubKey]
Pay-to-ScriptHash
Отправка на хеш скрипта:
scriptPubKey: OP_HASH160 [20-byte-hash of {[pubkey] OP_CHECKSIG} ] OP_EQUAL scriptSig: <зависит от типа входов>
Пример расходования:
scriptPubKey: OP_HASH160 [20-byte-hash of {[pubkey] OP_CHECKSIG} ] OP_EQUAL scriptSig: [signature] {[pubkey] OP_CHECKSIG}
Пустой получатель
scriptPubKey: (пусто) scriptSig: (пусто)
Нестандартные скрипты
Любой может потратить:
scriptPubKey: (empty) scriptSig: OP_TRUE