<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>区块链 &#8211; 寂静花园</title>
	<atom:link href="https://www.addesp.com/archives/category/%E7%AC%94%E8%AE%B0/%E5%8C%BA%E5%9D%97%E9%93%BE/feed" rel="self" type="application/rss+xml" />
	<link>https://www.addesp.com</link>
	<description>寂静中交织着热情</description>
	<lastBuildDate>Sat, 05 Jun 2021 04:24:04 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>
	<item>
		<title>通俗易懂地解释什么是区块链</title>
		<link>https://www.addesp.com/archives/306</link>
					<comments>https://www.addesp.com/archives/306#comments</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Thu, 23 Jul 2020 06:00:00 +0000</pubDate>
				<category><![CDATA[区块链]]></category>
		<category><![CDATA[科普]]></category>
		<category><![CDATA[随笔]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=306</guid>

					<description><![CDATA[不讨论细节，旨在勾勒出区块链的轮廓。]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">前言</h2>



<p class="wp-block-paragraph">不讨论细节，旨在勾勒出区块链的轮廓。由于是以介绍为主，所以不会涉及细节，而且<strong>**肯定会有一些错误**</strong>。如果有兴趣的话可以自行查询资料。</p>



<h2 class="wp-block-heading">故事</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>我们先讲个故事：张三是一个三年级的学生，他的父母是做生意的。有一天管帐本的妈妈把账本弄丢了，付出了很大的代价才搞清楚资金的来龙去脉，于是父母商量了一下决定，爸爸和张三每次收支都要告诉妈妈，由妈妈记录这一笔帐，并每天晚上将账本公布，账本开头写上昨日三人的期初余额，结尾写上三人的期末余额。爸爸和张三检查无误后各自抄走一份，如果公布的账本有误则认为是假账，则选择昨日公认的账本作为今天的账本，今日的所有支出作废，损失由妈妈承担。</p></blockquote>



<p class="wp-block-paragraph">检查账本时都要检查下列项目：</p>



<ul class="wp-block-list"><li>每笔交易是否有资金支出者的签名</li><li>资金支出者是否有足够的钱支付</li><li>今日的收支是否计算得出账本结尾声明的三人的期末余额</li><li>今日账本三人的期初余额和昨日账本三人的期末余额一致</li></ul>



<p class="wp-block-paragraph">Q：妈妈是否可以记录一些虚假的交易，比如妈妈擅自记录一笔爸爸转给妈妈&nbsp;100&nbsp;块钱的账？</p>



<p class="wp-block-paragraph">A：不可能，因为这笔转账必须由爸爸的签名才行，如果没有签名则晚上爸爸和张三检查账本的时候会被认为是假账，而损失却由妈妈自己承担。</p>



<p class="wp-block-paragraph">Q：张三是否可以假装爸爸发给妈妈一笔给自己买零食的交替？</p>



<p class="wp-block-paragraph">A：不能，因为没有爸爸的签名。</p>



<hr class="wp-block-separator"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>时间一长，妈妈发现记账很累，于是要求每记一笔账都要求支出放支付一块钱给妈妈。后续爸爸和张三发现妈妈记账很赚钱，于是想要自己来记账。一家人商量后达成一致，每个人都将自己的交易发送给其它两人，到了晚上汇总的时候，通过抽签选择采用谁的账本，并给予记账人报酬</p></blockquote>



<hr class="wp-block-separator"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>有一次爸爸妈妈一起出差了，抽签抽到爸爸记账，但是爸爸很忙，没时间把账本给张三看，导致张三无法抄写今天的账本。后来一家人商量后达成一致，当允许抄写记账人以外的账本。比如爸爸很忙，但是妈妈有空，妈妈抄完后可以让张三抄。</p></blockquote>



<h2 class="wp-block-heading">解释</h2>



<p class="wp-block-paragraph">这个故事描述了区块链的大致工作流程和特点。<br>区块链中的就是故事中的账本，每天产生一个账本就是每天产生一个「区块」。「链」对应的就是昨日账本的期末余额和今日账本的期初余额，两种余额将两个账本连接在一起，对应将「区块」连接依赖的「链」。</p>



<h3 class="wp-block-heading">区块链的特点</h3>



<ul class="wp-block-list"><li>分布式：对应故事中账本并不是只有记账人有，其它人也有一份。对应现实中数据不只有一份，而是有很多份，在不同的地方存储。</li><li>去中心化：对应故事中对账本起决定作用的人不是记账人，只有一家三口都认同的账本才是有效账本。对应现实中一份数据的内容究竟是什么不是一个人或者一个组织能够决定的，而是要大多数参与者达成共识才能决定。</li><li>点对点：对应故事中抄写账本时可以从任何持有账本的人手中抄写一份，而不是必须从记账人手中抄写。对应现实中一个节点请求数组不是请求中心节点，而是请求任意一个节点即可。</li><li>难以篡改：对应故事中任何人都无法伪造账本中的交易记录，因为必须要有签名。对应现实中依靠密码学保证的防篡改功能。</li></ul>



<h3 class="wp-block-heading">区块链的工作流程</h3>



<ol class="wp-block-list"><li>利用共识选择出一定时间段内的数据的管理员：对应故事中一家三口通过抽签决定记账人。</li><li>当数据发生改动时要对所有的节点进行广播：对应故事中一家三口在晚上决定记账人钱必须将自己的交易告知其余两人。</li><li>对于数据管理员公布的数据要进行检查：对应故事中要对账本进行的四种检查。</li><li>如果检查错误则回滚数据：对应故事中如果检查有误，则选择昨日公认的账本作为今天的账本，今日的所有支出作废。</li><li>如果检查无误则复制一份保存在本地：对应故事中没人都会抄写一份账本。</li></ol>



<h2 class="wp-block-heading">写在最后</h2>



<p class="wp-block-paragraph">本文是指介绍了一下区块链的特点时大致工作流程，并未涉及细节问题，如果有兴趣的话可以自行查询资料。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/306/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>以太坊的智能合约</title>
		<link>https://www.addesp.com/archives/179</link>
					<comments>https://www.addesp.com/archives/179#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Fri, 10 Jul 2020 14:42:43 +0000</pubDate>
				<category><![CDATA[以太坊]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=179</guid>

					<description><![CDATA[BTC 实现了去中心化的货币，而 ETH 则实现了去中心化的合约，即智能合约。]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<p class="wp-block-paragraph">现实中合约的有效性通常是通过法律来保证的，当合约出现纠纷，或者一方违约，可以通过法律手段解决，如起诉违约人等。<br>BTC 实现了去中心化的货币，而 ETH 则实现了去中心化的合约，即智能合约。<br>智能合约是存储在区块链上的一段代码，可以被调用，代码一般使用 Solidity 语言编写，运行在 EVM（Ethereum Virtual Machine）上，是图灵完备的语言，且代码一旦上链，则极难更改，这有效地保证了合约的有效性，但是如果合约代码有漏洞，也极难有修复，ETH 社区就曾经因为这个出现了 Hard Fork。<br>智能合约对帐户的更改，形成的交易和收据会存储在状态树、交易树和收据树中，并最终通过将三棵树的根哈希值写入 block header 来与其它全节点达成共识。<br>将介绍下列内容：</p>



<ul class="wp-block-list"><li>合约账户</li><li>嵌套调用</li><li>汽油费</li><li>其它特性</li></ul>



<h2 class="wp-block-heading">合约账户</h2>



<p class="wp-block-paragraph">智能合约的账户保存了合约的当前状态：</p>



<ul class="wp-block-list"><li>balance：余额</li><li>nonce：交易次数</li><li>code：合约代码</li><li>storage：存储，数据结构是一颗&nbsp;MPT。</li></ul>



<h2 class="wp-block-heading">嵌套调用</h2>



<ul class="wp-block-list"><li>智能合约的执行具有原子性，执行过程中出现错误会导致回滚。</li><li>嵌套调用是指一个合约调用另一个合约中的函数。</li><li>嵌套调用有时会触发连锁式的回滚，有时则不会。</li></ul>



<h2 class="wp-block-heading">汽油费</h2>



<ul class="wp-block-list"><li>每条语句会消耗一定汽油费（gas）。</li><li>复杂的指令消耗的多，简单的指令消耗少，也有一些是免费的。</li><li>汽油费由发起调用的外部账户一次性支付，如果没有用完则退还。</li><li>如果汽油费耗尽但是合约未执行完毕，则回滚更改，但是不退汽油费。</li><li>最终获取记账权的矿工会获得执行合约的汽油费。</li><li>执行发生错误的交易依然要支付汽油费。</li></ul>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph">Q：为什么汽油费不足时不退还？</p>



<p class="wp-block-paragraph">A：为了避免恶意的合约调用，如果退还的话，我就可以发布一个合约，里面是死循环代码，然后一直调用这个合约让矿工白白浪费算力，而我却几乎没有任何损失。</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph">Q：为什么执行发生错误的交易依然要支付汽油费？</p>



<p class="wp-block-paragraph">A：原因同上，主要是为了反之恶意的合约和恶意的调用。</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph">Q：每个区块内部的合约调用消耗的总汽油费是否有限制？</p>



<p class="wp-block-paragraph">A：有限制，记录在`header.gasLimit`字段，每个矿工在决定了要发布的区块时可以微调这个值，上调或下调$\frac{1}{1024}$。</p>



<h2 class="wp-block-heading">其它特性</h2>



<ul class="wp-block-list"><li>一个合约内的函数可以调用另一个合约内的函数。</li><li>一个外部账户也可以调用一个合约内的函数。</li><li>合约代码不支持<code>try....catch</code>，若执行时出现异常会触发回滚。</li><li>代码禁止 syscall。</li><li>合约代码只有被外部账户或者其它合约调用时才会执行，无法实现如定时执行等功能。</li><li>合约代码不允许多线程。</li></ul>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph">Q：为什么禁止 syscall？</p>



<p class="wp-block-paragraph">A：因为执行代码的环境不同，syscall 返回的结果也可能不同，容易导致最终的状态不一致，不同全节点之间难以达成共识。</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph">Q：为什么合约代码不允许多线程？</p>



<p class="wp-block-paragraph">A：多个合约并发/并行执行可能会导致最终的状态无法一致。一个例子：</p>



<ol class="wp-block-list"><li>合约&nbsp;A：如果张三账户中至少有&nbsp;100&nbsp;个币则转给李四&nbsp;10&nbsp;个币。</li><li>合约&nbsp;B：如果张三账户中不足&nbsp;100&nbsp;个币则转给李四&nbsp;5&nbsp;个币。</li><li>合约&nbsp;A&nbsp;中现在恰好有&nbsp;100&nbsp;个币。</li><li>正常的执行顺序是先执行&nbsp;A，后执行&nbsp;B。运行结果是李四收到&nbsp;15&nbsp;个币，张三的账户剩余&nbsp;85&nbsp;个币。</li><li>但是如果是并发/并行执行，则可能先执行&nbsp;B，等待&nbsp;B&nbsp;完成后才执行&nbsp;A，这种情况下李四收到&nbsp;10&nbsp;个币，张三的账户剩余&nbsp;90&nbsp;个币。</li><li>也就是最终相关的状态会不一致，也就是状态的转移不确定。各个全节点之间无法达成共识。</li></ol>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF?p=22" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF?p=22" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/179/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>以太坊 The DAO 事件</title>
		<link>https://www.addesp.com/archives/186</link>
					<comments>https://www.addesp.com/archives/186#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Fri, 10 Jul 2020 14:30:03 +0000</pubDate>
				<category><![CDATA[以太坊]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=186</guid>

					<description><![CDATA[由于智能合约代码存储在区块链上，所以一旦其有漏洞也极难修复。TheDAO 是运行在 ETH 区块链平台上的一个智能合约，但是其代码存在漏洞，于是黑客发起了 Re-entrancy Attack 盗走了大量的以太币，最终导致了以太坊分裂为 ETH（Ethereum） 和 ETC（Ethereum Classic）。]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<p class="wp-block-paragraph">由于智能合约代码存储在区块链上，所以一旦其有漏洞也极难修复。TheDAO&nbsp;是运行在&nbsp;ETH&nbsp;区块链平台上的一个智能合约，但是其代码存在漏洞，于是黑客发起了&nbsp;Re-entrancy&nbsp;Attack&nbsp;盗走了大量的以太币，最终导致了以太坊分裂为&nbsp;ETH（Ethereum）&nbsp;和&nbsp;ETC（Ethereum&nbsp;Classic）。</p>



<p class="wp-block-paragraph"><br>本系列的文章不会着重于细节讲解，对于本次攻击的详情可以参考这篇文章：<a rel="noreferrer noopener" href="https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/" data-type="URL" data-id="https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/" target="_blank">Analysis&nbsp;of&nbsp;the&nbsp;DAO&nbsp;exploit</a>。</p>



<p class="wp-block-paragraph">将介绍下列内容：</p>



<ul class="wp-block-list"><li>TheDAO</li><li>补救措施</li><li>以太坊的分裂</li></ul>



<h2 class="wp-block-heading">TheDAO</h2>



<p class="wp-block-paragraph">DAO&nbsp;是&nbsp;Decentralized&nbsp;Autonomous&nbsp;Organization（分布式自治组织）的简称，TheDAO&nbsp;是一个基于&nbsp;ETH&nbsp;区块链平台的众筹项目。其目的是让持有&nbsp;TheDAO&nbsp;代币的参与者通过投票的方式共同决定被投资项目，整个社区完全自制，其功能通过智能合约实现。众筹完成时共募集&nbsp;1150&nbsp;万以太币，在当时的价值达到&nbsp;1.49&nbsp;亿美元。</p>



<h3 class="wp-block-heading">Child DAO</h3>



<p class="wp-block-paragraph">允许&nbsp;TheDAO&nbsp;代币的持有者调用&nbsp;TheDAO&nbsp;合约中的&nbsp;`split`&nbsp;函数，创建一个子合约，持有者在原有&nbsp;TheDAO&nbsp;智能合约中的&nbsp;TheDAO&nbsp;代币被销毁，存储在原&nbsp;TheDAO&nbsp;智能合约中对应的以太币被转移到新的&nbsp;TheDAO&nbsp;智能合约中。<br>Child&nbsp;DAO&nbsp;是为了保护处于弱势地位了&nbsp;TheDAO&nbsp;代币持有者，使他们也可以有一个可以投票和分红的&nbsp;DAO。黑客发起攻击后 ETC 就锁定在了 <strong>Child&nbsp;DAO</strong> 内。</p>



<h2 class="wp-block-heading">补救措施</h2>



<p class="wp-block-paragraph">Child&nbsp;DAO&nbsp;创建后有&nbsp;28&nbsp;天的锁定期，这段时间无法将以太币转走，就是段时间给了以太坊社区补救的机会。</p>



<p class="wp-block-paragraph">以太坊团队设计了两步走方案：</p>



<ol class="wp-block-list"><li>锁定黑客账户。</li><li>设法将盗取的以太币退还。</li></ol>



<p class="wp-block-paragraph">以太坊首先发布了一个软分叉方案，新的软件升级中加入了一条规则：凡是和&nbsp;TheDAO&nbsp;相关的账户一律不允许交易。升级发布后大多数矿工都升级的软件。但是新的软件有一个&nbsp;bug。<br>当新的软件执行某个交易与&nbsp;TheDAO&nbsp;相关时，这个交易失败，但是没有收取汽油费。这就导致了整个系统中充斥着大量的与&nbsp;TheDAO&nbsp;相关的交易，消耗了大量的资源，因此大多数矿工又将软件版本退回了更新前。<br>软分叉的措施失败了，此时距离&nbsp;28&nbsp;天的锁定期结束已经很近了。于是以太坊团队发布了一个硬分叉方案，所有&nbsp;TheDAO&nbsp;账户中的以太币都被强制转到另一个账户，事后再想办法将其退还。<br>这次没有出现意外，最终被盗取的以太币都退还了</p>



<h2 class="wp-block-heading">以太坊的分裂</h2>



<p class="wp-block-paragraph">在攻击发生后，以太坊社区有两个观点，双方进行了激烈讨论，最终没能达成一致，导致了分裂。</p>



<h3 class="wp-block-heading">应该采取措施</h3>



<p class="wp-block-paragraph">这一派认为应该采取措施方式黑客将以太币盗走，原因是&nbsp;TheDAO&nbsp;是太大而不能倒的合约，TheDAO&nbsp;筹集的以太币大概占有当时总流通量的&nbsp;10%&nbsp;左右。以太坊开发团队也持有这种观点。<br><em>但是不要认为合约出了问题以太坊团队就会介入，主要还是因为这个合约的影响太大了。</em></p>



<h3 class="wp-block-heading">不应采取措施</h3>



<p class="wp-block-paragraph">这一派认为黑客的行为并没有违反任何规则，因为智能合约的代码就是规则，按照规则行事何谈违反？<br>更重要的观点是，如果出了问题就要回滚，那么还谈什么去中心化的不可篡改的账本？开发团队一句话就能强行更改账本，这和中心化有何区别？</p>



<h3 class="wp-block-heading">分裂</h3>



<p class="wp-block-paragraph">两派的矿工都没能说服对方，最终导致以太坊分裂成了两条链，一条就是采取了措施的链，称为&nbsp;ETH（Ethereum），另一条是没有采取任何补救措施的链，称为&nbsp;ETC（Ethereum&nbsp;Classic）。直到现在这两条链依旧存在，只是&nbsp;ETH&nbsp;上的算力更强。<br>在&nbsp;ETC&nbsp;上挖矿人一部分是出于投机目的，因为这条链算力更少，更容易挖出区块。另一部分人是纯粹出于信仰，这些坚持十分纯正的去中心化理念，认为&nbsp;ETC&nbsp;才是正宗的以太坊，而&nbsp;ETH&nbsp;已经偏离的去中心化的初衷。</p>



<h3 class="wp-block-heading">参考资料</h3>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF?p=23" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF?p=23" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/186/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>以太坊的状态树、交易树和收据树</title>
		<link>https://www.addesp.com/archives/183</link>
					<comments>https://www.addesp.com/archives/183#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Tue, 30 Jun 2020 14:45:02 +0000</pubDate>
				<category><![CDATA[以太坊]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=183</guid>

					<description><![CDATA[ETH 采用的是基于账户的模式，也就是说系统中显示记录着每个账户的当前状态信息。
每个账户都是由一个 160bit 的地址组成，外部账户中的状态包含余额（balance）、交易次数（nonce），合约账户包含 code(代码)、存储(stroge)。
对于一个出块时间只有十几秒的系统，如何高效地维护这些状态就成了十分重要的事情。]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>状态树</li><li>交易树和收据树</li></ul>



<h2 class="wp-block-heading">状态树</h2>



<p class="wp-block-paragraph">ETH&nbsp;采用的是基于账户的模式，也就是说系统中显示记录着每个账户的当前状态信息。</p>



<p class="wp-block-paragraph"><br>每个账户都是由一个&nbsp;160bit&nbsp;的地址组成，外部账户中的状态包含余额（balance）、交易次数（nonce），合约账户包含&nbsp;code(代码)、存储(stroge)。<br>对于一个出块时间只有十几秒的系统，如何高效地维护这些状态就成了十分重要的事情。</p>



<h3 class="wp-block-heading">为何不使用&nbsp;HashTable？</h3>



<p class="wp-block-paragraph">由于每个账户都是一个&nbsp;160bit&nbsp;的地址，所以很容易想到用&nbsp;HashTable&nbsp;来建立地址到账户状态的映射，在不考虑哈希碰撞的情况下，增删改查都是常数时间。国安民乐，岂不美哉？</p>



<p class="wp-block-paragraph"><br>那么为什么&nbsp;ETH&nbsp;没有使用&nbsp;HashTable&nbsp;呢？原因就是建立共识代价太大。</p>



<p class="wp-block-paragraph"><br>BTC&nbsp;建立共识是通过将区块内的交易组织成一颗&nbsp;Merkle&nbsp;Tree，并将根哈希值写入&nbsp;Block&nbsp;Header，其它全节点验证时只需要重新计算区根哈希值即可，同时因为一个&nbsp;Block&nbsp;的大小有限制，所以达成共识的代价比较小。<br>ETH&nbsp;如果使用&nbsp;HashTable&nbsp;管理账户状态的话，两个全节点要达成共识代价都很大，因为要遍历整个&nbsp;HashTable&nbsp;才可以。</p>



<h3 class="wp-block-heading">为何不使用&nbsp;Merkle&nbsp;Tree？</h3>



<p class="wp-block-paragraph">那么如果把账户的状态组织成一颗&nbsp;Merkle&nbsp;Tree&nbsp;怎么样呢？这样是不是就可以像&nbsp;BTC&nbsp;一样方便了？<br>看起来我们可以直接将根哈希值写入到&nbsp;Block&nbsp;Header&nbsp;里，以求向&nbsp;BTC&nbsp;一样达成共识。</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><br>Q：如果两个全节点记录的账户状态完全一致，它们的根哈希值一定相同么？</p>



<p class="wp-block-paragraph">A：不一定，因为两个全节点听到各个账户的顺序可能不同，如果不对&nbsp;Merkle&nbsp;Tree&nbsp;进行排序的话，两个全节点构造出来的&nbsp;Merkle&nbsp;Tree&nbsp;的根哈希值很可能不同。如果不同，也就无法达成共识。</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><br>Q：如果使用排序的&nbsp;Merkle&nbsp;Tree&nbsp;是不是就没问题了？</p>



<p class="wp-block-paragraph">A：如果监听到了一个新的账户，由于&nbsp;Merkle&nbsp;Tree&nbsp;时排序的，所以就要将其插入到合适的位置，那么就需要重新组织&nbsp;Merkle&nbsp;Tree，代价过大，不能接受。</p>



<h3 class="wp-block-heading">MPT（Merkle&nbsp;Patricia&nbsp;Trie）</h3>



<p class="wp-block-paragraph">最终&nbsp;ETH&nbsp;使用了&nbsp;MPT&nbsp;管理各个账户的状态，MPT&nbsp;是&nbsp;Merkle&nbsp;Tree&nbsp;和&nbsp;Patricia&nbsp;Trie&nbsp;组合而成的数据结构。</p>



<p class="wp-block-paragraph"><em>Patricia&nbsp;Trie&nbsp;就是经过路径压缩的&nbsp;Trie。</em></p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="780" height="570" src="https://www.addesp.com/wp-content/uploads/2020/09/0-6.webp" alt="" class="wp-image-184"/></figure>



<p class="wp-block-paragraph">Q：新增一个账户时的代价是否可以接受？</p>



<p class="wp-block-paragraph">A：可以，因为&nbsp;160bit&nbsp;的账户地址很容易地就能添加到&nbsp;Patricia&nbsp;Trie，且由于&nbsp;Patricia&nbsp;Trie&nbsp;的特点，对其更新都是局部的，不会导致整棵树的重组。</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><br>Q：更改一个账户状态时的代价是否可以接受？</p>



<p class="wp-block-paragraph">A：可以，因为&nbsp;Patricia&nbsp;Trie&nbsp;的查找仅需对数时间，同时由于&nbsp;Patricia&nbsp;Trie&nbsp;的特点，其更改也是局部的，同样不会导致整棵树的重组。</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph"><br>Q：达成共识的代价是否可以接受？</p>



<p class="wp-block-paragraph">A：Merkle&nbsp;Patricia&nbsp;Trie&nbsp;中&nbsp;将&nbsp;Patricia&nbsp;Trie&nbsp;中的传统的地址指针改成了哈希指针，且由于只要存储的地址完全一致，则无论存储顺序的先后，Patricia&nbsp;Trie&nbsp;只有一种形态，所以可以算出&nbsp;Merkle&nbsp;Patricia&nbsp;Trie&nbsp;的根哈希值并写道&nbsp;Block&nbsp;Header&nbsp;中，达成共识十分简单。</p>



<hr class="wp-block-separator"/>



<p class="wp-block-paragraph">每个区块都会保存完整的状态树，而不是仅和当前区块内交易有关的节点。因为这样可以便于回滚。也可以这么考虑：</p>



<ol class="wp-block-list"><li>账户&nbsp;A&nbsp;转账给&nbsp;账户&nbsp;B&nbsp;一个币。</li><li>那么就应该先知道两个账户的余额。</li><li>如果每个区块只保存与当前区块有关联的账户的状态树节点。</li><li>且假设&nbsp;B&nbsp;是一个新的账户。</li><li>那么这个新账户肯定不会存在于状态树中。</li><li>由于每个区块没有保留完整的状态树，所以只能顺着区块链去找。</li><li>那么查询账户&nbsp;B&nbsp;的状态，最终会找到&nbsp;Genesis&nbsp;Block，才会发现这是一个新账户。</li><li>代价太大，不能接受。</li></ol>



<h2 class="wp-block-heading">交易树和收据树</h2>



<p class="wp-block-paragraph">ETH&nbsp;每次发布区块的时候其包含的交易会被组织成一颗交易树，每笔交易执行完后会产生一个收据，记录相关信息，最终也会被组织成收据树，这两棵树均为&nbsp;MPT。<br>交易树和收据树也可以提供根哈希值。同时&nbsp;ETH&nbsp;也提供了比较复杂的查询操作，如查询&nbsp;10&nbsp;天内和某个智能合约有交易的账户等。为了降低这类查询操作的代价，ETH&nbsp;使用了&nbsp;Bloom&nbsp;Filter&nbsp;，它可以让矿工在沿着区块链查找交易等信息时快速地排除不可能包含所需信息区块。</p>



<p class="wp-block-paragraph"><em><a rel="noreferrer noopener" href="https://baike.baidu.com/item/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8/5384697" data-type="URL" data-id="https://baike.baidu.com/item/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8/5384697" target="_blank">Bloom&nbsp;Filter</a></em></p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF?p=16" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF?p=16" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/183/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>以太坊的 GHOST 协议</title>
		<link>https://www.addesp.com/archives/171</link>
					<comments>https://www.addesp.com/archives/171#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Tue, 30 Jun 2020 14:18:55 +0000</pubDate>
				<category><![CDATA[以太坊]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=171</guid>

					<description><![CDATA[ETH 的出块时间大概只有十几秒，如此短的出块时间如果照搬 BTC 的共识机制就会造成大量的分叉，分散全网算力，降低系统的安全性。因此 ETH 采用了新的 GHOST 协议，可以很好地适应十几秒地出块时间，保证系统的安全性，同时也在一定程度上平衡了收益，使得大型矿池相对于 BTC 不再那么占便宜。：]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<p class="wp-block-paragraph">ETH&nbsp;的出块时间大概只有十几秒，如此短的出块时间如果照搬&nbsp;BTC&nbsp;的共识机制就会造成大量的分叉，分散全网算力，降低系统的安全性。因此&nbsp;ETH&nbsp;采用了新的&nbsp;GHOST&nbsp;协议，可以很好地适应十几秒地出块时间，保证系统的安全性，同时也在一定程度上平衡了收益，使得大型矿池相对于&nbsp;BTC&nbsp;不再那么占便宜。<br>使用基于&nbsp;GHOST&nbsp;的协议主要出于两个目的：</p>



<ul class="wp-block-list"><li>维护系统安全性</li><li>平衡收益</li></ul>



<h2 class="wp-block-heading">维护系统安全性</h2>



<p class="wp-block-paragraph">出块时间只有十几秒，由于&nbsp;Flooding&nbsp;的时候没有考虑底层拓扑，如此短的时间一个区块难以广播给全网，容易造成大量分叉，如果继续使用&nbsp;BTC&nbsp;的共识协议，极其容易分散算力，降低系统安全性。</p>



<h2 class="wp-block-heading">平衡收益</h2>



<p class="wp-block-paragraph">以下图所示情况为例说明</p>



<figure class="wp-block-image size-large"><img decoding="async" width="482" height="262" src="https://www.addesp.com/wp-content/uploads/2020/09/0-5.webp" alt="" class="wp-image-172"/></figure>



<p class="wp-block-paragraph">我们假设&nbsp;A、C&nbsp;两个&nbsp;Block&nbsp;时个人矿工所挖出的，B&nbsp;是大型矿池挖出的&nbsp;Block。假设三个&nbsp;Block&nbsp;同时挖出。</p>



<ol class="wp-block-list"><li>显然大型矿池的所在的链最有可能成为最合法链，也就是&nbsp;B&nbsp;所在的链。</li><li>同时其它矿工出于不想浪费算力的目的，通常会选择跟在大型矿池的后面继续挖矿，而不是跟在个人区块后面。</li><li>理想情况下如果一个矿工占有&nbsp;n%&nbsp;的算力，那么他的收益也应该是所有矿工收益的&nbsp;n%。</li><li>现在&nbsp;B&nbsp;所在的链成为最长合法链的概率会超过&nbsp;n%。</li><li>因为个体矿工愿意跟随大型矿池进行挖矿。</li><li>那么大型矿池的期望收益就会超过&nbsp;n%。</li><li>我们不希望这种情况出现。</li></ol>



<figure class="wp-block-image size-large"><img decoding="async" width="582" height="262" src="https://www.addesp.com/wp-content/uploads/2020/09/1-5.webp" alt="" class="wp-image-173"/></figure>



<p class="wp-block-paragraph">上图这种情况下，ETH&nbsp;规定，D&nbsp;在发布的时候可以将&nbsp;A、C&nbsp;作为&nbsp;Uncle&nbsp;Block&nbsp;包含进&nbsp;D&nbsp;中，那么&nbsp;A&nbsp;和&nbsp;C&nbsp;的其所有者会获得&nbsp;7/8&nbsp;的出块奖励。一个区块中最多只能包含两个&nbsp;Uncle&nbsp;Block。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="782" height="262" src="https://www.addesp.com/wp-content/uploads/2020/09/2-5.webp" alt="" class="wp-image-174"/></figure>



<p class="wp-block-paragraph">对于上图这种情况，能被包含进&nbsp;J&nbsp;的&nbsp;Uncle&nbsp;Block&nbsp;只能是&nbsp;A&nbsp;和&nbsp;C。而&nbsp;E、G、F、H&nbsp;不能作为&nbsp;Uncle&nbsp;Block，否则这会降低矿工合并分支的积极性。</p>



<p class="wp-block-paragraph"><br>Uncle&nbsp;Block&nbsp;最多往前追溯七代，收益每隔一代减少&nbsp;1/8，七代之前的区块不允许作为&nbsp;Uncle&nbsp;Block。<br></p>



<p class="wp-block-paragraph">这么做就可以在一定程度上平衡了收益，也能鼓励分叉尽快进行合并。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF?p=18" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF?p=18" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/171/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>以太坊的账户</title>
		<link>https://www.addesp.com/archives/169</link>
					<comments>https://www.addesp.com/archives/169#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Sat, 27 Jun 2020 14:37:24 +0000</pubDate>
				<category><![CDATA[以太坊]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=169</guid>

					<description><![CDATA[外部账户 &#038; 合约账户]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>外部账户（Externally&nbsp;Owned&nbsp;Accounts）</li><li>合约账户（Smart&nbsp;Contract&nbsp;Accounts）</li></ul>



<p class="wp-block-paragraph">BTC&nbsp;采用基于交易的模型，一个账户有多少币没有显式记录，如果想要知道只能顺着区块链去查&nbsp;UTXO&nbsp;才能知道。</p>



<p class="wp-block-paragraph"><br>ETH&nbsp;采用基于账户的模型，就像现实中的银行账户一样，一个账户有多少币是显式记录在区块链上的，每次支付的时候就检测余额并修改余额即可，无需关注币的来源。</p>



<p class="wp-block-paragraph"><br>为什么&nbsp;ETH&nbsp;会使用这种模式呢？因为&nbsp;ETH&nbsp;要支持智能合约（Smart&nbsp;Contract），这就要求参与者的身份要比较稳定，否则很难知道合约的参与者究竟是哪个账户</p>



<h2 class="wp-block-heading">外部账户（Externally&nbsp;Owned&nbsp;Accounts）</h2>



<p class="wp-block-paragraph">外部账账户内记录的下列内容：</p>



<ul class="wp-block-list"><li>balance：余额</li><li>nonce：不同于&nbsp;BTC，这里则表示该账户发起过多少笔交易。</li></ul>



<p class="wp-block-paragraph">账户的信息都会记录到一种名为「状态树」的数据结构中，每次交易都会更新状态树的对应节点。</p>



<h3 class="wp-block-heading">重放攻击（Replay&nbsp;Attack）</h3>



<p class="wp-block-paragraph">基于账户的模式天然地对双花攻击（Double&nbsp;Spending&nbsp;Attack）有防范作用，但是容易成为重放攻击的目标。</p>



<p class="wp-block-paragraph"><br>重放攻击就是将一个已经上链的交易重新放送一次，由于这笔交易具有被攻击账户的签名，所以全节点会认为其是有效的，所以会导致一笔交易重复执行。对此&nbsp;ETH&nbsp;通过`nonce`字段来防范，这个字段记录了该账户发起过多少笔交易，每笔交易都要记录当前的`nonce`值，这样就可以有效防范重放攻击了。因为当一笔交易被重放时，其`nonce`值会比账户中记录的`nonce`值小，由此可以判断该账户没有发起过这笔交易。</p>



<h2 class="wp-block-heading">合约账户（Smart&nbsp;Contract&nbsp;Accounts）</h2>



<p class="wp-block-paragraph">合约账户记录下列内容：</p>



<ul class="wp-block-list"><li>Code：即合约代码</li><li>Storage：相关数据</li></ul>



<p class="wp-block-paragraph">合约内的代码可以被其它用户所调用，也可以被其它合约调用，用以完成合约的功能。创建合约的时候会返回一个地址，根据这个地址即可调用合约代码。<br>智能合约代码一般使用&nbsp;Solidity&nbsp;语言编写，运行在&nbsp;EVM（Ethereum&nbsp;Virtual&nbsp;Machine）上，且代码一旦上链，则极难更改。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF?p=15" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF?p=15" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/169/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>以太坊概述</title>
		<link>https://www.addesp.com/archives/177</link>
					<comments>https://www.addesp.com/archives/177#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Sat, 27 Jun 2020 14:07:49 +0000</pubDate>
				<category><![CDATA[以太坊]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=177</guid>

					<description><![CDATA[ASIC Resistance &#038; GHOST 协议 &#038; 基于账户的交易模式（Account-based ledger）&#038; 权益证明（Proof Of Stake） &#038; 智能合约（Smart Contract）]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>ASIC Resistance</li><li>GHOST 协议</li><li>基于账户的交易模式（Account-based ledger）</li><li>权益证明（Proof Of Stake）</li><li>智能合约（Smart Contract）</li></ul>



<h2 class="wp-block-heading">ASIC&nbsp;Resistance</h2>



<p class="wp-block-paragraph">BTC&nbsp;起初的设计目的包括让通用计算机加入到挖矿过程，但是目前&nbsp;BTC&nbsp;的挖矿主要是由&nbsp;ASIC&nbsp;矿机完成的，使用通用计算机挖矿几乎是无利可图的。</p>



<p class="wp-block-paragraph"><br>而&nbsp;ETH&nbsp;希望避免这种情况，其设计了&nbsp;Member&nbsp;hard&nbsp;mining&nbsp;puzzle，因为&nbsp;ASIC&nbsp;矿机的访存效率不一定有通用计算机高，如果&nbsp;Mining&nbsp;puzzle&nbsp;对内存的要求较高，则可以很好地对抗&nbsp;ASIC&nbsp;矿机。</p>



<h2 class="wp-block-heading">GHOST&nbsp;协议</h2>



<p class="wp-block-paragraph">ETH&nbsp;的出块时间大概只有十几秒，如此短的出块时间如果照搬&nbsp;BTC&nbsp;的共识机制就会造成大量的分叉，分散全网算力，降低系统的安全性。因此&nbsp;ETH&nbsp;采用了新的&nbsp;GHOST&nbsp;协议，可以很好地适应十几秒地出块时间，保证系统的安全性。</p>



<h2 class="wp-block-heading">基于账户的交易模式（Account-based&nbsp;ledger）</h2>



<p class="wp-block-paragraph">BTC&nbsp;中一个矿工有多少币是没有显式记录的，想要知道余额只能去查&nbsp;UTXO，而&nbsp;ETH&nbsp;是基于账户的交易模式，自己有多少币很容易就知道了。所有账户的信息存储在全节点的状态树，当某个账户发起交易时，全节点会检查账户信息以确定交易的合法性。当然这种模式的优点不止一个，当然有了新的缺点，笔者将会在其它文章中说明。</p>



<h2 class="wp-block-heading">权益证明（Proof&nbsp;Of&nbsp;Stake）</h2>



<p class="wp-block-paragraph">BTC&nbsp;采用的是&nbsp;Proof&nbsp;Of&nbsp;Work，即「工作量证明」，而&nbsp;ETH&nbsp;则计划逐步转为&nbsp;Proof&nbsp;Of&nbsp;Stake，即「权益证明」，这也是&nbsp;ETH&nbsp;对抗&nbsp;ASIC&nbsp;矿机的一种方式。权益证明简单来说就是持有的币越多，在系统中的话语权越大。详细情况笔者将会在其它文章中说明。</p>



<h2 class="wp-block-heading">智能合约（Smart&nbsp;Contract）</h2>



<p class="wp-block-paragraph">智能合约是存储在区块链上的一段代码，可以被调用。<br>BTC&nbsp;的脚本语言只能实现一些简单的操作。而&nbsp;ETH&nbsp;常常用于书写智能合约的语言&nbsp;Solidity&nbsp;是图灵完备的，这代表其可以又有十分强大的功能。<br>智能合约作为去中心化的合约，其合约的有效性是靠&nbsp;ETH&nbsp;系统的安全性保证的。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF?p=14" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF?p=14" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/177/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>针对比特币的「51%算力攻击」</title>
		<link>https://www.addesp.com/archives/94</link>
					<comments>https://www.addesp.com/archives/94#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Sun, 17 May 2020 13:25:02 +0000</pubDate>
				<category><![CDATA[比特币]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=94</guid>

					<description><![CDATA[Double spending attack &#038; Boycott]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>Double&nbsp;spending&nbsp;attack（双花攻击）</li><li>Boycott</li></ul>



<h2 class="wp-block-heading">Double&nbsp;spending&nbsp;attack</h2>



<p class="wp-block-paragraph">即双花攻击，一个比特币可以花至少两次。</p>



<h3 class="wp-block-heading">攻击举例</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="501" height="211" src="https://www.addesp.com/wp-content/uploads/2020/09/0.webp" alt="" class="wp-image-95"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="961" height="211" src="https://www.addesp.com/wp-content/uploads/2020/09/1.webp" alt="" class="wp-image-96"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="961" height="321" src="https://www.addesp.com/wp-content/uploads/2020/09/2.webp" alt="" class="wp-image-97"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1041" height="342" src="https://www.addesp.com/wp-content/uploads/2020/09/3.webp" alt="" class="wp-image-98"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1041" height="271" src="https://www.addesp.com/wp-content/uploads/2020/09/4.webp" alt="" class="wp-image-99"/></figure>



<h2 class="wp-block-heading">Boycott</h2>



<p class="wp-block-paragraph">即可以通过拒绝某些或某个账户的交易来达到封锁这个账户的目的。</p>



<h3 class="wp-block-heading">攻击举例</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="501" height="303" src="https://www.addesp.com/wp-content/uploads/2020/09/5.webp" alt="" class="wp-image-101"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1231" height="386" src="https://www.addesp.com/wp-content/uploads/2020/09/6.webp" alt="" class="wp-image-102"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1231" height="386" src="https://www.addesp.com/wp-content/uploads/2020/09/7.webp" alt="" class="wp-image-103"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="801" height="216" src="https://www.addesp.com/wp-content/uploads/2020/09/8.webp" alt="" class="wp-image-104"/></figure>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/94/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>比特币的匿名性</title>
		<link>https://www.addesp.com/archives/19</link>
					<comments>https://www.addesp.com/archives/19#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Sun, 17 May 2020 08:19:00 +0000</pubDate>
				<category><![CDATA[比特币]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=19</guid>

					<description><![CDATA[因比特币的底层技术为区块链，所以其天然的具有匿名性。]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>何为匿名</li><li><s>如何提高比特币用户的匿名性</s></li><li>什么情况下会破坏比特币的匿名性</li><li>典型案例</li><li>零知识证明</li><li>零币和零钞</li></ul>



<h2 class="wp-block-heading">何为匿名</h2>



<p class="wp-block-paragraph">比特币的匿名性个人我个人理解就是如果我自己不说，别人不会知道这个哪些账户是我的，以及这些我和某个具体人的发生了比特币交易。</p>



<h2 class="wp-block-heading">什么情况下会破坏比特币的匿名性</h2>



<ul class="wp-block-list"><li>当比特币和实体世界发生联系的时候，比如我用比特币换了现实中流通的货币，或者用比特币买了某件商品，甚至是用某台电脑登录了比特币账户。</li><li>区块链中交易信息是完全公开的，可以通过时间来找出账户对应的使用者。如我早上八点看见张三用比特币一杯豆浆，中午十二点看见张三用比特币点了一份外卖。这时我去查区块链中的对应时间点的交易记录，则就可以大大缩小寻找范围，长此以往，很容易就能知道张三使用的时哪个账户。</li></ul>



<h2 class="wp-block-heading">典型案例</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Silk&nbsp;Road，（丝路）是一个利用Tor的隐密服务来运作的黑市购物网站，Tor的服务保证了网站用户的匿名性。你能想到的东西都有可能在里面找到。只要你情我愿，就可以形成一笔买卖。毒品、性奴、儿童色情、私人杀手，这里没有“非法交易”，用比特币结算还使得交易变得无法追踪，从而受到了大量毒贩的青睐。</p><cite>https://baike.baidu.com/item/Silk%20Road</cite></blockquote>



<p class="wp-block-paragraph">最终幕后老板在旧金山被捕了，更重要的一点是此人一个比特币都没有花，也就是说没有用比特币换取过实体世界的任何物品和货币。后来出现了<strong> Silk&nbsp;Road&nbsp;2</strong>，没几年也被查封了</p>



<h2 class="wp-block-heading">零知识证明</h2>



<p class="wp-block-paragraph">零知识证明是指一方（证明者）向另一方（验证者）证明一个陈述是正确的，而无需透露除该陈述是正确的外的任何信息。</p>



<h3 class="wp-block-heading">同态隐藏</h3>



<ul class="wp-block-list"><li>如果&nbsp;$x&nbsp;\neq&nbsp;y$，那么它们的加密函数值&nbsp;$E(x),E(y)$&nbsp;也不相同。</li><li>给定&nbsp;$E(x)$&nbsp;的值，很难反推出$x$的值。</li><li>给定$E(x)$&nbsp;和$E(y)$的值，可以很容易地计算出关于$x,y$的加密函数值。<ul><li>同态加法：通过$E(x)$和$E(y)$计算出$E(x + y)$。</li><li>同态乘法：通过$E(x)$和$E(y)$计算出$E(x \times y)$。</li><li>上述的加法乘法均可扩展到多项式。</li></ul></li></ul>



<h3 class="wp-block-heading">例子</h3>



<p class="wp-block-paragraph">Alice&nbsp;想要向&nbsp;Bob&nbsp;证明她知道一组数&nbsp;$x,y&nbsp;且&nbsp;x+y=7$，同时不想让&nbsp;Bob&nbsp;知道$x$&nbsp;和$y$&nbsp;的具体数值。</p>



<ol class="wp-block-list"><li>Alice&nbsp;向&nbsp;Bob&nbsp;提供$E(x)$&nbsp;和$E(y)$的值。</li><li>Bob&nbsp;通过$E(x)$&nbsp;和$E(y)$计算出$E(x+y)$的值，并计算$E(7)$的值。</li><li>如果&nbsp;$E(x+y)=E(7)$则代表&nbsp;Alice&nbsp;没有说谎。</li><li>此时&nbsp;Bob&nbsp;难以知道$x$和$y$的具体数值。</li></ol>



<h3 class="wp-block-heading">盲签</h3>



<p class="wp-block-paragraph">在签名者不知道被签名信息的具体内容下对其进行签名。具体信息可自行查询资料详细了解。</p>



<h2 class="wp-block-heading">零币和零钞</h2>



<p class="wp-block-paragraph">零币和零钞在协议层就融合了匿名化处理，其匿名性来自密码学保证。<br>但其并不安全，因为要用其牟利总归要与实体世界发生交互。</p>



<p class="has-vivid-red-color has-text-color wp-block-paragraph"><strong>不要用零币和零钞进行任何违法犯罪活动。天网恢恢，疏而不漏。</strong></p>



<h3 class="wp-block-heading">零币</h3>



<p class="wp-block-paragraph">零币系统中存在基础币和零币，通过基础币和零币之间的转换来消除旧地址和新地址之间的关联。</p>



<h3 class="wp-block-heading">零钞</h3>



<p class="wp-block-paragraph">零钞系统使用&nbsp;zk-SNARKs&nbsp;协议，不依赖基础币，只记录交易的存在性和矿工用来验证的系统正常运行的关键信息，区块链上既不现实交易地址也不显示交易金额，所有交易通过零知识验证的方式进行。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/19/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>比特币的分叉</title>
		<link>https://www.addesp.com/archives/119</link>
					<comments>https://www.addesp.com/archives/119#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Sat, 16 May 2020 13:57:11 +0000</pubDate>
				<category><![CDATA[比特币]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=119</guid>

					<description><![CDATA[分叉的原因 &#038; 软分叉 &#038; 硬分叉]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>产生分叉的原因</li><li>Hard&nbsp;fork</li><li>Soft&nbsp;fork</li></ul>



<h2 class="wp-block-heading">产生分叉的原因</h2>



<ul class="wp-block-list"><li>比特币系统的协议的修改升级，因此产生的分叉称为&nbsp;Protocd&nbsp;fork。</li><li>日常挖矿过程中也会产生一些分叉，但是通常会很快地淘汰掉其它分叉，只留下一个。</li><li>攻击者的攻击。</li></ul>



<h2 class="wp-block-heading">Hard&nbsp;fork</h2>



<p class="wp-block-paragraph">即这个分叉是永远的。<br>如果对比特币协议增加新的特性，那些没有升级软件的节点不认可新特性，这个时候就会产生硬分叉，一个例子是比特币的区块大小限制。假如有人发布了软件更新，将区块大小限制从&nbsp;1M→4M，假设大多数节点都更新了，少数节点没有更新，这里的大多数不是按账户数目来算，而是按算力来算，即系统中有大多数&nbsp;hash&nbsp;算力的节点都更新了软件。新节点能挖出最大是&nbsp;4M&nbsp;的区块，但是旧节点不认可大小超过1M的区块，所以旧节点会沿着小区块一直挖下去，新节点大小区块都接受，但旧节点不接受大区块，两者没有达成共识，这样就会出现一个永远的分叉。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="901" height="341" src="https://www.addesp.com/wp-content/uploads/2020/09/0-2.webp" alt="" class="wp-image-120"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="921" height="391" src="https://www.addesp.com/wp-content/uploads/2020/09/1-2.webp" alt="" class="wp-image-121"/></figure>



<h2 class="wp-block-heading">Soft&nbsp;fork</h2>



<p class="wp-block-paragraph">即暂时性的分叉。<br>如果对比特币协议加一些限制，原来合法的交易或者区块在新的协议可能不合法就会引起软分叉。假如有人发布更新将区块大小变成&nbsp;0.5M，大部分节点更新了软件，少部分没有更新。这时候新节点沿着一条链挖小区块，不认可大区块，旧节点沿着一条链挖大区块，同时旧节点也认可小区块，因为新节点算力更强，所以更快形成一条新旧节点都认可的最长合法链，但是新节点不会在旧节点产出的大区块后面继续挖，而是会继续分叉挖小区块，所以旧节点挖出的大区块最后都没用了，不得不更新软件。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="911" height="363" src="https://www.addesp.com/wp-content/uploads/2020/09/2-2.webp" alt="" class="wp-image-122"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1377" height="441" src="https://www.addesp.com/wp-content/uploads/2020/09/3-2.webp" alt="" class="wp-image-123"/></figure>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/119/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>比特币的趋势</title>
		<link>https://www.addesp.com/archives/145</link>
					<comments>https://www.addesp.com/archives/145#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Sat, 16 May 2020 13:36:41 +0000</pubDate>
				<category><![CDATA[比特币]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=145</guid>

					<description><![CDATA[CPU 挖矿 &#038; GPU 挖矿 &#038; ASIC 挖矿 &#038; 大型矿池]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>CPU 挖矿</li><li>GPU 挖矿</li><li>ASIC 挖矿</li><li>大型矿池</li></ul>



<h2 class="wp-block-heading">CPU 挖矿</h2>



<p class="wp-block-paragraph">起初挖矿竞争还不激烈，大家可以随意用自己的&nbsp;PC&nbsp;进行挖矿，出块的概率也算可以接受。但是随着竞争的激烈，CPU&nbsp;无法满足算力的需求，因为通用计算机的的CPU在挖矿过程中只用到了&nbsp;CPU&nbsp;指令的很少的一部分。</p>



<h2 class="wp-block-heading">GPU 挖矿</h2>



<p class="wp-block-paragraph">这时大家开始用GPU挖矿，因为&nbsp;GPU&nbsp;是专门为了通用的大规模的并行运算而开发的，效率要比&nbsp;CPU&nbsp;挖矿提高了很多。<br>但是由于&nbsp;GPU&nbsp;依然是为了通用计算而开发，所以依然有很多功能无法利用导致浪费，如浮点运算。</p>



<h2 class="wp-block-heading">ASIC 挖矿</h2>



<p class="wp-block-paragraph">Application&nbsp;Specific&nbsp;Integrated&nbsp;Circuit，专门为了某种需求开发的芯片。随着挖矿竞争的加强，也有了专门用于挖矿的芯片，这种芯片的性价比是很高的，效率也远高于&nbsp;GPU。<br>据统计，此类芯片的主要利润主要来自发布的前两个月，两个月后基本就会被淘汰。矿工之间的竞争就像是军备竞赛。</p>



<h2 class="wp-block-heading">大型矿池</h2>



<p class="wp-block-paragraph">矿工单干时就像是买彩票，出块的概率很低，但是一旦出块了就能大赚一笔。这时就有了矿池的出现。<br>矿场主号召矿工加入自己的矿池，由矿场主分配不同的任务给每个矿工，矿工出块后就提交给矿池，大家一起分享收益。区块由矿场主组装，矿工只负责计算 Hash，矿场主则会收取一部分管理费。<br>矿池的出现使得矿工的收益相对来说更加稳定，但同时单次收益也会减少。</p>



<h3 class="wp-block-heading">如何分配收益</h3>



<p class="wp-block-paragraph">首先肯定不能是平均分配，因为这种方式会导致干多干少收益都是一样的。矿场主可以自己规定一个挖矿难度，这个难度小于比特币网络所规定的挖矿难度。矿工挖出出块后，如果符合矿池规定的难度但不符合比特币网络的难度则这个区块可以作为工作量证明提交给矿池，这种区块称为&nbsp;Almost&nbsp;valid&nbsp;block，如果符合比特币网络的难度则可以作为整个矿池收益的一部分。最后按照每个矿工提交的两种区块的数量来分配收益。</p>



<p class="wp-block-paragraph">Q：矿工可否挖到合法区块后绕过矿主自己去提交从而独吞奖励，而&nbsp;Almost&nbsp;valid&nbsp;block&nbsp;作为工作量证明提交给矿池？</p>



<p class="wp-block-paragraph">A：不可以，因为区块中的收款人是矿场主，就算矿工自己发布也赚不到比特币，比特币依旧是矿场主的。</p>



<h3 class="wp-block-heading">担忧</h3>



<p class="wp-block-paragraph">矿池的出现使得算力的集中更加简单，因为原本大家都是各干各的，而现在矿工加入和更换矿池是非常容易的。此时如果矿场主以较低的管理费吸引大量的矿工以获得半数以上的算力，同时因为每个矿工只负责计算 Hash ，因此其不知道自己是否在发起攻击，所以可以以此发起「51%算力攻击」。<br>而如果没有矿池，攻击者需要自己购置硬件来对抗全网的算力，成本十分巨大。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/145/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>比特币的挖矿难度</title>
		<link>https://www.addesp.com/archives/109</link>
					<comments>https://www.addesp.com/archives/109#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Thu, 14 May 2020 01:19:06 +0000</pubDate>
				<category><![CDATA[比特币]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=109</guid>

					<description><![CDATA[为何调整难度 &#038; 如何调整难度]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>为何调整挖矿难度</li><li>如何调整挖矿难度</li></ul>



<h2 class="wp-block-heading">为何调整挖矿难度</h2>



<p class="wp-block-paragraph">全网的算力可能会增强，可能会减弱，比特币系统会系统的出块时间控制在10分钟左右（中本聪没有说为什么是10分钟）。</p>



<p class="wp-block-paragraph"><em>中本聪并没有说明为何是10分钟，可能是他/她喜欢。</em></p>



<h3 class="wp-block-heading">如果挖矿难度过低</h3>



<p class="wp-block-paragraph">如果挖矿难度太低，则代表出块时间会非常短，看起来是好事，因为我发布一笔交易会很快地被写入到区块中。但是也会出现很大的问题。</p>



<ol class="wp-block-list"><li>因为出块时间缩短，所以会出现很多节点几乎在同一个时间发布区块。</li><li>在出块慢的时候10分钟的时间基本足够将出块信息广播给网络中的绝大多数节点，而在十分钟内基本不会出现大量的区块被广播。而如果出块速度加快，则在某个区块的广播过程中别的节点也很容易算出自己的区块并广播，这就会导致网络中的节点收到的区块不是基本一致的，而是多种多样的。</li><li>所以很容易造成区块链的分叉，而且可能不是两叉，数量可能会很多。</li><li>这样全网的算力就被分散到十分多的分叉上了。</li><li>此时如果攻击者发起一些攻击如&nbsp;Double&nbsp;Spending&nbsp;Attack，可能就不需要全网51%的算力了，因为全网的算力被分散了，而不是集中在一条最长链上。</li></ol>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="562" height="212" src="https://www.addesp.com/wp-content/uploads/2020/09/0-1.webp" alt="" class="wp-image-110"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="651" height="279" src="https://www.addesp.com/wp-content/uploads/2020/09/1-1.webp" alt="" class="wp-image-111"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="651" height="651" src="https://www.addesp.com/wp-content/uploads/2020/09/2-1.webp" alt="" class="wp-image-112"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="651" height="631" src="https://www.addesp.com/wp-content/uploads/2020/09/3-1.webp" alt="" class="wp-image-113"/></figure>



<h3 class="wp-block-heading">如果挖矿难度过高</h3>



<p class="wp-block-paragraph">这个就很容易理解了，出块速度过慢则会导致整个比特币系统十分低效，也会打击矿工的积极性。比如我发布一笔交易可能要等一个月甚至更久才会被确认，这太慢了。</p>



<h2 class="wp-block-heading">如何调整挖矿难度</h2>



<p class="wp-block-paragraph">比特币系统会在每产生2016个区块后调整难度，下面是调整公式。</p>



<p class="wp-block-paragraph"><em>中本聪也没有说明为何是每2016个区块才调整难度，可能是他/她喜欢。</em></p>



<p class="wp-block-paragraph">难度调整的公式如下</p>



<p class="wp-block-paragraph">\[&nbsp;&nbsp;target=target&nbsp;\times&nbsp;\frac{ActualTime}{ExpectTime} \]</p>



<p class="wp-block-paragraph">调整难度实际上就是调整target值，target&nbsp;越小则难度越大，反之则难度越小。</p>



<p class="wp-block-paragraph">同时为了保证挖矿难度不会出现大幅度的波动，一旦$\frac{ActualTime}{ExpectTime}&nbsp;&lt;&nbsp;\frac{1}{4}$，则一律按照等于$\frac{1}{4}$计算，一旦$\frac{ActualTime}{ExpectTime}&nbsp;&gt;&nbsp;4$，则一律按照等于$4$计算，保证挖矿难度不会有大幅度变动。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/109/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>比特币的网络</title>
		<link>https://www.addesp.com/archives/134</link>
					<comments>https://www.addesp.com/archives/134#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Wed, 13 May 2020 13:58:06 +0000</pubDate>
				<category><![CDATA[比特币]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=134</guid>

					<description><![CDATA[P2P Overlay network &#038; 交易和区块的广播]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>P2P&nbsp;Overlay&nbsp;network</li><li>交易的广播</li><li>区块的广播</li></ul>



<h2 class="wp-block-heading">P2P&nbsp;Overlay&nbsp;network</h2>



<p class="wp-block-paragraph">比特币网络的设计目标是简单、鲁棒，而非高效。<br>比特币的网络层运行的是一个&nbsp;P2P&nbsp;Overlay&nbsp;network，网络中所有的节点都是对等的，使用TCP协议通信。</p>



<h3 class="wp-block-heading">如何发现其它节点</h3>



<p class="wp-block-paragraph">既然每个网络节点都是平等的（是指在网络层面上节点是平等的，但各节点在功能上可以有不同的分工，&nbsp;如钱包节点、挖矿节点等），不存在任何“特殊”中心节点，那么当新的网络节点启动后，它是如何跟其他的节点建立连接，从而加入到比特币网络呢？</p>



<p class="wp-block-paragraph">在中心化网络中，新加入的节点只要连接“特殊”的中心节点就可以加入网络。</p>



<p class="wp-block-paragraph">为了能够加入到比特币网络，比特币客户端会做一下几件事情：</p>



<ol class="wp-block-list"><li>节点会记住它最近成功连接的网络节点，当重新启动后它可以迅速与先前的对等节点网络重新建立连接。</li><li>节点会在失去已有连接时尝试发现新节点。</li><li>当建立一个或多个连接后，节点将一条包含自身&nbsp;IP&nbsp;地址消息发送给其相邻节点。相邻节点再将此消息依次转发给它们各自的相邻节点，从而保证节点信息被多个节点所接收、保证连接更稳定。</li><li>新接入的节点可以向它的相邻节点发送获取地址&nbsp;getaddr&nbsp;消息，要求它们返回其已知对等节点的&nbsp;IP&nbsp;地址列表。节点可以找到需连接到的对等节点。</li><li>在节点启动时，可以给节点指定一个正活跃节点&nbsp;IP,&nbsp;如果没有，客户端也维持一个列表，列出了那些长期稳定运行的节点。这样的节点也被称为种子节点（其实和&nbsp;BT&nbsp;下载的种子文件道理是一样的），就可以通过种子节点来快速发现网络中的其他节点。</li></ol>



<p class="wp-block-paragraph"><em>相邻节点的选择是无视底层网络拓扑的，一个在A国的节点的相邻节点可能会在B国，并不是空间上的相邻。</em></p>



<h2 class="wp-block-heading">交易的广播</h2>



<p class="wp-block-paragraph">当一个节点收到一笔合法交易的时候会记住这笔交易并广播给相邻的节点，通过&nbsp;Flooding&nbsp;来将一个交易广播给全网，同时当节点收到重复的交易时也自然不会重复广播。<br>如果某个交易被写到区块链中后，则之前记住这笔交易的节点就要删除这个交易，因为已经没有必要记录了。<br>如果节点收到的被写到区块链中的交易和自己记住的交易发生冲突，则删除自己记录的交易。</p>



<h2 class="wp-block-heading">区块的广播</h2>



<p class="wp-block-paragraph">广播的过程和交易类似，区别是收到区块的节点还要判断这个区块是不是在最长合法链内。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" href="https://learnblockchain.cn/2017/11/07/bitcoin-p2p/" data-type="URL" data-id="https://learnblockchain.cn/2017/11/07/bitcoin-p2p/" target="_blank">分析比特币网络：一种去中心化、点对点的网络架构</a></li><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/134/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>比特币的实现</title>
		<link>https://www.addesp.com/archives/127</link>
					<comments>https://www.addesp.com/archives/127#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Wed, 13 May 2020 13:17:30 +0000</pubDate>
				<category><![CDATA[比特币]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=127</guid>

					<description><![CDATA[UTXO &#038; 出块概率 &#038; 交易确认]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>Unspent&nbsp;Transaction&nbsp;Output（UTXO）</li><li>出块概率</li><li>交易的确认</li></ul>



<h2 class="wp-block-heading">Unspent&nbsp;Transaction&nbsp;Output（UTXO）</h2>



<p class="wp-block-paragraph">UTXO 是 BTC 交易的基本单位，也就是说其不可分割，每一笔交易都会产生新的UTXO，一个 UTXO 可以包含的BTC可以是一聪的任意整数倍。</p>



<p class="wp-block-paragraph"><em>聪：BTC 的基本单位。</em></p>



<p class="wp-block-paragraph">Full&nbsp;node需要在内存中维护UTXO以保证可以快速检测Double&nbsp;spending&nbsp;attack。</p>



<p class="wp-block-paragraph">除了coinbase交易以外，任何一笔交易都会有一个输入和若干个输出，$输入的BTC=输出的BTC+手续费$。</p>



<p class="wp-block-paragraph">张三和李四拥有的UTXO如下：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="475" height="324" src="https://www.addesp.com/wp-content/uploads/2020/09/0-3.webp" alt="" class="wp-image-129"/></figure>



<p class="wp-block-paragraph">现在张三要给李四转 4 个 BTC，首先张三拥有的 UTXO 中没有正好包含 4 个 BTC 的 UTXO，但是张三可以选择将包含 5 个 BTC 的 UTXO，转账给李四 4 个 BTC，然后转账给自己 1 个 BTC，就完成了一笔交易。本地交易的输入为张三持有的包含 5 个 BTC 的 UTXO，输入给下图中绿色的 UTXO。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="475" height="324" src="https://www.addesp.com/wp-content/uploads/2020/09/1-3.webp" alt="" class="wp-image-130"/></figure>



<p class="wp-block-paragraph">我们称这种模式为 Transactor-base&nbsp;ledger。</p>



<h2 class="wp-block-heading">出块概率</h2>



<p class="wp-block-paragraph">挖矿的过程就是不断尝试各种&nbsp;nonce&nbsp;来求解&nbsp;puzzle，每次尝试&nbsp;nonce&nbsp;都可以看作一个&nbsp;Bernoulli&nbsp;trial：a&nbsp;random&nbsp;experiment&nbsp;with&nbsp;binary&nbsp;outcome（伯努利试验：一个二元结果的随机试验）。伯努利实验的经典案例是抛硬币，如果硬币不均匀，每次实验，正面的概率就是&nbsp;p，反面的概率是&nbsp;1-p。对于挖矿来说，这两个概率相差甚远，每次尝试一个nonce，成功的概率是微乎其微的，大概率不行的，如果我们做大量的伯努利实验，每个实验都是随机的，那么这些伯努利实验就构成了一个&nbsp;Bernoulli&nbsp;process：a&nbsp;sequence&nbsp;of&nbsp;independent&nbsp;Bernoulli&nbsp;trial（伯努利过程：一系列独立伯努利试验）。Bernoulli&nbsp;process&nbsp;的一个特性是无记忆性（memoryless），意思是说做大量实验，前面的实验结果对后面的结果没有影响，挖矿过程就是不断尝试nonce，这种情况下&nbsp;&nbsp;&nbsp;Bernoulli&nbsp;process可以用&nbsp;Poisson&nbsp;process&nbsp;来近似，实验次数很多，每次成功的概率很小就可以用&nbsp;Poisson&nbsp;process&nbsp;来近似。我们关心的是出块时间，也就是系统里产生下一个区块的时间，这个在概率上可以推导出来，服从指数分布。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="715" height="286" src="https://www.addesp.com/wp-content/uploads/2020/09/2-3.webp" alt="" class="wp-image-131"/></figure>



<p class="wp-block-paragraph">注意，上图的出块时间是整个系统的出块时间，并不是矿工的出块时间，整个系统的平均出块时间是10分钟，平均时间是比特币协议规定的，通过定期调整挖矿难度，使得平均出块时间维持在10分钟左右，具体到每一个矿工，出块时间取决于矿工的算力，算力大，概率就大，出块时间就短。指数分布也是无记忆的，概率密度曲线的特点有：从任何一个地方把它截断，剩下曲线的形状仍然和原来一样，仍然服从指数分布，这就是无记忆的性质，假如过去了10分钟，仍然没有人找到区块，那么接下来还要等多久呢？还是平均下来10分钟，这个和直觉不太一致。这个概率分析告诉我们将来还要挖多少时间和过去挖了多少时间是没有关系的，仍然是服从指数分布，平均还要10分钟，这个性质也叫&nbsp;Progress&nbsp;free。</p>



<h3 class="wp-block-heading">Progress&nbsp;free&nbsp;或者&nbsp;Memoryless&nbsp;有什么作用？</h3>



<p class="wp-block-paragraph">设想一下，如果有某个&nbsp;puzzle&nbsp;不满足这个性质会出现什么情况，比如说过去做的工作越多，接下来尝试&nbsp;nonce&nbsp;的时候成功的概率越大，相当于抛硬币的时候每次结果不是随机的，过去抛了好多次，都是反面朝上，下次再抛硬币的时候，正面朝上的概率会增加。如果有某一个加密货币设计出这样的&nbsp;puzzle，会有什么结果？算力强的矿工会有不成比例的优势，因为算力强的矿工过去的工作量更大。什么是不成比例的优势？比如系统中有两个矿工，一个的算力是另一个的10倍，理想状况下，算力强的矿工能挖到矿的概率应该是另一个矿工的10倍，这才算公平，因为算力强的矿工能尝试的nonce是另一个的10倍，这就是我们说的Progress&nbsp;free&nbsp;或者&nbsp;Memoryless&nbsp;所保证的，如果不是这样的话，算力强的矿工获得记账权的概率就会超过10倍，因为它过去尝试了更多的不成功&nbsp;nonce，那么下次成功的概率就会增大，这就是不成比例的优势。所以&nbsp;Progress&nbsp;free&nbsp;或者&nbsp;Memoryless&nbsp;保证了挖矿公平性。</p>



<h2 class="wp-block-heading">交易的确认</h2>



<p class="wp-block-paragraph">当一笔交易刚刚被写到区块中的时候交易并不会完全被确认的，此时是&nbsp;One&nbsp;confirmation，此时可能会出现分叉攻击，即在前一个区块后面发布一个不相同的区块来造成分叉，如果攻击者的链条称为最长合法链后则这笔交易就不在最长合法链中，交易会被回滚。</p>



<p class="wp-block-paragraph"><br>解决的方法是交易的确认需要&nbsp;Six&nbsp;confirmation。此时攻击者发起的分叉攻击就几乎不可能追赶上六个区块了，除非这个攻击者拥有全网半数以上的算力，这种攻击也称「51%算力攻击」。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" href="https://www.mscto.com/blockchain/258341.html" data-type="URL" data-id="https://www.mscto.com/blockchain/258341.html" target="_blank">比特币实现</a></li><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/127/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>区块链的密码学原理</title>
		<link>https://www.addesp.com/archives/158</link>
					<comments>https://www.addesp.com/archives/158#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Mon, 04 May 2020 14:32:46 +0000</pubDate>
				<category><![CDATA[区块链]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=158</guid>

					<description><![CDATA[Cryptographic hash function &#038; Signature]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>Cryptographic&nbsp;hash&nbsp;function</li><li>Signature</li></ul>



<h2 class="wp-block-heading">Cryptographic&nbsp;hash&nbsp;function</h2>



<p class="wp-block-paragraph">它有三个重要性质，分别为&nbsp;Collision&nbsp;resistance、Hiding&nbsp;和&nbsp;Puzzle&nbsp;friendly。</p>



<ul class="wp-block-list"><li>Collision&nbsp;resistance：不能找到一个快捷的方法使得$Hash(x_0)=Hash(x_1)=y&nbsp;且&nbsp;x_0&nbsp;\neq&nbsp;x_1$。</li><li>Hiding：假如$Hash(x)=y$，那么不能找到一个快捷的方法从$y$反推出$x$，前提是输入空间足够大且取值均匀，这时可以通过在$x$中增加一个随机数来解决这个问题。</li><li>Puzzle&nbsp;friendly：哈希函数的输出结果是难以预测的，即难以通过哈希函数的输入来预测哈希函数的输出结果。</li></ul>



<h2 class="wp-block-heading">Signature</h2>



<p class="wp-block-paragraph">它依赖于<a rel="noreferrer noopener" href="https://baike.baidu.com/item/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95" data-type="URL" data-id="https://baike.baidu.com/item/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95" target="_blank">Asymmetric&nbsp;cryptographic&nbsp;algorithm</a>，生成一对公私钥，私钥加密公钥解密，私钥签名公钥验证，所以公钥是可以公开的。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/158/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>比特币的协议</title>
		<link>https://www.addesp.com/archives/141</link>
					<comments>https://www.addesp.com/archives/141#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Mon, 04 May 2020 13:03:24 +0000</pubDate>
				<category><![CDATA[比特币]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=141</guid>

					<description><![CDATA[Block 的结构 &#038; 节点分类 &#038; 比特币的来源 &#038; 分布式共识]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>Block 的结构</li><li>节点类型</li><li>谁可以发布比特币</li><li>如何验证交易的有效性（分布式共识）</li></ul>



<h2 class="wp-block-heading">Block 的结构</h2>



<h3 class="wp-block-heading">Header</h3>



<ul class="wp-block-list"><li>version</li><li>hash&nbsp;of&nbsp;previours&nbsp;block&nbsp;header</li><li>merkle&nbsp;root&nbsp;hash</li><li>target</li><li>nonce</li></ul>



<p class="wp-block-paragraph">挖矿的过程就是寻找一个&nbsp;nonce&nbsp;使得$Hash(Header)&nbsp;\leq&nbsp;target$。</p>



<h3 class="wp-block-heading">Body</h3>



<ul class="wp-block-list"><li>transcation&nbsp;list</li></ul>



<h2 class="wp-block-heading">节点类型</h2>



<h3 class="wp-block-heading">Full&nbsp;node</h3>



<ul class="wp-block-list"><li>一直在线</li><li>在本地硬盘上维护完整的区块链信息</li><li>在内存中维护 UTXO 集合以便快速检测交易的合法性</li><li>监听比特币网络上的交易信息并验证每笔交易的合法性</li><li>决定哪些交易会被打包到区块里</li><li>监听别的矿工挖出来的区块并验证其合法性</li><li>挖矿<ul><li>决定沿着哪条链挖下去</li><li>当出现等长的分叉时选择哪一个分叉（缺省状态下选择先监听到的分叉）</li></ul></li></ul>



<h3 class="wp-block-heading">Light&nbsp;node</h3>



<ul class="wp-block-list"><li>无需一直在线</li><li>不保存整个区块链而只保存每个区块的&nbsp;Header</li><li>不保存全部的交易而只保存与自己相关的交易</li><li>无法检验大多数交易的合法性而只能检验和自己相关的交易的合法性</li><li>无法检测系统中发布的区块的正确性</li><li>可以验证挖矿难度</li><li>只能检测哪个是最长链而不知道哪个是最长合法链</li></ul>



<h2 class="wp-block-heading">谁可以发布比特币</h2>



<p class="wp-block-paragraph">比特币系统中<strong>唯一</strong>可以发布比特币的途径就是区块被接受后获得的奖励。奖励初始为&nbsp;\\(50BTC\\)，每接受21万个区块后奖励减半。<br>当奖励已经很少的时候获取BTC主要是靠交易的手续费。</p>



<h2 class="wp-block-heading">如何验证交易的有效性（分布式共识）</h2>



<h3 class="wp-block-heading">获取记账权</h3>



<p class="wp-block-paragraph">挖矿的过程就是寻找一个&nbsp;nonce&nbsp;使得$Hash(Header)&nbsp;\leq&nbsp;target$，优先完成这个工作的节点就获得了这个区块的记账权。节点无法欺骗其它节点说自己完成了工作，因为其它节点可以轻松地验证上述条件是否成立。</p>



<h3 class="wp-block-heading">接受区块&gt;</h3>



<ol class="wp-block-list"><li>验证区块的信息，如难度是否正确，交易信息是否没有篡改等。</li><li>通过查看 Header 确定当前区块是否在扩展最长链，如果是扩展最长链则接受该区块，反之则不接受。</li><li>下列情况下可能会导致几乎同时出现两个最长的链<ul><li>两个人几乎同时取得了记账权。</li><li>由于网络等原因一部分节点接受了一个区块，另一部分节点接受了另一个区块，以及类似的情况。</li><li>其它情况。</li></ul></li><li>出现这种情况的时候接受哪条链实际上是这些链各个对应的矿工的算力比拼，如果其中一条链的矿工的算力可以让该链最快地扩展，则最终该链会被其它节点接受成为最长链。</li></ol>



<h3 class="wp-block-heading">激励机制</h3>



<p class="wp-block-paragraph">那么凭什么让矿工来拿出算力来维持这个共识？</p>



<ul class="wp-block-list"><li>一旦一个区块被接受，则拥有者可以获得奖励。奖励初始为50 BTC&nbsp;，每接受 21 万个区块后奖励减半。这在奖励比较多的时候可以大大激发矿工的挖矿热情。</li><li>一个区块是可以记账的，每当一笔交易被记录到一个区块内的时候，区块的拥有者就可以收取一定手续费。</li></ul>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/141/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>区块链的数据结构</title>
		<link>https://www.addesp.com/archives/150</link>
					<comments>https://www.addesp.com/archives/150#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Sat, 04 Apr 2020 04:51:44 +0000</pubDate>
				<category><![CDATA[区块链]]></category>
		<guid isPermaLink="false">http://69a274df.addesp.com/?p=150</guid>

					<description><![CDATA[Blockchain &#038; Merkle Tree]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">概述</h2>



<ul class="wp-block-list"><li>Blockchain</li><li>Merkle&nbsp;Tree</li></ul>



<h2 class="wp-block-heading">Blockchain</h2>



<p class="wp-block-paragraph">本质上是链表，只不过传统的链表的指针域存储的下一个节点的地址，Blockchain&nbsp;的指针域则存储上一个节点的 Hash。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="682" height="112" src="https://www.addesp.com/wp-content/uploads/2020/09/0-4.webp" alt="" class="wp-image-151"/></figure>



<p class="wp-block-paragraph">结构如上图，如果从左到右第二个区块被篡改。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="702" height="132" src="https://www.addesp.com/wp-content/uploads/2020/09/1-4.webp" alt="" class="wp-image-152"/></figure>



<p class="wp-block-paragraph">因此后续的节点都使用的是哈希指针，所以必然会导致右边的两个区块的哈希指针发生改变。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="702" height="132" src="https://www.addesp.com/wp-content/uploads/2020/09/2-4.webp" alt="" class="wp-image-153"/></figure>



<p class="wp-block-paragraph">所以系统只需要保存最后一个区块的 Hash &nbsp;就可以检验整个区块链是否被篡改。<br>有了这些性质后节点就没有必要保存所有的区块，当需要其它区块的时候，可以向其它节点请求，得到之后通过验证 Hash 就可以知道这个区块是否被篡改过。</p>



<h2 class="wp-block-heading">Merkle&nbsp;Tree</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1559" height="638" src="https://www.addesp.com/wp-content/uploads/2020/09/3-3.webp" alt="" class="wp-image-154"/></figure>



<p class="wp-block-paragraph">Blockchain的header中只需要保存root&nbsp;hash即可，这样对Blockchain取哈希的时候也只需要对header取哈希就行了，也能够起到防篡改作用。<br>那么假如我想知道某个block是否已经写在了Merkle&nbsp;Tree里，则可以向其它节点请求下图中紫色的 Hash，然后通过计算 Hash&nbsp;就可以验证。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1559" height="638" src="https://www.addesp.com/wp-content/uploads/2020/09/4-1.webp" alt="" class="wp-image-155"/></figure>



<p class="wp-block-paragraph">理论上恶意节点可以通过篡改某个区块的内容且使其 Hash&nbsp;不变的情况下来欺骗其它节点，但目前的实际应用中是不可能的，因为这是在人为制造哈希碰撞，Collision&nbsp;resistance&nbsp;可以很好地解决这个问题。</p>



<p class="wp-block-paragraph">假如我想知道某个&nbsp;block&nbsp;是否不存在于&nbsp;Merkle&nbsp;Tree&nbsp;里，如果对叶结点的顺序没有特殊要求则需要遍历所有&nbsp;block，但是如果&nbsp;block经过排序，则可以在对数时间内进行验证。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://www.bilibili.com/video/BV1Vt411X7JF" data-type="URL" data-id="https://www.bilibili.com/video/BV1Vt411X7JF" target="_blank" rel="noreferrer noopener">北京大学肖臻老师《区块链技术与应用》公开课</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/150/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
