Как установить одноразовый номер для необработанных транзакций?

Несколько вопросов о rawTransactions:

  1. Они где-нибудь задокументированы?
  2. Как именно я должен установить одноразовый номер rawTransaction? Если я запускаю geth и не отправляю ему ничего, кроме rawTransactions, то одноразовые номера просто нумеруются 1, 2, 3, ..., верно? Как насчет того, чтобы добавить несколько не необработанных (sendTransaction) транзакций с другого адреса? Например, предположим, я отправляю eth_sendTransaction, eth_sendTransaction, eth_sendRawTransaction. Должен ли одноразовый номер первой необработанной транзакции быть 1 или 3?
  3. Изменилось ли что-нибудь в способе обработки одноразовых номеров rawTransaction между development и master?
  4. Изменяется ли ответ на (2), если sendTransaction(s) и необработанные транзакции с разных адресов?

Отредактировано (02.04.2016): конкретная ошибка, которую я получаю, когда пытаюсь отправить необработанные транзакции в geth: -32000: Nonce too low. (Вот почему я так сосредоточен на значении nonce...)

Вот пример транзакции на стороне клиента до того, как она была упакована с помощью ethereumjs-tx :

{
  "to": "0x895d32f2db7d01ebb50053f9e48aacf26584fe40",
  "from": "0x6bcf3d525c425965a40fb77b1fe6461eeced67d7",
  "gasLimit": "0x2fd618",
  "nonce": 1,
  "value": "0x0",
  "data": "0x5f92896e00000000000000000000000000000000000000000000000000000000000f69b5",
  "gasPrice": "0x4a817c800"
}

Что-то явно не так...?

Ответы (2)

  1. Необработанная транзакция — это закодированное RLP значение подписанной транзакции, т. е. все, что включено, как определено в желтой бумаге на странице 4, раздел 4.2 .
  2. Nonces уже должен быть включен в необработанную транзакцию, вы не можете его установить. Гет его не устанавливает. (Поскольку подпись, которая также включена, основана на ней).
  3. Насколько я знаю, нет.
Re: (2), как указать правильный одноразовый номер для включения в необработанную транзакцию до ее подписания? т. е. если вы программно создаете транзакцию в клиенте, то эта программа должна каким-то образом установить значение одноразового номера. Мой подход заключался в использовании getTransactionAccount(адрес, «ожидание»), но это больше не работает (в ветке разработки geth).
@tinybike - если бы вы создавали транзакции вручную, вы, скорее всего, использовали бы getTransactionCount. Решите ли вы указать ожидание, зависит от вас. Pending увеличит одноразовый номер на одно значение больше, чем последнее значение, хранящееся в списке ожидающих транзакций. Если вы хотите отправить другую транзакцию, чтобы перезаписать одну из ожидающих (скажем, вы решили, что ваша первоначальная цена на газ была слишком низкой, и хотите увеличить ее, чтобы ускорить добычу), вы можете просто снова использовать одноразовый номер этой транзакции. Какой из них будет добыт первым, сделает другой недействительным.

Одноразовый номер всегда является счетчиком транзакций отправителя. Получение транзакции не влияет на одноразовый номер. Когда транзакция обрабатывается, все ожидающие транзакции с одноразовым номером ниже, чем подтвержденная транзакция, отменяются.

Количество транзакций и одноразовый номер могут быть установлены с помощью web3.eth.getTransactionCount(). Незавершенные транзакции должны быть приняты во внимание.

nonce = web3.eth.getTransactionCount() + pending transactions
Есть ли способ получить незавершенные транзакции для адреса?
web3.eth.pendingTransactions, это вернет список ожидающих транзакций.
@ Тимоти, можем ли мы использовать «самый ранний» в качестве второго параметра для подсчета всех транзакций вместо отдельного расчета ожидающих и выполненных транзакций?