这个周期主要研究比特币生态和BTC Layer2

Joined December 2023
194 Photos and videos
18 Jun 2025
资本论学习输出一:什么是资本论 《资本论》的课程终于学完了。用了两个月时间吧,又花了半个月时间进行了一些整理,准备用10篇文章来作一个输出。 这是第一篇:什么是《资本论》。 主要内容包括 一、《资本论》是一部什么类型的著作? (一)《资本论》是政治经济学 (二)《资本论》的目的是批判和揭示 二、比较《国富论》《资本论》和《就业,利息和货币通论 三、《资本论》的内容 (一)《资本论》的逻辑架构 (二)《资本论》理论体系的逻辑关系 一、《资本论》是一部什么类型的著作? (一)《资本论》是政治经济学著作 资本论不是一部经济学著作,而是政治经济学著作。它的副标题就叫做政治经济学批判。 1. 什么是经济学? 经济学是一门研究人类经济行为,以及这些行为有什么规律的学科。经济学的前提假设是社会的资源是有限的,而人类的需求和欲望是无限的,所以它们之间存在着永恒的稀缺性矛盾。经济学的核心目的就是去探讨如何平衡这种矛盾,即如何通过有限的资源满足无限的需求,并分析和解释这个过程中产生的各种现象、问题与矛盾。 经济学解决什么问题? 经济学要解决的问题可以总结为三个基本的问题: 第一、生产什么?社会要把有限的资源优先用于哪些产业,行业,或者产品的发展上。 第二、如何生产?生产过程中生产方式的选择与技术的选择,比如应该选劳动密集型,资本密集型还是技术密集型的生产方式。还有如何进行效率与环境成本的权衡,比如高污染产业和绿色技术产业之间如何选择。 第三、为谁生产?如何决定产品分配的核心机制。 2. 什么是政治经济学? 政治经济学研究什么? 政治经济学研究的不仅仅是经济问题,更重要的是研究经济与政治、社会之间的关系。 说白了就是研究 "钱和权怎么互相影响" 的学问。 政治经济学的目的并不是解释经济现象,也不是只关注市场机制是否均衡,资源配置是否效率,经济增长是否合理这一类问题,而是揭示和批判。 揭示和批判经济现象背后的社会问题和矛盾。比如: 权如何影响钱:政府收税、发补贴、管物价这些操作,会让谁发财让谁吃亏? 钱如何影响权:大公司赚多了钱会不会控制政府政策?老百姓收入差距大了会不会闹事? 《资本论》研究什么问题? 《资本论》之所以属于政治经济学,是因为它研究的核心问题是资本主义生产关系的本质及其运动规律,而不仅仅是纯粹的经济现象或技术性问题。 它的“政治经济学”属性体现在以下几个方面: 第一、它符合政治经济学性质,因为政治经济学的传统就是研究社会生产关系; 第二、《资本论》的主要课题就是研究资本主义生产关系的本质,而不是表面的经济数据; 第三、《资本论》的核心目的就是批判资本主义生产关系; 第四、《资本论》标题就点名是对资产阶级政治经济学的批判,批判资产阶级经济学的虚伪性; 第四、《资本论》与现代经济学有本质区别:新古典、凯恩斯等现代经济学往往回避阶级问题,而《资本论》直接揭露阶级剥削与政治权力的经济基础,并直指核心:经济问题的本质是政治问题。 第五、《资本论》批判资本主义生产关系的最终目的并不是解决经济问题,而是为无产阶级革命提供理论武器的政治目的。 3. 什么是政治经济学批判? 政治经济学批判是马克思主义理论的核心组成部分,它指的是对资产阶级政治经济学,比如亚当·斯密、大卫·李嘉图的古典经济学的系统分析和批判,同时揭示资本主义生产方式的本质矛盾及其历史局限性。 马克思通过对资产阶级政治经济学和资本主义生产方式的批判,建立了科学的无产阶级政治经济学,代表作是就《资本论》。所以他给它取了“政治经济学批判”的副标题。 政治经济学的本质 政治经济学批判 = 对资产阶级经济学的揭露 对资本主义运行规律的剖析 对无产阶级解放道路的探索。 马克思通过这一批判,不仅解释了“资本主义是什么”,更证明了“资本主义为什么必然灭亡”。 政治经济学解决什么? 政治经济学要解决的问题是 “社会为什么不公平” 可以这么认为,主流经济学都是为统治阶级服务的,主要是为资本主义提供理论辩护,而政治经济学并不是服务于统治阶级,也不提供理解经济现象的理论或者哲学。它走向的是经济现象和问题的更深处,它在追问 “这个社会为什么会不公平”,是什么原因导致人们之间的不公平,它要揭示形成社会矛盾的底层逻辑。 4. 政治经济学与经济学的关系 政治经济学与经济学的关系可以理解为:政治经济学在经济学的基础上增加了政治学,哲学以及社会学的视角,追问“经济为谁的利益服务”;而普通经济学为政治经济学提供了“工程学的工具箱”,专注于“经济如何更高效运行”的技术性工程问题。 (二)《资本论》的目的是批判和揭示 《资本论》的副标题叫做政治经济学批判,强调《资本论》的核心目的就是批判。 《资本论》批判和揭示什么? 它批判的是资本主义的经济体系,它要做的是找出隐藏在经济现象背后,影响经济甚至起决定作用的政治问题,比如权力关系、制度结构和历史脉络。 通过经济现象和政治问题的关系,来揭示资本主义导致自我灭亡的致命问题,比如其生产方式的本质、资本主义内在的矛盾,以及它的历史局限性。 社会不公的根源 马克思认为社会不公平的根源正是统治阶级用于巩固统治的制度,即资本主义制度本身。 资本主义的本质 资本主义的本质是资本对整个社会生产过程的支配地位,资本统治一切的具体表现是资本通过私有制控制生产资料,以剩余价值即资本增值为目标,驱动生产和分配过程,所有的市场机制都服务于资本积累的目的,导致财富集中和阶级对立。 资本在社会关系中的支配地位 在资本主义制度下导致社会不公平,阶层贫富分化,阶级对立的底层原因,马克思归结为劳动与资本的关系,国家与资本的关系,以及资本流转和社会化大生产的问题。通过对这些问题和矛盾的分析,马克思得出的结论是资本主义这种制度的历史趋势是必然走向灭亡,为此他也在寻求替代资本主义制度的方案。 所以《资本论》不是为资产阶级的统治提供改良措施的书,而是为其对立面即无产阶级的解放提高指导理论基础和实践方法的书。 二、简单比较《国富论》《资本论》和《通论》 三论的理解角度 亚当斯密的《国富论》研究的是资本利得,它的整体框架结构都是在讨论资本利得。但是它讨论的不是个别资本的利得,而是以国家为单位的国家总资本的利得,所以它叫国富论。 《国富论》算是在宏观经济层面最伟大的著作,即使到今天在讨论国家问题的时候,依旧需要研究国家总资本的资本利得。国家总的资本积累率下降是因为我们的总资本中社会资本的部分出现了大规模的迁移,社会资本不是迁入了,而是迁出了,所以资本积累率就会下降。 总资本的利得是《国富论》要讨论的问题,所以《国富论》研究的问题就是如何增加总的资本利得,使国家迅速完成资本积累和完成工业化。 《资本论》研究的个体层面的劳动所得,它希望劳动者的劳动所得能够最大化或者合理化。让劳动者在劳动所得合理化的基础上能够比较好的维持自身的再生产。 凯恩斯的《就业,利息和货币通论》是研究如何让国家的资本利得和个体的劳动所得两者达到均衡的问题,针对如何实现资本利得和劳动所得的均衡,他的主张是在政府的干预下让两者取得平衡。 三论的联系 如果说《国富论》是一个国家进入工业化完成工业化的重要的逻辑基础,或者说是理论依据的话,那么《资本论》则是一个国家重视民众,重视社会,重视均衡发展的一个重要的逻辑基础和理论依据。它也是一个国家从君主专制,资本专制走向社会共治的重要的经济学理论。 《资本论》是一本关于解放的书。社会主义国家曾经把《资本论》当作无产阶级的圣经来读,是有一定道理的,因为它一直在研究劳动者劳动所得的合理性,以及劳动所得最大化的问题。 凯恩斯既熟悉《国富论》,也熟悉《资本论》,所以《通论》的立论基础并不是单纯的希望国家资本利得最大化,而是希望国家资本利得与劳动所得达成某种平衡。 亚当斯密,马克思和凯恩斯三人都有一个共同的特点,就是对人民的悲悯。亚当斯密后来还写了《道德情操论》,马克思的现代殖民理论里面涉及到超越了劳动异化和资本异化的更重要的话题,殖民的整个过程依旧是资本剥削和压榨的域外延申或者境外延伸,只不过是以更残暴,更粗鲁,更野蛮的方式进行。 概括三论 对这三个理论分别用一句话来进行概括,可以这样总结: 《国富论》是一本重要的经济学著作,古典经济学的著作; 《资本论》是一本政治学著作,或者政治经济学著作; 《通论》是经济政治学著作。它研究的是经济,但是要通过政府的方法来处理经济问题。 它们都是各自领域的开山之作。 三、《资本论》的内容 《资本论》总共三卷,分析和讨论的主题多达近20个,包括价值,价值规律,货币,劳动,商品,资本,资本积累,剩余价值,资本形变,资本流转,资本的跨境流动,经济危机,扩大再生产,地租,殖民,阶级,土地财政,国家与资本等。 (一)《资本论》的逻辑架构 第一卷主要是讲资本主义经济的生产领域,侧重劳动隶属与剩余价值,主要目的是揭示剩余价值的来源,说明了资本主义危机的来源。比如工人日薪100元却创造200元价值,100元的差价就是剩余价值。 第二卷主要是讲资本主义经济的流通领域,聚焦于资本循环与再生产的实现。分析了资本循环与周转,包括货币资本、生产资本、商品资本的形态转化。揭示了资本主义危机的发生过程。 第三卷是讲资本主义经济的总过程,在总过程的框架下分析资本主义经济的分配领域,实现生产过程、流通过程和分配过程的统一。综合研究分配过程,分析利润平均化与危机生成机制。核心在于以总过程为框架揭示剩余价值的分配规律,揭示信用制度如何促进危机的总爆发。 (二)《资本论》理论体系核心范畴的逻辑关系 理论体系范畴的核心逻辑 三卷内容以资本为核心把资本主义经济所有范畴串连起来,分析资本主义危机从起点到终点的历程,揭示了资本主义经济制度的内生矛盾及其根源,并从其自我否定的矛盾根源中推导出资本主义必将自行灭亡的最终结局。 为什么所有范畴都以资本为核心,围绕资本展开? 资本增值是整个资本主义生产的根本目的 资本主义的本质就体现为资本对整个社会生产过程的支配地位。因为资本增值是资本主义生产的终极目的,生产中的其他所有范畴包括劳动,商品,价值,货币,剩余价值等等都是为了实现资本增值的目的服务,成为资本的工具手段,或者是实现资本增值过程中的某个环节。 这是资本主义生产方式下产生的一种异化现象,因为在纯粹的经济学中,生产的最终目的应该是为了满足人的需要,资本跟劳动,商品,价值一样,都应该只是生产过程中的一个工具,是为人的生产需要服务的,所以在生产关系中人应该占支配地位,资本占被支配地位。但是在资本主义生产模式下人和资本的关系却发生了翻转,变成了资本支配人。因为资本变成了生产活动的目的,劳动力成为了实现资本增值目的的一个工具和手段。 资本为了自我增值会不断雇佣劳动者生产商品,创造剩余价值供自己剥削,而劳动者没有生产资料,必须接受资本对剩余价值剥削最大化的生产要求,完全沦为了跟机器,原材料等其他生产资料同样的角色,就是资本增值的生产工具。 资本自我增值的目的要求经济中的每个环节都以利润最大化为原则 在这种异化关系机制下资本变成了整个资本主义社会的支配力量,生产过程中的其他所有范畴比如劳动,商品,价值,货币,剩余价值,资本积累,扩大再生产等等都变成了资本增值目的的工具,手段或者过程中的一个环节。 比如在劳动和商品的范畴,为了资本增值的目的,生产什么产品不是根据人们的真实需求来决定,而是根据利润最高,剩余价值最多的原则,什么行业和产品利润最高资本就会在进入这个行业或者产品,而没有利润的行业,即使是人们的刚需资本也不会进入;在价值的范畴也是一样的逻辑,生产出来的产品不是为了满足人们的使用需求即商品的使用价值,而只是为了满足交换的需要即商品的交换价值。 因此资本是资本主义社会的支配力量,它不仅决定经济,也决定政治和意识形态。 资本主义危机的根源 资本增值的要求当然为资本主义提供了发展壮大的经济基础,然而恰恰也是资本自我增值的本质要求成为了资本主义制度内部矛盾的根源,也成为了资本主义危机的根源。 资本本质是一种剥削剩余价值的生产关系 根据马克思的理论,资本不仅仅只是像机器,原材料,货币这样的一种物,它更是一种剥削关系,其本质是剥削剩余价值。因为资本的必要条件包括生产资料,雇佣劳动力和剩余价值,如果只有机器,原材料这样仅仅作为“物”的生产资料,而没有雇佣劳动力形成雇佣关系,没有生产出剩余价值,那就构不成资本。必须要在带有剥削性质的生产关系中资本才会存在,所以生产资料和货币之所以变成了资本,就是因为它雇佣了工人,形成了雇佣关系,并完成了对剩余价值的剥削。 资本的剥削本质导致的结果是生产过剩的经济危机 而剥削机制的存在,在资本自我增值的本质要求下,资本一定会把这种剥削性质的生产方式变成最有利于产生剩余价值的模式,即不断地扩大再生产的规模,不断的增加剥削的程度,它带来的结果一定就是劳动者越来越穷,生产出的产品越来越多。而劳动者即被统治的无产阶级才是资本主义社会中最广大的社会阶层,他们自然也是社会最主力的消费者。但是他们的工资越来越低,消费能力越来越弱。于是这两种结果之间一定会形成一种矛盾:越来越多的商品和越来越低的消费能力,即商品的供应大大超过了社会对它的消费能力,导致商品卖不出去,卖不出去商品就无法实现其交换价值,即商品无法转化成货币。而剩余价值的生产机制是商品实现价值之后,兑换出来的货币大于资本支付的劳动力工资成本,多出来的部分就是被资本拿走的剩余价值。商品如果无法转化成货币自然就无法完成剩余价值的生产,那么资本主义生产的根本目的即资本增值就无法实现了。 这就是生产过剩的经济危机。 资本主义经济危机的产生过程让我们看到了资本的运动规律,即从商品交换变成货币,从货币购买劳动力进行再生产,生产出的商品再次进行交换变成货币,货币中减去劳动力工资剩余的部分就是剩余价值,这就完成了一轮资本的运动。 在这个过程中资本塑造了所有的经济范畴,比如它决定了劳动,商品,价值,货币的过程和性质,同时它也决定了资本主义的兴衰。资本积累必然导致危机和革命,《资本论》的批判就是要揭示这一规律,为无产阶级革命提供理论武器。 《资本论》逻辑总结 所以《资本论》的理论体系是以“资本”为核心,其他的所有范畴,包括价值、货币、剩余价值、危机等都是围绕资本的运动规律这条线在展开,构成一个严密的批判体系。目的就是批判资本主义以资本增值为目的的生产方式成为自身危机的根源,决定了资本主义制度的结局。
2
12
433
6 Feb 2025
Yap early, yap only, yap often. @_kaitoai is connecting AI, attention and capital with Yaps. Just claimed my social card and I'm accumulating Yap points in real-time. Claim yours 👉 yaps.kaito.ai/referral/17376…

