Основная концепция 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 из-за повторяющегося объяснения. Так что, пожалуйста, обратитесь к предыдущему сообщению в блоге, если вы хотите знать.
- Финансирование с несколькими подписями
- Сборка C1a и C1b (без знака)
- Сборка RD1a и RD1b
- Обмен подписью C1a и C1b
- Сборка C2a и C2b (без признаков)
- Сборка RD2a и RD2b
- Обмен подписью C2a и C2b
- Сборка BR1a и BR1b
- Потратьте C1b
- Израсходовать 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) );
Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик