44
Frost
4416e97154fee968dffa2aa49d0042dde925dbc78261396f83f3e9d754e12827
Replying to Frost

#TaprootAssets 这几天在看 taproot assets 的资料,想弄懂它到底是怎么运作的。不得不说,这是个相当复杂的协议,转账时双方协商的细节还是没很清楚。网上的资料其实相当缺乏,大都只是泛泛而谈。而官方文档的英语用词偏学术化,各种概念零落,读起来费劲。

Taproot assets 本质上是 taproot 的一种应用方式,也就是一种构造 tapscript 的惯例。所以需要从 taproot 交易是什么开始讲起。传统的比特币交易可以把一个公钥放到交易的 output 里面,要求花费这个 UTXO 时需要使用对应的私钥去签名一段信息,把签名结果放到交易的 input 里来证明自己确实拥有这个公钥,有花掉这个 UTXO 的所有权。Taproot 将这个 output 的公钥变了一下,`Taproot publick key Q = owner public key P + Hash(P | tapscript tree root) * G`,这个公钥 Q 对应的私钥显然就是 `owner private key p + Hash(P | tapscript tree root)`,可以直接用这个私钥按传统方式花掉 UTXO。

但还有另外一种方式花掉 taproot 的 UTXO。计算 Q 时只有两个变量 P 和 tapscript tree root,而如果这个 UTXO 是发给我的,那 P 就是我的公钥,唯一未知的就是 tapscript tree root。如果可以证明自己同时也知道这个 root,就能证明这个 UTXO 的所有者就是自己。这个 root 是一个被叫做 tapscript 的 merkle tree 的 root,而且叶子节点都是一段代码。所以只需揭露某个叶子节点的代码内容、加上对应的 merkle path 这一哈希数组,就能构造出 root,然后再按公式计算出 Q,看是不是同一个 Q 即可。另外一般还要提供一段解锁代码去配合叶子节点的代码,让它们运行之后为真(当然你也可以让叶子节点的代码自己单独运行就为真,这样 input 提供的解锁代码就是空),就跟传统模式的 output script 需要一段 input script 配合去解锁一样。总结一下这种花费方式下,交易的 input script 里面需要包括:P、一段解锁代码、merkle tree 某个叶子处的内容、merkle path。

然后看看 taproot asset 是如何构建 tapscript 这棵树的,它相当复杂,带有 3 重(更复杂时有 4 重)的 merkle tree。最上层一重跟普通的 tapscript tree 一样,只是叶子节点不再是一段代码,而是下面一重 merkle tree(叫做 taproot assets tree) 的 root,而 taproot assets tree 的叶子节点是更下一重 merkle tree(叫做 asset MS-SMT tree)的root。

最底层的 asset MS-SMT tree 用来存储某个资产的余额,一个叶子就相当于一个 UTXO,里面记录这个叶子代表的 amount、所有者的**公钥**等信息。这个 merkle tree 是带总和的稀疏 merkle tree(简称 MS-SMT),所以它往上层做哈希计算 root 时,为空的叶子节点也要哈希,并且需要带上 amount 的加和(可以很方便察觉资产的总发行量变没变)。而它上层的 taproot assets tree 的每个叶子都可以是一个资产,它是用来管理多个资产的,它的 root 叫做 taproot assets commitment。

创建资产时,需要往主网发送一个 taproot 交易(叫做 genesis tx),里面 output 的公钥按上面的公式计算,里面的 tapscrip tree root 就是 3 重 merkle tree 的 root。这个 genesis tx 上链之后,要发送第二个交易上链,揭露创建资产的元信息(叫什么名字、总额、url、文档等等),要不然 genesis tx 外表看起来和最普通的 taproot 交易一模一样,外人不从得知这个交易实际上创建了其他类型的资产。

转账时,双方需要复杂的协调。总的有两个层面,tapscript tree 层面和 tx 层面。对于 tapscript tree,要重新构建,在最底层 asset MS-SMT tree 下把 sender 要花的那个叶子节点整个删除(类似 UTXO 的花费,无论数额多少,都需要整个删除,然后新建另一个**找零** UTXO),然后新建自己的找零叶子节点和 receiver 的叶子节点。叶子节点的任何变更,往上层哈希最终计算出新的 tapscript tree root。然后可以进行 tx 层面的协调,需要保证 receiver 应得的叶子节点的tapscript tree root 用来生成了一个 taproot output,保证 sender 自己找零的叶子节点的 tapscript tree root 用来生成了找零的 taproot output。两个 output,而且代表的其实是不同的 tapscript tree 视角(所以 root 肯定不同),因为这里不是使用一棵 tapscript tree 来保存全局的账户余额(类似 Ethereum 的账户模型方式),而仍然是 UTXO 模式,资产在 MS-SMT tree 下的一个叶子节点和某个 UTXO 是一一对应的。