3
399
雪解 retweeted
21 Jan 2025
应各网友要求,现分享私发【43A6-BMPIL牛市逃顶指标清单】 原版表格: ·42个逃顶指标追踪所有详情,并持续更新 ·各指标链接 ·过往两轮牛市数据分析对比 获得条件 1支持原创 2关注我 3转发此帖,并回复分享你预测这一轮BTC牛顶价格&时间附上你的google邮箱,我给你开权限。 x.com/_43A6/status/188146043…
20 Jan 2025
有网友好奇我原创的 BTC牛市逃顶指标清单 43A6-BMPIL是否真的有用? 于是我做了两轮回测,如图21年4月14日命中56项,17年12月16日命中77项。 可是我被抄袭搞怕了,犹豫是否分享给大家,那么 支持【公开】请转发↗️ 回复; 支持【私发】请点赞♥️ 回复。 打击盗版👊抄袭冚家铲x.com/_43A6/status/188076828…
141
112
108
35,053
19 Jan 2025
还好昨天下午在68卖掉了Trump, 本以为今天川普登基会利好兑现大跌,没想到他们家这么快就发了第二个,还会有第三个,第四个吗? 刚刚买了点 Melania 玩玩,能不能暴负看这次了,哈哈。 @MELANIATRUMP
1
4
592
19 Jan 2025
DTRXBT @DTRXBT 的买入逻辑分析 昨天和今天分别在1800万和2100万市值的时候买进了 @DTRXBT 。希望不被辜负。 项目上线很短,才5天,不过基本上都保持在2000万以上,昨天应该是上线一来跌得最狠的一次,1800万,今天又涨到了2500,刚刚又跌到了2100,所以又买了一点。 买入逻辑: 1. 应用性强 这是一个在币圈应用性非常强的AI agent。提供投资分析,策略优化和 Alpha机会的 AI 代理,由DTR团队孵化,项目创始人是 @ghost93_x 。 我看了他在推特上的发的很多内容,其中提到的 Alpha 挺多的,不过都是我不熟悉的项目,所以没法判断这些Alpha的质量。但是貌似在社区挺受欢迎。 2. 团队厉害 DTR团队孵化了两个AI AGENT 项目: @AcolytAI@DTRXBT,ACOLYT 构建的是过滤数据的基础设施,让其他Agent能够更快更有效的访问市场数据。而DTRXBT 则是构建处理数据的算法,在获取到的有效数据基础上更有效的处理数据,生成 Alpha 并构建应用程序。 这两个项目市值都达到过3000完美金以上。目前@AcolytAI 为3700万,@DTRXBT为2100万。@AcolytAI 上线一个半月,价格一直都很稳。进入2000万用了20多天,后面就非常稳了,中间只有一次跌下过2000。跟其他项目大起大落的情况非常不一样。 而@DTRXBT 是本月14号上线,15号就上了2000万,持币地址也达到了两万多。从两个项目的市场表现来看,确实非常受欢迎。 团队核心成员包括 创始人: @ghost93_x 善于事件营销和情绪营销和产品创造;负责项目愿景和路线规划,目标制定; @jonahblake - 商务拓展, 负责娱乐和游戏领域; @icobeast - 商务拓展, 负责法务和财务; @Spectrum__eth - 负责运营和战略; @felixnorden - 专注于人工智能的技术专家,负责开发。 从推特上的信息来看,团队中的创始人和开发都是挺受尊敬的,@ghost93_x 也一直在强调他们项目的优势是技术和专业,不是创建一个通用性的AI agent, 而是专业性非常强的产品。貌似社区也挺买账。 3. 强强合作 从@DTRXBT 上线第一天,@AcolytAI 就宣布了两个项目的合作, @AcolytAI@AcolytAI 提供数据获取上的技术。 包括收集、筛选和显示这些数据的技术支持,还有预言机 API 功能。而@DTRXBT 则根据市场上的请求,情绪和结果等专业数据创建有效的算法,提供投资的Alpha机会。 我感觉从功能上来说可能类似于Aixbt @aixbt_agent,不过有什么区别目前还不清楚,因为还没有公布白皮书,电报群貌似也没有公开,普通用户还进不去。 我在Basement @PremierBase 的一篇分析中看到他认为@DTRXBT可能成为 @aixbt_agent 真实的竞争对手。 4. DTRXBT代币的应用场景即将打开 @DTRXBT 周一推出Alpha 客户端。用户访问AI 代理获取Alpha 信息需要质押DTRXBT代币,目前说的是10万个DTRXBT,按照现在的价格就是2100刀。可能还有基于数量和锁定时间的分层质押机制,具体情况要看明天的官方公告。不管怎么说,如果他们的Agent确实能够提供高质量的Alpha, 那么DTRXBT质量的需求量就一定会不断上升。 可能也是因为这个预期,在今天这样没有流动性的情况下,DTRXBT的价格还能上涨而不是下跌。 刚刚在推特上看到有人说@DTRXBT今天推的一个Alpha JAIDEN 已经涨了5倍了,@DTRXBT 发的那条推文如下:x.com/DTRXBT/status/18807381… 我当时看到了 @DTRXBT 的这个推特,但是没当回事,也没有去研究,所以我现在不能确认是不是真的5倍,有兴趣的同学可以自己去查一下。我还是不太习惯听机器人的,宁愿自己费力巴拉的去各种找数据,自己分析。要好好思考一下自己的问题了。 这个项目的Agent 如果能够做起来,前景应该非常不错。它提供的是币圈人真正愿意付费去使用的东西。相比于@aixbt_agent,它的价格还非常低,所以还是很有空间和想象力。 @ghost93_x 的推特中还有很多干货,我关注的时间太短,很多还没有消化。以后仔细去研究一下,再认真的写一写这个项目。
18 Jan 2025
JAIDEN launched on Solana, pumped 1K% in an hour to $1.6M FDV (ATH $2.4M). Billed as an agent token launchpad for trends, with devs mostly anon but tied to AI PhD Rita (@0xRitaBern). No marketing yet, but apes trust Tong’s calls—they rarely miss. Early vibes, big hype. 🚀🐒
6
11
532
19 Jan 2025
错过了Trump不是运气的锅,是基本功和能力不够,静下心来打好基础才是解题之道 本来是打算直接整理这几天的记录和操作的,但是昨天市场完全被Trump给搅翻天了,基本上所有山寨都没有了流动性而全线大跌,而我完全错过了Trump在链上的涨幅,只是昨天半夜醒来抓住了跌下来那个时机,在币安钱包里面以24刀的价格买了几千刀,现在基本上翻倍了。 所以还是先来自我反思一下吧。 其实赚不到这种机会的钱也是必然的,并非是我运气不好。因为这已经大大超出了我的基本功和能力范围,这种短时间暴涨,极为FOMO的机会其实需要非常剽悍的实力和能力才能赚到大钱。 这不仅仅是发现机会这么简单,即使很早就发现或者知道了这个消息,按照我的性子,也不会买进去的,因为不确定性实在太大了。我一定会认为特朗普这样地位的人怎么会去发一个空气币呢,所以第一时间我就会认为这是个骗局。可能需要等很长一段时间别人已经赚很多了,我才会去分辨是不是真的。 分辨是真实的之后,才会去思考能涨到什么程度,然后才是自己敢买多少,赚多少就该跑了等等问题。 等这些问题都弄清楚之后可能才会去买,而且我肯定不敢买很多,因为它没有什么价值支撑,也没经过市场的验证,你对它没有信心,所以只敢买几百U,最多几千U去试试。 买完之后,看到涨得那么猛,肯定会无数次的提醒自己赶快去卖了,免得一会跌下来竹篮打水一场空。所以能够拿到10倍涨幅对我来说已经很吃力了。说白了这种项目就不是自己能够把控的,自己心里没底,有一点风吹草动就拼命想逃,多涨一点也会把自己搞得心里七上八下。 其实想清楚了这些,对错失这种机会就淡然了,因为在自己不具备把控它的能力之前,错过都是必然,如果赚钱了一定偶然。 拿如果真的想要在以后去尝试自己是否能够把握类似的机会,那么从现在开始就要思考自己是否具备赚这种钱的素质和能力,比如自己的价值观是不是允许和支撑,有没有能力做判断和决策,有没有经济实力上仓位等等。 如果这些都想通了之后才是去规划要如何去学习和训练,通过什么办法能让自己的认知和能力匹配这种机会的要求。 就第一个问题,自己的价值观是不是支撑自己这样做,我就发现其实非常困难。因为我的潜意识就决定了自己关注的都是有一定使用场景和价值的项目,而且要已经经历过一两波涨跌,还要自己记录和观察过至少3次。如果不符合这些条件我感觉自己很难有信心的,对一个项目没有信心就不可能赚到它的钱,因为不敢上仓位,不敢等到大结果。除非你有大量的闲钱,反正亏了也不心痛。 所以还是放过自己吧,不用那么跟自己较劲,还是专注在能让自己内心舒适,睡得踏实的地方。人是很难突破自己的人性局限的。 不过说到如何发现类似的机会,以及如何做出分析和判断,以及如何根据自己的判断做出决策,就真的跟刻意训练自己在链上思考和操作的能力非常攸关了。 一个只是想方设法寻找他人的密码,照抄他人作业的人即使复制别人抓住了机会也很难真正赚到钱。因为赚钱不是只有密码这一个前提条件,更多的是判断,决策和行动,比如对机会大小的判断,时机的判断,对仓位的决策,对利润多少的判断和决策,对不确定情况和意外的决策和行动等等,这些都是需要有自己的思考和分析,要根据当时的情况以及自身的情况进行思考和分析。这些都是抄作业解决不了的问题。 我认为普通人要想锻炼这些能力,必须要自己亲自下场去实践,去了解项目,研究项目,寻找数据,记录数据,自己设计框架和模型进行对比,分析,然后得出结果。只有这样去做了,对项目的情况才有基本的认知,对各种数据才会有基本的理解,在这个基础之上才能对一个项目做出基本的判断,有了这些判断才敢真金白银的去投资。也正是有了这些判断和信心,即使出现异常或者意外情况自己才有能力决策。 类似的训练和操作只有做过很多次以后,才会形成对市场的认知和理解,才能在无数多新项目出来之后,通过最基本的一些数据和信息快速地辨识出哪些是需要进一步了解的项目,哪些是完全不用看的项目。其实说白了这些能力就只是在链上生存的基本功而已。 如果没有经过训练就急着进入一个市场买买买,你会发现如此多的项目,根本没法选择,而大多数人的选择就是四处找答案,或者闭着眼睛乱买。因此赚钱真的变成了一种碰运气的玄学。 写到这里,得出的结论还是得继续自己每天的功课,不停的看市场资料,看项目资料,看社区资料,找数据,记录数据,进行横向纵向的对比,计算结果。然后小规模的进行操作和尝试,不断验证自己的判断,不断修正自己的认知和理解,不断完善自己的思考,不断积累自己判断,决策和实操的经验。 能够坚持做下来,我相信未来有好的机会,才有第一时间发现的可能性,才有发现机会并快速判断和决策的能力。就算不能抓住这样巨大的机会,只要有链上思考和操作的基本能力,每个牛市场都会有无数次的小机会,只要认认真真对待遇到的每一个机会,踏踏实实做好每一步,赚钱也只是迟早的事。 所以,继续吧,别为不属于自己的牛奶而哭泣。
2
6
14
843
15 Jan 2025
Byte Ai @Byte__AI 怎么这么猛 发币不到12小时就一千多万了,早上发现和记录的时候才1300万。刚刚犹豫了一下,觉得涨得太猛了,等回调再买。 没想到现在2000万了。
1
329
11 Jan 2025
今天进了 AIYP @Agent_YP。 昨天AgentYP 昨天获得了 VaderAI @Vader_AI_ 的投资。这是一个专注于 Web3 游戏的自主 AI 代理,将 AI Agent YP 集成到主要游戏中,通过AI框架驾驭游戏世界。 以前收到过它们的空投,但是收到就卖了。当时只有几百万的市值,后来最高涨到2500万。 目前又跌到了 1000万的样子,这是我第一次买这种市值比较大,市值上了千万的AI agent。
1
418
8 Jan 2025
Bricks 遇到欧盟合规性问题了,跌了好多。 目前还不清楚能不能解决。 买得太早了,应该再观察两天的。 内盘不确定性太大,风险也大。以后尽量寻找外盘的项目。虽然风险也大,但是相对来说参与人数,活跃度和流动性等等都会好一点。
291
5 Jan 2025
前面在Virtuals @virtuals_io平台上参与的几个AI Agent都出掉了,开始关注新的项目 BRO, Dora 和SQDGN 都是在100-200万市值,内盘的时候开始关注和买入。 其中Bro和Dora 被我在到1000万之前卖飞了,目前BRO在2000万左右,Dora在1100万左右。 SQDGN 还没有飞起来,目前在500万左右,不过也卖完了。 Catalyst 是在10万市值的时候关注和买入的,做了几个波段,赚了一点,后来也卖完了。目前已经跌到5万,距离归零不远了。 这几天关注的是BRICKS @bricks_virtuals,记录了三天,今天早上买入了。目前市值只有70多万。 买入逻辑: 1)有应用场景的AI agent, 想要做的是AI 代理与物理世界之间的桥梁,改变他们之间的交互方式; 2)有白皮书,网站,推特,貌似昨天也建立了电报群; 3)开发者持有的币90%放在UNCX锁仓了,在basescan看到锁仓的币占总量的14.2393%; 4)推特更新和互动情况还可以,虽然粉丝数不多,但是从第一条推特开始,就有一定的互动。 风险: 1)项目还在内盘,能不能跑到外盘不确定太大; 2)各种链上数据和市场数据太少,通过数据还比较难以做判断; 3)前两天内盘冲的速度非常猛,第一天联合曲线完成了95.6%,第二天完成了97.2%,但是今天有点乏力,跌倒92.3%。 4)项目还只有一个概念,agent 还没有发布,不确定性大。
1
5
656
25 Dec 2024
研究Base链上Virtuals平台的AI agent 项目将近一个月 花了10多天跟踪记录了57个项目的数据。 花了一点小钱买了4个,其中有一个亏钱(记录之前买入的),三个小赚一点,但是不敢投入太多资金,也没有到钻石手的程度,都是一两倍就跑,所以赚得不多。 总体感觉,数据对选择项目还是有一定作用,至少可以在一定程度上避免买到归零的币,也能让自己在买入时有一定目的,避免完全的盲目性。但是由于项目基本上都非常早期,所以这些数据的可靠性和可预测性程度还是很有限。 以前买meme 都是随大流,从来没有花时间去做过研究,所以买了100%都是亏的,而这次至少总体上没有亏钱,从这个意义上来说,花时间去做一点研究还是有价值的。
1
3
8
763
雪解 retweeted
9 Nov 2024
闪电网络学习5:闪电通道运行流程(上) 前一篇文章分析了闪电通道防止和惩治作恶的原理,即通过一系列相互依赖的交易,包括退款交易,承诺交易,交付交易,可撤销的交付交易,违约惩罚交易等,把它们结合起来实现了可撤销按序到期合约 RSMC 的功能,这个功能就是帮助闪电通道作废了通道中所有过时交易的余额状态,并以奖惩机制一方面确保广播过时交易进行结算的欺骗行为都会受到罚没资金的惩罚,另一方面确保在作恶发生时没有作恶的一方会受到奖励,那就是获得对方的所有资金。 对RSMC的作用总结成一句话,就是让闪电通道实现以经济惩罚的机制而不是物理阻隔的方式来防止和惩治欺诈交易的作恶行为,最终实现了一个免信任的支付通道。 今天这篇文章的主题就是闪电通道的运行流程,重点是闪电通道中这些交易是如何构建出来的,他们又是如何结合起来实现RSMC合约的功能的。 本文主要内容如下 1. 开启通道 1)构建注资交易 2)构建退款交易(0#承诺交易)的两个版本 3)签名和广播注资交易,完成充值和通道开启 4)构建0#交付交易的两个版本 5)构建0#可撤销交付交易的两个版本 2. 通道交易 1)通道交易的流程 2)通道交易的构建 (1)构建1#承诺交易的两个版本 (2)构建1#交付交易的两个版本 (3)构建1#可撤销交付交易的两个版本 (4)交换0#承诺交易的撤销私钥 (5)构建1#违约惩罚交易的两个版本 进入正文,我们先从通道的开启开始。 1. 开启通道 在新建一个闪电通道时,需要提前准备好三个交易:一个注资(充值)交易,一对退款交易(两个版本)。 1)构建注资交易FT 注资交易就是充值交易Funding Transaction,简称FT。 它的作用是用来创建通道,即在比特币链上创建共管账号(即多签地址)并向这个地址充值资金,完成支付通道的开启。 跟所有比特币交易一样,注资交易也是由两个部分组成,即交易输入和交易输出。 第一:构建交易输入 Input 交易输入是用来表达当前交易所要操作的这笔资金来源和资金所有权归属的构造,主要内容包括引用的交易ID和未花费的交易输出即UTXO的序号,所涉及资金的金额,以及如何解锁这笔资金的方法(就是指解锁脚本)几个部分。其中引用的交易编号(TXid)和UTXO序号确定了资金的来源,解锁脚本中需要提供的数字签名则负责验证资金的所有权。 注资交易的资金来源于通道双方,因此需要引用的TXid和UTXO序号至少要有两个,即需要有两个或者以上的Input,分别代表两方提供的资金来源。 比如小艾(用A代表)和小笨(用B代表)各自向通道提供5个BTC的资金,那么他们需要分别提供一个(或多个)UTXO,每一个UTXO及其所在的交易就是需要引用的资金来源,它们构成一个输入;每方提供的UTXO所包含的资金合计必须要稍微大于5BTC,因为除了留在通道中的5BTC,开启和关闭通道时都需要发起BTC链上交易,要支付一些交易费用。 下面用小艾和小笨开启通道作为案例,来看FT交易的两个交易输入(Inputs)如何构建。 输入1:0# Input 交易ID:xxxxxx UTXO序号:xxxxxx 金额:5.001BTC 解锁脚本:用小艾的私钥KA签名 输入2:1# Input 交易ID:xxxxxx UTXO序号:xxxxxx 金额:5.001BTC 解锁脚本:用小笨的私钥KB签名 上例的两个Input中,0# Input 是小艾提供的,因此解锁脚本要用小艾的私钥KA提供签名,1# Input 是小笨提供的,因此解锁脚本要用小笨的私钥KB提供签名。每一方都要在自己提供的UTXO使用匹配的私钥进行签名来验证这笔资金的所有权,证明自己是这笔资金的所有者。 第二:构建交易输出 Output 交易输出是表达这笔交易的资金和所有权归属去向的构造,主要内容包括金额和锁定脚本。其中锁定脚本规定了这笔资金的花费条款,即哪个私钥能够解锁这笔资金,以及哪个地址拥有资金所有权。注资交易的锁定脚本中设置的是一个多签的公钥地址,表示这笔资金的去向就是这个多签地址,所有权则由锁定脚本中双方的公钥哈希进行锁定封印。 还是来看小艾和小笨开启通道的案例 0# Output 金额:10BTC 锁定脚本:A B 的FT多签地址 注资交易的资金去向是一个共管的账号,即由一个2-2多签地址来接收注资交易的资金,所以必须生成一个由2-2 双方多签地址控制的交易输出(Output),由双方的密钥共同控制,充值的时候双方的10个BTC会全部进入并锁定在这个Output 里面。FT交易多签 Output 中用来锁定资金的密钥由双方分别提供,而且这个密钥只能用于注资交易,不能复用在其他地方。比如小艾在FT交易的专用公钥是 PAFT,小笨是 PBFT。 注资交易只需要创建一笔交易,双方的资金都放在一个Output 里面,因此必须通过双方合作来构建和花费,即需要双方在各自提供的 Input 里面签名之后才能广播出去经过矿工的处理,任意一方发起广播都可以。 但是现在只需要把交易构建出来,还不用签名和广播,需要完成了下一步的退款交易之后再返回来完成操作。 2)构建退款交易 之所以要构建退款交易是因为充值到注资交易的资金进入了共管账号,需要双方合作才能解锁和转移,万一一方不配合就会导致资金被锁,造成充值者的损失。 所以退款交易的作用是按照FT交易的初始状态分配双方的资金,也就是把充值到FT交易2-2共管账号的资金按照充值金额退回给双方。 退款交易这部分的主要内容包括 (1)退款交易= 0#承诺交易 (2)0#承诺交易的构建原则 (3)0#承诺交易的两个版本 (4)0#承诺交易的两部分结构 (5)0#承诺交易的脚本 (1)第一笔承诺交易0#CT 退款交易 = 0#承诺交易 退款交易其实也是一笔承诺交易,因为它也是发生在链下,没有广播到链上进行验证和公证,是双方在链下向对方保证能够按照原样进行退款的承诺,因此也被认为是一笔承诺交易,即Commitment Transaction, 以下简称CT。我们可以把退款交易当作是第一笔承诺交易。 承诺交易(CT)要解决的第一个问题是要确定通道中的哪一方主动向比特币区块链发起了广播承诺交易的结算申请,这是在通道交易中要区分作恶者并给予惩罚的前提。其本质是要让区块链能辨别主动发起交易广播的是哪一方。 实现这一目标的方案就是把承诺交易构建为两个版本。 (2)0#承诺交易的构建原则 第一,承诺交易要构建为两个版本。退款交易是第一笔承诺交易,因此也需要要构建成两个版本,每方各构建一个版本,签名之后发给对方,由对方持有。 第二,承诺交易的结构跟比特币交易一样。也是由交易输入和输出两个部分构成,因此退款交易也是通过构建输入和输出两个部分进行构建。 第三,承诺交易代表的是通道中的状态。第一笔承诺交易代表的是通道的初始状态,即双方之间还没有发生交易时的状态。我们把初始状态设为状态0,所以第一笔承诺交易代表的就是状态0,交易序号设为0#,交易编号就是CT00,两个版本分别为CT00a和CT00b,小艾手中持有的是CT00a,小笨手中的是CT00b。 在这样的原则之下,我们来构建第一笔承诺交易,也就是退款交易。 (3)0#承诺交易的两个版本 小艾和小笨需要各自构建一个版本,签名之后发给对方持有。 小笨构建A版CT交易CT00a,签名之后发给小艾,由小艾持有 A版(CT00a) 交易输入(Input) 所引用的交易及UTXO:FT交易(ID),0#输出 金额:10BTC 解锁脚本:B的FT交易私钥KBFT 签名 交易输出(Output) 0# Output:(远程) 金额:5BTC 锁定脚本:B的DT公钥PBDT 1# Output:(本地) 金额:5BTC 花费路径1: 锁定脚本:PA && 1000 区块 花费路径2: 锁定脚本:双方的撤销公钥,即PARSMC0 && PB CT00a 由小艾持有,小艾想要单方面发起结算时只能广播A版的CT交易。 小艾构建B版CT交易CT00b,签名之后发给小笨,由小笨持有 B版(CT00b) 交易输入(Input) 所引用交易及UTXO:FT交易(ID),0#输出 金额:10BTC 解锁脚本:A的FT交易私钥KAFT签名 交易输出(Output) 0# Output:(远程) 金额:5BTC 锁定脚本:A的DT公钥PADT 1# Output:(本地) 金额:5BTC 花费路径1: 锁定脚本:PB && 1000 区块 花费路径2: 锁定脚本:双方的撤销公钥,即PBRSMC0 && PA 小艾构建好CT00b,签名之后发给小笨持有,小笨想要单方面发起结算时只能广播B版CT交易。 (4)0#承诺交易结构的两个部分 承诺交易是完全按照比特币交易的结构进行构建的,只不过在构建完成以后没有广播到比特币链上去,而是保存在链下双方自己的设备中。所以第一笔承诺交易的构建跟注资交易一样,也是通过交易输入和交易输出两个部分进行构建。 第一部分:交易输入 交易输入包括的主要内容是资金来源,金额,和解锁脚本。 资金来源:FT 交易, 0# Output 退款交易要分配的是注资交易(FT)多签Output中的资金,因此它的资金来源只有一个,即只有一个交易输入,就是 FT 交易的 0# Output 也就是2-2多签地址控制的 Output。 金额:10BTC。 解锁脚本: KAFT签名 KBFT 签名 解锁脚本是用来验证资金所有权的一个脚本,因为FT交易创建 2-2 Output 时在锁定脚本中使用了双方的FT交易多签地址进行锁定,所以这里解锁时需要双方各自提供自己专用于FT交易的私钥 KAFT 和 KBFT 签名进行验证。 在示例中两个版本的输入部分都只有一方的签名,是因为都是对方创建的交易发给另一方持有,比如A版交易CT00a是由小笨构建,签名之后发给小艾持有,因此只有小笨的签名,小艾可以随时添加自己的签名构成完整的多签签名去广播;同理B版交易CT00b是由小艾构建,签名之后发给小笨持有,因此只有小艾的签名,小笨也可以随时添加自己的签名去广播。 第二部分:交易输出 理解向双方分配资金的两个Output 承诺交易需要向两方分配资金,所以在表达资金去向的交易输出部分至少要创建两个 Output,用来给两方支付余额。一个叫做本地Output,是分配给持有方的;一个叫做远程Output,是分配给非持有方的。这是针对持有方来讲。 但是CT交易是由非持有方构建好之后发给持有方的,因此对非持有方即构建方来讲,在构建的时候远程Output 是用来分配给自己的,而本地Output是分配给对方的。 我们以小艾持有的A版承诺交易,即 CT00a 为例来看0#CT交易的交易输出。 CT交易中的两个输出,序号按照0开始向后编号。比如可以把远程 Output 设为0#,把本地 Output 设为1#。由于退款交易分配的是双方的初始余额状态,即两方向通道充值的金额比例,所以两个Output中的资金都是5BTC。 0# 远程 Output 远程 Output 的基本内容很简单,就是金额和锁定脚本。CT00a 的远程 Output 金额为5BTC,锁定脚本是小笨的公钥PBDT。 金额:5BTC 锁定脚本:小笨的公钥哈希PBDT 远程Output中的锁定公钥 关于这个公钥需要解释一下,因为它是专用于交付交易即DT中的公钥(小笨的公钥为PBDT),原因如下 闪电通道在承诺交易的设计中,Output 的花费不是在广播CT交易时把资金直接支付到 Output 锁定脚本中的地址,而是需要再发起一笔子交易才能完成对 Output 中资金的转移。 用来转移远程 Output 资金的子交易就叫做交付交易Delivery Transaction,简称为DT。它要完成的是CT交易对非持有方资金的交付。 闪电网络的白皮书中关于交付交易的内容中提到了PAliceD 和 PBobD 这一对公钥 ,就我的理解这个公钥就是专门用来指代交付公钥的,D是指Delivery,所以这两个公钥是指 Alice 和 Bob 在花费远程Output 时,资金交付所使用的公钥。 因此在案例中构建远程Output的时候,锁定脚本里用的是小笨的交付公钥PBDT。但是也看到很多地方的解释中这个锁定脚本里面用的就是通用的密钥,而非专用于交付交易的密钥。我是按照闪电网络白皮书中的内容来进行理解和解释。 1# 本地 Output 本地 Output 基本内容也只有两个部分:金额为5BTC,另一个部分是关于花费条件。 这里的花费条件就是由RSMC合约规定的两个花费路径。 第一个路径是由持有方解锁和花费。 因此本地Output 的锁定脚本就是持有方的公钥,CT00a 的持有人为小艾,因此锁定脚本为小艾的公钥PA。 但是这个路径对本地Output 的解锁有时间限制,因为这个路径是在持有方主动广播了承诺交易时,由持有方发起的子交易,它想要做的是转移持有方在承诺交易中的资金。为了避免主动广播交易的一方进行欺骗,就会限制这一笔交易解锁本地Output的时间。 因此这个路径中需要增加一个时间锁的设定,CT00a的例子中设置了1000个区块的相对时间锁。 所以整理路径1的锁定脚本为:小艾的公钥PA 1000区块 第二个路径是用一笔子交易取代第一个路径,即替代路径。 这个替代路径的子交易就是违约惩罚交易,因为它的作用是取代第一个路径并拿走持有方在通道中的资金,因此只有在持有方广播了过时的承诺交易即进行欺骗时才会被执行。 通过违约惩罚交易花费本地Output需要双方的配合,即要提供双方的签名才能解锁,因此在它对应的锁定脚本中使用的是双方的公钥进行锁定,类似于2-2的多签Output,不过这里用来锁定资金的密钥是一个专用密钥,叫做撤销密钥。每一笔CT交易的本地 Output 在替代路径中使用的撤销密钥都是专用的,不能复用于其他交易。 撤销密钥由双方的密钥合起来构成。 在实际案例中,CT00a 本地 Output 的替代路径中使用的是小艾的RSMC专用密钥和小笨的通用密钥,即PARSMC0 PB,它们一起构成了一个完整的撤销密钥。 这里只有CT交易的持有方用的是专用的撤销密钥,而非持有方用的却是通用密钥。这样设置是为了简化密钥管理,具体逻辑这里就不展开,后面打算再整理一篇闪电通道的整体逻辑,在RSMC 撤销密钥的运行原理那部分再详细解释。 就案例中来说,每个版本CT交易中,持有方的撤销密钥,比如A版的PARSMC0 是由小艾预先创建的撤销密钥,在小笨构建0#承诺交易之前小艾需要把这个撤销密钥的公钥发给小笨,因为A版CT交易是由小笨构建的,而A版的本地Output中在替代路径中使用的是小艾的撤销公钥加上小笨的通用公钥。有了小艾的PARSMC0 加上自己的公钥PB,小笨才能构建出CT00a,签名之后他会把CT00a 发给小艾持有和保管。在后面第二笔CT交易发生后要撤销这一笔承诺交易的状态,也是通过这个撤销密钥来实现的。那里小艾需要把 PARSMC0 的私钥即撤销私钥KARSMC0 发给小笨,由小笨构建违约惩罚交易来实现作废过时CT交易的目的。 同理,小笨也会提前生成自己的撤销密钥,并且把公钥PBRSMC0发给小艾,让小艾构建承诺交易的B版,签名之后发给小笨持有。以后要撤销这一笔承诺交易的时候,小笨也需要把 PBRSMC0 的私钥KBRSMC发给小艾,由小艾构建违约惩罚交易来实现作废过时CT交易的目的。 (5)0#承诺交易的脚本 关于第一笔承诺交易的构建,我从《精通比特币》中找到了交易的脚本,复制如下: Input:2-of-2 funding Output, signed by Bob Output 0 <5 bitcoins>: <Bob's Public Key> CHECKSIG Output 1<5 bitcoins>: IF # Revocation penalty output <Revocation Public Key> ELSE <1000 blocks> CHECKSEQUENCEVERIFY DROP <Alice's Public Key> ENDIF CHECKSIG 这是A版CT交易的脚本,由Alice持有且只有Alice能广播。但是这个版本是由Bob构建,签名之后发给Alice的,因此Input中目前只有Bob一方的签名。 在两个交易输出中, Output 0为远程Output,金额为5BTC,是分配给Bob的,因此由Bob的公钥进行锁定<Bob's Public Key>。如果Alice广播了这笔交易,到时候这个Output需要Bob发起一笔交付交易DT,并用Bob在这个Output中使用的锁定公钥对应的私钥进行签名才能解锁和花费。 Output 1 是本地Ouput,金额也是5BTC,理论上是分配给Alice的,但是RSMC合约为其设置了两个花费路径(IF……ELSE,如果……就,如果不…….就……)。 两个花费路径的顺序说明 需要说明一下,《精通比特币》中这两个路径的设置顺序,跟闪电网络白皮书的作者之一Tadge Dryja在视频中讲解的不一样。视频中讲解的路径1是由持有方单方花费,路径2是由撤销密钥花费。而《精通比特币》这个脚本中刚好相反,路径1是撤销密钥花费,而路径2是持有方单方花费。 因此在《精通比特币》脚本中的交易,路径1是由撤销公钥进行锁定,而撤销公钥就是双方在替代路径中所使用的公钥,需要双方合作即提供双方的对应私钥才能解锁,解锁之后资金会支付到撤销公钥对应的地址;路径2则是由Alice单方的公钥进行锁定,但是脚本中设置了1000个区块的时间锁,需要等CT00a 上链之后经过1000个区块确认之后,路径2的交易才能被打包进入区块,然后执行Alice的签名验证并完成资金所有权转移。 两个花费路径是按照顺序进行执行,如果IF后面的第一个条件成立就会这个条件下的指令进行操作,即把钱支付到撤销公钥对应的地址。如果第一个条件不成立,就按照ELSE后面的指令执行,即在1000个区块确认之后把钱支付到Alice的公钥地址中。这个路径设置所表达的意思是这笔钱虽然理论上是分配给Alice的,但是要真正支付给她是有一定条件的,要在IF后的第一个条件不成立的时候,而且要等1000个区块之后,这两个条件都满足的前提下,Alice才能真正拿到这笔钱。 下面图片中显示的是闪电网络作者Tadge Dryja在视频中提供的脚本,脚本的右半部分是针对CT交易A版的两个Output,上面2个Coins 的是本地Output,下面8个Coins是远程Output。 Tadge Dryja 讲解闪电网络的视频地址如下: youtube.com/watch?v=Hzv9WuqI… 就我理解这个顺序应该没有那么重要,所以我在前面构建0#承诺交易的两个版本那里用了闪电网络视频中的顺序,而这里的脚本还是直接用了《精通比特币》的顺序。 以上是对退款交易即第一笔承诺交易的构建过程和关于交易原则,交易版本,交易结构以及交易脚本的解释。 3)完成充值和通道开启 在双方为对方构建好退款交易并签名之后,他们就都不用担心对方玩消失了,因为即使对方不配合,自己也可以广播退款交易来赎回自己向多签地址充值的资金。 所以这时候双方就可以回去在注资交易上签名,并把FT交易广播出去,双方提供的资金就会被打进链上的多签地址,通道就创建好了。 但是在通道交易正式开始之前,还有两对交易需要构建,就是交付交易和可撤销的交付交易。因为承诺交易的两个Output 在向两方分配余额的时候不会直接把资金支付到Output 脚本中的公钥地址,而是需要双方各发起一笔子交易来转移资金。 在退款交易即 0#CT交易的情况中,如果一方真跑路了,另一方广播了 0#CT交易想要赎回自己的资金,也需要通过广播可撤销交付交易才能把充值的资金拿回来,而且需要等待时间锁到期才拿得到退回来的钱。只不过这两笔交易都不需要对方的签名,用自己的密钥就可以构建,所以在充值之后构建也没有关系,甚至是在它所在的承诺交易被广播,确实需要用到交付交易和可撤销交付交易的时候再构建也不迟。当然在构建好了0#CT交易还没有完成注资交易就构建也没有问题。 接下来我们要来完成构建0#承诺交易的两对子交易。 4)构建交付交易 承诺交易向通道两方分配余额的这两个Output 都不是直接把钱打到Output中的地址,而是分别要通过一笔子交易来把Output 中的资金转移到子交易的Output中。 所以接下来还要针对交易输出中的两个Output 分别构建转移其中资金的子交易。 (1)交付交易 Delivery Transaction(DT) 简单介绍 交付交易DT是用来花费远程 Output 的交易,而远程 Output 是CT交易给非持有方分配资金的交易输出,因此DT交易就是CT交易的非持有方用来花费自己在CT交易中资金(即转移资金)的交易。 交易结构和构建 承诺交易的子交易,结构上也是一笔比特币交易,所以交付交易也是由交易输入和交易输出两部分构建而成。因为承诺交易有两个版本,每一个版本都有一个远程Output,因此交付交易也要构建为两个版本。 还是以A版的DT交易DT00a为例,即CT00a的交付交易。 A版CT交易由小艾持有,因此远程 Output是分配给小笨的。交付交易 DT00a 由小笨发起去解锁远程Output,因此这笔子交易由小笨构建。 第一部分:交易输入 资金来源:来源中引用的交易就是CT00a,0#UTXO(即远程Outout)。 金额:5BTC。 解锁脚本:需要提供小笨的DT交易私钥KBDT进行签名。如果交易被提交,签名验证通过之后,这笔Output中的资金就会转移到交易输出中锁定脚本设置的公钥地址中。 第二部分:交易输出 DT交易只有一个交易输出,因此只需要生成一个0#Output。金额为输入中的那 5个BTC。 锁定脚本就是小笨自己的公钥PB。 这个交易比较简单,A版构建好之后由小笨自己持有就行了。 B版由小艾构建,只需要把签名和锁定公钥换成小艾就可以了,金额不用改变,因为双方都是5BTC。 (2)可撤销交付交易 Revocable Delivery Transaction(RDT) 简单介绍 可撤销交付交易RDT是用来花费另一个Output也就是本地Output的子交易,由持有方发起,对自己在通道中的余额按照承诺交易的分配比例进行花费。 可撤销交付交易也是交付交易的一种,英文是Revocable Delivery Transaction,简写为RDT。被叫做可撤销交付交易是因为它对本地Output的花费能力是有可能被撤销的,被撤销的原因是持有方广播了过时的承诺交易进行结算,就是持有方在结算时企图进行欺骗。因此这笔交易的花费能力或者说是持有方转移自己在通道中的资金的能力被设计为可撤销的机制,是为了阻止持有方在申请结算时广播过时的交易企图进行欺骗。这是避免通道作恶的一个重要环节。 持有方花费能力的撤销机制 撤销RDT交易对本地 Output 的花费能力是通过两个机制的设计来实现的,第一是时间锁,第二是一笔替代交易。 替代交易就是上面提到的违约惩罚交易BRT,可撤销交付交易RDT和违约惩罚交易BRT就是本地 Output的两个花费路径,它们花费的是同一个本地 Output,即同一笔资金,因此只能有一个路径能够花费成功。其中可撤销交付交易RDT由持有方单方进行解锁和花费,但是解锁的时间有限制。而违约惩罚交易BRT解锁时间没有限制,但是需要双方合作才能花费成功,并且由能够提供双方撤销私钥的一方进行花费。 交易的结构和构建 RDT交易同样也是通过交易输入和交易输出两个部分进行构建。我们还是以CT00a的可撤销交付交易RDT00a为例进行说明。 A版承诺交易CT00a由小艾持有,因此本地 Output是分配给小艾自己的。可撤销交付交易 RDT00a 是由持有方即小艾发起去解锁本地Output,因此这笔子交易由小艾构建。 第一部分:交易输入 RDT交易的交易输入,内容有这样几个部分: 资金来源:CT00a,1#UTXO。 来源中引用的交易也是CT00a,不过UTXO序号是1#,即本地 Outout,因为这笔交易要花费的是本地Output。 金额:5BTC。 解锁脚本:A的私钥KA签名 RDT交易是由持有方对本地Output 发起的花费交易,因此需要提供小艾的私钥KA进行签名。 时间锁:1000区块 这笔交易被广播和执行的条件是,第一小艾主动广播了承诺交易CT00a,第二CT00a是通道中最新的承诺交易,即CT00a的状态没有过时。在这种情况下,RDT00a 被提交,等待时间锁到期之后,如果签名验证通过,Output中的资金就会转移到交易输出中锁定脚本设置的公钥地址即小艾的地址中。 第二部分:交易输出 RDT交易也只有一个交易输出,因此只需要生成一个0#Output。金额为交易输入中的5个BTC。 锁定脚本就是小艾自己的公钥PA。 RDT交易A版就构建好了,由小艾自己持有。 B版可撤销交付交易RDT00b 由小笨构建,金额也不用改变,只需要把签名和锁定公钥换成小笨就可以了。 到这里前面的准备工作就完成了,双方可以在没有任何后顾之忧的情况下开始通道交易。 所以下一篇文章的内容就是闪电通道交易的过程。 相关阅读 Nervos Fiber Network 轻皮书学习(1):闪电网络介绍 x.com/xueblock/status/182838…… Nervos 闪电网络轻皮书学习(2):单向支付通道 x.com/xueblock/status/183206…… 闪电网络学习3:支付通道的演化 x.com/xueblock/status/183593…… Nervos 闪电网络学习4:双向支付通道 x.com/xueblock/status/183855… 参考资料 闪电网络白皮书: lightning.network/lightning-…… Tadge Dryja的视频《Payment Channels and Lightning Network》: youtube.com/watch?v=Hzv9WuqI… 精通比特币: github.com/bitcoinbook/bitco…… 播客《Lightning Network 技术演化史》: xiaoyuzhoufm.com/episode/5e2…… Jan 带你细数八种支付通道方案: mp.weixin.qq.com/s/v6NR68fDw…
24 Sep 2024
Nervos 闪电网络学习4:双向支付通道 今天正式开始闪电网络支付通道的学习,这篇文章主要内容包括: 1. 支付通道问题的总结 2. 闪电通道解决问题的思路 3. 闪电通道解决免信任问题的方案原理 (1)如何保证过时交易被广播上链但不能花费? (2)作恶行为如何受到惩罚 (3)如何防止注资交易2-2多签账号中的资金被锁? 一、支付通道问题的总结 前面讲了4种单向支付通道和3种双向支付通道的设计思路和一些实践,我们可以总结出它们想要解决的共性问题。 包括 1)充值到链上的公共账户之后,万一有一方私钥丢失或者干脆不配合,如何保证资金一定能退回给充值者; 2)通道中的交易发生在链下,没有通过区块链的共识机制验证,如何确保交易的安全和可信; 这两个是关于支付通道资金安全和交易有效性的问题,直白一些说就是通道能够在不需要信任他人的情况下,就在交易双方之间实现交易的有效性和资金安全性,即所谓的免信任问题。 另外还有几个需要解决的问题包括 3)要保证在一个通道中两方都可以进行支付和申请结算,即双向通道的设计问题; 4)通道的存续时间最好保证能够永远存在,只在参与方想要关闭时才关闭,而不是设定一个时间,时间一到就强制关闭; 5)通道中双方能够发生的交易次数最好不要有限制,只要参与方有需求,交易多少次都是可以的; 6)通道中的资金利用率要高,既要减少资金抵押,又想要实现更大的支付能力,即能够利用最少的资金,进行最大额度的交易。 7)如果能够在保证以上要求的基础上,还能把通道设计得简洁易操作,减少参与者的操作和管理成本就更好了。 后面这几个需求可以理解为通道的性能和效率问题。 在以前的方案中,每个方案都解决了其中的一个或者几个问题,但也有一些问题未能解决,有些可能解决了部分问题,又产生了新的问题。 从今天开始,我们来了解闪电网络的支付通道方案,看它是怎么解决这些问题,解决了哪些问题,还有哪些问题没能解决。 二、解决问题的全新思维框架 首先闪电网络的支付通道是双向通道,而且是在同一个通道中实现双向操作的通道。 另外它在解决支付通道问题时跳出了前面那7种方案的解决思路和框架,没有在中本聪, Spillman 通道,Timelock ,Duplex 和 DMC 等通道的思维框架里面进行设计,而是另起炉灶,走了一条完全不同的路。 我们重点来看闪电网络对支付通道系统的免信任,即资金安全和交易有效性问题的解决思路。 定位核心问题 闪电通道的免信任问题又可以分为两个部分来解决,一是需要确保存入链上2-2公共账户用来开启通道的资金不会被永久锁住拿不出来,二是通道中即在链下发生的众多交易,花费的都是公共账户中同一个UTXO的资产,如何解决用过时交易的欺骗手段进行恶意花费的问题。 闪电网络实际上采用了一套包括多个交易和合约的设计同时解决了这两个问题,但是第一个问题是在解决第二个问题的方案中完成的,即闪电通道的思考重点是如何杜绝利用链下通道中的过时交易实现对链上资金的恶意花费,在解决这个问题时,同时也解决了公共账号的资金被锁问题。 在这个思维框架中,恶意花费是影响通道交易安全和系统可信度的最大问题,也是核心问题,因为交易双方都用动机把链下发生过但是状态(即双方的余额数量或者金额)已经过时的交易广播出去,企图以过时的状态进行结算并关闭通道,目的当然是为自己谋取非法的收益。 这个问题能够发生是因为比特币区块链只能验证交易提供的签名是否符合解锁要求,而通道记录的交易代表的是链下状态的变化和更新,至于其中哪一笔才能代表链下最新或者有效的状态,这不在区块链的验证机制内,在链上是区分不出来的。就区块链能验证的部分来说,通道中的每一笔承诺交易都符合解锁UTXO的条件,因为闪电通道是双向通道,双方都需要在每一笔承诺交易中交换签名才能生效,因此每一笔生效之后的承诺交易都符合公共账户中 2-2 UTXO的解锁条件,对区块链来说它们都是合法的。 所以作恶者有动力在众多的链下交易中选择一笔对自己最有利的,比如分给自己余额最多的一笔交易,提交出去进行广播和结算,从而让自己能够从公共账户中多分配一些资金(比实际应得的多一些),相应地自然就会减少对方的分配(比实际应得的少一些),这样作恶方的恶意花费就会让对方受到资金损失。 这种情况通常发生在作恶方向对方支付了一笔或者几笔资金之后,单方面申请结算并关闭通道,在申请结算时会选择他向对方付款之前的交易去进行广播。相当于买方购物时在付款拿到了对方的商品或服务之后,却想撤回付款,企图让对方的商品给出去了却拿不到钱,实质就是恶意花费。 确定核心目标 我们把这个问题梳理一下:通道中可能会发生很多笔承诺交易,在发生的当时它们都是有效的,但是每一次新交易发生就会把上一笔交易的状态覆盖了,变成了新的状态,于是之前的状态就都无效了。根据这个逻辑整个通道中只有最后发生的一笔交易能够代表通道中的实际状态或者最终状态,其它交易代表的都是过去的状态。所以最后结算的时候,链上公共账户中的资金只应该按照最后一笔交易记录的余额给双方转账,其他任何一笔承诺交易都不能够再花费链上这笔资金。这就是比特币交易中通常所说的一个UTXO不能被花费两次。 这样一来通道的核心目标就可以定位为必须保证通道中只能有一笔且必须是最后一笔交易能够成功花费链上2-2公共账户的资金。 通道中那么多交易,如何才能保证只有最后一笔能够成功花费链上多签账户中的UTXO呢? 我们再拆分一下 要实现这个目标,首先要确保通道中只能有一笔承诺交易的状态是有效的,其次所有其他交易所代表的状态都必须要被作废变成无效状态。也就是每发生一笔新的交易产生一个新的状态时,不仅仅是要创建一笔新的承诺交易来代表新的状态,同时还要作废之前那一笔交易,让旧交易的状态变得无效。 确定解决思路 作废过时交易,让所有过时状态变得无效,通常的思路有两种,一是删除掉代表过时状态的交易,二是用一些办法阻止过时的交易被提交去广播,让它上不了链; 第一种思路即删除已经过时的交易首先可以排除。因为在UTXO模型中,如果一笔签署过的交易已经发给对方生效了,要想撤销或者删除它几乎是不可能的。因为区块链的确认原则是只要交易内容没有问题,又有符合条件的签名,交易就是合法的,对方就能随时广播到区块链上去被执行。因此通过删除或者撤销交易本身实现对过时状态的作废是不可行的。 所以在之前的通道方案中基本上都是采用后一种思路,阻止广播过时的交易,比如中本聪是用序列号的高低决定能广播的交易,只有序号最高的一笔交易能够被广播,如果这笔被广播了其他就都不能被广播了,因为它们花费的是同一个UTXO。Spilman 是单向通道,只允许一方广播交易进行结算,而这一方又没有动力广播过时的交易,因此不存在这个问题。后面几种通道用到了时间锁的方案,都是用锁定时间多少来决定哪一笔交易能最先被广播,只有锁定时间为0的交易才能被广播,而时间锁递减原则保证在同一时间只有一笔交易时间锁能到期,所以只有这一笔交易能够被广播。 时间锁确实解决了过时交易被广播的做恶问题,但是因为这个时间的规定又产生了很多限制,比如通道生存时间的限制,通道内能够容纳交易数量的限制。而且如果两笔交易之间的时间间隔设计不合理,也有可能让过时交易被成功上链而有效交易却广播失败,从而导致一方用户的资金损失。 所以时间锁也不是最好的思路。 闪电网络的支付通道没有采用上面两种思路,甚至都没有采用阻止过时交易被广播和上链的思路。 闪电通道允许过时的承诺交易被广播 它采用了另一个方向,允许作恶方把过时的交易广播出去,但是用一系列机制保证区块链只接受最后一笔承诺交易。 通道中所有过时的交易虽然在区块链的眼里都是合法的,但是通道设计了一套机制让区块链不会采用它们的记录作为结算依据,更不会执行对应的资金分配。所以过时的交易虽然可以被广播,但是即使广播出去了,上链了,它的状态也不会被区块链所接受,只有最后一笔承诺交易被广播才能最终成功得到链上结算,这样就变相地实现了链下交易只能有一笔是有效状态的目标。 作废状态的手段:惩罚 做恶交易不被区块链接受只是第一步,要让过时交易的状态失效,还需要更进一步的措施: 通过保障广播过时交易的恶意行为一定会受到惩罚,让交易者主动放弃广播这些交易的念头,即彻底消除作恶者广播过时交易的动机。 能够让作恶者打消做恶动机的是进一步的措施:严厉的惩罚。 闪电通道设计的机制,一方面对主动进行恶意花费的一方进行严厉惩罚,并保证区块链能够强制执行;另一方面,没有做恶的一方却会得到极大的奖励。 以作恶方在通道中全部资金的经济损失为代价让交易者不愿意或者不敢广播过时交易,主动选择广播代表当前真实状态的交易。同时将作恶者的所有经济损失转化为对未作恶者的奖励,来鼓励交易者保持诚实交易的动力。这是闪电通道实现免信任的思路。 可见,它的思路是从消除作恶者动机这个角度入手,重点在保障广播过时交易的恶意行为一定会受到惩罚。 既防患于未然,又除患于已然。只要交易者都能按照承诺诚实交易,不尝试恶意花费进行欺骗,那么最终区块链会按照两方的实际状态进行结算并给双方分配应得的余额。但是只要有一方尝试恶意花费并被确认,那么一定有办法让作恶者受到惩罚,同时还能让另一方得到奖励。 这是跟其他方案都不同的思路,不阻止你作恶,但是保证作恶必定不成功,而且一定会受到惩罚;同时在作恶发生时,不作恶的一方必定会得到奖励。这是更符合人性的一种思路,因为人都有怕自己的既得利益被剥夺的心理。 三、免信任问题如何解决? 根据以上的思维框架,我们能够梳理出闪电网络建立免信任通道需要解决的两个问题: 问题1:如何保证过时交易被广播上链却不能花费? 问题2:广播过时交易的作恶行为如何受惩罚? 下面我们就来看闪电网络的解决方案。 (一)如何保证过时交易被广播上链但不能花费? 1. 如何理解交易被广播了却不能花费这个说法? 第一承诺交易记录的是双方在通道中的余额分配情况,专业一点叫通道状态,每笔交易会用两个 Output 分别向两方分配余额,也就是一个承诺交易中至少要有两个Output,一个分配给自己,记录的是自己的余额状态,另一个分配给对方,记录的是对方的余额状态。 第二每方都要持有一份承诺交易,在每一方持有的交易中,分配给自己的 Output 叫做本地 Output,分配对对方的叫做远程 Output。 第三是每一方申请结算时的操作,申请结算就意味着通道关闭,并把链上公共账号中的资金给两方分了。反之如果没有发起申请结算的交易,承诺交易就只是双方之间在链下记录的账目。 闪电通道申请结算有两种操作,一种是以双方合作的方式进行结算,经过协商之后双方用最新的承诺交易状态创建一笔行权结算交易,根据承诺交易的两个Output 在行权结算交易中创建两个新的 Output,新建的 Output 不带任何限制条件;然后双方在行权结算交易上交换签名,之后任何一方都可以把行权结算交易广播到链上去结算。通过这种方法关闭通道双方都不用等待,交易被确认就都能拿到自己的资金。 另一种方法是由某一方单方发起结算,这种方法是直接使用承诺交易去广播,以承诺交易本身的两个Output 状态作为结算的依据。 两种方法的不同是行权结算交易需要创建新的交易和Output, 取消了承诺交易中 Output 的限制条件,但是需要双方在新交易上交换签名。而承诺交易是现成的,在每次发生交易时就创建好了并且生效了,所以结算时不需要新建交易和新的Output。 用承诺交易去进行结算,好处是不需要跟对方协商,不需要重新创建交易,创建新的结算Output,也不需要重新交换签名。因为每一笔承诺交易在生效的时候对方都交换过签名,而且每一方手里都持有一份,所以任何一方随时都可以拿出一笔承诺交易去进行广播申请结算。但是承诺交易的两个Output 中有一个是带条件的,对主动发起结算的一方做了付款期限的限制。所以用这种方法去结算,主动发起结算的一方需要等待,限制期限满了才能拿到资金,但是被动方不需要等待,交易广播了就能拿到资金。 第四在闪电通道中,我们说的作恶方指的是主动发起结算的一方,只有主动方才能够进行作恶的操作,因为广播哪一笔交易是由主动方选择的,他不可能选择一笔对对方更有利的交易去广播。因此作恶方一定是主动广播交易的那一方。 最后就是“不能花费”到底指什么,它针对的是被广播的承诺交易向作恶者分配余额的那个 Output,也就是上面讲的向持有者(也是主动广播者)分配余额的本地 Output。这个说法不针对给另一方分配余额的Output,因为在一方主动广播承诺交易的操作中,另一方没有作恶的可能性。 “不能花费”的意思就是在过时交易被广播出去之后,其中的本地 Output 会失去给作恶者分配余额的能力,就是承诺交易中本地 Output 的交付能力被限制了。但是给未作恶者分配余额的 Output 仍然不受影响,会在承诺交易被广播时立即支付给对方。 2. 如何让 Output 不能花费? 这里涉及两个问题,一是承诺交易中的 本地 Output,如何保证它在交易被广播的时候不会像远程 Output那样立即就把余额给付出去。第二是如何让本地Output不能向作恶者分配余额。 第一个问题:如何让本地 Output不能像远程 Output 那样在承诺交易被广播时立即就支付 RSMC 合约 闪电通道承诺交易的两个Output 中,有一个是带条件的,带条件的就是本地 Output。 条件是由一个叫做 RSMC 的合约来设定,RSMC 的全称是 Revocable Sequence Maturity Contract,翻译为可撤销的按序(指序列号)到期合约。要解释这个名称比较复杂,我们现在只需要知道它是通过一系列有依赖关系的交易组合起来实现一个合约的功能就行了。 RSMC 对 本地 Output 的限制 这个合约的第一个功能是限制了本地 Output 的花费条件,可以理解成本地 Output 就是一个由 RSMC 地址控制的交易输出,所以要花费本地 Output 中的资金其实就是要解锁 RSMC 的 Output。 为什么要限制本地 Output 立即支付的能力,是因为这个 Output 是向主动申请结算的一方支付余额的交易输出,而主动方在广播交易进行结算时,可以选择性地提交对自己最有利的承诺交易,因为区块链没有区分链下交易有效性的能力,因此主动方既有作恶的动机,也有作恶的能力。最终结算能不能按照主动方提交的方案进行分配还需要进一步验证。限制这个交易输出的支付时间,就是为了让后面的操作有足够的时间。 RSMC Output 的解锁路径 RSMC合约规定 RSMC Output 解锁的路径有两个,一个是由主动发起广播的一方自己花费,另一个是由对方即没有发起广播的一方花费。 交付交易 Delivery Transaction 在闪电通道中,承诺交易中向两方分配余额的两个 Output,都不是直接打款到两方地址,而是需要针对本地 Output 和远程 Output 分别发起各自的花费交易,闪电通道中叫做交付交易 Delivery Transaction,它的意思我理解是把承诺交易 Output 中的资金,交付(就是按照约定进行转账)给 Delivery Transaction 的 Output。 可撤销交付交易 Revocable Delivery Transaction 本地 Output 按照正常的约定是应该分配给主动方的,因此主动方对这个 Output 发起的花费交易,就是一笔交付交易。 如果是由主动方发起的花费 ,他创建的交付交易必须带有时间限制,需要等到限制时间到期之后才能广播。这个路径能够花费成功的前提是主动方没有作恶,即广播的的确是最新的承诺交易,那么本地 Output 的资金就会交付给主动方发起的交付交易。但是如果广播的不是最新的承诺交易,就意味着主动方作恶了,因此这笔交易肯定就不会成功得到交付,而且作恶方还会受到惩罚。这也是这笔交易需要设置时间限制的原因,需要给判断作恶与否以及执行惩罚提供时间。 主动方这笔交易的交付申请其实是在可与不可之间,不可时就会被撤销,所以这笔交易被叫做可撤销交付交易 Revocable Delivery Transaction。 违约惩罚交易 Breach Remedy Transaction 根据RSMC约定,本地 Output 的另一个花费路径就是由被动方,即没有发起广播的一方来花费。被动方也需要广播一个交易,它不带时间限制,不过我理解这笔交易不属于交付交易的范畴,因为本地 Output 按照正常约定不是分配给这一方,RSMC在花费条件中规定这一个路径是为了惩罚违约行为,所以这个交易叫做违约惩罚交易(Breach Remedy Transaction),或者违约补偿交易。这个路径能够花费成功的前提是主动方确实作恶了。 不管那一个路径能够花费成功,反正目前需要实现的效果就是本地 Output 被拖住不能立即支付,要为后面的验证和操作腾出时间。 第二个问题:如果确实是作恶了,那么怎么保证本地 Output 不会把余额支付给作恶方? 思路 这个问题还是要利用 UTXO 的能力和特性,即UTXO不能被双花。一个UTXO只能被一笔交易所花费,这是区块链在验证一笔交易时就会验证的内容,它会根据一笔交易输入中引用的交易和UTXO序号进行查询,只有没有被花费过的UTXO才能进入下一步金额和签名的验证,这是区块链本身保证的特性。 根据这个特性,如果有多笔交易的资金来源都是同一个UTXO,那么只有最先被广播并成功上链的一笔能够花费这个UTXO。而那些没有广播的交易,都会失效,因为它们要花费的同一笔资金已被转到广播成功那笔交易的UTXO里面。 方法 既然一个UTXO不能花费两次,那就可以创建一笔竞争交易,花费同一个UTXO,跟作恶者的交易进行竞争,看谁的交易能够先被广播。 闪电通道中创建的竞争交易就是违约惩罚交易(Breach Remedy Transction),是由被动方去广播,它要实现的就是取代主动方的可撤销交付交易,换成由被动方花费本地 Output ,即RSMC中规定的第二个路径。 如果违约惩罚交易成功取代了可撤销交付交易,那么本地 Output 中的余额就会付到被动方的地址中,作恶方便没有可能再得到这笔资金。 这样就实现了让承诺交易的本地 Output 失去向作恶者支付余额的能力,同时它还实现了把本地 Output的余额支付给未作恶方的目的,以作恶者失去所有资金的代价实现了对作恶者的惩罚,也以另一方获得所有资金的奖励实现了对未作恶方的褒奖。 那么如何能够让违约惩罚交易取代作恶者的可撤销付款交易呢? 还是要在交易广播的时间上想办法,通过设计让违约惩罚交易能比可撤销付款交易更早广播就能抢先花费本地 Output,从而作恶者的交易就被取代而失效。 3. 违约惩罚交易如何能抢先广播 也是时间锁的思路,通过合约的设计让作恶者的交易广播时间被限制在一定范围以后,而让违约惩罚交易能够更早被广播,只要符合解锁条件就可以立即支付,所以只要违约惩罚交易能在作恶者交易被限制的时间内完成上链,就能抢在作恶者的交易之前完成对本地 Output的花费。 这样违约惩罚交易就花费了分配给作恶者的余额,作恶者的交易就失效了,因为资金已经被转走了。而违约惩罚交易的UTXO 接收人是未作恶方,于是作恶者自己的余额就转给了未作恶方。 4. 作恶者的交易如何被限制 1)在交易中增加能限制交易被广播时间的时间锁 两种时间锁 限制交易广播时间的功能一般都是采用时间锁的思路,但在闪电通道中使用的不是常用的绝对时间锁,而是相对时间锁。 绝对时间锁用nLocktime 来表示,是用来限制一笔交易进入区块的时间。 相对时间锁用nSequence来表示,它限制的是一笔交易中某一个UTXO 能够解锁的时间。 因为RSMC合约要限制的其实是已上链的承诺交易中本地 Output 的解锁时间,而不是承诺交易进入区块的时间,所以要用nSequence。 设置在哪里? 一笔交易可能会有几个资金来源,比如闪电通道开启通道时的注资交易就有两个资金来源,每个资金来源都会成为这笔交易的一个交易输入,把这笔交易和它的资金来源之间连接起来的就是交易输入中的引用,所谓引用就是在交易输入中注明资金来源的UTXO序号,以及所在的交易编号。这样就能根据交易编号和UTXO序号定位到资金来源。 nSequence 就设置在一笔交易中的交易输入中,因为交易输入必须要引用某个交易以及一个UTXO作为资金来源,nSequence 要限制的就是引用的这个UTXO的解锁时间。 在闪电通道中,nSequence 要限制的是在主动方用可撤销交付交易对承诺交易中 RSMC Output 进行花费时的解锁时间,所以 nSequence 就设置在可撤销交付交易里引用承诺交易 RSMC Output 的那个交易输入中。 2)相对时间锁 nSequence 实现了对作恶者交易的限制 nSequence 是一个整数值,它表达的是一笔交易所在的区块经过了多少个区块的确认。这里的 nSequence 表达的就是可撤销交付交易所引用的 RSMC Output 所在的承诺交易进入区块之后,这个交易所经过的区块确认数。 nSequence 的这种设置要实现的功能是把可撤销交付交易创建好就放在那里,等它的输入所引用的UTXO所在的交易进入区块之后,看这个区块后面跟随了多少个区块,也就是交易经过了多少个区块确认。要等交易的确认数达到 nSequence 设定的值之后,可撤销交付交易才能被打包,然后广播进区块链。 由此可见,nSequence 是实现通过一笔交易在区块链上存在的时间来计算另一笔交易的广播时间。具体来说是用承诺交易被广播上链之后获得区块确认的数量这个时间来计算可撤销交付交易的广播时间。对可撤销交付交易来,承诺交易被确认的数量是一个相对时间,而不是一个绝对时间,如多少天,多是个区块高度这样。 举例来说,如果 nSequence 设为1000,那么承诺交易被广播之后要获得1000个区块的确认,可撤销交付交易才能被广播,RSMC Output 才能被解锁,资金才会交付给可撤销交付交易; 所以通过 nSequence,主动方想要花费 RSMC Output 的交易会被锁住,必须等 nSequence 设定的时间到期才能被广播并进行解锁操作。 到这里,实现闪电网络免信任的第一个问题《如何保证过时交易被广播上链却不能花费?》就解决了。接下来是第二个问题 (二)作恶行为如何受到惩罚 广播过时交易的行为会受到惩罚,这个问题又可以继续拆分 第一,确定交易双方到底有没有作恶? 第二,如果有人作恶如何保证做恶行为一定能被惩罚? 要解决第二个问题又需要回答下面的两个问题 一 是要弄清楚做恶的是哪一方?就是谁把过时的交易广播出去的? 二 是如何惩罚作恶者,即如何支付罚金? 我们逐个来看 第一,如何确定交易双方到底有没有作恶? 作恶具体是指什么行为? 支付通道做恶是有特殊针对性的,它指的是把链下的承诺交易广播到链上去申请结算和关闭通道这个操作,所以是不是有做恶要确定的是结算交易提交的承诺交易是不是最后一笔。 闪电通道判断是否作恶的方法 我们知道区块链其实是不能判断哪一笔链下交易代表的是通道最后的状态,因此闪电通道的方法不是让区块链去做这个判断,而是提供一个挑战期,让对方提交证据发起挑战。如果发起结算的一方确实做恶了,那么受损失的会是另一方,因此另一方一定会提出挑战。 挑战的证据就是上面讲过的违约惩罚交易,那为什么违约惩罚交易能够确定结算的交易是不是恶意交易? 违约惩罚交易为什么能判断是否作恶? 因为违约惩罚交易只是为已经过时的承诺交易而构建的,不是为最新一笔承诺交易而建。 这句话的意思是说,只有过时的承诺交易才会有对应的违约惩罚交易,而刚创建的最新承诺交易是没有违约惩罚交易的,需要等待下一笔交易发生时,在创建承诺交易的时候才会为这一笔承诺交易创建对应的违约惩罚交易。 违约惩罚交易的生效机制 每一笔新的承诺交易发生时,双方各自需要创建一笔承诺交易来让通道从上一个状态更新到下一个余额状态,但是在对承诺交易进行签名之前,双方需要各自为上一笔承诺交易构建一笔违约惩罚交易,等双方都在违约惩罚交易上签了名,并交换了签名之后,他们才会返回去签署新的承诺交易,然后交换签名。 这就意味着,新的承诺交易生效的同时,上一笔交易的违约惩罚交易就生效了,双方随时都可以广播出去。 违约惩罚交易的作用就是用来取代上一笔交易中主动方花费RSMC Output 的可撤销交付交易。 由于违约惩罚交易中没有限制条件,而可撤销交付交易却有nSequence的时间限制,如果发起结算的一方确实作恶了, 违约惩罚交易能够比可撤销交付交易更早完成对 RSMC Output 的解锁,结果就是上一笔交易的可撤销交付交易被撤销了,而且主动发起作恶交易的一方所有资金还会被罚没,全部转给没有作恶的一方,这就意味着交易的两方都不敢广播上一笔承诺交易,当然更早的也不敢广播,那么所有的过时交易在新承诺交易生效时实际上都已经作废了。所以每一笔违约惩罚交易的最终目的是作废上一笔承诺交易,保证通道中始终只有最新的一笔承诺交易是有效的。 根据违约惩罚交易的构建和作用机制,如果被动方确实广播了一笔违约惩罚交易,并且还通过了链上的挑战验证,就说明这笔结算交易确实做恶了,因为如果广播的承诺交易是最新的,那么被动方手里就不会有一笔对应的违约惩罚交易,更不会通过验证。 反过来说,如果在挑战期(挑战期就是可撤销交付交易中 nSequence 规定的时间),被动方没有广播违约惩罚交易,也就是没有提供挑战的证据,那就说明广播的是最新承诺交易,没有人做恶。那么挑战期结束,主动方就可以广播可撤销交付交易去解他自己那部分资金,到此结算就全部完成了。 第二,确定谁是作恶方? 区块链不能分辨哪一方在做恶是因为链下发生的承诺交易,双方手中持有的都是一样的版本,都有双方的签名,而且双方都可以提交同一笔交易到链上去结算。 因此闪电通道的方案中,对承诺交易的版本进行了区分。 同一笔承诺交易,设计了两个版本,双方各持有一个不同的版本,而且都只能广播自己手中这个版本,相当于通过承诺交易的不同版本为通道两方进行了标识,区块链通过广播到链上的结算交易就能判断提交的是哪一方的承诺交易,进而就能判断是哪一方在发起结算请求。 承诺交易的两个版本相同的地方是 实现的都是同一个结果,都是按照最后一笔承诺交易的状态为两方分配余额; 都包含两个 Output,本地 Output 用来给主动发起广播和结算的一方分配余额,远程 Output 用来给被动方或未发起广播的一方分配余额; 本地 Output 的转账行为都受 RSMC 合约限制,远程 Output 则不受限制,都在承诺交易被广播时立即支付。 不同的地方是 两个版本限制的对象不一样,比如 A 版的本地 Output 中 RSMC 限制的是 A 方,B方却不受限制;B 版则相反,限制的是B,A却不受限制 每方只能持有和广播自己的版本,比如 A 方只能持有A版,B方只能持有B版;A 方只能广播 A 版,B 只能广播B版。 承诺交易被这样设计,如果广播到链上去的是A,那么区块链就能判断发起广播的是A方,这样就能实现确定广播者,以及作恶方是谁的目的。 第三,作恶方如何支付罚金? 其实就是 RSMC 合约以及它所规定的两个花费路径。 (1)通过广播的交易版本确认了主动发起结算的是哪一方; (2)通过RSMC合约限制了本地 Output 对主动发起承诺的一方分配余额的时间; (3)可撤销交付交易用nSequence 限制了主动方花费 RSMC Output的资金; (4)被动方广播违约惩罚交易经区块链验证; (5)验证通过证实对方的作恶行为; (6)因为违约惩罚交易没有时间限制,可以立即解锁 RSMC Output,完成对承诺交易本地 Output的花费; (7)作恶方的可撤销交付交易被撤销,失去了他在通道中的所有资金; (8)而没有作恶的一方,在承诺交易被广播的时候就拿到了远程 Output 分给资金的那部分资金,后面又通过违约惩罚交易拿到了对方的资金,所以他拿到了通道中所有的资金。 这样保证通道不能做恶的三个问题都被解决了,这个设计中包含了两个版本的承诺交易,还有两个版本的可撤销交付交易,两个版本的违约惩罚交易,其实还有两个版本的交付交易,总共8个交易。 前面我们没有怎么涉及的是被动方用来花费远程 Output 的交付交易,因为闪电网络白皮书中没有细讲,我也没有弄明白是怎么创建的,应该是在闪电通道中的重要性相对来说比较低吧,我的理解其实不要这个交易,远程 Output 应该也能实现立即付款的功能。 这些交易中的可撤销交付交易和违约惩罚交易都是RSMC合约中的设计,可见通过这一系列交易的设计,完成了RSMC合约惩罚通道的作恶行为和奖励未作恶一行为的规定。 以上是闪电通道免信任其中的一个核心问题,即如何解决用过时交易的欺骗手段进行恶意花费。 还有一个核心问题是如何确保存入链上2-2公共账户用来开启通道的资金不会被永久锁住拿不出来。 如何防止注资交易2-2多签账号中的资金被锁? 对闪电通道来说其实这个问题比较简单,而且通过解决上面的其他问题,这个问题已经已经被解决了。 解决方案就在承诺交易 闪电通道的承诺交易都是双方各持有一份,而且都交换过签名的。所以只要把第一笔承诺交易的分配方案设计成匹配注资交易中双方的充值金额就行了,承诺交易的其他设计都不用变化。 比如开启通道时如果双方都充值了0.5 BTC,那么第一笔承诺交易的两个 Output 金额也都是 0.5 BTC,远程和本地的金额都一样。 只是这一笔承诺交易不是在通道中发生的交易,它代表的是双方的初始余额状态,即第一笔链上交易的状态。我们可以把它设为0#承诺交易,作用相当于其他通道中的退款交易。 0#承诺交易的作用原理 0#承诺交易还是需要用 RSMC 来约束本地 Output。限制它向主动发起结算一方支付余额的时间。 如果通道中还没有发生交易,一方就跑路了,那么另一方可以主动广播自己手中的0#承诺交易,因为还没有发生过链下的通道交易,那么对方手中就不会持有0#承诺交易的违约惩罚交易,因为双方还没有创建过通道交易。这种情况,发起结算的一方只需要等待时间锁到期就可以拿回自己的资金。 当然,如果通道中已经发生过交易了,那么双方就一定创建过0#承诺交易的违约惩罚交易并交换了签名,此时再广播0#承诺交易就是作恶了,对方就能通过广播违约惩罚交易对作恶方执行惩罚,这是0#承诺交易中仍然需要RSMC合约的原因。 其实0#承诺交易跟其他的链下承诺交易作用原理都是一样的,只是它只能用在通道中还没有发生过交易的情况,目的是用来结算双方的初始余额。 以上就是闪电通道免信任的整体思路和方案原理。 至于通道具体是怎样设计的,比如通道的流程,每一笔交易如何构造,合约怎样设计,后面有时间再写。 学习闪电网络才让我明白什么叫烧脑,感觉我的大脑已经崩盘无数次了。然而这才开始呢,后面还有好长的路,哈哈。 相关阅读 Nervos Fiber Network 轻皮书学习(1):闪电网络介绍 x.com/xueblock/status/182838… Nervos 闪电网络轻皮书学习(2):单向支付通道 x.com/xueblock/status/183206… 闪电网络学习3:支付通道的演化 x.com/xueblock/status/183593… 参考资料 闪电网络白皮书: lightning.network/lightning-… 精通比特币: github.com/bitcoinbook/bitco… 播客《Lightning Network 技术演化史》: xiaoyuzhoufm.com/episode/5e2… Jan 带你细数八种支付通道方案: mp.weixin.qq.com/s/v6NR68fDw…
1
9
11
3,050
雪解 retweeted
9 Nov 2024
闪电网络学习5:闪电通道运行流程(下) 上一篇文章《闪电网络学习5:闪电通道运行流程(上)》整理了闪电通道开始交易之前的准备工作,这一篇正式进入通道交易的过程。 x.com/xueblock/status/185514… 2. 通道交易 从通道中发生的第一笔交易开始,双方的余额就会从5 : 5 这一初始状态开始进行变化和更新,每发生一笔交易,都需要创建一笔新的承诺交易在双方之间确认新的余额状态,同时也需要对上一笔交易的状态进行作废的操作。 在通道开始交易之前,我们先来了解一下通道交易的流程。 通道交易的流程 第一、构建1#承诺交易的两个版本 第1、准备撤销密钥 第2、收款方向付款方发送付款发票和撤销密钥 第3、付款方构建1#承诺交易的B版并签名 第4、付款方向收款方发送1#承诺交易B版和撤销密钥 第5、收款方构建1#承诺交易的A版并签名 第6、收款方向付款方发送1#承诺交易A版 第二、构建1#交付交易的两个版本 第1、付款方构建交付交易的B版 第2、收款方构建交付交易的A版 第三、构建1#可撤销交付交易的两个版本 第1、付款方构建交付交易的A版 第2、收款方构建交付交易的B版 第四、交换0#承诺交易的撤销私钥 第五、构建1#违约惩罚交易的两个版本 第1、付款方构建违约惩罚交易的B版 第2、收款方构建违约惩罚交易的A版 下面正文开始 通道交易的构建 第一、构建 1#承诺交易的两个版本 因为我们已经把退款交易当作了第一笔承诺交易,那么通道中正式发生的第一笔交易就被当作是第二笔承诺交易。第一笔承诺交易代表的状态是状态0,序号为0#,编号为CT00。那么第二笔承诺交易的序号就记为1#,代表状态1,交易编号记为CT01,两个版本分别就是CT01a 和 CT01b。 我们来看CT01的交易流程 1. 发送付款发票 小笨向小艾发送一个1BTC的付款请求,通道中的说法是收款方向付款方发送了一个发票,让付款方向他支付 1个BTC。 这个付款请求中,小笨要把自己用在CT01b中的撤销公钥KBRSMC1 发给小艾,因为小艾在创建CT01b 时,本地Output 的替代花费路径中需要用到小笨的撤销密钥。 撤销公钥由双方提前生成,在正式开始通道交易时,收款方在向付款方发出付款申请时就需要首先把自己的撤销公钥发给对方,不然对方无法创建对应的承诺交易并付款。 2. 构建1#承诺交易的B版 1#承诺交易的B版 CT01b 由小艾创建,这个版本会发给小笨由小笨持有。 交易输入 资金来源:FT交易,0#UTXO 金额:10BTC 解锁脚本:小艾的FT私钥KAFT签名 交易输出 0#(远程):分配给小艾 金额:4BTC 锁定脚本:小艾的DT公钥PADT 1#(本地):分配给小笨 金额:6BTC 路径1 锁定脚本:小笨的公钥 1000区块 路径2 锁定脚本:小笨的撤销公钥KBRSMC1 小艾的公钥 3. 发送 CT01b 和 A版的撤销公钥 小艾在创建好的 CT01b上签名,然后把 CT01b 发给小笨,由小笨持有和保管。 小艾向小笨发送CT01b 时,也要把自己在A版CT01a 中要用到的撤销公钥KARSMC1发给小笨,因为小笨需要使用小艾的撤销公钥创建CT01a 本地Output 的替代路径。 4 . 构建1#承诺交易的A版 1#承诺交易的A版 CT01a 由小笨创建,这个版本会发给小艾由小艾持有。 交易输入 资金来源:FT交易,0#UTXO 金额:10BTC 解锁脚本:小笨的FT私钥KBFT签名 交易输出 0#(远程):分配给小笨 金额:6BTC 锁定脚本:小笨的DT公钥PBDT 1#(本地):分配给小艾 金额:4BTC 路径1 锁定脚本:小艾的公钥 1000区块 路径2 锁定脚本:小艾的撤销公钥KARSMC1 小笨的公钥 5. 发送A版承诺交易 CT01a 小笨在创建好 CT01a上之后,用自己的FT交易私钥签名然后发给小艾,由小艾持有和保管。 构建好这两笔CT交易并交换签名之后,1#承诺交易CT01就生效了。接下来双方还需要构建子交易来花费分配给自己的Output,即构建转移自己在通道中资金余额的子交易:交付交易和可撤销交付交易。 第二、构建1#交付交易的两个版本 交付交易是花费远程Output的交易。 1. 小艾构建CT01b 的交付交易 DT01b CT01b 的远程 Output ,资金是分配给小艾的,因此小艾需要为其构建交付交易 DT01b,如果小笨广播了 CT01b,这笔交易就会把远程 Output 中的资金转移到小艾的地址。 交易的构建 交易输入(Input) 资金来源:1#承诺交易 CT01b,0#UTXO(远程) 金额:4BTC 解锁脚本:小艾的DT私钥KADT 签名 交易输出(Output) 金额:4BTC 锁定脚本:小艾的公钥PA 2. 小笨构建CT01a 的交付交易 DT01a CT01a 的远程 Output ,资金是分配给小笨的,因此小笨需要为其构建交付交易 DT01a,如果小艾广播了 CT01a ,这笔交易就会把远程 Output 中的资金转移到小笨的地址。 交易的构建 交易输入(Input) 资金来源:1#承诺交易 CT01a,0#UTXO(远程) 金额:6BTC 解锁脚本:小笨的DT私钥KBDT 签名 交易输出 金额:6BTC 锁定脚本:小笨的公钥PB 第三、构建1#可撤销交付交易的两个版本 可撤销交付交易是花费本地 Output 的交易。 1. 小艾构建CT01a 的可撤销交付交易 RDT01a CT01a 的本地 Output ,资金是分配给小艾的,因此小艾需要为其构建可撤销交付交易 RDT01a,如果小艾自己广播了 CT01a ,需要这一笔交易把本地 Output 中的资金转移到小艾的地址。 交易的构建 交易输入 资金来源:1#承诺交易 CT01a,1#UTXO(本地) 金额:4BTC 解锁脚本:小艾的私钥KA签名 时间锁:1000区块 交易输出 金额:4BTC 锁定脚本:小艾的公钥PA 2. 小笨构建CT01b 的可撤销交付交易 RDT01b CT01b 的本地 Output ,资金是分配给小笨的,因此小笨需要为其构建可撤销交付交易 RDT01b,如果小笨自己广播了 CT01b ,需要这一笔交易把本地 Output 中的资金转移到小笨的地址。 交易的构建 交易输入 资金来源:1#承诺交易 CT01b,1#UTXO(本地) 金额:6BTC 解锁脚本:小笨的私钥KB签名 时间锁:1000区块 交易输出 金额:6BTC 锁定脚本:小笨的公钥PB 第四,交换0#承诺交易CT00的撤销私钥 在完成了1#承诺交易及其2对子交易的构建之后,双方就需要抓紧把0#承诺交易CT00的状态给撤销或者作废掉,因为新的交易状态已经生效,老的状态已经无效了。 过时状态的撤销需要通过交换双方在过时交易即CT00中使用的撤销密钥来完成。 撤销密钥是双方在自己所持有那一版CT交易中,本地Output 的替代花费路径中所使用的锁定密钥。但是要交换的是前一笔CT交易所使用的撤销密钥,而不是当前这一笔CT交易的撤销密钥,这一点一定要注意,如果把当前交易的撤销私钥交给了对方,即使你没有作恶,对方也会拥有你最新状态下的资金解锁权。我们要实现的是把过时交易的资金解锁权交给对方,这样才会阻止两个持有方主动去广播过时的交易进行作恶。 因此小艾需要把CT00a中使用的撤销公钥的私钥 KARSMC0 发给小笨,而小笨需要把CT00b 中使用的 KBRSMC0 发给小艾。 双方以此来把自己在前一笔CT交易中对本地Output的解锁权转移给对方,相当于让对方获得自己在前一笔交易中的资金转移能力。 交换撤销密钥的方案实际上是双方向对方承诺自己不会广播过时交易进行欺骗和作恶的一个保证。 第五、构建0#违约惩罚交易的两个版本 简单介绍 有了对方在0#承诺交易中专用的撤销密钥,双方就能为0#CT交易构建违约惩罚交易。违约惩罚交易的英文是Breach Remody Transaction, 简称为BRT。 这笔交易就是本地Output的替代花费路径,它具有抢在持有方的可撤销交付交易RDT之前,转移掉本地 Output 给持有方支付的资金的能力。也就是替代持有方自己的子交易花费掉持有方的资金,当然它的前提是持有方进行了广播过时承诺交易的作恶行为。 因此BRT罚交易也只是针对过时CT交易而构建,最新一笔交易是不会构建BRT交易的,因为只有过时的交易才需要作废余额状态。 交易构建 1. 小艾构建 CT00b 的违约惩罚交易 BRT00b 交易输入 资金来源:0#承诺交易 CT00b,1#UTXO(本地) 金额:5BTC 解锁脚本:小笨的撤销私钥KBRSMC0 签名 小艾的私钥KA 签名 交易输出 金额:5BTC 锁定公钥:小艾的公钥PA BRT交易花费的是对方的本地Output,因此小艾构建的BRT是用来花费小笨的本地 Output,所以她构建的是CT00b的违约惩罚交易BRT00b。 这笔交易的交易输入中需要用到小笨的撤销私钥KBRSMC0进行签名,加上小艾自己的私钥签名才能解锁CT00b的本地Output,并把资金转移到交易输出锁定脚本中设置的小艾的公钥地址。这也是上一步交换双方撤销私钥的原因。 2. 小笨构建CT00a 的违约惩罚交易BRT00a 小笨要构建的是CT00a的违约惩罚交易BRT00a。 交易输入 资金来源:0#承诺交易 CT00a,1#UTXO(本地) 金额:5BTC 解锁脚本:小艾的撤销私钥KARSMC0 签名 小笨的私钥KB 签名 交易输出 金额:5BTC 锁定公钥:小笨的公钥PB 这笔BRT交易的金额,两个版本都是5BTC,因为这是针对上一笔承诺交易的本地Output构建的替代花费交易。上一笔即0#CT交易,或者退款交易,分配方案是初始状态即5 : 5 的余额比例。 如果任何一方作恶,在CT01已经生效的情况下广播了CT00去申请结算,那么没有作恶的一方都可以用这一笔BRT00交易去转走作恶方在本地Output中的那一半资金,因为作恶方的可撤销交付交易RDT00有时间锁限制,没有那么快能够解锁本地Output,而BRT00交易没有时间限制,能够抢先转移资金。 而且CT00分配给未作恶方的那一半资金也会在CT00被广播时通过交付交易转移到未作恶方的地址。这样10个BTC会全部转移给未作恶方,作恶方将一分钱也拿不到。 3. 通道的持续或者结束 当然如果没有人广播CT00,就意味着没有人作恶,通道要么保持4:6 的新状态,直到下一笔交易更新当前的状态,要么在4:6 的状态结束通道。 如果双方不打算关闭通道,此后通道会在这个机制下持续进行交易,并进行状态更新。 如果任何一方,或者双方打算在最新状态下结束通道,有两种方式可以用来发起解锁和关闭通道: 一是单方面关闭,任何一方单方面广播了CT01,区块链会按照4:6 的比例结算双方的余额,只是主动广播的那一方需要等待时间锁到期,而被动方不需要等待。 二是双方合作关闭,需要按照4:6 的比例构建一笔新的结算交易,即行权结算交易,分配方案跟CT01 是一样的,只是两个Output中都不需要设置时间锁,所以双方解锁资金时都不用等待,在行权结算交易被广播之后都能立即赎回自己那一部分资金。 到这里闪电通道的开启,交易的构建和第一笔交易发生的过程就结束了,我们也完成了对闪电通道整个过程的初步理解。 相关阅读 Nervos Fiber Network 轻皮书学习(1):闪电网络介绍 x.com/xueblock/status/182838……… Nervos 闪电网络轻皮书学习(2):单向支付通道 x.com/xueblock/status/183206……… 闪电网络学习3:支付通道的演化 x.com/xueblock/status/183593……… Nervos 闪电网络学习4:双向支付通道 x.com/xueblock/status/183855…… 闪电网络学习5:闪电通道运行流程(上) x.com/xueblock/status/185514… 参考资料 闪电网络白皮书: lightning.network/lightning-……… Tadge Dryja的视频《Payment Channels and Lightning Network》: youtube.com/watch?v=Hzv9WuqI…… 精通比特币: github.com/bitcoinbook/bitco……… 播客《Lightning Network 技术演化史》: xiaoyuzhoufm.com/episode/5e2……… Jan 带你细数八种支付通道方案: mp.weixin.qq.com/s/v6NR68fDw…
9 Nov 2024
闪电网络学习5:闪电通道运行流程(上) 前一篇文章分析了闪电通道防止和惩治作恶的原理,即通过一系列相互依赖的交易,包括退款交易,承诺交易,交付交易,可撤销的交付交易,违约惩罚交易等,把它们结合起来实现了可撤销按序到期合约 RSMC 的功能,这个功能就是帮助闪电通道作废了通道中所有过时交易的余额状态,并以奖惩机制一方面确保广播过时交易进行结算的欺骗行为都会受到罚没资金的惩罚,另一方面确保在作恶发生时没有作恶的一方会受到奖励,那就是获得对方的所有资金。 对RSMC的作用总结成一句话,就是让闪电通道实现以经济惩罚的机制而不是物理阻隔的方式来防止和惩治欺诈交易的作恶行为,最终实现了一个免信任的支付通道。 今天这篇文章的主题就是闪电通道的运行流程,重点是闪电通道中这些交易是如何构建出来的,他们又是如何结合起来实现RSMC合约的功能的。 本文主要内容如下 1. 开启通道 1)构建注资交易 2)构建退款交易(0#承诺交易)的两个版本 3)签名和广播注资交易,完成充值和通道开启 4)构建0#交付交易的两个版本 5)构建0#可撤销交付交易的两个版本 2. 通道交易 1)通道交易的流程 2)通道交易的构建 (1)构建1#承诺交易的两个版本 (2)构建1#交付交易的两个版本 (3)构建1#可撤销交付交易的两个版本 (4)交换0#承诺交易的撤销私钥 (5)构建1#违约惩罚交易的两个版本 进入正文,我们先从通道的开启开始。 1. 开启通道 在新建一个闪电通道时,需要提前准备好三个交易:一个注资(充值)交易,一对退款交易(两个版本)。 1)构建注资交易FT 注资交易就是充值交易Funding Transaction,简称FT。 它的作用是用来创建通道,即在比特币链上创建共管账号(即多签地址)并向这个地址充值资金,完成支付通道的开启。 跟所有比特币交易一样,注资交易也是由两个部分组成,即交易输入和交易输出。 第一:构建交易输入 Input 交易输入是用来表达当前交易所要操作的这笔资金来源和资金所有权归属的构造,主要内容包括引用的交易ID和未花费的交易输出即UTXO的序号,所涉及资金的金额,以及如何解锁这笔资金的方法(就是指解锁脚本)几个部分。其中引用的交易编号(TXid)和UTXO序号确定了资金的来源,解锁脚本中需要提供的数字签名则负责验证资金的所有权。 注资交易的资金来源于通道双方,因此需要引用的TXid和UTXO序号至少要有两个,即需要有两个或者以上的Input,分别代表两方提供的资金来源。 比如小艾(用A代表)和小笨(用B代表)各自向通道提供5个BTC的资金,那么他们需要分别提供一个(或多个)UTXO,每一个UTXO及其所在的交易就是需要引用的资金来源,它们构成一个输入;每方提供的UTXO所包含的资金合计必须要稍微大于5BTC,因为除了留在通道中的5BTC,开启和关闭通道时都需要发起BTC链上交易,要支付一些交易费用。 下面用小艾和小笨开启通道作为案例,来看FT交易的两个交易输入(Inputs)如何构建。 输入1:0# Input 交易ID:xxxxxx UTXO序号:xxxxxx 金额:5.001BTC 解锁脚本:用小艾的私钥KA签名 输入2:1# Input 交易ID:xxxxxx UTXO序号:xxxxxx 金额:5.001BTC 解锁脚本:用小笨的私钥KB签名 上例的两个Input中,0# Input 是小艾提供的,因此解锁脚本要用小艾的私钥KA提供签名,1# Input 是小笨提供的,因此解锁脚本要用小笨的私钥KB提供签名。每一方都要在自己提供的UTXO使用匹配的私钥进行签名来验证这笔资金的所有权,证明自己是这笔资金的所有者。 第二:构建交易输出 Output 交易输出是表达这笔交易的资金和所有权归属去向的构造,主要内容包括金额和锁定脚本。其中锁定脚本规定了这笔资金的花费条款,即哪个私钥能够解锁这笔资金,以及哪个地址拥有资金所有权。注资交易的锁定脚本中设置的是一个多签的公钥地址,表示这笔资金的去向就是这个多签地址,所有权则由锁定脚本中双方的公钥哈希进行锁定封印。 还是来看小艾和小笨开启通道的案例 0# Output 金额:10BTC 锁定脚本:A B 的FT多签地址 注资交易的资金去向是一个共管的账号,即由一个2-2多签地址来接收注资交易的资金,所以必须生成一个由2-2 双方多签地址控制的交易输出(Output),由双方的密钥共同控制,充值的时候双方的10个BTC会全部进入并锁定在这个Output 里面。FT交易多签 Output 中用来锁定资金的密钥由双方分别提供,而且这个密钥只能用于注资交易,不能复用在其他地方。比如小艾在FT交易的专用公钥是 PAFT,小笨是 PBFT。 注资交易只需要创建一笔交易,双方的资金都放在一个Output 里面,因此必须通过双方合作来构建和花费,即需要双方在各自提供的 Input 里面签名之后才能广播出去经过矿工的处理,任意一方发起广播都可以。 但是现在只需要把交易构建出来,还不用签名和广播,需要完成了下一步的退款交易之后再返回来完成操作。 2)构建退款交易 之所以要构建退款交易是因为充值到注资交易的资金进入了共管账号,需要双方合作才能解锁和转移,万一一方不配合就会导致资金被锁,造成充值者的损失。 所以退款交易的作用是按照FT交易的初始状态分配双方的资金,也就是把充值到FT交易2-2共管账号的资金按照充值金额退回给双方。 退款交易这部分的主要内容包括 (1)退款交易= 0#承诺交易 (2)0#承诺交易的构建原则 (3)0#承诺交易的两个版本 (4)0#承诺交易的两部分结构 (5)0#承诺交易的脚本 (1)第一笔承诺交易0#CT 退款交易 = 0#承诺交易 退款交易其实也是一笔承诺交易,因为它也是发生在链下,没有广播到链上进行验证和公证,是双方在链下向对方保证能够按照原样进行退款的承诺,因此也被认为是一笔承诺交易,即Commitment Transaction, 以下简称CT。我们可以把退款交易当作是第一笔承诺交易。 承诺交易(CT)要解决的第一个问题是要确定通道中的哪一方主动向比特币区块链发起了广播承诺交易的结算申请,这是在通道交易中要区分作恶者并给予惩罚的前提。其本质是要让区块链能辨别主动发起交易广播的是哪一方。 实现这一目标的方案就是把承诺交易构建为两个版本。 (2)0#承诺交易的构建原则 第一,承诺交易要构建为两个版本。退款交易是第一笔承诺交易,因此也需要要构建成两个版本,每方各构建一个版本,签名之后发给对方,由对方持有。 第二,承诺交易的结构跟比特币交易一样。也是由交易输入和输出两个部分构成,因此退款交易也是通过构建输入和输出两个部分进行构建。 第三,承诺交易代表的是通道中的状态。第一笔承诺交易代表的是通道的初始状态,即双方之间还没有发生交易时的状态。我们把初始状态设为状态0,所以第一笔承诺交易代表的就是状态0,交易序号设为0#,交易编号就是CT00,两个版本分别为CT00a和CT00b,小艾手中持有的是CT00a,小笨手中的是CT00b。 在这样的原则之下,我们来构建第一笔承诺交易,也就是退款交易。 (3)0#承诺交易的两个版本 小艾和小笨需要各自构建一个版本,签名之后发给对方持有。 小笨构建A版CT交易CT00a,签名之后发给小艾,由小艾持有 A版(CT00a) 交易输入(Input) 所引用的交易及UTXO:FT交易(ID),0#输出 金额:10BTC 解锁脚本:B的FT交易私钥KBFT 签名 交易输出(Output) 0# Output:(远程) 金额:5BTC 锁定脚本:B的DT公钥PBDT 1# Output:(本地) 金额:5BTC 花费路径1: 锁定脚本:PA && 1000 区块 花费路径2: 锁定脚本:双方的撤销公钥,即PARSMC0 && PB CT00a 由小艾持有,小艾想要单方面发起结算时只能广播A版的CT交易。 小艾构建B版CT交易CT00b,签名之后发给小笨,由小笨持有 B版(CT00b) 交易输入(Input) 所引用交易及UTXO:FT交易(ID),0#输出 金额:10BTC 解锁脚本:A的FT交易私钥KAFT签名 交易输出(Output) 0# Output:(远程) 金额:5BTC 锁定脚本:A的DT公钥PADT 1# Output:(本地) 金额:5BTC 花费路径1: 锁定脚本:PB && 1000 区块 花费路径2: 锁定脚本:双方的撤销公钥,即PBRSMC0 && PA 小艾构建好CT00b,签名之后发给小笨持有,小笨想要单方面发起结算时只能广播B版CT交易。 (4)0#承诺交易结构的两个部分 承诺交易是完全按照比特币交易的结构进行构建的,只不过在构建完成以后没有广播到比特币链上去,而是保存在链下双方自己的设备中。所以第一笔承诺交易的构建跟注资交易一样,也是通过交易输入和交易输出两个部分进行构建。 第一部分:交易输入 交易输入包括的主要内容是资金来源,金额,和解锁脚本。 资金来源:FT 交易, 0# Output 退款交易要分配的是注资交易(FT)多签Output中的资金,因此它的资金来源只有一个,即只有一个交易输入,就是 FT 交易的 0# Output 也就是2-2多签地址控制的 Output。 金额:10BTC。 解锁脚本: KAFT签名 KBFT 签名 解锁脚本是用来验证资金所有权的一个脚本,因为FT交易创建 2-2 Output 时在锁定脚本中使用了双方的FT交易多签地址进行锁定,所以这里解锁时需要双方各自提供自己专用于FT交易的私钥 KAFT 和 KBFT 签名进行验证。 在示例中两个版本的输入部分都只有一方的签名,是因为都是对方创建的交易发给另一方持有,比如A版交易CT00a是由小笨构建,签名之后发给小艾持有,因此只有小笨的签名,小艾可以随时添加自己的签名构成完整的多签签名去广播;同理B版交易CT00b是由小艾构建,签名之后发给小笨持有,因此只有小艾的签名,小笨也可以随时添加自己的签名去广播。 第二部分:交易输出 理解向双方分配资金的两个Output 承诺交易需要向两方分配资金,所以在表达资金去向的交易输出部分至少要创建两个 Output,用来给两方支付余额。一个叫做本地Output,是分配给持有方的;一个叫做远程Output,是分配给非持有方的。这是针对持有方来讲。 但是CT交易是由非持有方构建好之后发给持有方的,因此对非持有方即构建方来讲,在构建的时候远程Output 是用来分配给自己的,而本地Output是分配给对方的。 我们以小艾持有的A版承诺交易,即 CT00a 为例来看0#CT交易的交易输出。 CT交易中的两个输出,序号按照0开始向后编号。比如可以把远程 Output 设为0#,把本地 Output 设为1#。由于退款交易分配的是双方的初始余额状态,即两方向通道充值的金额比例,所以两个Output中的资金都是5BTC。 0# 远程 Output 远程 Output 的基本内容很简单,就是金额和锁定脚本。CT00a 的远程 Output 金额为5BTC,锁定脚本是小笨的公钥PBDT。 金额:5BTC 锁定脚本:小笨的公钥哈希PBDT 远程Output中的锁定公钥 关于这个公钥需要解释一下,因为它是专用于交付交易即DT中的公钥(小笨的公钥为PBDT),原因如下 闪电通道在承诺交易的设计中,Output 的花费不是在广播CT交易时把资金直接支付到 Output 锁定脚本中的地址,而是需要再发起一笔子交易才能完成对 Output 中资金的转移。 用来转移远程 Output 资金的子交易就叫做交付交易Delivery Transaction,简称为DT。它要完成的是CT交易对非持有方资金的交付。 闪电网络的白皮书中关于交付交易的内容中提到了PAliceD 和 PBobD 这一对公钥 ,就我的理解这个公钥就是专门用来指代交付公钥的,D是指Delivery,所以这两个公钥是指 Alice 和 Bob 在花费远程Output 时,资金交付所使用的公钥。 因此在案例中构建远程Output的时候,锁定脚本里用的是小笨的交付公钥PBDT。但是也看到很多地方的解释中这个锁定脚本里面用的就是通用的密钥,而非专用于交付交易的密钥。我是按照闪电网络白皮书中的内容来进行理解和解释。 1# 本地 Output 本地 Output 基本内容也只有两个部分:金额为5BTC,另一个部分是关于花费条件。 这里的花费条件就是由RSMC合约规定的两个花费路径。 第一个路径是由持有方解锁和花费。 因此本地Output 的锁定脚本就是持有方的公钥,CT00a 的持有人为小艾,因此锁定脚本为小艾的公钥PA。 但是这个路径对本地Output 的解锁有时间限制,因为这个路径是在持有方主动广播了承诺交易时,由持有方发起的子交易,它想要做的是转移持有方在承诺交易中的资金。为了避免主动广播交易的一方进行欺骗,就会限制这一笔交易解锁本地Output的时间。 因此这个路径中需要增加一个时间锁的设定,CT00a的例子中设置了1000个区块的相对时间锁。 所以整理路径1的锁定脚本为:小艾的公钥PA 1000区块 第二个路径是用一笔子交易取代第一个路径,即替代路径。 这个替代路径的子交易就是违约惩罚交易,因为它的作用是取代第一个路径并拿走持有方在通道中的资金,因此只有在持有方广播了过时的承诺交易即进行欺骗时才会被执行。 通过违约惩罚交易花费本地Output需要双方的配合,即要提供双方的签名才能解锁,因此在它对应的锁定脚本中使用的是双方的公钥进行锁定,类似于2-2的多签Output,不过这里用来锁定资金的密钥是一个专用密钥,叫做撤销密钥。每一笔CT交易的本地 Output 在替代路径中使用的撤销密钥都是专用的,不能复用于其他交易。 撤销密钥由双方的密钥合起来构成。 在实际案例中,CT00a 本地 Output 的替代路径中使用的是小艾的RSMC专用密钥和小笨的通用密钥,即PARSMC0 PB,它们一起构成了一个完整的撤销密钥。 这里只有CT交易的持有方用的是专用的撤销密钥,而非持有方用的却是通用密钥。这样设置是为了简化密钥管理,具体逻辑这里就不展开,后面打算再整理一篇闪电通道的整体逻辑,在RSMC 撤销密钥的运行原理那部分再详细解释。 就案例中来说,每个版本CT交易中,持有方的撤销密钥,比如A版的PARSMC0 是由小艾预先创建的撤销密钥,在小笨构建0#承诺交易之前小艾需要把这个撤销密钥的公钥发给小笨,因为A版CT交易是由小笨构建的,而A版的本地Output中在替代路径中使用的是小艾的撤销公钥加上小笨的通用公钥。有了小艾的PARSMC0 加上自己的公钥PB,小笨才能构建出CT00a,签名之后他会把CT00a 发给小艾持有和保管。在后面第二笔CT交易发生后要撤销这一笔承诺交易的状态,也是通过这个撤销密钥来实现的。那里小艾需要把 PARSMC0 的私钥即撤销私钥KARSMC0 发给小笨,由小笨构建违约惩罚交易来实现作废过时CT交易的目的。 同理,小笨也会提前生成自己的撤销密钥,并且把公钥PBRSMC0发给小艾,让小艾构建承诺交易的B版,签名之后发给小笨持有。以后要撤销这一笔承诺交易的时候,小笨也需要把 PBRSMC0 的私钥KBRSMC发给小艾,由小艾构建违约惩罚交易来实现作废过时CT交易的目的。 (5)0#承诺交易的脚本 关于第一笔承诺交易的构建,我从《精通比特币》中找到了交易的脚本,复制如下: Input:2-of-2 funding Output, signed by Bob Output 0 <5 bitcoins>: <Bob's Public Key> CHECKSIG Output 1<5 bitcoins>: IF # Revocation penalty output <Revocation Public Key> ELSE <1000 blocks> CHECKSEQUENCEVERIFY DROP <Alice's Public Key> ENDIF CHECKSIG 这是A版CT交易的脚本,由Alice持有且只有Alice能广播。但是这个版本是由Bob构建,签名之后发给Alice的,因此Input中目前只有Bob一方的签名。 在两个交易输出中, Output 0为远程Output,金额为5BTC,是分配给Bob的,因此由Bob的公钥进行锁定<Bob's Public Key>。如果Alice广播了这笔交易,到时候这个Output需要Bob发起一笔交付交易DT,并用Bob在这个Output中使用的锁定公钥对应的私钥进行签名才能解锁和花费。 Output 1 是本地Ouput,金额也是5BTC,理论上是分配给Alice的,但是RSMC合约为其设置了两个花费路径(IF……ELSE,如果……就,如果不…….就……)。 两个花费路径的顺序说明 需要说明一下,《精通比特币》中这两个路径的设置顺序,跟闪电网络白皮书的作者之一Tadge Dryja在视频中讲解的不一样。视频中讲解的路径1是由持有方单方花费,路径2是由撤销密钥花费。而《精通比特币》这个脚本中刚好相反,路径1是撤销密钥花费,而路径2是持有方单方花费。 因此在《精通比特币》脚本中的交易,路径1是由撤销公钥进行锁定,而撤销公钥就是双方在替代路径中所使用的公钥,需要双方合作即提供双方的对应私钥才能解锁,解锁之后资金会支付到撤销公钥对应的地址;路径2则是由Alice单方的公钥进行锁定,但是脚本中设置了1000个区块的时间锁,需要等CT00a 上链之后经过1000个区块确认之后,路径2的交易才能被打包进入区块,然后执行Alice的签名验证并完成资金所有权转移。 两个花费路径是按照顺序进行执行,如果IF后面的第一个条件成立就会这个条件下的指令进行操作,即把钱支付到撤销公钥对应的地址。如果第一个条件不成立,就按照ELSE后面的指令执行,即在1000个区块确认之后把钱支付到Alice的公钥地址中。这个路径设置所表达的意思是这笔钱虽然理论上是分配给Alice的,但是要真正支付给她是有一定条件的,要在IF后的第一个条件不成立的时候,而且要等1000个区块之后,这两个条件都满足的前提下,Alice才能真正拿到这笔钱。 下面图片中显示的是闪电网络作者Tadge Dryja在视频中提供的脚本,脚本的右半部分是针对CT交易A版的两个Output,上面2个Coins 的是本地Output,下面8个Coins是远程Output。 Tadge Dryja 讲解闪电网络的视频地址如下: youtube.com/watch?v=Hzv9WuqI… 就我理解这个顺序应该没有那么重要,所以我在前面构建0#承诺交易的两个版本那里用了闪电网络视频中的顺序,而这里的脚本还是直接用了《精通比特币》的顺序。 以上是对退款交易即第一笔承诺交易的构建过程和关于交易原则,交易版本,交易结构以及交易脚本的解释。 3)完成充值和通道开启 在双方为对方构建好退款交易并签名之后,他们就都不用担心对方玩消失了,因为即使对方不配合,自己也可以广播退款交易来赎回自己向多签地址充值的资金。 所以这时候双方就可以回去在注资交易上签名,并把FT交易广播出去,双方提供的资金就会被打进链上的多签地址,通道就创建好了。 但是在通道交易正式开始之前,还有两对交易需要构建,就是交付交易和可撤销的交付交易。因为承诺交易的两个Output 在向两方分配余额的时候不会直接把资金支付到Output 脚本中的公钥地址,而是需要双方各发起一笔子交易来转移资金。 在退款交易即 0#CT交易的情况中,如果一方真跑路了,另一方广播了 0#CT交易想要赎回自己的资金,也需要通过广播可撤销交付交易才能把充值的资金拿回来,而且需要等待时间锁到期才拿得到退回来的钱。只不过这两笔交易都不需要对方的签名,用自己的密钥就可以构建,所以在充值之后构建也没有关系,甚至是在它所在的承诺交易被广播,确实需要用到交付交易和可撤销交付交易的时候再构建也不迟。当然在构建好了0#CT交易还没有完成注资交易就构建也没有问题。 接下来我们要来完成构建0#承诺交易的两对子交易。 4)构建交付交易 承诺交易向通道两方分配余额的这两个Output 都不是直接把钱打到Output中的地址,而是分别要通过一笔子交易来把Output 中的资金转移到子交易的Output中。 所以接下来还要针对交易输出中的两个Output 分别构建转移其中资金的子交易。 (1)交付交易 Delivery Transaction(DT) 简单介绍 交付交易DT是用来花费远程 Output 的交易,而远程 Output 是CT交易给非持有方分配资金的交易输出,因此DT交易就是CT交易的非持有方用来花费自己在CT交易中资金(即转移资金)的交易。 交易结构和构建 承诺交易的子交易,结构上也是一笔比特币交易,所以交付交易也是由交易输入和交易输出两部分构建而成。因为承诺交易有两个版本,每一个版本都有一个远程Output,因此交付交易也要构建为两个版本。 还是以A版的DT交易DT00a为例,即CT00a的交付交易。 A版CT交易由小艾持有,因此远程 Output是分配给小笨的。交付交易 DT00a 由小笨发起去解锁远程Output,因此这笔子交易由小笨构建。 第一部分:交易输入 资金来源:来源中引用的交易就是CT00a,0#UTXO(即远程Outout)。 金额:5BTC。 解锁脚本:需要提供小笨的DT交易私钥KBDT进行签名。如果交易被提交,签名验证通过之后,这笔Output中的资金就会转移到交易输出中锁定脚本设置的公钥地址中。 第二部分:交易输出 DT交易只有一个交易输出,因此只需要生成一个0#Output。金额为输入中的那 5个BTC。 锁定脚本就是小笨自己的公钥PB。 这个交易比较简单,A版构建好之后由小笨自己持有就行了。 B版由小艾构建,只需要把签名和锁定公钥换成小艾就可以了,金额不用改变,因为双方都是5BTC。 (2)可撤销交付交易 Revocable Delivery Transaction(RDT) 简单介绍 可撤销交付交易RDT是用来花费另一个Output也就是本地Output的子交易,由持有方发起,对自己在通道中的余额按照承诺交易的分配比例进行花费。 可撤销交付交易也是交付交易的一种,英文是Revocable Delivery Transaction,简写为RDT。被叫做可撤销交付交易是因为它对本地Output的花费能力是有可能被撤销的,被撤销的原因是持有方广播了过时的承诺交易进行结算,就是持有方在结算时企图进行欺骗。因此这笔交易的花费能力或者说是持有方转移自己在通道中的资金的能力被设计为可撤销的机制,是为了阻止持有方在申请结算时广播过时的交易企图进行欺骗。这是避免通道作恶的一个重要环节。 持有方花费能力的撤销机制 撤销RDT交易对本地 Output 的花费能力是通过两个机制的设计来实现的,第一是时间锁,第二是一笔替代交易。 替代交易就是上面提到的违约惩罚交易BRT,可撤销交付交易RDT和违约惩罚交易BRT就是本地 Output的两个花费路径,它们花费的是同一个本地 Output,即同一笔资金,因此只能有一个路径能够花费成功。其中可撤销交付交易RDT由持有方单方进行解锁和花费,但是解锁的时间有限制。而违约惩罚交易BRT解锁时间没有限制,但是需要双方合作才能花费成功,并且由能够提供双方撤销私钥的一方进行花费。 交易的结构和构建 RDT交易同样也是通过交易输入和交易输出两个部分进行构建。我们还是以CT00a的可撤销交付交易RDT00a为例进行说明。 A版承诺交易CT00a由小艾持有,因此本地 Output是分配给小艾自己的。可撤销交付交易 RDT00a 是由持有方即小艾发起去解锁本地Output,因此这笔子交易由小艾构建。 第一部分:交易输入 RDT交易的交易输入,内容有这样几个部分: 资金来源:CT00a,1#UTXO。 来源中引用的交易也是CT00a,不过UTXO序号是1#,即本地 Outout,因为这笔交易要花费的是本地Output。 金额:5BTC。 解锁脚本:A的私钥KA签名 RDT交易是由持有方对本地Output 发起的花费交易,因此需要提供小艾的私钥KA进行签名。 时间锁:1000区块 这笔交易被广播和执行的条件是,第一小艾主动广播了承诺交易CT00a,第二CT00a是通道中最新的承诺交易,即CT00a的状态没有过时。在这种情况下,RDT00a 被提交,等待时间锁到期之后,如果签名验证通过,Output中的资金就会转移到交易输出中锁定脚本设置的公钥地址即小艾的地址中。 第二部分:交易输出 RDT交易也只有一个交易输出,因此只需要生成一个0#Output。金额为交易输入中的5个BTC。 锁定脚本就是小艾自己的公钥PA。 RDT交易A版就构建好了,由小艾自己持有。 B版可撤销交付交易RDT00b 由小笨构建,金额也不用改变,只需要把签名和锁定公钥换成小笨就可以了。 到这里前面的准备工作就完成了,双方可以在没有任何后顾之忧的情况下开始通道交易。 所以下一篇文章的内容就是闪电通道交易的过程。 相关阅读 Nervos Fiber Network 轻皮书学习(1):闪电网络介绍 x.com/xueblock/status/182838…… Nervos 闪电网络轻皮书学习(2):单向支付通道 x.com/xueblock/status/183206…… 闪电网络学习3:支付通道的演化 x.com/xueblock/status/183593…… Nervos 闪电网络学习4:双向支付通道 x.com/xueblock/status/183855… 参考资料 闪电网络白皮书: lightning.network/lightning-…… Tadge Dryja的视频《Payment Channels and Lightning Network》: youtube.com/watch?v=Hzv9WuqI… 精通比特币: github.com/bitcoinbook/bitco…… 播客《Lightning Network 技术演化史》: xiaoyuzhoufm.com/episode/5e2…… Jan 带你细数八种支付通道方案: mp.weixin.qq.com/s/v6NR68fDw…
9
13
1,865
雪解 retweeted
24 Sep 2024
Nervos 闪电网络学习4:双向支付通道 今天正式开始闪电网络支付通道的学习,这篇文章主要内容包括: 1. 支付通道问题的总结 2. 闪电通道解决问题的思路 3. 闪电通道解决免信任问题的方案原理 (1)如何保证过时交易被广播上链但不能花费? (2)作恶行为如何受到惩罚 (3)如何防止注资交易2-2多签账号中的资金被锁? 一、支付通道问题的总结 前面讲了4种单向支付通道和3种双向支付通道的设计思路和一些实践,我们可以总结出它们想要解决的共性问题。 包括 1)充值到链上的公共账户之后,万一有一方私钥丢失或者干脆不配合,如何保证资金一定能退回给充值者; 2)通道中的交易发生在链下,没有通过区块链的共识机制验证,如何确保交易的安全和可信; 这两个是关于支付通道资金安全和交易有效性的问题,直白一些说就是通道能够在不需要信任他人的情况下,就在交易双方之间实现交易的有效性和资金安全性,即所谓的免信任问题。 另外还有几个需要解决的问题包括 3)要保证在一个通道中两方都可以进行支付和申请结算,即双向通道的设计问题; 4)通道的存续时间最好保证能够永远存在,只在参与方想要关闭时才关闭,而不是设定一个时间,时间一到就强制关闭; 5)通道中双方能够发生的交易次数最好不要有限制,只要参与方有需求,交易多少次都是可以的; 6)通道中的资金利用率要高,既要减少资金抵押,又想要实现更大的支付能力,即能够利用最少的资金,进行最大额度的交易。 7)如果能够在保证以上要求的基础上,还能把通道设计得简洁易操作,减少参与者的操作和管理成本就更好了。 后面这几个需求可以理解为通道的性能和效率问题。 在以前的方案中,每个方案都解决了其中的一个或者几个问题,但也有一些问题未能解决,有些可能解决了部分问题,又产生了新的问题。 从今天开始,我们来了解闪电网络的支付通道方案,看它是怎么解决这些问题,解决了哪些问题,还有哪些问题没能解决。 二、解决问题的全新思维框架 首先闪电网络的支付通道是双向通道,而且是在同一个通道中实现双向操作的通道。 另外它在解决支付通道问题时跳出了前面那7种方案的解决思路和框架,没有在中本聪, Spillman 通道,Timelock ,Duplex 和 DMC 等通道的思维框架里面进行设计,而是另起炉灶,走了一条完全不同的路。 我们重点来看闪电网络对支付通道系统的免信任,即资金安全和交易有效性问题的解决思路。 定位核心问题 闪电通道的免信任问题又可以分为两个部分来解决,一是需要确保存入链上2-2公共账户用来开启通道的资金不会被永久锁住拿不出来,二是通道中即在链下发生的众多交易,花费的都是公共账户中同一个UTXO的资产,如何解决用过时交易的欺骗手段进行恶意花费的问题。 闪电网络实际上采用了一套包括多个交易和合约的设计同时解决了这两个问题,但是第一个问题是在解决第二个问题的方案中完成的,即闪电通道的思考重点是如何杜绝利用链下通道中的过时交易实现对链上资金的恶意花费,在解决这个问题时,同时也解决了公共账号的资金被锁问题。 在这个思维框架中,恶意花费是影响通道交易安全和系统可信度的最大问题,也是核心问题,因为交易双方都用动机把链下发生过但是状态(即双方的余额数量或者金额)已经过时的交易广播出去,企图以过时的状态进行结算并关闭通道,目的当然是为自己谋取非法的收益。 这个问题能够发生是因为比特币区块链只能验证交易提供的签名是否符合解锁要求,而通道记录的交易代表的是链下状态的变化和更新,至于其中哪一笔才能代表链下最新或者有效的状态,这不在区块链的验证机制内,在链上是区分不出来的。就区块链能验证的部分来说,通道中的每一笔承诺交易都符合解锁UTXO的条件,因为闪电通道是双向通道,双方都需要在每一笔承诺交易中交换签名才能生效,因此每一笔生效之后的承诺交易都符合公共账户中 2-2 UTXO的解锁条件,对区块链来说它们都是合法的。 所以作恶者有动力在众多的链下交易中选择一笔对自己最有利的,比如分给自己余额最多的一笔交易,提交出去进行广播和结算,从而让自己能够从公共账户中多分配一些资金(比实际应得的多一些),相应地自然就会减少对方的分配(比实际应得的少一些),这样作恶方的恶意花费就会让对方受到资金损失。 这种情况通常发生在作恶方向对方支付了一笔或者几笔资金之后,单方面申请结算并关闭通道,在申请结算时会选择他向对方付款之前的交易去进行广播。相当于买方购物时在付款拿到了对方的商品或服务之后,却想撤回付款,企图让对方的商品给出去了却拿不到钱,实质就是恶意花费。 确定核心目标 我们把这个问题梳理一下:通道中可能会发生很多笔承诺交易,在发生的当时它们都是有效的,但是每一次新交易发生就会把上一笔交易的状态覆盖了,变成了新的状态,于是之前的状态就都无效了。根据这个逻辑整个通道中只有最后发生的一笔交易能够代表通道中的实际状态或者最终状态,其它交易代表的都是过去的状态。所以最后结算的时候,链上公共账户中的资金只应该按照最后一笔交易记录的余额给双方转账,其他任何一笔承诺交易都不能够再花费链上这笔资金。这就是比特币交易中通常所说的一个UTXO不能被花费两次。 这样一来通道的核心目标就可以定位为必须保证通道中只能有一笔且必须是最后一笔交易能够成功花费链上2-2公共账户的资金。 通道中那么多交易,如何才能保证只有最后一笔能够成功花费链上多签账户中的UTXO呢? 我们再拆分一下 要实现这个目标,首先要确保通道中只能有一笔承诺交易的状态是有效的,其次所有其他交易所代表的状态都必须要被作废变成无效状态。也就是每发生一笔新的交易产生一个新的状态时,不仅仅是要创建一笔新的承诺交易来代表新的状态,同时还要作废之前那一笔交易,让旧交易的状态变得无效。 确定解决思路 作废过时交易,让所有过时状态变得无效,通常的思路有两种,一是删除掉代表过时状态的交易,二是用一些办法阻止过时的交易被提交去广播,让它上不了链; 第一种思路即删除已经过时的交易首先可以排除。因为在UTXO模型中,如果一笔签署过的交易已经发给对方生效了,要想撤销或者删除它几乎是不可能的。因为区块链的确认原则是只要交易内容没有问题,又有符合条件的签名,交易就是合法的,对方就能随时广播到区块链上去被执行。因此通过删除或者撤销交易本身实现对过时状态的作废是不可行的。 所以在之前的通道方案中基本上都是采用后一种思路,阻止广播过时的交易,比如中本聪是用序列号的高低决定能广播的交易,只有序号最高的一笔交易能够被广播,如果这笔被广播了其他就都不能被广播了,因为它们花费的是同一个UTXO。Spilman 是单向通道,只允许一方广播交易进行结算,而这一方又没有动力广播过时的交易,因此不存在这个问题。后面几种通道用到了时间锁的方案,都是用锁定时间多少来决定哪一笔交易能最先被广播,只有锁定时间为0的交易才能被广播,而时间锁递减原则保证在同一时间只有一笔交易时间锁能到期,所以只有这一笔交易能够被广播。 时间锁确实解决了过时交易被广播的做恶问题,但是因为这个时间的规定又产生了很多限制,比如通道生存时间的限制,通道内能够容纳交易数量的限制。而且如果两笔交易之间的时间间隔设计不合理,也有可能让过时交易被成功上链而有效交易却广播失败,从而导致一方用户的资金损失。 所以时间锁也不是最好的思路。 闪电网络的支付通道没有采用上面两种思路,甚至都没有采用阻止过时交易被广播和上链的思路。 闪电通道允许过时的承诺交易被广播 它采用了另一个方向,允许作恶方把过时的交易广播出去,但是用一系列机制保证区块链只接受最后一笔承诺交易。 通道中所有过时的交易虽然在区块链的眼里都是合法的,但是通道设计了一套机制让区块链不会采用它们的记录作为结算依据,更不会执行对应的资金分配。所以过时的交易虽然可以被广播,但是即使广播出去了,上链了,它的状态也不会被区块链所接受,只有最后一笔承诺交易被广播才能最终成功得到链上结算,这样就变相地实现了链下交易只能有一笔是有效状态的目标。 作废状态的手段:惩罚 做恶交易不被区块链接受只是第一步,要让过时交易的状态失效,还需要更进一步的措施: 通过保障广播过时交易的恶意行为一定会受到惩罚,让交易者主动放弃广播这些交易的念头,即彻底消除作恶者广播过时交易的动机。 能够让作恶者打消做恶动机的是进一步的措施:严厉的惩罚。 闪电通道设计的机制,一方面对主动进行恶意花费的一方进行严厉惩罚,并保证区块链能够强制执行;另一方面,没有做恶的一方却会得到极大的奖励。 以作恶方在通道中全部资金的经济损失为代价让交易者不愿意或者不敢广播过时交易,主动选择广播代表当前真实状态的交易。同时将作恶者的所有经济损失转化为对未作恶者的奖励,来鼓励交易者保持诚实交易的动力。这是闪电通道实现免信任的思路。 可见,它的思路是从消除作恶者动机这个角度入手,重点在保障广播过时交易的恶意行为一定会受到惩罚。 既防患于未然,又除患于已然。只要交易者都能按照承诺诚实交易,不尝试恶意花费进行欺骗,那么最终区块链会按照两方的实际状态进行结算并给双方分配应得的余额。但是只要有一方尝试恶意花费并被确认,那么一定有办法让作恶者受到惩罚,同时还能让另一方得到奖励。 这是跟其他方案都不同的思路,不阻止你作恶,但是保证作恶必定不成功,而且一定会受到惩罚;同时在作恶发生时,不作恶的一方必定会得到奖励。这是更符合人性的一种思路,因为人都有怕自己的既得利益被剥夺的心理。 三、免信任问题如何解决? 根据以上的思维框架,我们能够梳理出闪电网络建立免信任通道需要解决的两个问题: 问题1:如何保证过时交易被广播上链却不能花费? 问题2:广播过时交易的作恶行为如何受惩罚? 下面我们就来看闪电网络的解决方案。 (一)如何保证过时交易被广播上链但不能花费? 1. 如何理解交易被广播了却不能花费这个说法? 第一承诺交易记录的是双方在通道中的余额分配情况,专业一点叫通道状态,每笔交易会用两个 Output 分别向两方分配余额,也就是一个承诺交易中至少要有两个Output,一个分配给自己,记录的是自己的余额状态,另一个分配给对方,记录的是对方的余额状态。 第二每方都要持有一份承诺交易,在每一方持有的交易中,分配给自己的 Output 叫做本地 Output,分配对对方的叫做远程 Output。 第三是每一方申请结算时的操作,申请结算就意味着通道关闭,并把链上公共账号中的资金给两方分了。反之如果没有发起申请结算的交易,承诺交易就只是双方之间在链下记录的账目。 闪电通道申请结算有两种操作,一种是以双方合作的方式进行结算,经过协商之后双方用最新的承诺交易状态创建一笔行权结算交易,根据承诺交易的两个Output 在行权结算交易中创建两个新的 Output,新建的 Output 不带任何限制条件;然后双方在行权结算交易上交换签名,之后任何一方都可以把行权结算交易广播到链上去结算。通过这种方法关闭通道双方都不用等待,交易被确认就都能拿到自己的资金。 另一种方法是由某一方单方发起结算,这种方法是直接使用承诺交易去广播,以承诺交易本身的两个Output 状态作为结算的依据。 两种方法的不同是行权结算交易需要创建新的交易和Output, 取消了承诺交易中 Output 的限制条件,但是需要双方在新交易上交换签名。而承诺交易是现成的,在每次发生交易时就创建好了并且生效了,所以结算时不需要新建交易和新的Output。 用承诺交易去进行结算,好处是不需要跟对方协商,不需要重新创建交易,创建新的结算Output,也不需要重新交换签名。因为每一笔承诺交易在生效的时候对方都交换过签名,而且每一方手里都持有一份,所以任何一方随时都可以拿出一笔承诺交易去进行广播申请结算。但是承诺交易的两个Output 中有一个是带条件的,对主动发起结算的一方做了付款期限的限制。所以用这种方法去结算,主动发起结算的一方需要等待,限制期限满了才能拿到资金,但是被动方不需要等待,交易广播了就能拿到资金。 第四在闪电通道中,我们说的作恶方指的是主动发起结算的一方,只有主动方才能够进行作恶的操作,因为广播哪一笔交易是由主动方选择的,他不可能选择一笔对对方更有利的交易去广播。因此作恶方一定是主动广播交易的那一方。 最后就是“不能花费”到底指什么,它针对的是被广播的承诺交易向作恶者分配余额的那个 Output,也就是上面讲的向持有者(也是主动广播者)分配余额的本地 Output。这个说法不针对给另一方分配余额的Output,因为在一方主动广播承诺交易的操作中,另一方没有作恶的可能性。 “不能花费”的意思就是在过时交易被广播出去之后,其中的本地 Output 会失去给作恶者分配余额的能力,就是承诺交易中本地 Output 的交付能力被限制了。但是给未作恶者分配余额的 Output 仍然不受影响,会在承诺交易被广播时立即支付给对方。 2. 如何让 Output 不能花费? 这里涉及两个问题,一是承诺交易中的 本地 Output,如何保证它在交易被广播的时候不会像远程 Output那样立即就把余额给付出去。第二是如何让本地Output不能向作恶者分配余额。 第一个问题:如何让本地 Output不能像远程 Output 那样在承诺交易被广播时立即就支付 RSMC 合约 闪电通道承诺交易的两个Output 中,有一个是带条件的,带条件的就是本地 Output。 条件是由一个叫做 RSMC 的合约来设定,RSMC 的全称是 Revocable Sequence Maturity Contract,翻译为可撤销的按序(指序列号)到期合约。要解释这个名称比较复杂,我们现在只需要知道它是通过一系列有依赖关系的交易组合起来实现一个合约的功能就行了。 RSMC 对 本地 Output 的限制 这个合约的第一个功能是限制了本地 Output 的花费条件,可以理解成本地 Output 就是一个由 RSMC 地址控制的交易输出,所以要花费本地 Output 中的资金其实就是要解锁 RSMC 的 Output。 为什么要限制本地 Output 立即支付的能力,是因为这个 Output 是向主动申请结算的一方支付余额的交易输出,而主动方在广播交易进行结算时,可以选择性地提交对自己最有利的承诺交易,因为区块链没有区分链下交易有效性的能力,因此主动方既有作恶的动机,也有作恶的能力。最终结算能不能按照主动方提交的方案进行分配还需要进一步验证。限制这个交易输出的支付时间,就是为了让后面的操作有足够的时间。 RSMC Output 的解锁路径 RSMC合约规定 RSMC Output 解锁的路径有两个,一个是由主动发起广播的一方自己花费,另一个是由对方即没有发起广播的一方花费。 交付交易 Delivery Transaction 在闪电通道中,承诺交易中向两方分配余额的两个 Output,都不是直接打款到两方地址,而是需要针对本地 Output 和远程 Output 分别发起各自的花费交易,闪电通道中叫做交付交易 Delivery Transaction,它的意思我理解是把承诺交易 Output 中的资金,交付(就是按照约定进行转账)给 Delivery Transaction 的 Output。 可撤销交付交易 Revocable Delivery Transaction 本地 Output 按照正常的约定是应该分配给主动方的,因此主动方对这个 Output 发起的花费交易,就是一笔交付交易。 如果是由主动方发起的花费 ,他创建的交付交易必须带有时间限制,需要等到限制时间到期之后才能广播。这个路径能够花费成功的前提是主动方没有作恶,即广播的的确是最新的承诺交易,那么本地 Output 的资金就会交付给主动方发起的交付交易。但是如果广播的不是最新的承诺交易,就意味着主动方作恶了,因此这笔交易肯定就不会成功得到交付,而且作恶方还会受到惩罚。这也是这笔交易需要设置时间限制的原因,需要给判断作恶与否以及执行惩罚提供时间。 主动方这笔交易的交付申请其实是在可与不可之间,不可时就会被撤销,所以这笔交易被叫做可撤销交付交易 Revocable Delivery Transaction。 违约惩罚交易 Breach Remedy Transaction 根据RSMC约定,本地 Output 的另一个花费路径就是由被动方,即没有发起广播的一方来花费。被动方也需要广播一个交易,它不带时间限制,不过我理解这笔交易不属于交付交易的范畴,因为本地 Output 按照正常约定不是分配给这一方,RSMC在花费条件中规定这一个路径是为了惩罚违约行为,所以这个交易叫做违约惩罚交易(Breach Remedy Transaction),或者违约补偿交易。这个路径能够花费成功的前提是主动方确实作恶了。 不管那一个路径能够花费成功,反正目前需要实现的效果就是本地 Output 被拖住不能立即支付,要为后面的验证和操作腾出时间。 第二个问题:如果确实是作恶了,那么怎么保证本地 Output 不会把余额支付给作恶方? 思路 这个问题还是要利用 UTXO 的能力和特性,即UTXO不能被双花。一个UTXO只能被一笔交易所花费,这是区块链在验证一笔交易时就会验证的内容,它会根据一笔交易输入中引用的交易和UTXO序号进行查询,只有没有被花费过的UTXO才能进入下一步金额和签名的验证,这是区块链本身保证的特性。 根据这个特性,如果有多笔交易的资金来源都是同一个UTXO,那么只有最先被广播并成功上链的一笔能够花费这个UTXO。而那些没有广播的交易,都会失效,因为它们要花费的同一笔资金已被转到广播成功那笔交易的UTXO里面。 方法 既然一个UTXO不能花费两次,那就可以创建一笔竞争交易,花费同一个UTXO,跟作恶者的交易进行竞争,看谁的交易能够先被广播。 闪电通道中创建的竞争交易就是违约惩罚交易(Breach Remedy Transction),是由被动方去广播,它要实现的就是取代主动方的可撤销交付交易,换成由被动方花费本地 Output ,即RSMC中规定的第二个路径。 如果违约惩罚交易成功取代了可撤销交付交易,那么本地 Output 中的余额就会付到被动方的地址中,作恶方便没有可能再得到这笔资金。 这样就实现了让承诺交易的本地 Output 失去向作恶者支付余额的能力,同时它还实现了把本地 Output的余额支付给未作恶方的目的,以作恶者失去所有资金的代价实现了对作恶者的惩罚,也以另一方获得所有资金的奖励实现了对未作恶方的褒奖。 那么如何能够让违约惩罚交易取代作恶者的可撤销付款交易呢? 还是要在交易广播的时间上想办法,通过设计让违约惩罚交易能比可撤销付款交易更早广播就能抢先花费本地 Output,从而作恶者的交易就被取代而失效。 3. 违约惩罚交易如何能抢先广播 也是时间锁的思路,通过合约的设计让作恶者的交易广播时间被限制在一定范围以后,而让违约惩罚交易能够更早被广播,只要符合解锁条件就可以立即支付,所以只要违约惩罚交易能在作恶者交易被限制的时间内完成上链,就能抢在作恶者的交易之前完成对本地 Output的花费。 这样违约惩罚交易就花费了分配给作恶者的余额,作恶者的交易就失效了,因为资金已经被转走了。而违约惩罚交易的UTXO 接收人是未作恶方,于是作恶者自己的余额就转给了未作恶方。 4. 作恶者的交易如何被限制 1)在交易中增加能限制交易被广播时间的时间锁 两种时间锁 限制交易广播时间的功能一般都是采用时间锁的思路,但在闪电通道中使用的不是常用的绝对时间锁,而是相对时间锁。 绝对时间锁用nLocktime 来表示,是用来限制一笔交易进入区块的时间。 相对时间锁用nSequence来表示,它限制的是一笔交易中某一个UTXO 能够解锁的时间。 因为RSMC合约要限制的其实是已上链的承诺交易中本地 Output 的解锁时间,而不是承诺交易进入区块的时间,所以要用nSequence。 设置在哪里? 一笔交易可能会有几个资金来源,比如闪电通道开启通道时的注资交易就有两个资金来源,每个资金来源都会成为这笔交易的一个交易输入,把这笔交易和它的资金来源之间连接起来的就是交易输入中的引用,所谓引用就是在交易输入中注明资金来源的UTXO序号,以及所在的交易编号。这样就能根据交易编号和UTXO序号定位到资金来源。 nSequence 就设置在一笔交易中的交易输入中,因为交易输入必须要引用某个交易以及一个UTXO作为资金来源,nSequence 要限制的就是引用的这个UTXO的解锁时间。 在闪电通道中,nSequence 要限制的是在主动方用可撤销交付交易对承诺交易中 RSMC Output 进行花费时的解锁时间,所以 nSequence 就设置在可撤销交付交易里引用承诺交易 RSMC Output 的那个交易输入中。 2)相对时间锁 nSequence 实现了对作恶者交易的限制 nSequence 是一个整数值,它表达的是一笔交易所在的区块经过了多少个区块的确认。这里的 nSequence 表达的就是可撤销交付交易所引用的 RSMC Output 所在的承诺交易进入区块之后,这个交易所经过的区块确认数。 nSequence 的这种设置要实现的功能是把可撤销交付交易创建好就放在那里,等它的输入所引用的UTXO所在的交易进入区块之后,看这个区块后面跟随了多少个区块,也就是交易经过了多少个区块确认。要等交易的确认数达到 nSequence 设定的值之后,可撤销交付交易才能被打包,然后广播进区块链。 由此可见,nSequence 是实现通过一笔交易在区块链上存在的时间来计算另一笔交易的广播时间。具体来说是用承诺交易被广播上链之后获得区块确认的数量这个时间来计算可撤销交付交易的广播时间。对可撤销交付交易来,承诺交易被确认的数量是一个相对时间,而不是一个绝对时间,如多少天,多是个区块高度这样。 举例来说,如果 nSequence 设为1000,那么承诺交易被广播之后要获得1000个区块的确认,可撤销交付交易才能被广播,RSMC Output 才能被解锁,资金才会交付给可撤销交付交易; 所以通过 nSequence,主动方想要花费 RSMC Output 的交易会被锁住,必须等 nSequence 设定的时间到期才能被广播并进行解锁操作。 到这里,实现闪电网络免信任的第一个问题《如何保证过时交易被广播上链却不能花费?》就解决了。接下来是第二个问题 (二)作恶行为如何受到惩罚 广播过时交易的行为会受到惩罚,这个问题又可以继续拆分 第一,确定交易双方到底有没有作恶? 第二,如果有人作恶如何保证做恶行为一定能被惩罚? 要解决第二个问题又需要回答下面的两个问题 一 是要弄清楚做恶的是哪一方?就是谁把过时的交易广播出去的? 二 是如何惩罚作恶者,即如何支付罚金? 我们逐个来看 第一,如何确定交易双方到底有没有作恶? 作恶具体是指什么行为? 支付通道做恶是有特殊针对性的,它指的是把链下的承诺交易广播到链上去申请结算和关闭通道这个操作,所以是不是有做恶要确定的是结算交易提交的承诺交易是不是最后一笔。 闪电通道判断是否作恶的方法 我们知道区块链其实是不能判断哪一笔链下交易代表的是通道最后的状态,因此闪电通道的方法不是让区块链去做这个判断,而是提供一个挑战期,让对方提交证据发起挑战。如果发起结算的一方确实做恶了,那么受损失的会是另一方,因此另一方一定会提出挑战。 挑战的证据就是上面讲过的违约惩罚交易,那为什么违约惩罚交易能够确定结算的交易是不是恶意交易? 违约惩罚交易为什么能判断是否作恶? 因为违约惩罚交易只是为已经过时的承诺交易而构建的,不是为最新一笔承诺交易而建。 这句话的意思是说,只有过时的承诺交易才会有对应的违约惩罚交易,而刚创建的最新承诺交易是没有违约惩罚交易的,需要等待下一笔交易发生时,在创建承诺交易的时候才会为这一笔承诺交易创建对应的违约惩罚交易。 违约惩罚交易的生效机制 每一笔新的承诺交易发生时,双方各自需要创建一笔承诺交易来让通道从上一个状态更新到下一个余额状态,但是在对承诺交易进行签名之前,双方需要各自为上一笔承诺交易构建一笔违约惩罚交易,等双方都在违约惩罚交易上签了名,并交换了签名之后,他们才会返回去签署新的承诺交易,然后交换签名。 这就意味着,新的承诺交易生效的同时,上一笔交易的违约惩罚交易就生效了,双方随时都可以广播出去。 违约惩罚交易的作用就是用来取代上一笔交易中主动方花费RSMC Output 的可撤销交付交易。 由于违约惩罚交易中没有限制条件,而可撤销交付交易却有nSequence的时间限制,如果发起结算的一方确实作恶了, 违约惩罚交易能够比可撤销交付交易更早完成对 RSMC Output 的解锁,结果就是上一笔交易的可撤销交付交易被撤销了,而且主动发起作恶交易的一方所有资金还会被罚没,全部转给没有作恶的一方,这就意味着交易的两方都不敢广播上一笔承诺交易,当然更早的也不敢广播,那么所有的过时交易在新承诺交易生效时实际上都已经作废了。所以每一笔违约惩罚交易的最终目的是作废上一笔承诺交易,保证通道中始终只有最新的一笔承诺交易是有效的。 根据违约惩罚交易的构建和作用机制,如果被动方确实广播了一笔违约惩罚交易,并且还通过了链上的挑战验证,就说明这笔结算交易确实做恶了,因为如果广播的承诺交易是最新的,那么被动方手里就不会有一笔对应的违约惩罚交易,更不会通过验证。 反过来说,如果在挑战期(挑战期就是可撤销交付交易中 nSequence 规定的时间),被动方没有广播违约惩罚交易,也就是没有提供挑战的证据,那就说明广播的是最新承诺交易,没有人做恶。那么挑战期结束,主动方就可以广播可撤销交付交易去解他自己那部分资金,到此结算就全部完成了。 第二,确定谁是作恶方? 区块链不能分辨哪一方在做恶是因为链下发生的承诺交易,双方手中持有的都是一样的版本,都有双方的签名,而且双方都可以提交同一笔交易到链上去结算。 因此闪电通道的方案中,对承诺交易的版本进行了区分。 同一笔承诺交易,设计了两个版本,双方各持有一个不同的版本,而且都只能广播自己手中这个版本,相当于通过承诺交易的不同版本为通道两方进行了标识,区块链通过广播到链上的结算交易就能判断提交的是哪一方的承诺交易,进而就能判断是哪一方在发起结算请求。 承诺交易的两个版本相同的地方是 实现的都是同一个结果,都是按照最后一笔承诺交易的状态为两方分配余额; 都包含两个 Output,本地 Output 用来给主动发起广播和结算的一方分配余额,远程 Output 用来给被动方或未发起广播的一方分配余额; 本地 Output 的转账行为都受 RSMC 合约限制,远程 Output 则不受限制,都在承诺交易被广播时立即支付。 不同的地方是 两个版本限制的对象不一样,比如 A 版的本地 Output 中 RSMC 限制的是 A 方,B方却不受限制;B 版则相反,限制的是B,A却不受限制 每方只能持有和广播自己的版本,比如 A 方只能持有A版,B方只能持有B版;A 方只能广播 A 版,B 只能广播B版。 承诺交易被这样设计,如果广播到链上去的是A,那么区块链就能判断发起广播的是A方,这样就能实现确定广播者,以及作恶方是谁的目的。 第三,作恶方如何支付罚金? 其实就是 RSMC 合约以及它所规定的两个花费路径。 (1)通过广播的交易版本确认了主动发起结算的是哪一方; (2)通过RSMC合约限制了本地 Output 对主动发起承诺的一方分配余额的时间; (3)可撤销交付交易用nSequence 限制了主动方花费 RSMC Output的资金; (4)被动方广播违约惩罚交易经区块链验证; (5)验证通过证实对方的作恶行为; (6)因为违约惩罚交易没有时间限制,可以立即解锁 RSMC Output,完成对承诺交易本地 Output的花费; (7)作恶方的可撤销交付交易被撤销,失去了他在通道中的所有资金; (8)而没有作恶的一方,在承诺交易被广播的时候就拿到了远程 Output 分给资金的那部分资金,后面又通过违约惩罚交易拿到了对方的资金,所以他拿到了通道中所有的资金。 这样保证通道不能做恶的三个问题都被解决了,这个设计中包含了两个版本的承诺交易,还有两个版本的可撤销交付交易,两个版本的违约惩罚交易,其实还有两个版本的交付交易,总共8个交易。 前面我们没有怎么涉及的是被动方用来花费远程 Output 的交付交易,因为闪电网络白皮书中没有细讲,我也没有弄明白是怎么创建的,应该是在闪电通道中的重要性相对来说比较低吧,我的理解其实不要这个交易,远程 Output 应该也能实现立即付款的功能。 这些交易中的可撤销交付交易和违约惩罚交易都是RSMC合约中的设计,可见通过这一系列交易的设计,完成了RSMC合约惩罚通道的作恶行为和奖励未作恶一行为的规定。 以上是闪电通道免信任其中的一个核心问题,即如何解决用过时交易的欺骗手段进行恶意花费。 还有一个核心问题是如何确保存入链上2-2公共账户用来开启通道的资金不会被永久锁住拿不出来。 如何防止注资交易2-2多签账号中的资金被锁? 对闪电通道来说其实这个问题比较简单,而且通过解决上面的其他问题,这个问题已经已经被解决了。 解决方案就在承诺交易 闪电通道的承诺交易都是双方各持有一份,而且都交换过签名的。所以只要把第一笔承诺交易的分配方案设计成匹配注资交易中双方的充值金额就行了,承诺交易的其他设计都不用变化。 比如开启通道时如果双方都充值了0.5 BTC,那么第一笔承诺交易的两个 Output 金额也都是 0.5 BTC,远程和本地的金额都一样。 只是这一笔承诺交易不是在通道中发生的交易,它代表的是双方的初始余额状态,即第一笔链上交易的状态。我们可以把它设为0#承诺交易,作用相当于其他通道中的退款交易。 0#承诺交易的作用原理 0#承诺交易还是需要用 RSMC 来约束本地 Output。限制它向主动发起结算一方支付余额的时间。 如果通道中还没有发生交易,一方就跑路了,那么另一方可以主动广播自己手中的0#承诺交易,因为还没有发生过链下的通道交易,那么对方手中就不会持有0#承诺交易的违约惩罚交易,因为双方还没有创建过通道交易。这种情况,发起结算的一方只需要等待时间锁到期就可以拿回自己的资金。 当然,如果通道中已经发生过交易了,那么双方就一定创建过0#承诺交易的违约惩罚交易并交换了签名,此时再广播0#承诺交易就是作恶了,对方就能通过广播违约惩罚交易对作恶方执行惩罚,这是0#承诺交易中仍然需要RSMC合约的原因。 其实0#承诺交易跟其他的链下承诺交易作用原理都是一样的,只是它只能用在通道中还没有发生过交易的情况,目的是用来结算双方的初始余额。 以上就是闪电通道免信任的整体思路和方案原理。 至于通道具体是怎样设计的,比如通道的流程,每一笔交易如何构造,合约怎样设计,后面有时间再写。 学习闪电网络才让我明白什么叫烧脑,感觉我的大脑已经崩盘无数次了。然而这才开始呢,后面还有好长的路,哈哈。 相关阅读 Nervos Fiber Network 轻皮书学习(1):闪电网络介绍 x.com/xueblock/status/182838… Nervos 闪电网络轻皮书学习(2):单向支付通道 x.com/xueblock/status/183206… 闪电网络学习3:支付通道的演化 x.com/xueblock/status/183593… 参考资料 闪电网络白皮书: lightning.network/lightning-… 精通比特币: github.com/bitcoinbook/bitco… 播客《Lightning Network 技术演化史》: xiaoyuzhoufm.com/episode/5e2… Jan 带你细数八种支付通道方案: mp.weixin.qq.com/s/v6NR68fDw…
17 Sep 2024
闪电网络学习3:支付通道的演化 1. 支付通道的演化 原来计划没有打算写支付通道的演化历程,但是这段时间听了 Jan 的播客和视频,发现从中本聪提出支付通道这个想法到闪电网络提出一个比较完整的方案,这中间还经历过很多版本的演化,而且有些方案也经过了精心的设计,虽然不是每一个版本最终都被实现了,但是这些设想也为闪电网络后来在众多的方案获得成功做出来贡献,因此还是想把这部分整理一下。 在闪电网络出现之前,支付通道的发展已经经历了好几代方案的演化。主要包括 1)中本聪在比特币0.1版本中的构想 中本聪的设想是如果一笔交易还在内存池里没有被打包,那么它就可以被修改,通过在新的交易中设置比旧交易更高的序列号,并以序列号的高低作为判断是否是最新交易的标准,从而让矿工能够根据序列号高低决定应该打包哪一笔交易。 中本聪的版本被认为是支付通道的雏形,不过它有一个明显的缺陷,就是比特币协议没有这个机制,所以区块链无法保证矿工一定能够打包序列号最高的交易,容易出现支付者和矿工合谋攻击收款人的问题,最终这个设想没有被实现。 不过它已经包含了支付通道的完整思想:把一层要处理的大量交易搬到链下去处理,同时通过一些设计保证链下处理的交易是安全和无需信任的,最后还能把链下处理的交易结果搬回链上进行验证和结算,通过链上的算力保证链下交易的安全和可信。 2)比特币社区对中本聪设想的完善 很快社区对中本聪的构想提出了改进思路,在交易中增加 nLockTime 即时间锁的字段。如果 nLockTime 字段设置了有意义的数字,比如10天,意味着这笔交易会被锁定10天,只能等到10天之后才会被打包,任何矿工都不能在这个时间之前打包这笔交易。 nLockTime 字段的改进解决了中本聪版本中合谋的问题,设计了一个单向的支付通道,用于支付方向收款方进行单向支付,不能逆向支付。 这个版本也没有进入实现。 3)Spillman 版支付通道 Spillman 支付通道也是一个单向的支付通道,就是我在上一篇文章《Nervos 闪电网络轻皮书学习(2):单向支付通道》中详细讲解过的那个版本。x.com/xueblock/status/183206… 它是第一个被真正实现了的支付通道,在BitcoinJ 客户端里面完成了真正的实现。 不过 Spillman 支付通道也有两个问题 一是通道的生命周期限制 接收方必须在 TimeLock 时间到期之前申请结算并关闭通道。如果到期了还没关闭,就只能通过付款方广播退款交易进行关闭的申请,这时候通道中所有的资金都会退回给支付方,收款方将会一无所获。 二是Spillman 支付通道容易遭受可塑性交易的攻击。 所谓可塑性是指一个东西的形状发生了变化,却没有导致本质比如质量的变化。交易的可塑性指的是,一笔交易的某些内容被改变了,会导致交易ID的改变,但是交易中最本质的部分,就是交易输出,以及输入中的资金来源,金额等却并没有变化。 比特币交易中最容易被改动又能导致交易ID改变的内容是交易输入中的签名,因为在隔离见证之前的比特币协议,签名也被纳入计算交易ID的整个交易数据中,交易ID其实就是把一笔交易整体的数据进行哈希计算得出的哈希值。根据哈希函数的特性,只要输入的数据有一点不一样,哈希值就会不一样,因此如果签名被改动了,交易ID就会不一样。 签名能够被修改的原因是签名可以通过很多种算法计算出来,要用那种算法在构造交易的时候可以自由选择。所以当通道中支付方把承诺交易发给收款方之后,收款方可以通过换一个签名算法修改掉交易的签名,导致交易的ID发生变化。 Spillman 是单向的支付通道,交易只需要由支付方签名然后发给收款方,不需要对方签名再发回来保管,因此收款方在广播交易时很容易进行这样的操作。 虽然交易ID被修改了,但是区块链并不能识别,因为伪造交易的 input 和 output 内容跟原交易是一样的,所以交易仍然是有效合法的。而TXID是标识和区分一笔交易的唯一方法,TXID改变了,就会带来很多问题,比如门头沟交易所被盗,就是在交易的可塑性上出了问题。 4)Peter Todd 对 Spillman 支付通道的改进 在 Spillman 支付通道的基础上,Peter Todd 提出了一个比特币改进提议,即BIP65,这是一个软分叉提议,在比特币协议中增加一个操作码,叫做 CHECKLOCKTIMEVERIFY 的 OP_CODE ,用于加强 Spillman 支付通道协议。目的就是解决交易的可塑性攻击问题。 不过这个改进版仍然是一个单向通道,用途还是非常有限。 5)Duplex 双向支付通道 这个版本的设想很简单,就是把Spillman的单向通道直接变为双向的,它的想法就是在一个通道基础上增加一个,不就有两个通道,一个让A给B支付,另一个只让B给A支付。两个通道一起运行就是成双向通道了。 它的问题是并没有很好解决 Spillman 通道的问题,比如生命周期有限。 Duplex 的通道还会出现一个新的问题,通道资金容量小。 通道中同样金额的资金能够支付的额度会减少一半,通道资金容量的使用率非常低效。 比如同样是100元的资金,如果放在 Duplex 双向通道中,每一个通道中就只有50元,于是不管是A向B支付,还是B向A支付,双方能够支付的最大金额就是50,所以双方加起来总的支付额度就是100元。 但是如果把100元放在一个单个的双向支付通道中,这100元资金能够实现的支付能力就有两倍,即达到200元的支付额度。因为所有资金是有可能全部都付到一方去的,比如A的50元全部付给了B,B就有了100元,这时候B又可以分多次把这100全部付给A。 如果一个通道额度用完了,想要继续支付就只能到链上去关闭通道,再重新充值开一个新的通道,这会导致额外的链上成本。 6)基于时间 Timelock 的双向支付通道 这是在同一个通道中实现双向支付的双向支付通道,在单一的通道中不仅A可以向B付钱,B也可以向A付钱。 它的基本思路是 第一、双方共同向通道提供资金 就是在充值交易中资金来源分别是双方各自提供的一个UTXO,比如分别是1个BTC的UTXO,这两个BTC都支付给同一个交易输出,这个交易输出由双方的私钥共同管理,即2BTC 锁在这个2-2多签交易输出中。 第二、退款交易需要在链上充值之前交换签名 当然在完成充值交易的广播之前,双方同样需要各自签署一笔带有时间锁 nLocktime的退款交易并交换退款交易的签名,用来保证任何一方跑路或者私钥丢失另一方仍然能够在时间锁到期之后拿回通道中的资金,而不至于让资金被锁死在公共账号里面。 双方拿到对方在退款交易中的签名之后才会把充值交易发到链上去进行充值,开启通道。 第三、进入通道之后的承诺交易遵循以下规则 (1)每一笔承诺交易都需要使用新的 nLocktime (2)每一笔承诺交易要按照递减的原则设置nLocktime。 每一个新的承诺交易,在 nLocktime 字段设置的时间要比前面一笔交易的 nLocktime更小;比如第一笔承诺交易 nLocktime 是 1000个区块,第二笔承诺交易nLocktime 只能比 1000小,可以是999,也可以是990,或者更小的区块数。 (3)承诺交易被广播和打包的原则是 nLocktime 时间越小,享有越高优先级。 因此最后一笔承诺交易会比它之前的所有交易都更早被打包。因为根据递减原则,最后一笔交易的nLocktime 时间值会比之前所有承诺交易的锁定时间值更小。 这些规定保证了通道中所有交易中只有最后一笔交易的状态是有效的,因为这么多交易花费的都是同一个2-2 UTXO,UTXO不能双花的特性决定了最终只有一笔交易能够成功广播和上链,完成对2-2交易输出的解锁和花费。而 nLocktime 递减原则又保证了通道中最后一笔交易会被最先广播和打包,所以最终的结果就是只有广播最后一笔承诺交易才能成功实现对多签输出的解锁,完成结算和余额的最终分配。那么其他所有的承诺交易都会因为不能被结算而作废和失效。 这就是基于时间的双向支付通道用来解决通道中支付安全和信任问题的基本思路。 Timelock 双向通道的优点 这个通道是没有挑战期的,即如果关闭通道时提交的是最后一笔交易,那么交易被广播和上链去请求结算的时候,不需要等待时间锁到期。 这个地方我的理解是通过前面的递减最后一笔交易的 nLocktime 应该已经走到 0了。不然好像有点说不通,比如如果在 nLocktime 为 100的时候,有一方就提出了结算请求,那么主动提出结算的一方应该还是需要等100个区块才行。 Timelock 双向通道的缺点 一是通道生命周期还是有限的,退款交易中的时间锁就是通道存在时间的上限。 二是通道中容纳的交易数量是有限的,因为每一次新构建的承诺交易都要把 nLocktime 的值在前一次的基础上减少一些,而且间隔还不能太小。两笔交易的 nLocktime 之间的时间间隔实际上就是保障新交易被广播和打包的时间,这个时间如果太短,新交易还没有完成上链,它前面那一笔交易时间锁很可能就到期了,那么新交易在时间上的优势就不一定有保障了,很可能前面那笔交易会先上链。这样通道就不能保障交易的安全性。 时间锁的值在减小就注定了总有一笔交易 nLocktime 会走到头,比如 nLocktime 的值到 0,就不能再减了,这时候通道中就不能再进行交易了,这个通道能够容纳的最大交易次数就是这么多了。所以 Timelock 的通道交易数量是有限制的。 这个协议是在2014年被提出来的,也是停留在想法层面,没有实现。到2015年闪电网络的方案就被提出来了。 7)DMC(Duplex Micropayment Channel) 上面是两种把单向通道变成双向通道的思路,这期间其实还出现过其他的思路,比如 DMC(Duplex Micropayment Channel)。它的想法是把 Duplex 和 Timelock 两种方案组合起来,解决 Duplex 双向通道资金容量的问题。 根据 Duplex 的想法,两个Spillman通道加起来构成的双向通道缺陷在于通道的资金容量太小,资金利用率低,想要继续交易就得经常去链上关闭通道和重新开启新的通道。它想要解决的就是频繁上链去调整通道资金容量的问题。 它提出把调整通道资金容量,即在一个新通道中增加通道资金的操作放在链下进行,同时引入了一个invalidation tree 的概念。但是这个方案比较复杂,而且有几个问题也没有很好解决,包括支付通道生命周期的问题,它对通道容量重新调整的次数是有限的,也不是不限制次数,还有这个方案单方面关闭通道时需要广播的交易数量比较多,成本比较高,反正到最后也没有看到真正应用起来。就不细讲了。 此后就是闪电网络的方案了,闪电网络的方案几乎解决了前面几种支付通道中没有完全解决的所有问题,而且跳出了这些方案的解决思路和框架,没有在 Spillman 通道,Timelock 和 Deplex 等通道的思维框架里面进行设计,而是另起炉灶,走了一个完全不同的路。 不过闪电网络的方案实在有点复杂,可能接下来还需要几篇文章才讲得清楚。所以还是下一篇再正式开始写闪电网络。 2. 支付通道的演化路径 1)只有一方能支付和结束通道的单向支付通道:Spillman 第一个实现的支付通道是Spillman 单向通道。这是一个只能由一方发起支付,另一方发起结束的通道。 通道中的承诺交易只需要支付方签名,由此只有接收方可以通过广播承诺交易来申请结算和关闭通道,而支付方只能在时间锁到期之后通过广播退款交易申请关闭。 优点:设计简单,支付时操作也简单。只有一笔交易,单方签名,另一方保管就行。 缺点:只能单方操作,包括付款,申请关闭;而且容易遭受可塑性交易攻击 2)在两个通道中实现的双向支付通道:Duplex 这个方案比较粗糙,简单粗暴,虽然实现了双向支付,但是缺点也很明显。提供了一个构建双向通道的想法,但是可行性比较差,没有实现。 3)在一个通道中实现的双向通道:TimeLock 双方都在承诺交易上签名并交互签名,于是双方都可以进行付款,广播承诺交易并结束通道等操作。 缺点 1)双方都有广播之前的交易来获得更多资金的动机和可能性 解决办法是在每一笔承诺交易中加上时间锁,并以时间锁的递减设计来实现最后一笔交易可以作废前面所有承诺交易,从而确保只有最后一笔承诺交易能够作为最终余额状态进行结算,防止作恶者广播之前交易进行欺骗的企图。 2)时间锁的限制:退款交易的时间锁决定了通道的生命周期,也决定了通道中能够容纳的交易数量,这样实际运用中也不是很方便。 3. 好的支付通道是怎样的? 综合以上几种支付通道演化中的问题,可以总结一下一个好的通道必须要保证的特性: 1)必须是双向通道,双向都能进行付钱,和发起通道结算; 2)通道中资金利用率要高; 3)通道生命周期没有限制; 4)通道中的交易次数没有限制; 5)通道中交易必须要安全可靠; 6)链上充值交易中的资金要安全可靠,即链下过时交易的状态不能作为链上结算的依据。 参考内容 闪电网络白皮书:lightning.network/lightning-… 精通比特币第3版:github.com/bitcoinbook/bitco… 播客《Lightning Network 技术演化史》:xiaoyuzhoufm.com/episode/5e2… Jan 带你细数八种支付通道方案:mp.weixin.qq.com/s/v6NR68fDw… 本贴结束!
3
12
23
2,288
雪解 retweeted
17 Sep 2024
闪电网络学习3:支付通道的演化 1. 支付通道的演化 原来计划没有打算写支付通道的演化历程,但是这段时间听了 Jan 的播客和视频,发现从中本聪提出支付通道这个想法到闪电网络提出一个比较完整的方案,这中间还经历过很多版本的演化,而且有些方案也经过了精心的设计,虽然不是每一个版本最终都被实现了,但是这些设想也为闪电网络后来在众多的方案获得成功做出来贡献,因此还是想把这部分整理一下。 在闪电网络出现之前,支付通道的发展已经经历了好几代方案的演化。主要包括 1)中本聪在比特币0.1版本中的构想 中本聪的设想是如果一笔交易还在内存池里没有被打包,那么它就可以被修改,通过在新的交易中设置比旧交易更高的序列号,并以序列号的高低作为判断是否是最新交易的标准,从而让矿工能够根据序列号高低决定应该打包哪一笔交易。 中本聪的版本被认为是支付通道的雏形,不过它有一个明显的缺陷,就是比特币协议没有这个机制,所以区块链无法保证矿工一定能够打包序列号最高的交易,容易出现支付者和矿工合谋攻击收款人的问题,最终这个设想没有被实现。 不过它已经包含了支付通道的完整思想:把一层要处理的大量交易搬到链下去处理,同时通过一些设计保证链下处理的交易是安全和无需信任的,最后还能把链下处理的交易结果搬回链上进行验证和结算,通过链上的算力保证链下交易的安全和可信。 2)比特币社区对中本聪设想的完善 很快社区对中本聪的构想提出了改进思路,在交易中增加 nLockTime 即时间锁的字段。如果 nLockTime 字段设置了有意义的数字,比如10天,意味着这笔交易会被锁定10天,只能等到10天之后才会被打包,任何矿工都不能在这个时间之前打包这笔交易。 nLockTime 字段的改进解决了中本聪版本中合谋的问题,设计了一个单向的支付通道,用于支付方向收款方进行单向支付,不能逆向支付。 这个版本也没有进入实现。 3)Spillman 版支付通道 Spillman 支付通道也是一个单向的支付通道,就是我在上一篇文章《Nervos 闪电网络轻皮书学习(2):单向支付通道》中详细讲解过的那个版本。x.com/xueblock/status/183206… 它是第一个被真正实现了的支付通道,在BitcoinJ 客户端里面完成了真正的实现。 不过 Spillman 支付通道也有两个问题 一是通道的生命周期限制 接收方必须在 TimeLock 时间到期之前申请结算并关闭通道。如果到期了还没关闭,就只能通过付款方广播退款交易进行关闭的申请,这时候通道中所有的资金都会退回给支付方,收款方将会一无所获。 二是Spillman 支付通道容易遭受可塑性交易的攻击。 所谓可塑性是指一个东西的形状发生了变化,却没有导致本质比如质量的变化。交易的可塑性指的是,一笔交易的某些内容被改变了,会导致交易ID的改变,但是交易中最本质的部分,就是交易输出,以及输入中的资金来源,金额等却并没有变化。 比特币交易中最容易被改动又能导致交易ID改变的内容是交易输入中的签名,因为在隔离见证之前的比特币协议,签名也被纳入计算交易ID的整个交易数据中,交易ID其实就是把一笔交易整体的数据进行哈希计算得出的哈希值。根据哈希函数的特性,只要输入的数据有一点不一样,哈希值就会不一样,因此如果签名被改动了,交易ID就会不一样。 签名能够被修改的原因是签名可以通过很多种算法计算出来,要用那种算法在构造交易的时候可以自由选择。所以当通道中支付方把承诺交易发给收款方之后,收款方可以通过换一个签名算法修改掉交易的签名,导致交易的ID发生变化。 Spillman 是单向的支付通道,交易只需要由支付方签名然后发给收款方,不需要对方签名再发回来保管,因此收款方在广播交易时很容易进行这样的操作。 虽然交易ID被修改了,但是区块链并不能识别,因为伪造交易的 input 和 output 内容跟原交易是一样的,所以交易仍然是有效合法的。而TXID是标识和区分一笔交易的唯一方法,TXID改变了,就会带来很多问题,比如门头沟交易所被盗,就是在交易的可塑性上出了问题。 4)Peter Todd 对 Spillman 支付通道的改进 在 Spillman 支付通道的基础上,Peter Todd 提出了一个比特币改进提议,即BIP65,这是一个软分叉提议,在比特币协议中增加一个操作码,叫做 CHECKLOCKTIMEVERIFY 的 OP_CODE ,用于加强 Spillman 支付通道协议。目的就是解决交易的可塑性攻击问题。 不过这个改进版仍然是一个单向通道,用途还是非常有限。 5)Duplex 双向支付通道 这个版本的设想很简单,就是把Spillman的单向通道直接变为双向的,它的想法就是在一个通道基础上增加一个,不就有两个通道,一个让A给B支付,另一个只让B给A支付。两个通道一起运行就是成双向通道了。 它的问题是并没有很好解决 Spillman 通道的问题,比如生命周期有限。 Duplex 的通道还会出现一个新的问题,通道资金容量小。 通道中同样金额的资金能够支付的额度会减少一半,通道资金容量的使用率非常低效。 比如同样是100元的资金,如果放在 Duplex 双向通道中,每一个通道中就只有50元,于是不管是A向B支付,还是B向A支付,双方能够支付的最大金额就是50,所以双方加起来总的支付额度就是100元。 但是如果把100元放在一个单个的双向支付通道中,这100元资金能够实现的支付能力就有两倍,即达到200元的支付额度。因为所有资金是有可能全部都付到一方去的,比如A的50元全部付给了B,B就有了100元,这时候B又可以分多次把这100全部付给A。 如果一个通道额度用完了,想要继续支付就只能到链上去关闭通道,再重新充值开一个新的通道,这会导致额外的链上成本。 6)基于时间 Timelock 的双向支付通道 这是在同一个通道中实现双向支付的双向支付通道,在单一的通道中不仅A可以向B付钱,B也可以向A付钱。 它的基本思路是 第一、双方共同向通道提供资金 就是在充值交易中资金来源分别是双方各自提供的一个UTXO,比如分别是1个BTC的UTXO,这两个BTC都支付给同一个交易输出,这个交易输出由双方的私钥共同管理,即2BTC 锁在这个2-2多签交易输出中。 第二、退款交易需要在链上充值之前交换签名 当然在完成充值交易的广播之前,双方同样需要各自签署一笔带有时间锁 nLocktime的退款交易并交换退款交易的签名,用来保证任何一方跑路或者私钥丢失另一方仍然能够在时间锁到期之后拿回通道中的资金,而不至于让资金被锁死在公共账号里面。 双方拿到对方在退款交易中的签名之后才会把充值交易发到链上去进行充值,开启通道。 第三、进入通道之后的承诺交易遵循以下规则 (1)每一笔承诺交易都需要使用新的 nLocktime (2)每一笔承诺交易要按照递减的原则设置nLocktime。 每一个新的承诺交易,在 nLocktime 字段设置的时间要比前面一笔交易的 nLocktime更小;比如第一笔承诺交易 nLocktime 是 1000个区块,第二笔承诺交易nLocktime 只能比 1000小,可以是999,也可以是990,或者更小的区块数。 (3)承诺交易被广播和打包的原则是 nLocktime 时间越小,享有越高优先级。 因此最后一笔承诺交易会比它之前的所有交易都更早被打包。因为根据递减原则,最后一笔交易的nLocktime 时间值会比之前所有承诺交易的锁定时间值更小。 这些规定保证了通道中所有交易中只有最后一笔交易的状态是有效的,因为这么多交易花费的都是同一个2-2 UTXO,UTXO不能双花的特性决定了最终只有一笔交易能够成功广播和上链,完成对2-2交易输出的解锁和花费。而 nLocktime 递减原则又保证了通道中最后一笔交易会被最先广播和打包,所以最终的结果就是只有广播最后一笔承诺交易才能成功实现对多签输出的解锁,完成结算和余额的最终分配。那么其他所有的承诺交易都会因为不能被结算而作废和失效。 这就是基于时间的双向支付通道用来解决通道中支付安全和信任问题的基本思路。 Timelock 双向通道的优点 这个通道是没有挑战期的,即如果关闭通道时提交的是最后一笔交易,那么交易被广播和上链去请求结算的时候,不需要等待时间锁到期。 这个地方我的理解是通过前面的递减最后一笔交易的 nLocktime 应该已经走到 0了。不然好像有点说不通,比如如果在 nLocktime 为 100的时候,有一方就提出了结算请求,那么主动提出结算的一方应该还是需要等100个区块才行。 Timelock 双向通道的缺点 一是通道生命周期还是有限的,退款交易中的时间锁就是通道存在时间的上限。 二是通道中容纳的交易数量是有限的,因为每一次新构建的承诺交易都要把 nLocktime 的值在前一次的基础上减少一些,而且间隔还不能太小。两笔交易的 nLocktime 之间的时间间隔实际上就是保障新交易被广播和打包的时间,这个时间如果太短,新交易还没有完成上链,它前面那一笔交易时间锁很可能就到期了,那么新交易在时间上的优势就不一定有保障了,很可能前面那笔交易会先上链。这样通道就不能保障交易的安全性。 时间锁的值在减小就注定了总有一笔交易 nLocktime 会走到头,比如 nLocktime 的值到 0,就不能再减了,这时候通道中就不能再进行交易了,这个通道能够容纳的最大交易次数就是这么多了。所以 Timelock 的通道交易数量是有限制的。 这个协议是在2014年被提出来的,也是停留在想法层面,没有实现。到2015年闪电网络的方案就被提出来了。 7)DMC(Duplex Micropayment Channel) 上面是两种把单向通道变成双向通道的思路,这期间其实还出现过其他的思路,比如 DMC(Duplex Micropayment Channel)。它的想法是把 Duplex 和 Timelock 两种方案组合起来,解决 Duplex 双向通道资金容量的问题。 根据 Duplex 的想法,两个Spillman通道加起来构成的双向通道缺陷在于通道的资金容量太小,资金利用率低,想要继续交易就得经常去链上关闭通道和重新开启新的通道。它想要解决的就是频繁上链去调整通道资金容量的问题。 它提出把调整通道资金容量,即在一个新通道中增加通道资金的操作放在链下进行,同时引入了一个invalidation tree 的概念。但是这个方案比较复杂,而且有几个问题也没有很好解决,包括支付通道生命周期的问题,它对通道容量重新调整的次数是有限的,也不是不限制次数,还有这个方案单方面关闭通道时需要广播的交易数量比较多,成本比较高,反正到最后也没有看到真正应用起来。就不细讲了。 此后就是闪电网络的方案了,闪电网络的方案几乎解决了前面几种支付通道中没有完全解决的所有问题,而且跳出了这些方案的解决思路和框架,没有在 Spillman 通道,Timelock 和 Deplex 等通道的思维框架里面进行设计,而是另起炉灶,走了一个完全不同的路。 不过闪电网络的方案实在有点复杂,可能接下来还需要几篇文章才讲得清楚。所以还是下一篇再正式开始写闪电网络。 2. 支付通道的演化路径 1)只有一方能支付和结束通道的单向支付通道:Spillman 第一个实现的支付通道是Spillman 单向通道。这是一个只能由一方发起支付,另一方发起结束的通道。 通道中的承诺交易只需要支付方签名,由此只有接收方可以通过广播承诺交易来申请结算和关闭通道,而支付方只能在时间锁到期之后通过广播退款交易申请关闭。 优点:设计简单,支付时操作也简单。只有一笔交易,单方签名,另一方保管就行。 缺点:只能单方操作,包括付款,申请关闭;而且容易遭受可塑性交易攻击 2)在两个通道中实现的双向支付通道:Duplex 这个方案比较粗糙,简单粗暴,虽然实现了双向支付,但是缺点也很明显。提供了一个构建双向通道的想法,但是可行性比较差,没有实现。 3)在一个通道中实现的双向通道:TimeLock 双方都在承诺交易上签名并交互签名,于是双方都可以进行付款,广播承诺交易并结束通道等操作。 缺点 1)双方都有广播之前的交易来获得更多资金的动机和可能性 解决办法是在每一笔承诺交易中加上时间锁,并以时间锁的递减设计来实现最后一笔交易可以作废前面所有承诺交易,从而确保只有最后一笔承诺交易能够作为最终余额状态进行结算,防止作恶者广播之前交易进行欺骗的企图。 2)时间锁的限制:退款交易的时间锁决定了通道的生命周期,也决定了通道中能够容纳的交易数量,这样实际运用中也不是很方便。 3. 好的支付通道是怎样的? 综合以上几种支付通道演化中的问题,可以总结一下一个好的通道必须要保证的特性: 1)必须是双向通道,双向都能进行付钱,和发起通道结算; 2)通道中资金利用率要高; 3)通道生命周期没有限制; 4)通道中的交易次数没有限制; 5)通道中交易必须要安全可靠; 6)链上充值交易中的资金要安全可靠,即链下过时交易的状态不能作为链上结算的依据。 参考内容 闪电网络白皮书:lightning.network/lightning-… 精通比特币第3版:github.com/bitcoinbook/bitco… 播客《Lightning Network 技术演化史》:xiaoyuzhoufm.com/episode/5e2… Jan 带你细数八种支付通道方案:mp.weixin.qq.com/s/v6NR68fDw… 本贴结束!

