Основная концепция Lightning Network проста. Для дальнейшего понимания представьте потоки транзакций сети Lightning как код javascript, ссылаясь на белую книгу.

Это вторая статья, в которой объясняются следующие потоки Lightning Network. На этот раз я объясню, как использовать «Устранение нарушений», которое показано на рис. 9 официального документа.

Код на Github: lightning-network-tx-flow

Pre Post: Упрощенный код Bitcoin Lightning Network - Расходуемая отзывная доставка

Следующее сообщение: Упрощенный код Bitcoin Lightning Network, часть 3 - Отменная доставка выполнения HTLC

10 шагов, чтобы потратить Breach Remedy

Я пропускаю шаги до 4 из-за повторяющегося объяснения. Так что, пожалуйста, обратитесь к предыдущему сообщению в блоге, если вы хотите знать.

  1. Финансирование с несколькими подписями
  2. Сборка C1a и C1b (без знака)
  3. Сборка RD1a и RD1b
  4. Обмен подписью C1a и C1b
  5. Сборка C2a и C2b (без признаков)
  6. Сборка RD2a и RD2b
  7. Обмен подписью C2a и C2b
  8. Сборка BR1a и BR1b
  9. Потратьте C1b
  10. Израсходовать BR1b

5. Сборка C2a и C2b (без признаков)

Структура такая же, как у C1a. Обратите внимание, что 2 входа тоже такие же, как у C1a, т.к. C1a в этот момент еще не потратил. Эта транзакция обновляет баланс биткойнов между Алисой и Бобом. Для основной сети Биткойн важен только окончательный результат. Если Алиса потратила C2a, сеть Bitcoin Mainnet не сможет воспринимать существование C1a.

let C2a = new Transaction(
  [
    new TxIn( // This is same as C1a
      fTxAH, 
      0, 
      { 
        type: 'MULTI',
        sig: [ 
          redeemScript.pubKeyHashs[0], 
          redeemScript.pubKeyHashs[1] 
        ],
        redeemScript
      }
    ),
    new TxIn( // This is same as C1a
      fTxBH, 
      0, 
      { 
        type: 'MULTI',
        sig: [ 
          redeemScript.pubKeyHashs[0], 
          redeemScript.pubKeyHashs[1] 
        ],
        redeemScript
      }
    )
  ],
  [
    new TxOut(
      40000000, 
      { 
        type: 'RSMS',
        pubKeyHash: [ 
          getPubKeyHash(AliceKeys[4]), 
          getPubKeyHash(BobKeys[4]) 
        ]
      }
    ),
    new TxOut(
      60000000, 
      { 
        type: 'NORMAL',
        pubKeyHash: getPubKeyHash(BobKeys[4])
      }
    )
  ]
)

6. Сборка RD2a и RD2b

Создание RD2a и RD2b - это почти такой же процесс, как и RD1a и RD1b. Так что позвольте мне пропустить. Пожалуйста, обратитесь к разделу построения RD1a и RD2b в предыдущей записи блога.

7. Обмен подписью C2a и C2b

Как и в разделе C1a, Алиса передает C2a Бобу и позволяет ему подписать. Теперь Алиса и Боб могут потратить C2a и C2b. Если Алиса неожиданно потратит C1a, она потеряет все BTC, так что Алиса может безопасно отозвать C1a.

// Alice hand over C2a to Bob, and let him sign
C2a = signTx(C2a, BobKeys[1]);

Таким же образом Боб позволил Алисе подписать C2b.

8. Сборка BR1a и BR1b

Алиса построит BR1a и подпишет, а затем передаст BR1a Бобу. Обратите внимание, что вывод BR1a предназначен для Боба. По сути, этот вывод принадлежит Алисе.

Если Алиса не будет сотрудничать с Бобом и потратит C1a, даже если C2a и C2b уже обменялись, Алиса потеряет все BTC из-за своего нарушения.

let BR1a = new Transaction(
  [
    new TxIn(
      '', // Keep empty because C1a have not yet spent
      0, 
      { 
        type: 'BR',
        sig: [ 
          getPubKeyHash(AliceKeys[2]), 
          getPubKeyHash(BobKeys[2]) 
        ],
      }
    )
  ],
  [
    new TxOut(
      50000000, 
      { 
        type: 'NORMAL',
        pubKeyHash: getPubKeyHash(BobKeys[3]) // For Bob
      }
    )
  ]
)
// Alice hand over signed BR1a to Bob. This output is for Bob
BR1a = signTx(BR1a, AliceKeys[2]);

Формат Json BR scriptSig выглядит следующим образом.

scriptSig = { 
  type: 'BR',
  sig: [ 
    {
     signature: signature, 
     pubKey: pubKey1 
    },
    {
     signature: signature, 
     pubKey: pubKey2
    }
  ],
}

Таким же образом Боб передает опаленный BR1b Алисе.

9. Потратьте C1b

Боб неожиданно потратил C1b. К сожалению, он потерял все BTC навсегда.

// Sign by himself(Bob)
C1b = signTx(C1b, BobKeys[1]);
// Validate transaction
validateTx(C1b, Blocks);
// Mine block as adding transactions
Blocks = mineBlock(Blocks, createNewBlock([C1b], Blocks));

10. Потратьте BR1b.

Алиса может потратить BR1b сразу без временной блокировки. Обратите внимание, что Боб может потратить RD1b, если истечет срок блокировки. Так что Алисе лучше потратить BR1b пораньше.

// Set C1b transaction hash
BR1b.txIns[0].txPrev = calculateTxHash(C1b);
// Inherently, this BTC is for Bob, but now belong to Alice.
// Bob lose for his breach.
BR1b = signTx(BR1b, AliceKeys[2]);
validateTx(BR1b, Blocks);
Blocks.push( createNewBlock([BR1a], Blocks) );

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик