请选择 进入手机版 | 继续访问电脑版
开启辅助访问
链路首页链路财经目前收录 币种 : 4908 交易所 : 310钱包 : 17 24H 交易量 : $43,403,137,051 总市值 : $245,388,183,835
2019
05/23
08:00
分享
评论
  • 这是第二篇解释闪电网络流程的文章。这一次,我将解释的是与白皮书图9相对应的违约补救措施。



    花费违规补救措施的10个步骤:


    由于第一篇文章应讲解前面4个,将不在本篇文章重新讲述。如果想了解的,可以查看区块链研究实验室 | 闪电网络代码简化教程-可撤销交付交易part1


    1. 多签名资金

    2. 构建C1a和C1b(No Sign)

    3. 构建RD1a和RD1b

    4. C1a和C1b的交换签名

    5. 建立C2a和C2b(No Sign)

    6. 构建RD2a和RD2b

    7. C2a和C2b的交换签名

    8. 建立BR1a和BR1b

    9. 花费C1b

    10. 花费BR1b


    构建C2a和C2b(No sign)

    结构与C1a相同。 请注意,2个输入也与C1a相同,因为此时C1a还没有花费。 此交易更新了Alice和Bob之间的比特币余额。 只有最终输出对比特币主网非常重要。 如果Alice花了C2a,比特币主网就无法察觉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])
          }
        )
      ]
    )


    构建RD2a和RD2b

    构建RD2a和RD2b几乎与RD1a和RD1b所需的过程相同。  请参阅上一篇文章中的RD1a和RD2b部分。区块链研究实验室 | 闪电网络代码简化教程-可撤销交付交易part1


    C2a和C2b交换签名

    与C1a部分相同,Alice将C2a移交给Bob,让Bob签名。 现在Alice和Bob可以花费C2a和C2b。 如果Alice意外地花费了C1a,她就会失去所有的BTC,这样Alice就可以安全地撤销C1a。


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


    以同样的方式,Bob让Alice签署C2b。


    构建BR1a和BR1b

    Alice建立BR1a并签名,然后将BR1a移交给Bob。 请注意,BR1a的输出是Bob的。 本质上,此输出属于Alice。


    如果Alice不配合Bob,她花了c1a,甚至认为c2a和c2b已经交换了,Alice就会因为她的违约而失去所有的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
        }
      ],
    }


    以同样的方式,Bob把签名的BR1b递交给Alice。


    花费C1b

    Bob意外地花了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));


    花费BR1b

    Alice可以在没有任何时间锁的情况下立即使用br1b。请注意,如果时间锁过期,Bob可以花费RD1b。所以,最好是Alice早点花掉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) );


    好的,本章节到此结束,下一节我们将会继续讲解;


    作者:re795h


    相关文章阅读:

    区块链研究实验室 | 闪电网络代码简化教程-可撤销交付交易part1


    描下放二维码添加我,拉您进入技术交流群


主题帖 165 关注 0 粉丝 0
情感指数

链路大数据分析置信度 13.56 %

TA的主题帖
主题相关
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表