<?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/%E4%BB%A5%E5%A4%AA%E5%9D%8A/feed" rel="self" type="application/rss+xml" />
	<link>https://www.addesp.com</link>
	<description>寂静中交织着热情</description>
	<lastBuildDate>Sat, 05 Jun 2021 04:21:53 +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/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>
	</channel>
</rss>