6 Sep 2024
Nervos 闪电网络轻皮书学习(2):单向支付通道 本文主要内容: 1. 闪电网络的基本思想以及目标 2. 闪电网络实现无需信任支付系统的基本思路 3. 单向支付通道解读 (1)什么是单向支付通道 (2)单向支付通道的运行原理 (3)单向支付通道的问题以及解决方案 (4)单向支付通道的运行流程 (5)单向支付通道的局限 一、前言:闪电网络的基本思想以及目标 上一篇文章主要学习了闪电网络的概念,包括是闪电网络是什么,解决了什么问题,为什么能解决这些问题,以及如何解决的基础思想。 闪电网络的基本思想 我们大概了解了闪电网络的基础是在交易双方之间搭建的支付通道,而在不同支付方之间搭建的若干个支付通道连接起来就形成了闪电网络。 闪电网络的基本思想是以非区块链的模式来解决比特币在日常和零售支付场景下所面临问题,主要是交易速度,容量与成本。这种思想可以理解为从区块链的模式中走出来,在常规思路之外寻找比特币问题的解决之道。 其原理是在区块链的外面去搭建一个网络,让交易参与方之间在这个网络中建立连接彼此的通道,并把需要经常性转账的支付场景移到通道中去,这个通道除了在建立和关闭的时候需要跟比特币网络进行通信,其他时间都是双方点到点的通信。于是通道交易不需要放在区块链网络上处理,只在参与方之间本地处理,实现真正的点对点交易。 这种设计的逻辑是以非区块链的模式来规避所有因为区块链本身特性而带来的性能问题,特别是区块链需要把所有交易数据上链并通过全网共识,即在链上等待其他节点对同一个结果进行验证和确认的机制。数据上链,全员共识等机制带来了高度的安全性和牢固的信任度,这是区块链的优势,但也是阻碍区块链性能提升的底层原因。 因此把不需要数据上链和全网共识的业务从区块链上拿出来,放到一个点对点的网络中,让用户自己在本地去处理,只在必要的时候提供安全和信任保障。这就是闪电网络的基本思想。 闪电网络的简化理解 对闪电网络的理解,可以通过现实生活中的一个场景来简化,比如在现实中的转账或者汇款有两个基本选择,可以去银行柜台汇款,也可以在手机上通过移动支付工具来汇款。根据传统认知我们会认为去银行汇款更安全,更可靠,特别是对公付款或者大额转账。但是银行汇款更麻烦,需要肉身去柜台,汇款有繁琐的流程,可能还需要排队等待,去汇一次款来回可能就需要大半天时间,还要花不少手续费。这种汇款方式对小额,高频的交易就很不友好。 而在微信,支付宝等移动支付工具上转账则方便很多,不需要填表,也不需要手续费,速度快得多,但是要使用这些移动工具,需要开通移动支付的账户,并且从银行里面转一些钱进来。之后付款就可以在腾讯或者淘宝自己的系统里面进行,向开通了同样支付工具账户的人转账,无论多少次,只要支付金额不超过你在里面的余额和每天的支付额度就没有限制。 当然微信和支付宝跟闪电网络还是有很大不同,比如微信和支付宝系统是运行在腾讯和淘宝的服务器上,而非支付者的客户端;付款时在后面处理交易的是微信和支付宝的系统,而非交易方自己。 也就是说使用现有的移动支付工具进行转账其实有一个前提,支付双方必须要信任在后台帮他们处理交易和记账的微信和支付宝的服务器和系统,相信他们不会出问题或者不会作恶。所以这是一个基于信任的支付系统。 闪电网络的目标:实现不需要信任的点对点支付系统 而闪电网络要实现的是一个陌生人之间不需要信任的系统,即支付的参与方不需要信任任何第三方,任何个人,机构或者中心化的实体,也不需要信任交易对手方就能安全地跟陌生人进行直接的交易。在这个系统需要相信的是这一套系统提供的各种安全保障机制,以及保证这一套机制被强制执行的数学,密码学以及计算机代码,因为这一套机制的执行不会被人为干预,因此这是一个无需信任他人,即免信任的支付系统。 本篇文章我们就来学习闪电网络是怎样实现这个无需信任的支付系统。 二、闪电网络实现无需信任支付系统的基本思路 闪电网络是基于链下支付通道,即各个通道相互连接起来形成的一个快速支付网络。 所以闪电网络的实现可以分成两个模块来理解,如何实现支付通道,以及如何实现支付网络。支付通道是在交易双方之间创建的用于支付用途的通道,建立的是双方之间的关系;支付网络即闪电网络则是支付通道之间相互连接而构建的网络,建立的是每个参与者之间的关系。 因此,要弄清楚闪电网络怎样实现无需信任的支付系统,得从支付通道和支付网络分别是怎样实现的两个维度来理解。 我们先从支付通道来学习。 支付通道解决信任问题的主要思路是: 第一、提供保证金:充值资金为通道中进行的交易提供资金来源,也为可能的不诚实行为提供惩罚保证金; 第二、承诺保证:双方通过书面形式,承诺交易和资金状态的有效性,以及自己不会作恶的保证; 第三、合约约定:通过不同的合约约定了在链下通道中进行交易的业务逻辑;约定了什么是诚实的交易行为,什么是违约行为,违约者应当受到什么样的惩罚;针对可能的违约情况,通过合约规定对违约者资金结算的时间期限,以及对方如何向链上提交证据等等。 第四、脚本执行:比特币链针对提交的证据进行验证,并通过脚本执行判罚的结果。 支付通道是闪电网络形成的基础单元,它的发展也经过了不断的改进和演化,慢慢形成了几种分类,主要有单向支付通道,基于时间的双向支付通道,基于惩罚的双向支付通道三种。 而双向支付通道又是在单向支付通道方案的基础上发展而来,因此我们需要先学习和了解单向支付通道是怎么运行的才能更好的理解双向支付通道的运行。 三、单向支付通道解读 1. 单向支付通道的概念 单向支付通道是闪电网络的前身,在闪电网络出现之前很长一段时间单向支付通道的概念就已经存在了。 单向支付通道,顾名思义,是指只能由一方向另一方进行转账的支付通道,因此通道中的充值也是由支付方单方提供的。另一方只能接收付款,无法向对方发起付款。 严格来说,单向支付通道在物理能力上并没有限制收款方向支付方发起转账,只是这个交易是不可信的交易,或者说这个方向流动的资金安全性无法得到合约的保护。因此理论上不会有人愿意接收逆向支付的付款。 这种支付通道的应用场景主要是比如发工资,打赏,在附近的商店超市等购物的支付等。 2. 单向通道的运行原理 1)开启通道 由支付方发起开启通道的交易,创建一个2-2的多签输出(UTXO),并往里面充值BTC;2-2多签交易的输出意思是这个UTXO的持有者是2个私钥,需要提供2个私钥签名才能解锁里面的资金,可以理解为一个由两个人共同管理的公共账户。 这个充值BTC的交易,目的是宣布通道的开启,之后双方可以在通道中进行交易;也宣布了通道中双方的初始资金分配情况,即充值方/支付方全额,收款方0。 2)通道交易 (1)开启单向支付通道的原因 之所以要开通单向的支付通道,是因为一方有经常性多次向另一方付款的需求,比如公司每个月要向员工发工资,任务平台上发布任务的一方要向领取和完成任务的一方按照任务进度多次支付劳务费,还有像用户在内容平台阅读小说,或者观看电视剧,每看一集/一章需要付一次款等等。于是双方在链外开了一个通道进行支付以避免链上频繁交易的成本,因此这些交易都不会实时上链,而是在链外双方之间进行的记账,只有在双方不想继续进行交易的时候,才会把通道中记录的最终结果或者状态提交到链上去进行结算。 通道中发生的很多笔交易最后会形成一个结果或者余额状态,就是也就是最后一笔交易记录的双方余额结果,所以即使在通道中发生了几千几万笔交易,最后只有代表最终结果的最后一笔才会被上链,区块链也会按照这一笔交易的结果对双方进行结算。这样就会大大减少与链上的交互,从而节省成本,让日常交易变得可行。 (2)通道交易的实质 开启通道时付款方向2-2地址充值之后通道里面的资金就是固定的,但是每次在通道里面交易一次意味着付款方要向收款方转一些资金,于是付款方的余额会减少,而对方的余额会增加。因此通道中资金的状态变化规律会是链上和链下的总余额都固定不变,随着交易增多,在链下付款方的余额会不断减少,而收款方会不断增加。 因此通道交易实质上是就通道中双方的资金余额在链下不断进行的重新分配和更新,并对重新分配的余额状态达成共识的过程。而这些余额的分配,来源只有一个,就是充值交易中的 2-2 多签交易输出(UTXO)。 (3)如何更新通道资金的状态? 更新通道中资金状态所采用的方法是由支付方向收款方发起付款交易,资金来源即交易输入永远是那个 2-2 UTXO,金额就是2-2地址中充值的资金金额。资金去向即交易输出则有两个,一个支付给付款方即充值方,金额是从付款方的资金中减去本次交易需要付给收款方的金额后还剩余的余额;另一个则支付给收款方,金额是在收款方此前的余额上,加上本次交易应该从付款方那里收到的金额之后的合计金额。 由支付方构建好交易,签名之后发给收款方保管。 如果要进行第二次交易,还是由支付方构建好交易输入和输出,输出中的内容要把本次交易之后,即付款方向收款方付完款之后,双方重新分配的余额分别更新在两个输出里面,把金额和持有人对应好。 支付方同样要在交易的输入中签名然后发给收款方保管。 如果通道中发生了多次交易,代表通道中的资金余额状态发生了多次更新,但是每次资金状态的更新都是在前一次交易的余额基础上做出的调整,因此通道中的余额不是多个交易记录相加,而是只有一个记录是有效的结果,只有最后那笔交易记录的状态是有效的,通道当前的余额状态也是以最新的交易上显示的为准。 如果在通道额度用完之前想要结束通道,需要收款方把最新的一笔交易广播到区块链上,请求按照这笔交易的余额给双方进行结算。如果想要继续交易,交易就保留在双方自己本地就可以了。 (4)什么是承诺交易? 在通道中即链下发生的交易就叫做承诺交易,所谓承诺交易是用来作承诺和保证的交易。承诺的内容包括在通道中进行的交易是诚实的,双方的资金分配是正确的,以及交易中记录的结果是有效的。要做这样的承诺是因为通道中的交易没有向区块链进行广播,没有经过矿工的处理和节点的验证,数据也不用上链,因此整个过程和结果都没有向外界公开,即交易没有经过区块链这个信任机器的生产,不具有链上交易的客观有效性和可信度。 而交易双方是没有信任基础的陌生人,在与对方交易之前肯定都会存在一些顾虑。于是双方都需要对自己的交易行为做一些保证,保证自己不会作恶。于是双方都要以书面形式签订一份承诺,作为后面发生纠纷时需要通过区块链进行验证和判罚的依据。 单向通道中的承诺交易应该是由支付方向收款方作的保证,收款方向支付方的保证是在退款交易里面,等会讲。 3)结束通道 在通道存续期间(到期之前),需要收款方把最后发生的一笔承诺交易提交到主链去结算。因为最后一笔交易,收款人从付款人那里收到的资金是最多的,因此他没有动力去广播之前已经作废的交易。 而如果付款方想要单方结束通道,只能等待时间锁到期提交和广播退款交易。而不能在通道开放期间主动把承诺交易广播到链上去结算,因为他手中保留的承诺交易都没有对方的签名。 但是根据退款交易的机制,如果通道到期,时间锁交易被广播之后,通道中所有资金都会退回到支付方的账户,因此在通道到期之前,收款方一定会去广播承诺交易结束通道的,因为只有这样他才能拿到属于自己的那部分资金。 关于时间锁和退款交易会在下面一部分内容(单向支付通道的问题)中解释。 3. 单向支付通道存在的问题:付款人的资金被锁 单向支付通道在开启通道时,资金来源都是由付款方一方提供,但是充值的资金是锁在一个2-2的多签交易输出(UTXO)里面,这个UTXO要花费需要两方都提供签名才能解锁。即由一方提供资金到公共账户,但是两方一起管理,要花费也需要对方的同意。 这里的问题在于,如果付款方在充值到2-2公共账户之后,还没有开始交易对方就消失了,这时候付款方就没法把自己的钱拿回来。因为钱在公共账户里面,即使是付款方自己要拿出来也需要对方提供签名加上自己的签名才动得了。现在对方不打算继续交易了,甚至消失了,拿不到他的签名,付款方打到多签地址中的钱就会被锁住,拿不出来了。 解决方案:时间锁合约 概念 时间锁 CheckSequenceVerify(CSV):时间锁的意思用一个时间期限来约定一个UTXO的解锁时间,或者是一笔交易的广播时间。这里约定的是充值交易的那个2-2交易输出,即2-2多签交易的UTXO。使用时间锁的作用是让充值交易中的资金在约定时间到期后就被解锁,并按照时间锁交易中的交易输出金额进行结算,并关闭通道。 这个方案就是为了解决单向通道中当付款方充值了资金,对方却反悔不愿意继续在通道中交易,也不提供签名让付款方解锁UTXO拿回资金的问题。 原理 时间锁实际上是一个智能合约,我们可以叫做时间锁合约,它是通过比特币的脚本来设置一个基于时间的条件,意思是在这个时间之前,这笔交易只会放在内存池中,不会被广播和打包到区块里,意味着交易中的UTXO不会被解锁,资金当然也花费不了。 具体操作是在开启通道也就是在支付方进行充值之前,支付方构建一笔带有时间锁的退款交易,发给接收方签名,对方签名之后再发回给支付方在本地保管,此时不需要广播和上链。 退款交易对支付方的保障,是规定在约定时间内,如果双方没有发生过交易,或者收款方没有向链上广播承诺交易请求关闭通道,那么支付方可以把退款交易广播到链上去解锁充值交易的 2-2 UTXO,因为对方已经提供了签名,再加上自己的签名,就符合 2-2的签名要求,只要约定的期限满了,交易就会打包,自己充值进去的钱就会全额退回给自己(当然会减去手续费)。 因此,支付方要在拿到对方在退款交易上的签名之后才会在开启通道的交易上签名,然后进行广播,让充值交易上链,完成向公共账户打款充值。 4. 单向支付通道的流程 因此一个单向支付通道运行的基本流程为: 第一、创建充值交易:支付方构建一笔充值交易,创建一个2-2的多签地址作为交易输出的持有者。多签地址中需要的两个地址分别是支付方和收款方的地址(需要是专用于充值交易的地址)。此时交易不签名不广播。 第二、签署退款合约:支付方创建一笔带有时间锁的退款交易,输入的第一部分是资金来源,是2-2多签UTXO,第二部分是时间锁中约定的通道到期时间,第三部分是签名,此时应该还没有签名,位置空着。 输出有两个,一个是支付给自己的,金额是2-2 UTXO中的全部金额,另一个是支付给收款方的,金额是0。 第三、收款方签名:支付方把退款交易发给收款方签名,收款方确认没有问题签名之后把退款交易发回给支付方保管; 退款交易的用途是防备收款方跑路,因此在对方没有消失之前不会上链,只保存在支付方本地,所以退款交易是第一笔承诺交易,由收款方向付款方做出不会跑路的承诺。 第四、开启通道:支付方在充值交易上签名并广播到比特币链上,同时把签署过的充值交易发给收款方。交易上链就意味着充值成功,即通道成功开启。 第五、通道交易:支付方在通道中发起向收款方的转账交易,每一次交易都代表一次通道内资金状态的更新;具体操作就是上面在单向支付通道的运行原理中所描述的那样。 第四、关闭通道:在通道到期之前由收款方提交承诺交易到链上进行关闭,或者到期后由付款方提交退款交易去关闭。 5. 单向支付通道的局限 1)流动性容量限制 因为单向支付通道只能由一方进行支付,另一方理论上不会对接收到的资金用于向对方的转账途径,即资金的流动是单向的,因此这个通道的支付额度无法依靠循环流动而扩大,上限就是支付方在开启通道时充值的金额。那么当这个金额用完的时候,通道的生命周期就结束了,如果要继续支付,需要重新开启一个通道并重新充值。 2)生命周期限制 另外因为单向通道都需要用一个时间锁来强制关闭通道,用这种方式保证支付方不会因为对手方不配合导致资金永远被锁住,因此单向通道的生命周期有限制。 3)付款方拿回资金的时间限制 时间锁退款机制对付款方来说,虽然有一定保障作用,但也有很大弊端,比如时间锁期限为一年,而在充值之后对方就消失了,那需要等一年之后付款方才能广播退款交易拿回自己的钱。 单向通道的局限总结一下就是通道存在的期限有限制,资金利用效率比较低,付款方受到的限制比较大,因此使用的场景也比较有限,在闪电网络的历史上这种通道应用的情况也比较受限。 在单向支付通道基础上发展出来的双向支付通道对单向支付通道的确缺点和局限进行了改进,让支付通道有了更广泛的应用场景。所以下一篇要学习的就是双向支付通道。 本系列学习文章是为了更好理解 Nervos 的闪电网络方案,但是前面关于闪电网络的部分却不是Nervos 的 Fiber Network 的内容,因为 Fiber Network 也是在闪电网络的基础上作了一些改进而来,可以说闪电网络是Fiber Network 的基础。所以要更好的理解 Fiber Network,就需要先把闪电网络的基础知识弄清楚。 不过闪电网络理解起来真实有难度,后面的双向支付通道和支付网络,里面的机制更复杂,我感觉这种技术对普通用户门槛还是挺高的,希望 Fiber Network 有更好的优化。 相关阅读: Nervos Fiber Network 轻皮书学习(1):闪电网络介绍 x.com/xueblock/status/182838… 本贴结束!
11
24
2,796
雪解 retweeted
6 Sep 2024
Nervos 闪电网络轻皮书学习(2):单向支付通道 本文主要内容: 1. 闪电网络的基本思想以及目标 2. 闪电网络实现无需信任支付系统的基本思路 3. 单向支付通道解读 (1)什么是单向支付通道 (2)单向支付通道的运行原理 (3)单向支付通道的问题以及解决方案 (4)单向支付通道的运行流程 (5)单向支付通道的局限 一、前言:闪电网络的基本思想以及目标 上一篇文章主要学习了闪电网络的概念,包括是闪电网络是什么,解决了什么问题,为什么能解决这些问题,以及如何解决的基础思想。 闪电网络的基本思想 我们大概了解了闪电网络的基础是在交易双方之间搭建的支付通道,而在不同支付方之间搭建的若干个支付通道连接起来就形成了闪电网络。 闪电网络的基本思想是以非区块链的模式来解决比特币在日常和零售支付场景下所面临问题,主要是交易速度,容量与成本。这种思想可以理解为从区块链的模式中走出来,在常规思路之外寻找比特币问题的解决之道。 其原理是在区块链的外面去搭建一个网络,让交易参与方之间在这个网络中建立连接彼此的通道,并把需要经常性转账的支付场景移到通道中去,这个通道除了在建立和关闭的时候需要跟比特币网络进行通信,其他时间都是双方点到点的通信。于是通道交易不需要放在区块链网络上处理,只在参与方之间本地处理,实现真正的点对点交易。 这种设计的逻辑是以非区块链的模式来规避所有因为区块链本身特性而带来的性能问题,特别是区块链需要把所有交易数据上链并通过全网共识,即在链上等待其他节点对同一个结果进行验证和确认的机制。数据上链,全员共识等机制带来了高度的安全性和牢固的信任度,这是区块链的优势,但也是阻碍区块链性能提升的底层原因。 因此把不需要数据上链和全网共识的业务从区块链上拿出来,放到一个点对点的网络中,让用户自己在本地去处理,只在必要的时候提供安全和信任保障。这就是闪电网络的基本思想。 闪电网络的简化理解 对闪电网络的理解,可以通过现实生活中的一个场景来简化,比如在现实中的转账或者汇款有两个基本选择,可以去银行柜台汇款,也可以在手机上通过移动支付工具来汇款。根据传统认知我们会认为去银行汇款更安全,更可靠,特别是对公付款或者大额转账。但是银行汇款更麻烦,需要肉身去柜台,汇款有繁琐的流程,可能还需要排队等待,去汇一次款来回可能就需要大半天时间,还要花不少手续费。这种汇款方式对小额,高频的交易就很不友好。 而在微信,支付宝等移动支付工具上转账则方便很多,不需要填表,也不需要手续费,速度快得多,但是要使用这些移动工具,需要开通移动支付的账户,并且从银行里面转一些钱进来。之后付款就可以在腾讯或者淘宝自己的系统里面进行,向开通了同样支付工具账户的人转账,无论多少次,只要支付金额不超过你在里面的余额和每天的支付额度就没有限制。 当然微信和支付宝跟闪电网络还是有很大不同,比如微信和支付宝系统是运行在腾讯和淘宝的服务器上,而非支付者的客户端;付款时在后面处理交易的是微信和支付宝的系统,而非交易方自己。 也就是说使用现有的移动支付工具进行转账其实有一个前提,支付双方必须要信任在后台帮他们处理交易和记账的微信和支付宝的服务器和系统,相信他们不会出问题或者不会作恶。所以这是一个基于信任的支付系统。 闪电网络的目标:实现不需要信任的点对点支付系统 而闪电网络要实现的是一个陌生人之间不需要信任的系统,即支付的参与方不需要信任任何第三方,任何个人,机构或者中心化的实体,也不需要信任交易对手方就能安全地跟陌生人进行直接的交易。在这个系统需要相信的是这一套系统提供的各种安全保障机制,以及保证这一套机制被强制执行的数学,密码学以及计算机代码,因为这一套机制的执行不会被人为干预,因此这是一个无需信任他人,即免信任的支付系统。 本篇文章我们就来学习闪电网络是怎样实现这个无需信任的支付系统。 二、闪电网络实现无需信任支付系统的基本思路 闪电网络是基于链下支付通道,即各个通道相互连接起来形成的一个快速支付网络。 所以闪电网络的实现可以分成两个模块来理解,如何实现支付通道,以及如何实现支付网络。支付通道是在交易双方之间创建的用于支付用途的通道,建立的是双方之间的关系;支付网络即闪电网络则是支付通道之间相互连接而构建的网络,建立的是每个参与者之间的关系。 因此,要弄清楚闪电网络怎样实现无需信任的支付系统,得从支付通道和支付网络分别是怎样实现的两个维度来理解。 我们先从支付通道来学习。 支付通道解决信任问题的主要思路是: 第一、提供保证金:充值资金为通道中进行的交易提供资金来源,也为可能的不诚实行为提供惩罚保证金; 第二、承诺保证:双方通过书面形式,承诺交易和资金状态的有效性,以及自己不会作恶的保证; 第三、合约约定:通过不同的合约约定了在链下通道中进行交易的业务逻辑;约定了什么是诚实的交易行为,什么是违约行为,违约者应当受到什么样的惩罚;针对可能的违约情况,通过合约规定对违约者资金结算的时间期限,以及对方如何向链上提交证据等等。 第四、脚本执行:比特币链针对提交的证据进行验证,并通过脚本执行判罚的结果。 支付通道是闪电网络形成的基础单元,它的发展也经过了不断的改进和演化,慢慢形成了几种分类,主要有单向支付通道,基于时间的双向支付通道,基于惩罚的双向支付通道三种。 而双向支付通道又是在单向支付通道方案的基础上发展而来,因此我们需要先学习和了解单向支付通道是怎么运行的才能更好的理解双向支付通道的运行。 三、单向支付通道解读 1. 单向支付通道的概念 单向支付通道是闪电网络的前身,在闪电网络出现之前很长一段时间单向支付通道的概念就已经存在了。 单向支付通道,顾名思义,是指只能由一方向另一方进行转账的支付通道,因此通道中的充值也是由支付方单方提供的。另一方只能接收付款,无法向对方发起付款。 严格来说,单向支付通道在物理能力上并没有限制收款方向支付方发起转账,只是这个交易是不可信的交易,或者说这个方向流动的资金安全性无法得到合约的保护。因此理论上不会有人愿意接收逆向支付的付款。 这种支付通道的应用场景主要是比如发工资,打赏,在附近的商店超市等购物的支付等。 2. 单向通道的运行原理 1)开启通道 由支付方发起开启通道的交易,创建一个2-2的多签输出(UTXO),并往里面充值BTC;2-2多签交易的输出意思是这个UTXO的持有者是2个私钥,需要提供2个私钥签名才能解锁里面的资金,可以理解为一个由两个人共同管理的公共账户。 这个充值BTC的交易,目的是宣布通道的开启,之后双方可以在通道中进行交易;也宣布了通道中双方的初始资金分配情况,即充值方/支付方全额,收款方0。 2)通道交易 (1)开启单向支付通道的原因 之所以要开通单向的支付通道,是因为一方有经常性多次向另一方付款的需求,比如公司每个月要向员工发工资,任务平台上发布任务的一方要向领取和完成任务的一方按照任务进度多次支付劳务费,还有像用户在内容平台阅读小说,或者观看电视剧,每看一集/一章需要付一次款等等。于是双方在链外开了一个通道进行支付以避免链上频繁交易的成本,因此这些交易都不会实时上链,而是在链外双方之间进行的记账,只有在双方不想继续进行交易的时候,才会把通道中记录的最终结果或者状态提交到链上去进行结算。 通道中发生的很多笔交易最后会形成一个结果或者余额状态,就是也就是最后一笔交易记录的双方余额结果,所以即使在通道中发生了几千几万笔交易,最后只有代表最终结果的最后一笔才会被上链,区块链也会按照这一笔交易的结果对双方进行结算。这样就会大大减少与链上的交互,从而节省成本,让日常交易变得可行。 (2)通道交易的实质 开启通道时付款方向2-2地址充值之后通道里面的资金就是固定的,但是每次在通道里面交易一次意味着付款方要向收款方转一些资金,于是付款方的余额会减少,而对方的余额会增加。因此通道中资金的状态变化规律会是链上和链下的总余额都固定不变,随着交易增多,在链下付款方的余额会不断减少,而收款方会不断增加。 因此通道交易实质上是就通道中双方的资金余额在链下不断进行的重新分配和更新,并对重新分配的余额状态达成共识的过程。而这些余额的分配,来源只有一个,就是充值交易中的 2-2 多签交易输出(UTXO)。 (3)如何更新通道资金的状态? 更新通道中资金状态所采用的方法是由支付方向收款方发起付款交易,资金来源即交易输入永远是那个 2-2 UTXO,金额就是2-2地址中充值的资金金额。资金去向即交易输出则有两个,一个支付给付款方即充值方,金额是从付款方的资金中减去本次交易需要付给收款方的金额后还剩余的余额;另一个则支付给收款方,金额是在收款方此前的余额上,加上本次交易应该从付款方那里收到的金额之后的合计金额。 由支付方构建好交易,签名之后发给收款方保管。 如果要进行第二次交易,还是由支付方构建好交易输入和输出,输出中的内容要把本次交易之后,即付款方向收款方付完款之后,双方重新分配的余额分别更新在两个输出里面,把金额和持有人对应好。 支付方同样要在交易的输入中签名然后发给收款方保管。 如果通道中发生了多次交易,代表通道中的资金余额状态发生了多次更新,但是每次资金状态的更新都是在前一次交易的余额基础上做出的调整,因此通道中的余额不是多个交易记录相加,而是只有一个记录是有效的结果,只有最后那笔交易记录的状态是有效的,通道当前的余额状态也是以最新的交易上显示的为准。 如果在通道额度用完之前想要结束通道,需要收款方把最新的一笔交易广播到区块链上,请求按照这笔交易的余额给双方进行结算。如果想要继续交易,交易就保留在双方自己本地就可以了。 (4)什么是承诺交易? 在通道中即链下发生的交易就叫做承诺交易,所谓承诺交易是用来作承诺和保证的交易。承诺的内容包括在通道中进行的交易是诚实的,双方的资金分配是正确的,以及交易中记录的结果是有效的。要做这样的承诺是因为通道中的交易没有向区块链进行广播,没有经过矿工的处理和节点的验证,数据也不用上链,因此整个过程和结果都没有向外界公开,即交易没有经过区块链这个信任机器的生产,不具有链上交易的客观有效性和可信度。 而交易双方是没有信任基础的陌生人,在与对方交易之前肯定都会存在一些顾虑。于是双方都需要对自己的交易行为做一些保证,保证自己不会作恶。于是双方都要以书面形式签订一份承诺,作为后面发生纠纷时需要通过区块链进行验证和判罚的依据。 单向通道中的承诺交易应该是由支付方向收款方作的保证,收款方向支付方的保证是在退款交易里面,等会讲。 3)结束通道 在通道存续期间(到期之前),需要收款方把最后发生的一笔承诺交易提交到主链去结算。因为最后一笔交易,收款人从付款人那里收到的资金是最多的,因此他没有动力去广播之前已经作废的交易。 而如果付款方想要单方结束通道,只能等待时间锁到期提交和广播退款交易。而不能在通道开放期间主动把承诺交易广播到链上去结算,因为他手中保留的承诺交易都没有对方的签名。 但是根据退款交易的机制,如果通道到期,时间锁交易被广播之后,通道中所有资金都会退回到支付方的账户,因此在通道到期之前,收款方一定会去广播承诺交易结束通道的,因为只有这样他才能拿到属于自己的那部分资金。 关于时间锁和退款交易会在下面一部分内容(单向支付通道的问题)中解释。 3. 单向支付通道存在的问题:付款人的资金被锁 单向支付通道在开启通道时,资金来源都是由付款方一方提供,但是充值的资金是锁在一个2-2的多签交易输出(UTXO)里面,这个UTXO要花费需要两方都提供签名才能解锁。即由一方提供资金到公共账户,但是两方一起管理,要花费也需要对方的同意。 这里的问题在于,如果付款方在充值到2-2公共账户之后,还没有开始交易对方就消失了,这时候付款方就没法把自己的钱拿回来。因为钱在公共账户里面,即使是付款方自己要拿出来也需要对方提供签名加上自己的签名才动得了。现在对方不打算继续交易了,甚至消失了,拿不到他的签名,付款方打到多签地址中的钱就会被锁住,拿不出来了。 解决方案:时间锁合约 概念 时间锁 CheckSequenceVerify(CSV):时间锁的意思用一个时间期限来约定一个UTXO的解锁时间,或者是一笔交易的广播时间。这里约定的是充值交易的那个2-2交易输出,即2-2多签交易的UTXO。使用时间锁的作用是让充值交易中的资金在约定时间到期后就被解锁,并按照时间锁交易中的交易输出金额进行结算,并关闭通道。 这个方案就是为了解决单向通道中当付款方充值了资金,对方却反悔不愿意继续在通道中交易,也不提供签名让付款方解锁UTXO拿回资金的问题。 原理 时间锁实际上是一个智能合约,我们可以叫做时间锁合约,它是通过比特币的脚本来设置一个基于时间的条件,意思是在这个时间之前,这笔交易只会放在内存池中,不会被广播和打包到区块里,意味着交易中的UTXO不会被解锁,资金当然也花费不了。 具体操作是在开启通道也就是在支付方进行充值之前,支付方构建一笔带有时间锁的退款交易,发给接收方签名,对方签名之后再发回给支付方在本地保管,此时不需要广播和上链。 退款交易对支付方的保障,是规定在约定时间内,如果双方没有发生过交易,或者收款方没有向链上广播承诺交易请求关闭通道,那么支付方可以把退款交易广播到链上去解锁充值交易的 2-2 UTXO,因为对方已经提供了签名,再加上自己的签名,就符合 2-2的签名要求,只要约定的期限满了,交易就会打包,自己充值进去的钱就会全额退回给自己(当然会减去手续费)。 因此,支付方要在拿到对方在退款交易上的签名之后才会在开启通道的交易上签名,然后进行广播,让充值交易上链,完成向公共账户打款充值。 4. 单向支付通道的流程 因此一个单向支付通道运行的基本流程为: 第一、创建充值交易:支付方构建一笔充值交易,创建一个2-2的多签地址作为交易输出的持有者。多签地址中需要的两个地址分别是支付方和收款方的地址(需要是专用于充值交易的地址)。此时交易不签名不广播。 第二、签署退款合约:支付方创建一笔带有时间锁的退款交易,输入的第一部分是资金来源,是2-2多签UTXO,第二部分是时间锁中约定的通道到期时间,第三部分是签名,此时应该还没有签名,位置空着。 输出有两个,一个是支付给自己的,金额是2-2 UTXO中的全部金额,另一个是支付给收款方的,金额是0。 第三、收款方签名:支付方把退款交易发给收款方签名,收款方确认没有问题签名之后把退款交易发回给支付方保管; 退款交易的用途是防备收款方跑路,因此在对方没有消失之前不会上链,只保存在支付方本地,所以退款交易是第一笔承诺交易,由收款方向付款方做出不会跑路的承诺。 第四、开启通道:支付方在充值交易上签名并广播到比特币链上,同时把签署过的充值交易发给收款方。交易上链就意味着充值成功,即通道成功开启。 第五、通道交易:支付方在通道中发起向收款方的转账交易,每一次交易都代表一次通道内资金状态的更新;具体操作就是上面在单向支付通道的运行原理中所描述的那样。 第四、关闭通道:在通道到期之前由收款方提交承诺交易到链上进行关闭,或者到期后由付款方提交退款交易去关闭。 5. 单向支付通道的局限 1)流动性容量限制 因为单向支付通道只能由一方进行支付,另一方理论上不会对接收到的资金用于向对方的转账途径,即资金的流动是单向的,因此这个通道的支付额度无法依靠循环流动而扩大,上限就是支付方在开启通道时充值的金额。那么当这个金额用完的时候,通道的生命周期就结束了,如果要继续支付,需要重新开启一个通道并重新充值。 2)生命周期限制 另外因为单向通道都需要用一个时间锁来强制关闭通道,用这种方式保证支付方不会因为对手方不配合导致资金永远被锁住,因此单向通道的生命周期有限制。 3)付款方拿回资金的时间限制 时间锁退款机制对付款方来说,虽然有一定保障作用,但也有很大弊端,比如时间锁期限为一年,而在充值之后对方就消失了,那需要等一年之后付款方才能广播退款交易拿回自己的钱。 单向通道的局限总结一下就是通道存在的期限有限制,资金利用效率比较低,付款方受到的限制比较大,因此使用的场景也比较有限,在闪电网络的历史上这种通道应用的情况也比较受限。 在单向支付通道基础上发展出来的双向支付通道对单向支付通道的确缺点和局限进行了改进,让支付通道有了更广泛的应用场景。所以下一篇要学习的就是双向支付通道。 本系列学习文章是为了更好理解 Nervos 的闪电网络方案,但是前面关于闪电网络的部分却不是Nervos 的 Fiber Network 的内容,因为 Fiber Network 也是在闪电网络的基础上作了一些改进而来,可以说闪电网络是Fiber Network 的基础。所以要更好的理解 Fiber Network,就需要先把闪电网络的基础知识弄清楚。 不过闪电网络理解起来真实有难度,后面的双向支付通道和支付网络,里面的机制更复杂,我感觉这种技术对普通用户门槛还是挺高的,希望 Fiber Network 有更好的优化。 相关阅读: Nervos Fiber Network 轻皮书学习(1):闪电网络介绍 x.com/xueblock/status/182838… 本贴结束!

