Как рассчитать размер транзакции перед отправкой (Legacy Non-Segwit - P2PKH /P2SH)

Я знаю, что я платил комиссию за транзакцию за kB, поэтому как я могу рассчитать, насколько велика транзакция, прежде чем я отправлю ее через RPC api. Я запускаю сайт с использованием биткойнов, и я не могу позволить балансу пользователя пойти отрицательно, поэтому мне нужно знать, достаточно ли у них баланса, чтобы покрыть затраты.

50 голосов | спросил macintosh264 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 22 Sep 2011 05:53:49 +0400 2011, 05:53:49

3 ответа


55

Предполагая, что все затраты, которые вы тратите, исчисляются из регулярных транзакций «платить за адрес», каждый вход будет вносить 180 транзакций (плюс или минус 1). Каждый вывод добавляет к транзакции 34 байта. И есть фиксированные дополнительные 10 байт, которые всегда присутствуют.

«плюс или минус 1» исходит из того факта, что для каждого входа требуется подпись. Подпись содержит два 32 байтовых значения, но если у одного из значений есть первый байт 0x80 или больше, у него есть байтовый 0x00. Поэтому я предполагаю, что один из них высокий, а другой низкий. Таким образом, я отключен не более чем на один байт на вход.

Итак, если ваша транзакция имеет in и out, размер транзакции в байтах будет:

in*180 + out*34 + 10 plus or minus 'in'

Например, эта транзакция содержит 40 входов и 16 выходов. Это дает нам размер транзакции

40*180 + 16*34 + 10 +- 40

то есть. 7754 +- 40. Фактический размер - это 7761 байты.

Если входные данные поступают из транзакций «платить в паблик», входы меньше, чем для транзакций «платить за адрес». И это будет отличаться и для вкладов «платить за скрипт», в зависимости от того, как это реализовать.

Изменить: Эта транзакция была сделана с биткойнами, украденными в Linode heist и показывает размер транзакции 1337 , возможно, преднамеренное использование leetspeak в блок-цепочке.

Edit2: теперь, когда сжатые открытые ключи являются обычным явлением, каждый вход на 32 байта короче и поэтому размер транзакции теперь:

in*148 + out*34 + 10 plus or minus 'in'
ответил Chris Moore 25 FebruaryEurope/MoscowbSat, 25 Feb 2012 08:13:15 +0400000000amSat, 25 Feb 2012 08:13:15 +040012 2012, 08:13:15
21

Ниже приведены некоторые расчеты на основе документации по протоколу .

Биткойн-транзакция состоит из следующего:

  • Версия (4 байта)
  • TxIn Count (1 ~ 9B)
  • Для каждого TxIn:
    • Outpoint (36B)
    • Длина скрипта (1 ~ 9B)
    • ScriptSig (?)
    • Последовательность (4B)
  • TxOut Count (1 ~ 9B)
  • Для каждого TxOut:
    • Значение (8B)
    • Длина скрипта (1 ~ 9B) *
    • Скрипт (?) *
  • LockTime (4B)

Предполагая, что стандартная транзакция P2SH /P2PKH создана, длина скрипта, помеченная звездочкой, будет привязана к 1 байту, поскольку длина скрипта кодируется как целое целое; в то время как размер скрипта, помеченный звездочками, будет привязан к 24 байтам, поскольку он будет содержать только хэш-скрипт.

Итак, мы можем предположить, что максимальная граница каждого TxOut равна 33 байтам, если мы платим за адрес P2SH /P2PKH, так как в каждом выходном скрипте имеется 4 кода операций.

Предполагая, что мы тратим точки P2PKH для нашего TxIn. Наш ScriptSig (состоящий из 72-битного DER Encoded Transaction Signature + 33byte Public Key) будет иметь размер 146 байтов, а длина нашего скрипта будет потреблять только 1 байт, так как размер ScriptSig меньше 0xFD.

Следовательно, стандартная транзакция P2PKH /P2SH, тратящая ONE UTXO, подлежащую выкупу с базовым сценарием ScriptSig только на ОДИН , составляет 189 байтов. В противном случае мы также можем обобщить это на:

in отмечает количество TxIns

out отмечает количество TxOuts

Предполагая, что in <254 и out <254.

Размер транзакции P2SH /P2PKH = in * 146 + out * 33 + 10

Вычисление размера транзакции P2SH /P2PKH, которая финансируется сложными входами (то есть UTXO, которые можно использовать с сигналами M-of-N, хешированные временные контракты) по своей сути сложна и зависит от сложности redeemScript, используемой для производства scriptHash предыдущей транзакции P2SH.

ответил renlord 6 J000000Wednesday16 2016, 01:21:29
19

Важно понимать, что платеж за транзакцию, который вы должны заплатить за make , основан на том, как вы получили средства, которые вы используете для совершения платежа. Исходящий платеж (при условии, что он находится только в одном месте) всегда будет одного размера. Таким образом, «вне» часть всегда будет иметь два стандартных сценария «платить за адрес». Размер части «in» будет зависеть от того, сколько вы хотите получить, что зависит от того, как вы получили средства.

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

Представьте себе, если вы войдете в кондитерский магазин и сказали, что конфет-бар - 35 центов, но затем, когда они позвонили вам, они взяли плату за 15 центов. Когда вы спросили их, для чего это было, они объяснили, что предыдущий клиент заплатил им все в гроши, и для того, чтобы дать вам ваши изменения, им придется пересчитать все эти гроши, и это занимает больше времени.

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

Либо взимать фиксированную плату за снятие средств (0,01 BTC в настоящее время является обычным явлением), либо сами оплачивать транзакционные сборы. И используйте разумные стратегии для снижения транзакционных сборов . Но, на мой взгляд, вы действительно не хотите передавать такую ​​цену клиенту.

ответил David Schwartz 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 22 Sep 2011 09:22:33 +0400 2011, 09:22:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132