所以一个 taproot assets 转账交易的 input 里会包含什么?跟普通的 taproot 交易一样,它包括:所有者公钥 P、asset MS-SMT tree 叶子节点指示的所有者公钥的签名(用来证明所有权)、**叶子节点的内容本身**、3 重的 merkle path。

为了保证每个转账往前追溯是都能追溯到 genesis tx,asset MS-SMT tree 的叶子节点记录的信息里面还有个 prev asset witness 字段,它存的是当前 UTXO 的父 UTXO(通过花掉了父 UTXO 而创建了当前 UTXO) 位置、asset id、asset witness(花掉父 UTXO 的凭证)。genesis tx 里这项为空。这个字段就建立了这些 UTXO 的树式关系(并非链式关系),最终可以追溯到 genesis tx 的那个 UTXO,并且所有 witness 是可以验证的。

显然,叶子节点的内容太大了,如果每次转账交易的 input 都要附带这么多数据上链,那比特币的硬盘增长会上升非常迅速。所以就有了 Universe 服务,有几个功能:1. 监视链上交易,一旦发现是 taproot assets 的创建或者转账,就把数据索引好存起来。2. 存储数据,它存的数据包括:asset meta 信息(名字、数量之类的,它不能变更,因为 asset id 的生成里用到了它的哈希值)、genesis tx、转账交易。3. 响应查询,一般的客户端没有能力从链上交易里检索的话,直接向 Univserse 服务查询,并且它可以提供 witness 来证明。genesis tx 的 tapscript 里可以有 canonical_universe 这个字段,规定官方的 Universe 地址。

如果 Universe 服务仅是这样的话,那它**根本没有任何减少上链数据的功能**,只有一种叫 Pocket Universe 的特种 Universe 才提供**上链交易批量聚合**的功能:每转账一次,就需要重新生成 taproot assets tree 发交易上链,如果将多次的 tree 变更批量成一次变更,就只需上链一个交易。它需要信任运营方,还需要锁定 sender 的 taproot assets UTXO,否则 sender 在任何时候都有退路去链上转账,就会出现双花,所以它其实是一种 channel。

Taproot assets 还有很多复杂的设计,比如 asset MS-SMT tree 叶子节点在发花费时可以 merge 和 split(这会让 tapscrit tree 变成 4 重 merkle)、基于闪电网络 HTLC 的转账、一个 genesis tx 创建多个 asset(group assets) 后跨 asset 的 swap 转账(跨 asset MS-SMT tree 叶子节点的删除和创建,这可以实现多资产的原子交换,甚至实现去中心化交易所)、Universe 数据存储的格式(一棵 MS—SMT tree,它的叶子叫做 proof,一个 proof 包含全部用来证明转账确实合法的息,叶子的内容是 append-only 的文本)

上面没提到的细节有:

Q1:关于 3 重的 tapscript tree 每重之间的叶子节点是怎么和下一重的 root 对应的?

