Проблема сбоя стороннего API

Я хотел подчеркнуть проблему, от которой мы все страдаем при использовании сторонних API. Допустим, вы хотите совершить транзакцию эфириума. Обычно API возвращает txid при успешном выполнении запроса. Но в моем примере в запросе есть неизвестная ошибка. API не возвращает txid.

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

Поэтому, когда мы получаем сообщение об ошибке при создании транзакции, мы хотим выяснить, была ли транзакция успешной или нет. В противном случае вы можете отправить транзакцию несколько раз. Проблема здесь в том, что у нас нет txid для простого поиска транзакции.

В идеале я хочу давать свой собственный идентификатор ссылки с каждой транзакцией. Таким образом, мне не нужно полагаться на txid, предоставленный мне API. К сожалению, это не параметр в текущем API json-rpc.

Я решил эту проблему в биткойне, используя поле «комментарий» для моего собственного идентификатора ссылки. Затем я перебираю последнюю сумму X транзакции и пытаюсь найти совпадение с комментарием транзакции и идентификатором ссылки.

Любые предложения о том, как решить эту проблему с Ethereum?

Если я правильно понимаю, вы можете указать свой идентификатор ссылки в поле данных транзакции ethereum.stackexchange.com/q/2466/42 и искать свой идентификатор при повторении последних X транзакций?
Как видите, я полный нуб в Эфириуме. Я не знал, что поле данных может содержать сообщение. В документации мне сказали, что она предназначена для контрактного кода. Спасибо за быстрый ответ
Вы также правы: когда toполе пустое, вы вводите код контракта в dataполе. Кроме того, я разместил ответ вместо того, чтобы пометить ваш вопрос как дубликат, потому что могут быть другие решения общей проблемы.

Ответы (1)

В идеале я хочу давать свой собственный идентификатор ссылки с каждой транзакцией.

Данные можно прикрепить к любой транзакции с помощью dataполя.

Вот пример в web3.js:

eth.sendTransaction({data:web3.toHex('123456'), from:eth.accounts[0], to:eth.accounts[1], value:web3.toWei(1‌​00,'finney')})

Данные должны быть в шестнадцатеричном формате. Строка передается, toHexчтобы идентификатор рассматривался как BigNumber (поскольку Javascript не имеет собственных больших чисел).

Когда вы читаете шестнадцатеричные данные, преобразуйте их обратно в строковый идентификатор, используя new BigNumber(hexData).toString().

Чем больше данных прикреплено к транзакции, тем больше газа она будет стоить, поэтому имейте это в виду при использовании идентификаторов, которые вы используете.