<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Btc · Jingyu Liu</title><link>https://jingyu.uk/tags/btc/</link><description>Jingyu Liu · PhD student in Financial Technology at HKUST (Guangzhou). Research in blockchain, mechanism design, and decentralized finance.</description><language>en-US</language><atom:link href="https://jingyu.uk/tags/btc/index.xml" rel="self" type="application/rss+xml"/><item><title>ChaumMian CoinJoin</title><link>https://jingyu.uk/posts/coinjoin/</link><guid>https://jingyu.uk/posts/coinjoin/</guid><pubDate>Thu, 26 Oct 2023 10:34:07 +0800</pubDate><description>&lt;ul&gt;
&lt;li&gt;目标：构建一笔 bitcoin mixer 交易, 打乱 Inputs Outputs 的关联. &lt;img src="https://jingyu.uk/images/coinjoin/exp.png" alt="examples"&gt;&lt;/li&gt;
&lt;li&gt;前置知识
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.bitcoin.it/wiki/CoinJoin"&gt;Coinjoin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;UTXO&lt;/li&gt;
&lt;li&gt;盲签名介绍：
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/gjmWhFVBpVrbW_wCd7UucA"&gt;https://mp.weixin.qq.com/s/gjmWhFVBpVrbW_wCd7UucA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UnBlind ( Sign( Blind(msg) ) ) = Sign(msg) &lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;参与者：
&lt;ul&gt;
&lt;li&gt;用户&lt;/li&gt;
&lt;li&gt;coordinator: 一个无需信任的第三方&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;为了简单起见，假设池子的单位为 1 btc，全部使用 P2PKH 的方式进行转账。参与者 alice 想要自己的 addr1 的 tx ouput（大于 1btc ）当中转 1btc 到 bob 的地址 addr2 当中&lt;/li&gt;
&lt;li&gt;过程
&lt;ul&gt;
&lt;li&gt;alice 使用某个匿名的网络 id1 连上 coordiantor（tor etc）&lt;/li&gt;
&lt;li&gt;alice 向 coordiator 证明自己可以解锁一个未使用的 ouput（大于 1btc ）OP1
&lt;ul&gt;
&lt;li&gt;alice -&amp;gt; coordinator: 我拥有地址 addr1, 可以解锁 OP1 ( 使用 pk 就可以证明)&lt;/li&gt;
&lt;li&gt;coordinator -&amp;gt; alice: 麻烦您签个名，我认证一下哈&lt;/li&gt;
&lt;li&gt;alice -&amp;gt; coordinator: 签名消息&lt;/li&gt;
&lt;li&gt;coordinator 验证成功&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;alice 向 coordiator 发送 bob 公钥的盲消息 &lt;strong&gt;M1&lt;/strong&gt; = &lt;code&gt;&amp;lt; Blind(Hash(addr2.pk)) &amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;coordinator 对 M1 直接签名，并向 alice 返回 签名消息：&lt;strong&gt;M2&lt;/strong&gt; = &lt;code&gt;Sign(Coordinator.sk, M1) &lt;/code&gt;&lt;/li&gt;
&lt;li&gt;coordinator 向当前池子 tx 的临时 outputs 当中加上一条对 alice 的找零 output
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OP_DUP&lt;/code&gt; &lt;code&gt;OP_HASH160&lt;/code&gt; &lt;code&gt;&amp;lt;Hash(addr1.pk)&amp;gt;&lt;/code&gt; &lt;code&gt;OP_EQUALVERIFY&lt;/code&gt; &lt;code&gt;OP_CHECKSIG&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;alice 在 网络 id 1 下线，更换 id2 连上 coordinator（tor etc）&lt;/li&gt;
&lt;li&gt;alice 对 M2 去盲得到 &lt;strong&gt;M3&lt;/strong&gt; =&lt;code&gt;Sign(Coordinator.sk, Hash(addr2.pk))&lt;/code&gt;,并把 &lt;strong&gt;M2&lt;/strong&gt; 和接收者的公钥哈希发送到 coordinator&lt;/li&gt;
&lt;li&gt;coordinator 用自己的私钥验证，发现自己的确对这个接收者签了名&lt;/li&gt;
&lt;li&gt;coordinator 向当前池子 tx 的临时 outputs 当中加上一条对 addr2 的 1btc 转账
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OP_DUP&lt;/code&gt; &lt;code&gt;OP_HASH160&lt;/code&gt; &lt;code&gt;&amp;lt;Hash(addr2.pk)&amp;gt;&lt;/code&gt; &lt;code&gt;OP_EQUALVERIFY&lt;/code&gt; &lt;code&gt;OP_CHECKSIG&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;当 coordinator 发现池子足够大的时候把完整的 outputs 发给所有的该池子的用户，要求所有的参与者签名，锁住 outputs（此时 outputs 不会在添加了）&lt;/li&gt;
&lt;li&gt;alice 从网络 id2 下线，更换 id3&lt;/li&gt;
&lt;li&gt;alice 接收到了完成的 outputs， 作了个简单的算术，发现自己的两笔转账都在里面（一笔 1btc 给bob 的， 一笔找零给自己的）满意地签了名，把签名和自己的公钥（addr1.pk）发给 coordinator&lt;/li&gt;
&lt;li&gt;coordinator 收集到了所有的签名，构建了所有的inputs ，把完整的 池子 tx 发送到 btc 网络上，完成交易&lt;/li&gt;
&lt;li&gt;待交易确认之后，bob 可以向正常使用 P2PKH 一样使用 alice 的转过来的 1btc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;匿名问题：有谁知道转移对？
&lt;ul&gt;
&lt;li&gt;alice：alice 作为发起人，当然知道&lt;/li&gt;
&lt;li&gt;bob：如果bob 只知道链上的消息，bob不知道这笔钱是 alice 给转的。但是alice 和 bob 往往在链下有联系（要不然为什么要向bob 转账呢？除了&lt;a href="https://web3caff.com/zh/archives/26627%5D"&gt;投毒攻击&lt;/a&gt;，甚至往往可能是同一个人。&lt;/li&gt;
&lt;li&gt;coordinator:coordinator 知道所有 input 对应的公钥. 由于 alice 使用两个不同的网络 id 发送 &lt;strong&gt;M1 M3&lt;/strong&gt;. coordinator 无法将 &lt;strong&gt;M1&lt;/strong&gt; 和&lt;strong&gt;M3&lt;/strong&gt; 关联起来，除非 coordinator 关联了 id。&lt;/li&gt;
&lt;li&gt;混币池子里面其他的用户：无法知道其他的转移对，只知道完整的整个池子的转移&lt;/li&gt;
&lt;li&gt;其他人：更加无从得知转移对。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;破解匿名的方法：
&lt;ul&gt;
&lt;li&gt;网络层面关联 id1 id2&lt;/li&gt;
&lt;li&gt;coinjoin 常规攻击：在一个池子当中混入足够多的内鬼交易对（可以被攻击者知晓的交易对），可以暴露其他混币者的转移对。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;安全问题：
&lt;ul&gt;
&lt;li&gt;alice 怎样不会被 coordinator欺骗？
&lt;ul&gt;
&lt;li&gt;在整个交易过程当中，alice 只签名了两次
&lt;ul&gt;
&lt;li&gt;第一次签名用于证明了自己掌握了某个 output，过程与使用钱包 连接dapp的过程一致，签名消息都是明文。&lt;/li&gt;
&lt;li&gt;第二次是对整个池子 coinjoin 进行签名，alice只要验证钱是否有足够的钱转到 bob 和自己的，就可以签名了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;coordinator 怎样不被用户欺骗？
&lt;ul&gt;
&lt;li&gt;Coordinator 会对所有用户合格用户进行一个盲签。在我们举的例子当中，coordinator 会对所有 160 bit 的消息进行签名。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;混币池子里面其他的用户：无法知道其他的转移对，只知道完整的&lt;/li&gt;
&lt;li&gt;盲签的安全性:
&lt;ul&gt;
&lt;li&gt;为了防止攻击者构造特殊的hash攻击让 coordinator 签名，盲签采用的签名方法应该与 btc 网络当中的签名方法完全不同，这样攻击者无法伪造 tx 签名。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;参考链接&lt;/p&gt;</description></item><item><title>Taproot Asset 快速上手体验</title><link>https://jingyu.uk/posts/taro/</link><guid>https://jingyu.uk/posts/taro/</guid><pubDate>Fri, 20 Oct 2023 10:34:07 +0800</pubDate><description>&lt;h2 id="参考学习"&gt;参考学习&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;taproot asset 介绍:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.btcstudy.org/2022/04/08/how-bitcoin-taro-protocol-works/"&gt;https://www.btcstudy.org/2022/04/08/how-bitcoin-taro-protocol-works/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.btcstudy.org/2022/04/07/announing-Taro-a-new-protocol-for-multi-asset-bitcoin-and-lightning/"&gt;https://www.btcstudy.org/2022/04/07/announing-Taro-a-new-protocol-for-multi-asset-bitcoin-and-lightning/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;taproot asset 文档
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.lightning.engineering/the-lightning-network/taproot-assets"&gt;https://docs.lightning.engineering/the-lightning-network/taproot-assets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;taproot asset demo
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=JNaryHu2mFc"&gt;https://www.youtube.com/watch?v=JNaryHu2mFc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=xtklaJHfKIY"&gt;https://www.youtube.com/watch?v=xtklaJHfKIY&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安装与配置"&gt;安装与配置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;docker&lt;/li&gt;
&lt;li&gt;docker compose/ docker desktop&lt;/li&gt;
&lt;li&gt;polar:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jamaljsr/polar"&gt;https://github.com/jamaljsr/polar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;linux 下可能要注意 docker volume 没有权限读取的问题, &lt;code&gt;chmod chown&lt;/code&gt; 一下就行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;btc exporer
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/janoside/btc-rpc-explorer"&gt;https://github.com/janoside/btc-rpc-explorer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;主要用来看一下 bitcoin regtest 链上信息.&lt;/li&gt;
&lt;li&gt;需要根据 bitcoin core node 的 rpc 相关信息配置一下 &lt;code&gt;.env&lt;/code&gt; 文件: &lt;img src="https://jingyu.uk/images/taro/btc_config.png" alt=""&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="简单的-mint-transfer-test"&gt;简单的 mint transfer test&lt;/h2&gt;
&lt;p&gt;下面我将使用 Polar 测试 Taproot asset, 测试网络结构如下:&lt;img src="https://jingyu.uk/images/taro/struct.png" alt=""&gt;&lt;/p&gt;</description></item></channel></rss>