首先,`asset id = sha256(genesis tx 花的UTXO outpint | asset tag | asset meta hash | output index | asset type)`。第二重 taproot asset tree 的叶子节点就对应 asset id,并且里面存的是(asset sum,[Asset MS-SMT 树 root、asset sum]。这样某项 asset 对应的发行数量和它的 MS-SMT tree 就能找到。

最上层 tapscript tree 的叶子对应的是 `tagged_hash("TapLeaf", leaf version | taproot assert maker | taprrot asset version | asset tree root)`。这样也和 asset tree root 联系起来了。

资料:

[Taproot assets bip](https://github.com/Roasbeef/bips/blob/bip-tap/bip-tap.mediawiki)

[Taproot assets universe bip](https://github.com/Roasbeef/bips/blob/bip-tap/bip-tap-universe.mediawiki)

[Nayuta 团队写的最通俗的博客文章,里面的图可视化非常好](https://medium.com/nayuta-inc/taro-ed6b93b09a75)

大家普遍下意识地认为 Taproot Assets 能减少上链数据量,但按文档的方案介绍,它会比目前的 brc-20 方案的上链数据量都多得多,可以看看 Lightingning Labs 自己的介绍[视频](https://www.youtube.com/watch?v=-yiTtO_p3Cw),都是说转账 taproot assets 要发送 on-chain 交易。

只有通过闪电网络才能真正的减少上链数据量,也就是它的 Pocket Universe 服务商。

nostr:nevent1qqswkqw0lkn8865znddua9k9p5n75rqrl5m0w7s7qs9y706l3h7m03gppemhxue69uhkummn9ekx7mp0qywhwumn8ghj7mn0wd68ytnzd96xxmmfdejhytnnda3kjctv9uq32amnwvaz7tmwdaehgu3wdau8gu3wv3jhvtcurk3gf

#TaprootAssets 这几天在看 taproot assets 的资料,想弄懂它到底是怎么运作的。不得不说,这是个相当复杂的协议,转账时双方协商的细节还是没很清楚。网上的资料其实相当缺乏,大都只是泛泛而谈。而官方文档的英语用词偏学术化,各种概念零落,读起来费劲。

Taproot assets 本质上是 taproot 的一种应用方式,也就是一种构造 tapscript 的惯例。所以需要从 taproot 交易是什么开始讲起。传统的比特币交易可以把一个公钥放到交易的 output 里面,要求花费这个 UTXO 时需要使用对应的私钥去签名一段信息,把签名结果放到交易的 input 里来证明自己确实拥有这个公钥,有花掉这个 UTXO 的所有权。Taproot 将这个 output 的公钥变了一下,`Taproot publick key Q = owner public key P + Hash(P | tapscript tree root) * G`,这个公钥 Q 对应的私钥显然就是 `owner private key p + Hash(P | tapscript tree root)`,可以直接用这个私钥按传统方式花掉 UTXO。

但还有另外一种方式花掉 taproot 的 UTXO。计算 Q 时只有两个变量 P 和 tapscript tree root,而如果这个 UTXO 是发给我的,那 P 就是我的公钥,唯一未知的就是 tapscript tree root。如果可以证明自己同时也知道这个 root,就能证明这个 UTXO 的所有者就是自己。这个 root 是一个被叫做 tapscript 的 merkle tree 的 root,而且叶子节点都是一段代码。所以只需揭露某个叶子节点的代码内容、加上对应的 merkle path 这一哈希数组,就能构造出 root,然后再按公式计算出 Q,看是不是同一个 Q 即可。另外一般还要提供一段解锁代码去配合叶子节点的代码,让它们运行之后为真(当然你也可以让叶子节点的代码自己单独运行就为真,这样 input 提供的解锁代码就是空),就跟传统模式的 output script 需要一段 input script 配合去解锁一样。总结一下这种花费方式下,交易的 input script 里面需要包括:P、一段解锁代码、merkle tree 某个叶子处的内容、merkle path。

然后看看 taproot asset 是如何构建 tapscript 这棵树的,它相当复杂,带有 3 重(更复杂时有 4 重)的 merkle tree。最上层一重跟普通的 tapscript tree 一样,只是叶子节点不再是一段代码,而是下面一重 merkle tree(叫做 taproot assets tree) 的 root,而 taproot assets tree 的叶子节点是更下一重 merkle tree(叫做 asset MS-SMT tree)的root。

最底层的 asset MS-SMT tree 用来存储某个资产的余额,一个叶子就相当于一个 UTXO,里面记录这个叶子代表的 amount、所有者的**公钥**等信息。这个 merkle tree 是带总和的稀疏 merkle tree(简称 MS-SMT),所以它往上层做哈希计算 root 时,为空的叶子节点也要哈希,并且需要带上 amount 的加和(可以很方便察觉资产的总发行量变没变)。而它上层的 taproot assets tree 的每个叶子都可以是一个资产,它是用来管理多个资产的,它的 root 叫做 taproot assets commitment。

创建资产时,需要往主网发送一个 taproot 交易(叫做 genesis tx),里面 output 的公钥按上面的公式计算,里面的 tapscrip tree root 就是 3 重 merkle tree 的 root。这个 genesis tx 上链之后,要发送第二个交易上链,揭露创建资产的元信息(叫什么名字、总额、url、文档等等),要不然 genesis tx 外表看起来和最普通的 taproot 交易一模一样,外人不从得知这个交易实际上创建了其他类型的资产。

转账时,双方需要复杂的协调。总的有两个层面,tapscript tree 层面和 tx 层面。对于 tapscript tree,要重新构建,在最底层 asset MS-SMT tree 下把 sender 要花的那个叶子节点整个删除(类似 UTXO 的花费,无论数额多少,都需要整个删除,然后新建另一个**找零** UTXO),然后新建自己的找零叶子节点和 receiver 的叶子节点。叶子节点的任何变更,往上层哈希最终计算出新的 tapscript tree root。然后可以进行 tx 层面的协调,需要保证 receiver 应得的叶子节点的tapscript tree root 用来生成了一个 taproot output,保证 sender 自己找零的叶子节点的 tapscript tree root 用来生成了找零的 taproot output。两个 output,而且代表的其实是不同的 tapscript tree 视角(所以 root 肯定不同),因为这里不是使用一棵 tapscript tree 来保存全局的账户余额(类似 Ethereum 的账户模型方式),而仍然是 UTXO 模式,资产在 MS-SMT tree 下的一个叶子节点和某个 UTXO 是一一对应的。

所以一个 taproot assets 转账交易的 input 里会包含什么?跟普通的 taproot 交易一样,它包括:所有者公钥 P、asset MS-SMT tree 叶子节点指示的所有者公钥的签名(用来证明所有权)、**叶子节点的内容本身**、3 重的 merkle path。

为了保证每个转账往前追溯是都能追溯到 genesis tx,asset MS-SMT tree 的叶子节点记录的信息里面还有个 prev asset witness 字段,它存的是当前 UTXO 的父 UTXO(通过花掉了父 UTXO 而创建了当前 UTXO) 位置、asset id、asset witness(花掉父 UTXO 的凭证)。genesis tx 里这项为空。这个字段就建立了这些 UTXO 的树式关系(并非链式关系),最终可以追溯到 genesis tx 的那个 UTXO,并且所有 witness 是可以验证的。

显然,叶子节点的内容太大了,如果每次转账交易的 input 都要附带这么多数据上链,那比特币的硬盘增长会上升非常迅速。所以就有了 Universe 服务,有几个功能:1. 监视链上交易,一旦发现是 taproot assets 的创建或者转账,就把数据索引好存起来。2. 存储数据,它存的数据包括:asset meta 信息(名字、数量之类的,它不能变更,因为 asset id 的生成里用到了它的哈希值)、genesis tx、转账交易。3. 响应查询,一般的客户端没有能力从链上交易里检索的话,直接向 Univserse 服务查询,并且它可以提供 witness 来证明。genesis tx 的 tapscript 里可以有 canonical_universe 这个字段,规定官方的 Universe 地址。

如果 Universe 服务仅是这样的话,那它**根本没有任何减少上链数据的功能**,只有一种叫 Pocket Universe 的特种 Universe 才提供**上链交易批量聚合**的功能:每转账一次,就需要重新生成 taproot assets tree 发交易上链,如果将多次的 tree 变更批量成一次变更,就只需上链一个交易。它需要信任运营方,还需要锁定 sender 的 taproot assets UTXO,否则 sender 在任何时候都有退路去链上转账,就会出现双花,所以它其实是一种 channel。

Taproot assets 还有很多复杂的设计,比如 asset MS-SMT tree 叶子节点在发花费时可以 merge 和 split(这会让 tapscrit tree 变成 4 重 merkle)、基于闪电网络 HTLC 的转账、一个 genesis tx 创建多个 asset(group assets) 后跨 asset 的 swap 转账(跨 asset MS-SMT tree 叶子节点的删除和创建,这可以实现多资产的原子交换,甚至实现去中心化交易所)、Universe 数据存储的格式(一棵 MS—SMT tree,它的叶子叫做 proof,一个 proof 包含全部用来证明转账确实合法的息,叶子的内容是 append-only 的文本)

上面没提到的细节有:

Q1:关于 3 重的 tapscript tree 每重之间的叶子节点是怎么和下一重的 root 对应的?

首先,`asset id = sha256(genesis tx 花的UTXO outpint | asset tag | asset meta hash | output index | asset type)`。第二重 taproot asset tree 的叶子节点就对应 asset id,并且里面存的是(asset sum,[Asset MS-SMT 树 root、asset sum]。这样某项 asset 对应的发行数量和它的 MS-SMT tree 就能找到。

最上层 tapscript tree 的叶子对应的是 `tagged_hash("TapLeaf", leaf version | taproot assert maker | taprrot asset version | asset tree root)`。这样也和 asset tree root 联系起来了。

资料:

[Taproot assets bip](https://github.com/Roasbeef/bips/blob/bip-tap/bip-tap.mediawiki)

[Taproot assets universe bip](https://github.com/Roasbeef/bips/blob/bip-tap/bip-tap-universe.mediawiki)

[Nayuta 团队写的最通俗的博客文章,里面的图可视化非常好](https://medium.com/nayuta-inc/taro-ed6b93b09a75)

不管是谁发的铭文,先打几张再说,防止像 ordi 那样涨几万倍拍断大腿😹

所以这一轮牛市启动的 fomo 口号是「打着防身」吗,太傻了。

虽然硬盘资源没 UTXO 内存那么贵重,但也是相当珍贵的了,尤其是真想做百年项目的话,也不是可以随便扔垃圾进去的。让每个后人都捏着鼻子看着垃圾只怕他们也会想要推倒重来。

Replying to 20aae42f...

为什么我们要拒绝福利国家?——推荐《福利国家之后》

这是几年前的一篇文章,阐述了为什么在中国目前的情况下也要反对福利国家政策。

风灵

古典自由主义者一贯反对福利国家政策,比如我参加翻译的文集《福利国家之后》,就是这种观念的集合。但在中国反对福利政策,常常会遭遇许多反对:福利病是发达国家福利过高才会产生的弊端,中国福利水平与发达国家不可同日而语,抨击福利政策是无的放矢打稻草人,相当于要一个瘦骨伶仃的人减肥。还有很多人则认为,免费医疗,免费养老,免费教育,天经地义就是政府的责任。

那么,在中国,是不是就不应该反对福利政策了呢?恰恰相反,由于中国的国情,福利政策的危害只是更大而不是更小,因此,更应该明辨是非,坚定态度。

第一、认为政府会从已有的税款里拿钱出来实施福利政策,这是很大的误解。事实上,现行的各种社会福利都是来自于独立于税款的基金,如养老基金,医疗基金,而这些资金来自企业和个人的缴费,是“羊毛出在羊身上”。

第二、“五险一金”或“四险一金”已经给企业,尤其是民营的中小企业造成了相当沉重的负担,不少企业不得不裁员甚至关门。企业用工成本增加的同时,劳动者实际到手的收入却减少了。今年的“个税社保新政”,引发一片哀鸣,更可见其弊。此外,为办理社保事宜而增加的机构,比如社保局,本身又是一笔不小的开支,同样是由企业和个人承担。

第三、由上可见,社保其实是一种强制储蓄,政府强制保管企业和个人的部分收入,在符合条件时可有参保的个人提取。然而,这与银行储蓄不同,银行到期不能付款,要承担违约法律责任。政府到期不能支付,可以修改法律和政策,比如“延迟退休”,修改公积金提取条件等等,而企业和个人对这种政策变化只能被动接受,得不到法律救济。实际上,强制储蓄可以由自愿储蓄和商业保险等替代,除非能够证明,政府比每个人自己更知道自己的利益所在,并能全心全意地致力于实现每个人的利益。

第四、强制性要求企业缴纳社保费用,效果类似于最低工资制度,会造成边际劳工失业。边际的劳工是那些在劳动力市场上最缺乏竞争力的劳工,比如教育程度较低或年龄较大的劳工、女性、没有工作经验的年轻人(包括某些大学毕业生)等等。这是因为,强制社保导致企业用工成本增高,企业要生存就不可能做亏本生意,为企业创造的价值较少的边际劳工就不可避免地成了受害者,失去了谋生和提高技能的机会。另一方面,也不利于白手起家的创业者,创业初期本钱微薄,支付不了高昂的用工成本,则无法扩大规模甚至无法持续经营。新鲜血液大量减少,经济体就会失去活力。

第五、福利病对较穷的国家危害更大。诚如米塞斯所说:富国的优势就是犯蠢的时间可以更长一点。一个富翁天天大手大脚,挥金如土,短时间内还看不出什么问题,一个穷小子天天大手大脚,挥金如土,那会是什么后果?被誉为福利国家典范的瑞典,曾有过长达150年的自由市场经济的发展,家底厚、人口少且民间自律性较强,加之除了福利政策之外,经济体其他方面仍然很自由,福利制度才能运行下去。即使如此,瑞典在上个世纪90年代还是大量削减了福利,以度过经济危机。同样实行福利制度的希腊,没那么有钱,经济上又实行干预政策,就搞得一团糟,国家濒临破产。希腊还有欧盟输血,中国如果陷入希腊式的困境,又靠谁来输血呢?

第六、福利政策并非是人们遇到困难时的唯一解决之道。实际上还存在着多种效率更高,弊端更少的方式,比如自助、互助、慈善、商业保险等。政府提供的福利只能作为紧急情况下的最后手段,而不应作为最优先的选择。

除了这种强制储蓄的所谓福利,另一种是秦晖老师说的负福利,有权力制定政策的人把公共的福利分给了自己人,反而加剧了不平等分化。前几天湖南一个城市退租 600 多套公租房就是这样的例子。农民、城市、公务员的退休工资天差地远也是这样的例子。

Replying to Frost

#eltoo 之前没看懂 eltoo 是怎么交互的,跟当前方式的通道有什么区别,晚上又重新仔细看了这篇[博文](https://medium.com/@brandonarvanaghi/breaking-down-the-bitcoin-lightning-network-eltoo-c48554f5ae02)。大致过程如下。

A 和 B 建立双向流量通道,和当前方式一样,在构建充值交易 F 之前,先商量构建保底的让双方都不被骗的结算交易 S0。典型的充值交易 F 两个 input(双方分别注资,)1 个 output。这个 output 有两种花费方式:1. 被**两方结算密钥多签**花掉,这就是结算交易 S0,但结算交易上链有 10 个高度的时间锁;2. 被**两方更新密钥多签**花掉。

发生支付行为后,比如 A 向 B 支付。商量构建新的结算交易 S1,但它花的不是充值交易 F,而是另一个等待商量着构建的交易,也就是更新交易 U1,它的 input 用方式 2 花掉 F 的 output, 它自己的 output 的形式和充值交易 F 一样,同样两种方式可花掉它。

也就是初始状态 S0 花 F,支付一次,构建S1 花 U1,U1 花 F,再支付一次,构建 S2 花 U2,U2 花 U1。

关闭通道,只需要 F、最后的 U、最后的 S 这 3 个交易上链。

Q&A:

Q1. U1 花 F,U2 花 U1,U3 花 U2,为什么中间的 U 不用上链,直接上链最后一个 U 而它就能直接花掉 F?

A:基于 SIGHASH_NOINPUT 这种新的 SigHashType,在 U 的 input 里生成签名时,跟它要花的 UTXO 无关,只用它自己的 ouput 计算哈希(input 不参与),这样最后一个 U 要上链时,input 的签名(这是个两方更新密钥多签)不用变,就可以把 input 改一下变成指向 F 的 output。

Q2. 那最后的 U 上链要更换了 input,它的 tx hash 变了,对应要花它的 S 的 input 指向的 tx hash 就对不上了?

A:S 也要使用 SIGHASH_NOINPUT,它的 input 也要变,重新指向这个新替换的 U 的 tx hash,input 里的签名(这是两方结算密钥多签)不用变。

Q3:如果任意一套 U 和 S 都可以花掉 F,那坏人用中间一套 U 和 S 上链怎么办?

A:这时另一方需要观察到这个恶意 U 上链(恶意 S 上不了链,因为 U 有 10 个高度的时间锁),然后更改他自己保存的最终的 U 的 input,去上链花掉这个恶意的 U,然后等自己的 S 上链。U 只能是后构造可以花掉先前构造的(不可以反过来,否则坏人会继续用中间的 U 上链),因为 F 和 U 的 output 用方式 2 花费时,带有自己的序列号(作为 UTXO 级别的绝对时间锁),同时将交易的高度锁 nLockTime 字段设置成这个序列号数值。这样后序列的 U 可以花前面的 U,因为它的 nLocktime 满足 UTXO 时间锁条件,但反过来就不满足。

Q4:那即使坏人不能继续用中间的 U 上链搞破坏,但好人的 S 在等待 10 个高度准备上链,坏人拿中间的 S(也更改 input 重新指向已经上链的最后的 U)也准备上链,两个 S 看运气上链?

A:每次重新商量构建结算交易 S 时,双方都要**更换结算密钥**,这样每个 S 只能花对应的 U。中间状态的 S 留着是没有用的,因为它对应的 U 上链就会进入 Q3 情形,是没有好处的。

总结:和当前方式一样,eltoo 也需要 watchtower,及时发现中间的 U 是否恶意上链(似乎只需要记住这一串 U 的 tx hash,而在当前方式下,还需要保存对应的揭秘密钥去实施惩罚,这样 eltoo 的通道状态备份更简单一点)。当前方式这样做,被发现会面临经济惩罚,但 eltoo 做了只相当于在捣乱,可以即使纠正,但也没有惩罚(最大损失仅可能是手续费,而且这个 U 的手续费扣的还可能是另一方的)。eltoo 的 F 从一开始似乎不用上链,这样构建通道不用等待链上确认,但关闭通道需要 3 个交易,当前方式下开通再结算只需要 2 个交易。eltoo 在双向流量通道上似乎并没有特殊的,当前通道在构建时,理论上双方愿意的话也可以每人提供一个 input,跟 eltoo 一样一开始就有双向流量。

按理说 F 一样要先上链,否则注资的 input 指向双方各自的 UTXO 可能会失效。

并发:两只手抛三个球的杂技,任一时刻任一只手最多只有一个球,甚至没有球,算是偷懒的空档。这种杂技当然可以加入更多球,但手抛起来的频率有限,最后只能把球抛高一点,让它滞空久一点,这样每个球在手中被得到处理的时间反而降低了。

并行:左手画圆,右手画方,两只手是真正地在同时工作。每增加一只手,可处理的量都会增长。

L1 的链因为要达到全局共识状态,所以都是单核的,单核是没有并行可言的。只有真正利用到网络中的节点,把它们看成许许多多的手利用起来,达成并行,才算得上是能力扩容。单核能力可提高的上限相比需求来说,是微不足道的。

多核并行的一个难题就是不同核之间的状态同步,一种办法就是把需要同步的状态写到一个大家都方便读到的地方,比如共享内存、寄存器等。

从这种角度看,比特币的扩容才算是并行式扩容,凡是通过另起一个节点更少的网络来达到提高单核处理能力的扩容方式,都是临时抱佛脚管用一时而已。

#eltoo 之前没看懂 eltoo 是怎么交互的,跟当前方式的通道有什么区别,晚上又重新仔细看了这篇[博文](https://medium.com/@brandonarvanaghi/breaking-down-the-bitcoin-lightning-network-eltoo-c48554f5ae02)。大致过程如下。

A 和 B 建立双向流量通道,和当前方式一样,在构建充值交易 F 之前,先商量构建保底的让双方都不被骗的结算交易 S0。典型的充值交易 F 两个 input(双方分别注资,)1 个 output。这个 output 有两种花费方式:1. 被**两方结算密钥多签**花掉,这就是结算交易 S0,但结算交易上链有 10 个高度的时间锁;2. 被**两方更新密钥多签**花掉。

发生支付行为后,比如 A 向 B 支付。商量构建新的结算交易 S1,但它花的不是充值交易 F,而是另一个等待商量着构建的交易,也就是更新交易 U1,它的 input 用方式 2 花掉 F 的 output, 它自己的 output 的形式和充值交易 F 一样,同样两种方式可花掉它。

也就是初始状态 S0 花 F,支付一次,构建S1 花 U1,U1 花 F,再支付一次,构建 S2 花 U2,U2 花 U1。

关闭通道,只需要 F、最后的 U、最后的 S 这 3 个交易上链。

Q&A:

Q1. U1 花 F,U2 花 U1,U3 花 U2,为什么中间的 U 不用上链,直接上链最后一个 U 而它就能直接花掉 F?

A:基于 SIGHASH_NOINPUT 这种新的 SigHashType,在 U 的 input 里生成签名时,跟它要花的 UTXO 无关,只用它自己的 ouput 计算哈希(input 不参与),这样最后一个 U 要上链时,input 的签名(这是个两方更新密钥多签)不用变,就可以把 input 改一下变成指向 F 的 output。

Q2. 那最后的 U 上链要更换了 input,它的 tx hash 变了,对应要花它的 S 的 input 指向的 tx hash 就对不上了?

A:S 也要使用 SIGHASH_NOINPUT,它的 input 也要变,重新指向这个新替换的 U 的 tx hash,input 里的签名(这是两方结算密钥多签)不用变。

Q3:如果任意一套 U 和 S 都可以花掉 F,那坏人用中间一套 U 和 S 上链怎么办?

A:这时另一方需要观察到这个恶意 U 上链(恶意 S 上不了链,因为 U 有 10 个高度的时间锁),然后更改他自己保存的最终的 U 的 input,去上链花掉这个恶意的 U,然后等自己的 S 上链。U 只能是后构造可以花掉先前构造的(不可以反过来,否则坏人会继续用中间的 U 上链),因为 F 和 U 的 output 用方式 2 花费时,带有自己的序列号(作为 UTXO 级别的绝对时间锁),同时将交易的高度锁 nLockTime 字段设置成这个序列号数值。这样后序列的 U 可以花前面的 U,因为它的 nLocktime 满足 UTXO 时间锁条件,但反过来就不满足。

Q4:那即使坏人不能继续用中间的 U 上链搞破坏,但好人的 S 在等待 10 个高度准备上链,坏人拿中间的 S(也更改 input 重新指向已经上链的最后的 U)也准备上链,两个 S 看运气上链?

A:每次重新商量构建结算交易 S 时,双方都要**更换结算密钥**,这样每个 S 只能花对应的 U。中间状态的 S 留着是没有用的,因为它对应的 U 上链就会进入 Q3 情形,是没有好处的。

总结:和当前方式一样,eltoo 也需要 watchtower,及时发现中间的 U 是否恶意上链(似乎只需要记住这一串 U 的 tx hash,而在当前方式下,还需要保存对应的揭秘密钥去实施惩罚,这样 eltoo 的通道状态备份更简单一点)。当前方式这样做,被发现会面临经济惩罚,但 eltoo 做了只相当于在捣乱,可以即使纠正,但也没有惩罚(最大损失仅可能是手续费,而且这个 U 的手续费扣的还可能是另一方的)。eltoo 的 F 从一开始似乎不用上链,这样构建通道不用等待链上确认,但关闭通道需要 3 个交易,当前方式下开通再结算只需要 2 个交易。eltoo 在双向流量通道上似乎并没有特殊的,当前通道在构建时,理论上双方愿意的话也可以每人提供一个 input,跟 eltoo 一样一开始就有双向流量。

10 年前提出的助记词方法只是保证私钥生成确定化、好记忆。但还有很多不足,像海量空间下的路径共识问题、要不要短语、除了私钥外其他的元数据要怎么恢复,包括:交易标签、交易多签脚本和其他脚本等。

在未来 Taproot 逐渐流行,不再限于几种共识脚本模板,到时怎么备份和恢复交易身上附带的自定义的链下脚本,是必须要解决的问题。

nostr:nevent1qqsq9ps88nnpavhj9cfna6xmz8e73lavu75una6dg370dp5epgf63aspz3mhxue69uhhyetvv9ujuerpd46hxtnfdupzq3qka9c4flhfdr0l524yn5qy9h0fyhdu0qnp89hc8ulf6a2wz2p8qvzqqqqqqygjtzh2

花了一天时间已经看到了第 5 章,可以说这第三版在原来已经很优秀的基础上继续改进了很多,吸收了其它更技术细节书籍的一些优点。

目前感受到两个突出特点:技术细节介绍时会讲当时为什么选这样,不仅讲 what,而且用一两句话把 why 点出来;力求清晰简洁,很多网上流传的资料里混淆的概念,在这本书里区分得很清楚。

第 5 章对于钱包助记词、恢复、备份写得非常好,相比零碎的博客文章而言,书用一章的篇幅可以把这些内容讲得更连贯完整。尤其是讲了目前方案的不足和可选的新方案。

nostr:nevent1qqsqumg2m6huz8fekngh42m2dyju2ftrrfm3tkvrun9rx45vatr3eqspr3mhxue69uhkummnw3ezucnfw33k76twv4ezuum0vd5kzmqzypzpd6t32nlwj6xllg42f8gqgtw7jfwmc7pxzwt0s0e7n465uy5zwqcyqqqqqqgnc00nv

短剧再次给老外一点中国震撼,这期经济学人报道短剧在国外都火热了,霸道总裁和龙王女婿真是跨文化的吗?😹

早上看了因纽特人的纪录片《消失的极地猎人》,不得不敬佩老布这样的原始部落里的主心骨,为常人所不能为,堪称英雄。最后搬进现代化住宅里,寿享 92,真是传奇一生。

也更理解了保守主义思想家所看重的传统,在这种原始部落里正是核心。

今天看了宫崎骏的《风之谷》,发现和《幽灵公主》是同样的题材,讲的都是人类破坏自然。

在这两部电影里,占大多数的普通人都是破坏自然的罪人,并且狂妄而不知死期将近。只有主角是自然之子,代表人类这个种族仅有的一点价值,也就是创造更好未来的微弱可能性。只有这一点点可能性是人类堪堪可以继续存在的原因,除此之外全是罪恶。

这样的两部电影,在剧情、角色、主题上,天生缺两个脚,只有一个主题,所以只能算作寓言故事片。由于太注重主题,对一个故事而言就太伤害了剧情和角色这两个方面。

它们在剧情上显得牵强,因为要凸显主题,所以矛盾,也就是主角要解决的难题会非常尖锐地摆在面前,就像是直接拿一头大象贴你脸上,要你塞进冰箱。另外在角色上也显得分裂,两部电影的主角都重视每一个个体的生命,不分人类阵营和自然阵营。但就在主角热血地抢救某一个生命的行动下,死亡的生命反而不知凡几。

但不得不承认,即使是寓言故事,由于主题的深刻性和警醒性,这两部都无疑是优秀的电影。强烈到极点的矛盾展示出来也能让观众真正地反思下人与自然的关系问题,达到了这个作用,作为电影它就已经很好了。

读政治思想史和读哲学史在心理态度上会存在明显的差异。

读哲学史,看到对你而言不是很有说服力的理论,可以放松,看过了也就看过了,可以雁过而水无痕。

但读政治思想史碰到对你而言不是很有说服力的观点,比如说某个主体是绝对正确的,君主,普遍意志,阶级,民族等等,说它们会违法是不可能的,因为它们本身就是法。再比如说政体形式问题,要我们按哪种形式组织。这些不同意会有更强烈的心理反抗冲动:能说服别人但没能说服我。

因为政治思想对现实来说,后果范围更大,影响更快,作用更直接,所以更警惕是合理的。

nostr:nevent1qqsvk0d8xq42p4l8qs83xaq56yf4dhac243lunrx442fmdvsp22g6kqpz3mhxue69uhhyetvv9ujuerpd46hxtnfdupzq3qka9c4flhfdr0l524yn5qy9h0fyhdu0qnp89hc8ulf6a2wz2p8qvzqqqqqqyl3jja0

这本《西方政治思想史》上本由柏拉图讲到美国立国,还不能说看得很爽,主要是翻译语言不文不白,像是一个中国老头在讲台上用地道的中国语言讲课,有时总让我怀疑这翻译到底准不准。

但到了下册,直接大呼过瘾,把脉络理得清楚,看得让人只想大啸三声。尤其是对自由主义的反动部分,一连串层层递进,黑格尔,马克思,伯恩斯坦,列宁托洛斯基,帕累托,勒庞,弗洛伊德,希特勒。这些理论或是偏离或是颠倒或是左右,看完就让人明白他们对自由主义到底是什么批判意见。

https://www.goodreads.com/book/show/55925518

无意间找到了讲一本俄国历史的好书,在豆瓣上看到别人评论,说这本书理想国好几年前就翻译完了,1000 多页,只是一直不让出版,结果在网上找到了精排版的中文版,估计是译者不忍心它难见天日所以放出来的。

人民的悲剧:俄国革命史,1891-2914

https://anonymfile.com/x40y/1891-1924.epub

政府变成这样骑虎难下的局面非常僵化和愚蠢,这它自己也是非常危险的。

本来建国就不是通过无产阶级实现的,而是列宁式的恐怖极权。但一百年后中国城市人口中真的出现了大比例的的青年无产阶级,如果他们上过高中,在这世道下亲身经历认为真的「城市里打工的工资永远只够一部分人勉强糊口,一部分人不够糊口」,再认同课本上的马克思对这种情况的分析是对的话,那他们可能真的会相信需要进行革命了。

现在网上一批年轻人是毛粉,一批人等别人「创业」,似乎就有点这苗头。

nostr:nevent1qqsprl5trydwnwzvx9lt0rlt3relcqsvw3gueqkjqwrdh6l2752halspr3mhxue69uhkummnw3ezucnfw33k76twv4ezuum0vd5kzmqzyr258jpqq5806mfvz5mtpxgpzxkzjwjyx8n2z2ffgv3kdc92sqq7wqcyqqqqqqg42vm5z

因为不能穿越时间,所以带来两个非常无解的问题。

不能穿越过去,所以休谟怀疑是否真的有因果,无法重放来证明这点;历史路径是否偶然还是必然也不确定。

不能穿越未来,所以可以用诉诸未来论证合理性,从弥赛亚降世,到共产主义,都是用事实上不存在的未来进行说服。