BTC-闪电网络-原理
看这篇文章时一直在想一些设计上的问题,而没有急着直接往下读得到答案,因此有些烧脑,想不明白再往下读后豁然开朗,体会到了一种学习中的快感,不自觉便笑了,一种微妙的快乐。
从闪电网络浏览器可以了解到当前闪电网络情况,闪电网络节点多分布在欧洲和北美,是一种独立于比特币节点的客户端,需要在本地部署,通过寻找活跃节点建立通道,最终形成网络。
“闪电火炬”活动
2019年初,Twitter上一位比特币爱好者“hodlonaut”发起这次接力活动,他通过闪电网络将10万聪(Satoshi,1比特币=1亿Satoshi)比特币赠予在帖子下面随机挑选的一位回复者,他希望这个“火炬”能接力传递下去,每次接棒的人需要增加1万聪比特币,接力中众多名人参与。闪电网络通道内交易额被硬编码限制为429w Satoshi,最终传递了数百次,跨越6大洲近60个国家,到达了慈善组织“委内瑞拉比特币”。
闪电网络概述
以扩容为目的,解决BTC交易拥堵、吞吐量低、手续费高的问题。
2015年初Mirror CTO发表闪电网络白皮书《The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments》,经过技术研发实现,莱特币试用,最终用于比特币交易。
交易双方首先创建专属支付通道(双方将小部分比特币充值入通道),通道内交易转账不记录在链上,等金额花光或不想再交易,再将交易结果上链,通道关闭。
优势是速度快、费用低,但对矿工不利且牺牲去中心化、匿名性被削弱(闪电网络能够得知交易双方在通道内的所有交易)
闪电网络原理
理解闪电网络主要分为两步,一是理解双向支付通道,二是诸多通道扩展成闪电网络。
双向支付通道
需要在无第三方作证情况下,保证双方保持诚信。
1. 开启通道
交易双方各自往一个由双方共同控制的多重签名地址转账。
多重签名技术(multisig),一个账户多个人拥有签名权和支付权。多重签名m/n,表示共n个私钥可对一个账户的交易签名,当m个私钥进行签名就可以支付一笔交易。
以Alice和Bob交易为例,先各自向多签地址1(由双方共同控制的2/2多重签名地址)转入5个BTC,后续这个地址需要双方签名才可操作其中比特币。
2. 通道内交易
首先需要理解两个概念,哈希时间锁定和哈希秘钥锁定。
哈希时间锁定,在交易脚本内设置时钟,设定时间或区块高度到达后才能解锁UTXO的比特币。例如Alice收到了一笔2 BTC转账,但是对方设定了1000个区块之后才能解锁,所以Alice必须等待1000个区块之后才能用自己的私钥签署交易,花费其中的BTC转给Bob。
哈希秘钥锁定,将密文的哈希值放入交易输出,作为哈希密文锁,后续需要输入锁的原先密文才能解锁UTXO的比特币。例如Alice收到了一笔2BTC转账,但是对方设定了哈希值锁定,所以Alice必须得到交易方的密文,同时配合自己的密钥签名才能签署交易,花费其中的BTC转给Bob。
以下通过Alice和Bob的两次交易来理解双向支付通道的巧妙,第一次交易Alice向Bob支付1个BTC,第二次Bob需要向Alice支付1个比特币。
第一次交易,Alice和Bob各自分别创建一笔不完整的、对自己有利的交易然后交换。
下图左边由Bob创建,Alice收到后可进行签名和广播,右图类似。Bob在创建半笔交易时,通过闪电网络通信模块与Alice联系,获得Alice创建的密文的哈希值(而密文在下一次构建交易时交换,从而作废当前构建的这次交易),然后把这个哈希值作为哈希锁放在自己创建的半笔交易里。这半笔交易将多签地址1里的10BTC,分别转给Bob控制的普通地址6个BTC和多签地址2(1/2多重签名地址)4个BTC(为什么不直接转给Alice?防双花,具体缘由下面解释),Alice拿到这半笔交易后可以进行签名并在链上广播。(以此可以单方面进行强制关闭通道,另外一种关闭通道方式是双方协商后创建一笔代表最终交易结果的新交易到链上)
为什么不直接转给Alice的地址,而采用多签地址2(1/2多重签名地址)?
假如直接转给Alice地址,后续通道内又进行新的交易,则Alice仍旧可以在链上广播当前这笔交易从而造成双花。
从下图看,多签地址2需要满足两个条件其中之一。要么Bob用自己的私钥和Alice生成哈希值的密文来解锁地址下的BTC,要么Alice等待1000个区块后用私钥来解锁。如果此时Alice单方要关闭通道不再交易,则需要承受等待1000区块的“惩罚”,而Bob没有Alice的密文,没办法去转出多签地址2里的BTC。这两个条件的设置很巧妙,更多设计理念会在第二次交易中解释。
发现自己的笔记习惯总是由果推因,一项技术是怎么样的,然后才去解释为什么要这么设计。这样的思维方式并不利于自主解决问题,没有很好地锻炼到根据某个问题去思考解决方法的能力。
第二笔交易,仍旧和第一笔交易类似,但区别在于建立第二笔交易前,双方会交换第一笔交易中的密文,从而“作废”第一笔交易。
如何达到“作废”第一笔交易的目的?
第一笔交易后Bob拥有6个BTC,而第二笔交易后拥有5个BTC,如果Bob作弊去签名广播第一笔交易,则会失去所有通道内BTC。因为第二笔交易前会交换第一笔交易的密文,而Bob在广播第一笔交易后需要等待1000个区块,此时Alice因为拥有了密文,可以将地址里的BTC提前转出,Bob将一无所有。
通道内交易的过程,不需要互相信任,只要同时在线,建立连接,交换哈希值,再各自创建交易交换。这个过程不在链上,快速且无手续费。因为作废的机制,双方可以在通道内反复任意次交易,每次交易后的状态都是最新的通道资金分配状态。
3. 关闭通道
关闭通道有两种方式,一是单方强制关闭,需承受延迟的代价,二是商议后关闭,双方从最开始的多签地址构建一笔交易(也要交换最后一次通道内交易的密文来作废),如下。
通道扩展闪电网络
当更多人参与网络交易时,如果两两间都要建立通道,则太过于复杂。
闪电网络中允许通过中间人作为路由节点来完成交易。假如Alice和Bob间有支付通道,Bob和Carol间也有支付通道,则Alice和Carol间无需再创建通道,通过Bob作为路由节点即可完成交易。当越来越多节点相互建立通道,最终便形成闪电网络,交易可以通过中间人像路由般通过一跳跳连接完成。
建立闪电网络时,存在信任问题,例如Alice先转给Bob后Bob不转给Carol、Bob先转给Carol后Alice不转给Bob、Alice转给Bob再转给Carol后Carol不承认收到等等问题。
要解决这个问题,大体的思路如下:1. 让Carol给Alice一把锁,Carol有锁的钥匙;2. Alice把锁给Bob,告诉Bob从Carol那拿钥匙,拿到钥匙自己就给Bob钱;3. Bob拿锁去找Carol,用钱从Carol那换来钥匙;4. Bob拿钥匙去和Alice换钱。
闪电网络采用了哈希时间锁定合约HTLC解决了这个信任问题。1. Carol使用随机密文生成哈希值,将哈希值给Alice;2. Alice将BTC转入一个多签地址,解锁这个多签地址可以通过两种方式,Bob输入本人签名和生成上述哈希值的密文,或者Alice在等待一定时间延时后输入本人签名,如下图HTLC(HTLC相当于这个新的输出,合约内容就是去满足两个条件之一);3. Bob也如Alice般创建HTLC给Carol,Carol通过自己的签名和密文取到Bob转出的BTC,此时Bob也因此得知了公布出来的密文;4. Bob使用得到的密文和自己的签名,从Alice创建的HTLC中得到BTC。
细节补充
- Bob创建的HTLC中Bob需要等待的延时要比Alice创建的HTLC中的延时短,从而使得Bob从Carol处取到密文后有足够时间去取Alice创建的HTLC中的BTC。这个过程中主要使用了哈希时间锁定来实现延迟解锁,应用方式和双向支付通道的有所不同,双向支付通道中是被用于单方强制关闭通道的惩罚,而此处是用于督促多方间两两的交易的及时完成,如果收到HTLC者没有及时公布出密文,则发出HTLC者可以取回原先转出到多签地址的BTC。
- Alice转给Bob的BTC金额要大于Bob转给Carol的金额,以此作为必要的路由费来激励Bob充当路由节点。
- 实际上,需要将HTLC和原来的双向支付通道结合,才不至于频繁地在链上取BTC。这里以Alice和Bob间为例,做转接时,Alice和Bob都创建双向支付通道内交易,但输出有所改变。比如上述经过两次交易后,Alice和Bob各自分别拥有通道内的5个BTC,现在Alice要创建HTLC让Bob代转1个BTC,因此新的通道内交易输出变为4-5-1。以Alice创建给Bob的那笔交易为例,多签地址1的UTXO作为输入,输出给Alice地址4个BTC,多签地址2(1/2多重签名地址)5个BTC,以及给一个HTLC的多签地址3(1/3多重签名地址,除了上述HTLC的两个条件,还有一个条件3是提供Alice的签名和Bob的密文,在Bob作弊时,Alice不仅可以直接拿走多签地址2的BTC,连同这个多签地址3的BTC也可以一并拿走。需要哈希密文的条件有小小的变动,需要等待1000区块,也是为了配合条件3来防作弊)1个BTC。当然,在创建这笔新的交易前仍然要交换前面交易的哈希值的密文,来作废原来交易。
- 在完成上述的交易路由后,Alice和Bob可以私底下协商,Bob将从Carol拿到的密文给Alice,Alice统一把通道最新状态更新成正常情况(非HTLC)。无论如何,正常情况下Alice是拿不到HTLC转给Bob的1BTC的,除非Bob先作弊或没能提供Carol的密文来转走这1BTC。以此对双方来说,还不如顺其自然把通道状态更新。
- 对于关闭通道结束所有交易后,只有两笔交易会被广播到比特币网络,开启通道交易和关闭通道交易,而这之间的所有交易通通不用记在链上,无论通道交易持续了多久,完美收官!
晚上在听关于李娟的《我的阿勒泰》的播客时,其中讲到文章中每段的长度影响到了阅读的难度,每一段越长越是难读,难以理解。我写文章也有这样的问题,不管是学习笔记还是写些其他的文字,大段的文字其实更应该是论文的风格,而非这类文章,