当前位置: 首页 > news >正文

从技术人视角看闪电网络之微支付通道

  (要看懂这篇文章,读者需掌握BTC基本原理,包括转账原理和多签地址、地址锁定时间、隔离见证)

  (感谢闪电网络很难懂?你需要看看这篇文章 | 硬核科普这个教程提供的图片)

  比特币的价值传输相当安全,但是要和其他体系对接也要考虑一些问题,比如要如何保证交易效率(不可能每10分钟交割一次,太慢了),如何指定对单方违约的惩罚规则。

  光靠主链还是不够。如果需要在双方之间达成需要多次交割的交易(像Alice是数据提供商,Bob是用户,Bob需要购买Alice的文件版权,又不想一次性付1BTC给Alice,就达成协议:Alice给Bob传输1M文件,Bob就给Alice0.001BTC),就需要在双方之间建立微支付通道。这条通道只有开启和关闭时,才会在主链写入交易,其他时间只要交易双方拿着合理的账本即可。

  1.打开通道(指双方开始交易),为了防止单方违约,Alice和Bob各拿5BTC,一起把10BTC锁在Alice和Bob一起锁的保险箱里(多签地址),下图左边俩就是Alice和Bob的钱包地址,右边就是锁着双方共同财产的多签地址;

  

 

  同时还要保证如果交易中断,这个多签地址的BTC可以取出;但是如果单方面断开通道,对方不同意的情况下要惩罚。

  这里就需要把打开这个多签的钥匙给Alice和Bob,但是不同人拿到的钥匙能打开的东西不同:从自己那一侧打开,对方的财产要比自己先拿到。

  预先锻造特制钥匙:对方锻造了另一把锁,然后给自己,打开之后,对方立马就拿到币,自己要晚一些拿币。反之亦然。

  (为什么不是其他惩罚,比如手续费翻倍,或者锁定地址什么的,一是这些惩罚太重了,又不是要占用财产;二是某些情形下,延时退款可以为违约惩罚争取时间)

  

 

  因此需要预先生成交易:

  1号交易:使用Alice2&Bob秘钥加密:在区块高度达到本块高度+1000时,把这笔交易打包出去,将本地址的4个币打到Alice

  2号交易:使用Bob秘钥加密:立刻将本地址的6个币打到Bob

  3号交易:使用Alice&Bob2秘钥加密:在区块高度达到本块高度+1000时,把这笔交易打包出去,将本地址的6个币打到Bob

  4号交易:使用Alice秘钥加密:立刻将本地址的4个币打到Alice

  

 

  Bob把1号和2号签名好了给Alice,Alice把3号和4号签名好了给Bob。

  把这5条交易(转到多签地址和双方的断开通道合约)生成之后,再把多签地址的交易提交上链,以防止多签地址的币被永久锁定。

  双方都想关闭怎么办?用双方的钥匙直接签名,退回协定余额。

  

  1号和3号交易,就是学名为Revocable Sequence Maturity Contract (RSMC) 可撤销序列成熟合约的交易,其实这种交易机理也很简单。一个1/2多签地址,有俩公钥,只要能提供匹配的1个私钥就能打开,但是两条分支是不同的:在1000个块之后解锁,自己能取得币;或者由对方持有私钥解锁。

  这种交易己方一般不提供自己的钥匙,而是每次生成时另打一把,理由会在第2步说明。

  2.修改双方余额状态

  和1操作一样,只不过1-4号交易要打给不同地址的币量不同。

  这里就有一个问题,发送方有动力打包前一次签名的2条交易,使前一次余额变化作废。

  如何保证Bob不敢打包历史交易?这里需要让Alice能对Bob广播历史交易的行为作出惩罚。

  

 

  很容易想到,如果Bob在生成转出交易之前,先把上一条交易的钥匙Bob2给Alice,Alice就可以在Bob把历史交易发出去之后,在另一条分支(上图分支的上选项)执行前,用Bob2和自己的钥匙解锁多签地址(上图分支的下选项),把币打到Alice地址,Bob一聪都拿不到。这也是第1步说的要另打钥匙的原因。如果自己的私钥泄露,财产安全没有保障。

  在下一条交易签名之前,一定要拿到对方在上一条交易的钥匙,保证对方的作恶行为受到牵制。

  如果发送方广播交易拖太久的话,Alice的钥匙就没用了,因为这次历史交易已经上链,币已经到Bob地址了,并且交易是有次序的,互相有依赖关系的交易比先执行上一条,所以过了RSMC锁定期之后,即使Alice在Bob发出历史交易之后立马(同出块周期)发出惩罚交易,也会因为历史交易上的多签地址先执行打币给Bob的分支而无法执行。

  当然历史记录不广播的话,Alice拿的Bob2私钥没用,因为对应的多签地址没有币。所以每次生成新交易,也是必须另打一把钥匙,防止我方想广播最新交易时,被对方用旧钥匙开锁。

  如果是双方资金来往,双方收发关系频繁转变,Bob也要做好防违约工作。

转载于:https://www.cnblogs.com/dgutfly/p/10778378.html

相关文章:

  • java基础 数据类型转换
  • 即将到来的 Debian 10 Buster 发布版的新特点
  • server 2016 安装web+DNS服务
  • xtrabackup2.4选项参考
  • Vue.js - day6
  • 图文并茂的带你彻底理解悲观锁与乐观锁
  • Python项目实战:实现QQ抽屉功能效果展示
  • JAVA之流程控制语句
  • | 刘知远:让计算机听懂人话
  • 原来... 反调试技术揭秘(转)
  • 【微信事业群】趣味面试算法题
  • Go 夜读 - 每周四晚上 Go 源码阅读技术分享
  • MAN命令
  • kettle-Excel输出
  • js知识点——2之navigator
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [译] 怎样写一个基础的编译器
  • 【技术性】Search知识
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • es6(二):字符串的扩展
  • JavaScript设计模式系列一:工厂模式
  • JavaScript设计模式之工厂模式
  • Java深入 - 深入理解Java集合
  • Less 日常用法
  • magento 货币换算
  • 那些年我们用过的显示性能指标
  • 线性表及其算法(java实现)
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习Vue.js的五个小例子
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 应用生命周期终极 DevOps 工具包
  • mysql面试题分组并合并列
  • 正则表达式-基础知识Review
  • #etcd#安装时出错
  • $.ajax()方法详解
  • (4)logging(日志模块)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .Net FrameWork总结
  • .net wcf memory gates checking failed
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET导入Excel数据
  • .NET建议使用的大小写命名原则
  • .NET中 MVC 工厂模式浅析
  • .NET中GET与SET的用法
  • @拔赤:Web前端开发十日谈
  • [<事务专题>]
  • [Android]Tool-Systrace
  • [C#]winform部署yolov5-onnx模型
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具
  • [HackMyVM]靶场Boxing