27 Aug 2024
Nervos Fiber Network 轻皮书学习(1):闪电网络介绍 主要内容 1. 什么是闪电网络? 2. 闪电网络对比特币扩展的逻辑 3. 闪电网络的构成 4. 闪电网络的运行 第一部分:闪电网络介绍 1. 什么是闪电网络? 1)概念 闪电网络是一个运行在比特币主网之上的二层扩展方案,一种去中心化的链外扩展方案,被认为是最符合中本聪思想的比特币扩展方案。 扩展的是什么? 闪电网络扩展的是处理交易的速度,能够处理的交易数量,以及交易所需的成本。 闪电网络能够支持每秒上万笔交易并发,接近于Visa系统所能做到的程度。另外闪电网络可以做到几乎零手续费的交易处理,几乎没有限制的交易笔数容量。 这些扩展使比特币能够实现在日常生活中的使用场景,比如零售付款,用户与用户之间进行的,点对点,高频,即时,小额,低成本的付款或者交易。 因此根本上说闪电网络扩展的是比特币的使用场景,让比特币从价值存储的用途回归到点对点的现金支付系统的用途,这也是中本聪在白皮书中对比特币系统的定义:一个点对点的电子现金系统。 闪电网络概念的缘起 闪电网络最初的来源是中本聪在 2009 年发布的 Bitcoin 0.1 软件中包含的一段代码草稿。 根据这段代码在一笔交易被比特币网络确认之前,用户可以对这笔交易进行修改和更新。 代码见Github链接。 github.com/trottier/original… 这就是支付通道的工作模式,这里所说的对交易进行修改和更新就是放在链外支付通道中实现的。 2011 年,中本聪在跟当时的 BitCoinJ (开源比特币客户端库)开发者,时任Google 的高级软件工程师和技术主管的 Mike Hearn 进行的邮件往来中对这种模式进行了解释:“nLockTime的一个用途是在一组参与者之间的高频交易,它们可以经过一致同意后不断对交易进行更新。如果一方不再同意继续更新,那么最后的状态将会在 nLockTime 被记录。中间交易事务不需要广播,网络(比特币区块链)只记录最终结果。” 邮件内容见如下链接: bitcoin.com/satoshi-archive/… 这是中本聪对支付通道的解释,也是闪电网络最早的想法来源。 完整的闪电网络方案在2015年被提出,智能合约交易平台Mirror 的CTO, Thaddeus “Tadge” Dryja 和 Joseph Poon 在2015年2月首次发表了题为《比特币闪电网络:可扩展的链下即时支付》(The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments)的论文,被认为是《闪电网络》的白皮书。 之后闪电网络的开发落地由闪电实验室,Blockstream,ACINQ等团队实施和完成,并得到了 Jack Dorcey 等比特币OG的支持和追捧。 2)思路 闪电网络的思路是在比特币区块链外面(或者上面)增加一层,用户能够在这一层的任意两方之间创建通道,日常和高频发生的交易就可以放到这些通道中去处理。 因为通道是直接在交易双方直接建立的,所以交易几乎可以即时完成,所需要的费用也可以忽略不计。而且只要通道里面的资金没有被消耗完,通道就可以一直存在,双方可以在里面来来回回进行不限次数的交易。 这个通道是用来实现支付交易的,所以被叫做支付通道。 可见这个通道只是建立在交易方之间,并没有放到区块链上,因此交易不需要通过矿工处理,而是交易双方自行处理。 3)为什么闪电网络能够实现这些扩展? 比特币交易性能低下的底层逻辑 比特币处理交易的性能难以提高,根本原因是它的区块链设计所限制。为了保证去中心化和网络安全,比特币采用的是全员共识机制,即一笔交易的确认,一个区块的产生都需要经过所有矿工和全节点的计算和验证,通过验证才意味着一个区块上链成功,交易才算得到一个确认。 同样为了维持系统去中心化,比特币规定了一个区块的大小上限为4M(隔离见证之前是1M),这就意味着一个区块中能够容纳的交易数量是有上限的。 另外为了维持经济模式合理性,即控制比特币新币发行速度和节奏,比特币的出块速度也是确定的,平均每10分钟出一个块,这种规定意味着每10分钟能够处理的交易数量也是有上限的。 总结一下就是比特币的区块链要求更多的节点数量,更大的算力保障,其分布式共识机制要求尽可能多的节点参与到计算和验证的共识过程中以确保交易的安全和可靠,为了减小节点负担对每一个区块的大小做了限制,另外比特币经济系统的稳定性要求挖出每一个区块所需要的时间平均为10分钟。这些设计共同决定了比特币系统的去中心化,安全性,可靠性,稳定性以及经济模式合理性,从另一方面它也决定了如果不修改区块链的底层设计,比特币交易的性能就不可能进行大幅度提升。 闪电网络扩展交易性能的逻辑 核心在于闪电网络放弃了区块链的思路,让交易仅仅发生在交易方之间,取缔了矿工和节点,也取消了共识,出块等过程。记账不再由矿工完成,而是交易方之间私下记录,链下记录的账目也不需要广播给其他通道的节点知道,交易计算和验证也由交易方自己处理。因此由区块链本身的设计所导致的问题,比如交易处理速度,交易手续费,区块对交易数的容量限制,链上所能记录和保存的数据大小等等限制都可以消除。 在交易对手方之间发生的交易,就如两个人面对面的线下交易,不存在交易数量,手续费,以及等待他人确认等问题,这种方案理论上可对这些问题进行以无限制的扩展。 2. 闪电网络的构成 任意交易双方之间都可以建立双方的支付通道,因此在比特币区块链之外可以建立很多个甚至无数个不同用户之间的通道。这些很多个通道合起来就形成了一个通道网络,也就是闪电网络。 所以可以理解为闪电网络包括了很多个用户之间的支付通道,还有建立通道的用户,也就是闪电网络节点,另外应该还包括通道中所存放的资金,因为每个通道的开通都需要参与通道的双方在里面存入一定BTC作为这个通道的支付额度。 3. 闪电网络的运作 闪电网络的流程从整体上来说可以分为开启通道,通道内(链下)交易,以及关闭通道三个环节。其中开启和关闭通道是通过在比特币链上分别发起一笔交易来完成,而通道内的所有交易都发生在链外,不需要在区块链上发起,不需要广播给他人,不需要在链上记录,不需要在主网进行处理和确认,也不需要上链。 1)开启通道 开启通道实际上就是交易参与方创建一个多重签名的比特币钱包地址,并往多签地址里面冲入资金。 因此支付通道可以理解成连接支付双方的一个虚拟通道,而从根本上说它只是一个建立在比特币链上的多签钱包地址,类似一个没有私钥的智能合约地址。 这个通道里面能够进行多大金额的交易,是由开启通道时往里面冲入的资金金额决定的,这就是这个通道的支付额度。 充值交易是这个通道流程中的第一笔交易,被称为锚点交易,这笔交易需要广播并记录到比特币链上,让所有人都能够看见,见证这个通道的开启。 开启通道的目的是为了简化之后频繁发生的交易过程,缩减这些交易的成本,以及能够容纳更多的交易数量,因此建立这个通道的双方之间一定会有经常性的转账,支付或者交易行为,如果两个人之间并没有高频交易的需求,那就没有开启一个支付通道的必要,毕竟开启通道也是需要在比特币链上去发起一笔交易,而且还要往里面冲入一定数量的比特币,占用一定的流动性。 2)通道交易 开启通道之后,通道双方就可以通过通道进行私下的交易。因为通道是建立在比特币区块链之外类似二层这样的概念,因此通道里的交易可以理解成是二层交易或者链外交易。 通道中交易的资产其实并非真实的原生BTC,而是在二层闪电网络上的一个映射资产,因为原生比特币的所有权被锁定在一层的多签地址里面,并没有转移到二层的地址上。因此二层通道内的交易并不会真正转移比特币的所有权,而是依靠双方记录和维护一个类似资产负债表的账本来进行管理和确认。 通道内的交易叫做承诺交易,承诺交易的流程大概是创建交易,签名,以及向对方发送交易这样三步。 每一次通道交易,双方的余额会发生一次变动,双方就会进行一次承诺交易的创建,签名和交换,这意味着账本上的一次结果或者状态更新。这些交易和状态都不会广播和发布到比特币链上去。 通道内的交易,只有支付额度这一个限制,只要交易双方没有关闭通道的想法,并且额度没有用完,通道就会一直存在,就可以一直进行来回的交易。双方的余额状态可以不断的发生变化,只要双方的承诺交易速度跟得上,多少次都可以。 每一次产生了新的承诺交易,老的交易状态就会作废,防止交易的任何一方把之前的交易状态发到链上去进行关闭通道的操作,从而进行有利于自己的欺骗行为。这种机制保证了只有最新的一笔承诺交易是有效的。 3)关闭通道 关闭通道就意味着交易双方退出通道,拿回属于自己的比特币金额,之后不能在通道当中继续进行交易。 通道的关闭可以是双方同意之后在提出,也可以由单方提出。只要交易的任意一方不想继续维持通道,都可以发起关闭通道的交易。 关闭通道的操作是在比特币主网发起一笔“结算”交易,需要把通道交易中最新的状态,也就是最后一笔承诺交易广播到主网。 一旦关闭通道的交易被发起,系统会把最新的账本记录提交到比特币一层去验证。验证的过程会有一个期限,大概需要7天时间,主要是防止有一方提交了过期的交易状态进行有利于自己的作弊行为。这段时间交易双方都可以进行检举。 如果在检举期交易双方都确认没有问题并及时签名,则交易会立即完成,双方会按照最新状态中双方的余额记录拿回自己的比特币。如果有一方或者双方都没有签名,中间也无人检举,双方也会在在7天到期之后按照最新状态拿回自己的比特币。 以上是闪电网络对比特币实现扩展和运行的基本原理。具体实现过程还涉及很多的问题,比如在通道中如何防止交易方作弊,如何保证资金能安全到达对方,如何保证交易方的隐私,跟任何人转账如果都需要建立通道是不是太麻烦了等等。 这些问题需要深入到哈希时间锁,多跳路由等机制和原理中去,我还没有弄得十分清晰,还要学习一下,以后再写。 未完待续。。。。。。 本贴结束!
2
14
25
2,847