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

Я новичок в блокчейне. Я понимаю, что блокчейн хранит записи обо всех транзакциях, и каждая транзакция подписывается закрытым ключом. Однако почему никто не может ввести произвольную сумму биткойн-транзакции? Скажем, на адресе a только 1 биткойн, но его владелец может создать транзакцию на 100 биткойнов и при этом подписать ее. Каков механизм Биткойн для проверки исходящей и входящей суммы транзакции?

См. также:  Как я могу отправить эфир между двумя АККАУНТАМИ в remix IDE?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 3
  1. Yangrui

    Возможно, вам поможет эта ссылка о том, как работают транзакции с биткойнами. Посмотрите на раздел «Что делать, если суммы ввода и вывода не совпадают?»

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

  2. Yangrui

    Блокчейн Биткойна содержит исторические записи всех транзакций, которые когда-либо происходили на нем. Клиенты, безусловно, могут выбрать хранить меньше, а цепочку блоков можно сократить, не сохраняя транзакции, которые уже были потрачены давно.

    Адреса биткойнов технически не имеют «баланса» в смысле традиционной банковской книги. Вместо этого адрес имеет возможность проводить транзакции, которые были отправлены на него.

    Чтобы углубиться в технические детали, давайте посмотрим на адрес 1PkCAVKjPz1YK7iJwT8xTLxBXR1av8dL98 (который принадлежит мне).

    Недавно я получил очень небольшую транзакцию на 0,004 BTC в транзакции с TxID 432794be2e056275cafb0eeb7ab59a24444dd4c9e00cd9702a49c2a655a3e705.

    Исходные данные (в шестнадцатеричном коде) этой транзакции: 0100000001e9a24c1d1b8d10b13482cdcbbb90d894577292c4d0c0c1427411fb9d82ea710c010000006b483045022100d9a5433c1381b39b7e02b0b0f042990e7c16cfea252b05ccfef2e85c2dab2a6f022057c7def782fe3b0d7e5e0eae277d2a5890844da7d72309817a2dac22a6307c6001210390d78cb0c1d34d4417db7e0a9a9f125a689dc29dc2197a01a5f827a20f870f62ffffffff01801a0600000000001976a914f97df8f593e0056d337c274fd81a163f47a17d3788ac00000000

    Что в удобочитаемой форме:

    {
      "txid": "432794be2e056275cafb0eeb7ab59a24444dd4c9e00cd9702a49c2a655a3e705",
      "size": 192,
      "version": 1,
      "locktime": 0,
      "vin": [
        {
          "txid": "0c71ea829dfb117442c1c0d0c492725794d890bbcbcd8234b1108d1b1d4ca2e9",
          "vout": 1,
          "scriptSig": {
            "asm": "3045022100d9a5433c1381b39b7e02b0b0f042990e7c16cfea252b05ccfef2e85c2dab2a6f022057c7def782fe3b0d7e5e0eae277d2a5890844da7d72309817a2dac22a6307c60[ALL] 0390d78cb0c1d34d4417db7e0a9a9f125a689dc29dc2197a01a5f827a20f870f62",
            "hex": "483045022100d9a5433c1381b39b7e02b0b0f042990e7c16cfea252b05ccfef2e85c2dab2a6f022057c7def782fe3b0d7e5e0eae277d2a5890844da7d72309817a2dac22a6307c6001210390d78cb0c1d34d4417db7e0a9a9f125a689dc29dc2197a01a5f827a20f870f62"
          },
          "sequence": 4294967295
        }
      ],
      "vout": [
        {
          "value": 0.00400000,
          "n": 0,
          "scriptPubKey": {
            "asm": "OP_DUP OP_HASH160 f97df8f593e0056d337c274fd81a163f47a17d37 OP_EQUALVERIFY OP_CHECKSIG",
            "hex": "76a914f97df8f593e0056d337c274fd81a163f47a17d3788ac",
            "reqSigs": 1,
            "type": "pubkeyhash",
            "addresses": [
              "1PkCAVKjPz1YK7iJwT8xTLxBXR1av8dL98"
            ]
          }
        }
      ]
    }
    

    Таким образом, адрес 1PkCAVKjPz1YK7iJwT8xTLxBXR1av8dL98 может «проводить» транзакцию 432794be2e056275cafb0eeb7ab59a24444dd4c9e00cd9702a49c2a655a3e705. Выходное значение этой транзакции составляет 0,004 BTC, поэтому я не могу совершить транзакцию Биткойн, которая пытается потратить больше. Однако давайте все равно попробуем это сделать.

    Я создам необработанную транзакцию, которая пытается вывести 0,01 BTC на 1MgLu9L7ftmGQM84xhKYKw8pTXiSANwggs из транзакции с выходным балансом 0,004 BTC:

    bitcoin-rpc createrawtransaction '[{"txid":"432794be2e056275cafb0eeb7ab59a24444dd4c9e00cd9702a49c2a655a3e705","vout":0}]' '{"1MgLu9L7ftmGQM84xhKYKw8pTXiSANwggs":0.01}'
    

    Возвращает необработанную транзакцию:

    010000000105e7a355a6c2492a70d90ce0c9d44d44249ab57aeb0efbca7562052ebe9427430000000000ffffffff0140420f00000000001976a914e2d3595bd0a55c16f4b19f5cd996568dd7e811f688ac00000000
    

    Затем я могу подписать транзакцию:

    bitcoin-rpc signrawtransaction 010000000105e7a355a6c2492a70d90ce0c9d44d44249ab57aeb0efbca7562052ebe9427430000000000ffffffff0140420f00000000001976a914e2d3595bd0a55c16f4b19f5cd996568dd7e811f688ac00000000
    

    который возвращает:

    {
          "hex": "010000000105e7a355a6c2492a70d90ce0c9d44d44249ab57aeb0efbca7562052ebe942743000000006b483045022100ce3fad8ccdee48f1fe9060ef81624d3bbe721293feb8ee06a96751e65b9c423e0220106a3e80d5fdf93df5dbf037d8cfd32af70a405586e12294c937308a3c57b10e012102f2acb810346866908108dd86462ee5400b15786739f5e908711d2d15d9dd2238ffffffff0140420f00000000001976a914e2d3595bd0a55c16f4b19f5cd996568dd7e811f688ac00000000",
          "complete": true
    }
    

    И я могу взять этот возвращенный шестнадцатеричный код, который является правильно отформатированной транзакцией, и отправить его в сеть:

    bitcoin-rpc sendrawtransaction 010000000105e7a355a6c2492a70d90ce0c9d44d44249ab57aeb0efbca7562052ebe942743000000006b483045022100ce3fad8ccdee48f1fe9060ef81624d3bbe721293feb8ee06a96751e65b9c423e0220106a3e80d5fdf93df5dbf037d8cfd32af70a405586e12294c937308a3c57b10e012102f2acb810346866908108dd86462ee5400b15786739f5e908711d2d15d9dd2238ffffffff0140420f00000000001976a914e2d3595bd0a55c16f4b19f5cd996568dd7e811f688ac00000000
    

    Что дает мне ошибку:

    66: insufficient priority (code -26)
    

    Это ошибка на стороне клиента, но если бы я успешно транслировал необработанную транзакцию в сеть, другие одноранговые узлы просто просмотрели бы указанную (или «потраченную») транзакцию 432794be2e056275cafb0eeb7ab59a24444dd4c9e00cd9702a49c2a655a3e705 и увидели бы, что итоговая сумма моей новой транзакции больше чем итоговая сумма транзакции, которую я пытаюсь потратить.

    Из этого правила есть одно исключение: транзакции на базе монет генерируют биткойны для майнеров, и, таким образом, им разрешается выводить правильную субсидию блока (первоначально 50 BTC, но в настоящее время 12,5 BTC после сокращения вдвое около полутора месяцев назад) плюс транзакционные сборы в размере все транзакции, содержащиеся в блоке.

    Понятно. Итак, каждая новая транзакция происходит из предыдущей транзакции, верно? Скажем, у вас есть два входа, один — 2 биткойн, другой — 1 биткойн, что составляет всего 3 биткойна; и вы хотите потратить 2,5 btc, поэтому для каждого входа будет две транзакции, верно? person Yangrui; 21.08.2016

    @yangrui За исключением транзакций coinbase, все транзакции ссылаются (и при этом предотвращают ссылки любой другой транзакции) на предыдущую транзакцию. Если у вас есть две отдельные транзакции, одна для 2 BTC, а другая для 1 BTC, вы должны создать одну транзакцию, которая тратит обе входные транзакции, платит кому-то 2,5 BTC и выплачивает оставшиеся 0,5 BTC на адрес изменения, который вы контролируете (или 0,5 минус комиссия за транзакцию, которую вы хотите заплатить, так как общие входы минус общие выходы = txFee). Транзакции могут быть потрачены или неизрасходованы, вы никогда не можете частично потратить транзакцию. person Yangrui; 22.08.2016

  3. Yangrui

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

    https://en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messages < / а>

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: