北京大学肖臻老师《区块链技术与应用》公开课笔记(二十六):总结
前面二十五节课主要讲了区块链的技术,这节课侧重讲区块链的应用。
现在社会对区块链争议比较大,有很多对区块链的质疑其实也是有道理的。为什么很多人质疑这个技术,因为区块链的滥概念的滥用。有些人什么问题都爱往区块链上放,好像区块链是解决一切问题的法宝,无论什么问题,放到区块链上都可以解决了。这是不对的。
比如国外有人提议把保险理赔业务放到区块链上,原因是保险理赔太慢了,要好几个星期,区块链上的转账速度跟现实转账速度比很慢,但跟几个星期比很快。但实际上保险理赔慢并不是支付本身的局限性,而是因为要人工审核理赔条件,区块链并没有什么好的优势。
还有人提出用区块链做防伪溯源。把有机蔬菜生产的全过程放到区块链上,从生产过程到运输到发售地的过程都写在区块链上,因为区块链是不可篡改的,在区块链上可以查到有机蔬菜的生产销售全过程。这个本身是没问题的,但是并不是说只要你用区块链把整个过程记录下来,就能保证你买到的蔬菜一定是有机的,因为区块链的不可篡改性只是说发布后的信息不可篡改,并不能防止假的信息的写入
另一个区块链的争议是跟信任机制相关的。区块链的共识机制本质上是要在互不信任的实体之间建立共识,有些人认 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(二十五):ETH美链
我们之前提到的The DAO的例子发生在16年,今天刚要讲的美链的例子发生在18年4月,出问题的智能合约叫做美链(beauty chain)
美链美链是一个发行在以太坊上的代币。以太坊上有很多发行的代币,17年以太坊价格涨到很多,其中的主要原因就是有很多ICO(Initial Coin offering,代币首次发行)。这些发行的代币没有自己的区块链,而是以智能合约的形式运行在EVM上,发行代币的智能合约对应以太坊状态树上的一个节点,这个节点是一个合约账户,其中状态树中存储的账户余额为这个智能合约总共有多少以太币,至于合约里每个账户有多少代币,这个是作为存储树的变量存储在合约账户里。代币的存储,交易,销毁都是通过调用智能合约的函数实现的。比如你通过一个外部账户调用智能合约的函数转入1个以太币,那么对应的这个智能合约会给你代币账户上转一定数量的代币。
以太坊这个平台的出现,为各种代币的发行提供了方便,比如一些没有自己基础链的加密货币可以使用这个平台作为早期的交易平台。
batchTransfer函数问题就出在这个batchTransfer函数上,我们看一下具体实现如下
问题出在第三行 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(二十四):ETH反思
Is samrt conract really smart?智能合约真的智能吗?
答案是否定的。有人称其应该为自动合约,可以视为代码合同,因为他并没有涉及到人工智能。现实生活中的自动合约,比如ATM、自动贩卖机。就是你定好一个程序,这个东西只是简单的按照你编好的逻辑执行,并不智能,也就是Samrt conract is anything but smart
Irrevocability is a double edged sword不可篡改性是一把双刃剑。一方面来说,不可篡改性增加了合约的公信力,所有人必须按照合约定的规则执行,没有人能篡改这个规则;另一方面,如果合约中有漏洞,我们想修复漏洞,想升级都是很困难的。
比如上节提到的The DAO事件,传闻在被攻击的前几天就被告知了存在安全漏洞,但没来得及修复就被攻击了,这在一个中心化系统里是很难想象的,软件有漏洞及时发布一个补丁不就好了,但是这是去中心化的系统,想要修复是很困难的,这和我们日常生活的感觉相违背。所以不能用常识性的认知来玩区块链
与之相关的问题是,如果一个智能合约发布到区块链中,无法阻止对它的调用。
Nothing is i ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(二十三):ETH TheDAO
上节课我们提到了重入攻击,那么这种攻击真的可能存在么?我们这节会介绍一个真实的案例,这个案例造成了以太坊的分裂,他就是一个众筹智能合约The DAO。
我们说以太币实现了去中心化的货币,以太坊实现了去中心化的合约。那么为什么不把一切都去中心化,DAO这个概念就是这时候产生的,
DAODecentralized Autonomous Organization,去中心化的自治组织。传统社会中,组织是建立在某种法律文件上的,比如一个书面的章程来规范组织的行为,有时候还需要到政府部门去注册(比如一个公司)。在区块链中,DAO这个组织就是建立在代码基础上,组织的规章制度写在代码里,通过区块链的共识协议来维护规章制度的正常执行。比如以太坊的智能合约就可以作为一个DAO的规章制度。
The DAO在2016年5月,出现了一个致力于众筹投资的DAO:The DAO。它的工作原理类似一个众筹的投资基金,用于投资项目,只不过钱的来源是通过区块链上大家众筹的方法得到的。本质上是运行在以太坊上的一个智能合约。
如果你想参与The DAO,那么你可以把以太币转给这个智能合约,换回The DAO的代币,需要决定 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(二十二):ETH智能合约
简介智能合约:运行在区块链系统上的一段代码,代码逻辑定义了合约内容。
智能合约的账户保存了合约当前的运行状态:
balance:当前余额
nonce:交易次数
code:合约代码
storage:存储,数据结构为一棵MPT
智能合约编写代码为Solidity,其语法与JavaScript很接近。
下图为一个简单的拍卖交易的智能合约:
账户调用外部账户调用合约账户
合约账户调用合约账户合约账户之间也可以进行调用。其调用方式如下:
直接调用
使用address类型的call函数
上面两种调用方式的错误处理是不同的,比如B调用了A,而A发生了错误,前者A、B会一起回滚;而后者只会回滚A,因为B这时候会返回false,代表A发生了错误,并且调用的A的函数不会有返回值,所以只需要回滚A即可。
代理调用
fallback()函数是在智能合约定义的,也可以不定义;代表一种缺省调用,我们上面提到调用智能合约的函数以及参数会写在data域里,如果向一个智能合约转账而data域为空,或者data域中要调用的函数不存在,那么就会调用fallback函数
注意:上面提到的函数、代码都是 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(二十一):ETH权益证明
POW机制下能耗状况比特币和以太坊目前采用的都是POW(工作量证明)机制,但这种方式一直为人所诟病,正在于其浪费电力资源的特点。
比特币的电量消耗
下图为比特币系统电力消耗随着时间变化的情况。y轴的单位为Twh,1Twh = 10^9 Kwh,1Kwh就是我们平时生活中常说的“一度电”。
比特币系统能耗消耗情况(2018年数据)
电量使用量巨大,但是有利可图
以太坊系统的电量消耗
以太坊系统能耗消耗情况(2018年数据)
以太坊平均每个交易消耗电量比比特币少很多,按道理说,比特币系统的交易是比较简单的,以太坊的交易可能会包含对智能合约的调用,所以以太坊的能耗应该更高才是,主要原因是以太坊出块时间很短,平均每个交易的电量消耗也比较少
思考显而易见,“挖矿”过程消耗了大量的电力资源,这些能耗是必须的吗?
矿工为什么要挖矿?为了取得出块奖励,为了收益。那么为什么要给矿工这些奖励?为了激励矿工参与区块链的维护,进行记账。那么矿工具体怎么挖矿?用一大笔资金购买现成的挖矿设备。挖矿的收益又是由你有多少算力(能挖出来多少区块)决定的。你的算力又是由你花多少钱买了多少设备。所 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(二十):ETH挖矿难度调整
前文中介绍了比特币难度调整是每隔2016个区块调整难度,从而达到维持出块时间15min的目标。而以太坊则与之不同,每个区块都又可能会进行难度调整。以太坊难度调整较为复杂,存在多个版本,网络上存在诸多不一致,这里遵循以代码逻辑为准的原则,从代码中查看以太坊难度调整算法。
以太坊难度调整以太坊中区块难度调整算法如下图所示:
自适应难度调整:
举例说明难度炸弹根据以上以太坊难度调整算法可以看到,该算法可以很好地动态调整挖矿难度,从而保障系统整体出块时间维持在15s左右。但之前在挖矿算法的文章中有介绍到,以太坊在设计之初就计划要逐步从POW(工作量证明)转向POS(权益证明),而权益证明不需要挖矿。
从旁观者角度来看,挖矿消耗了大量电力、资金等,如果转入放弃挖矿,必然是一件好事。但从矿工的角度,花费了很大精力投入成本购买设备,突然被告知“不挖矿了”,这必然是一件很难接受的事情。而以太坊本身为一个分布式系统,其转入POS必须经过系统中大多数矿工认可才行,如果届时矿工联合起来转入POS,那么这一设计初衷就成了一江流水。
因此,以太坊在设计之初便添加了难度炸弹,迫使矿工转入POS。那么如何促使矿工 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(十九):ETH挖矿算法
在之前的BTC篇中,介绍了比特币系统中使用的挖矿算法。挖矿这一过程,虽然并没有创造什么实际价值,但挖矿本身维持了比特币系统的稳定,Block chain is secured by mining。总体来说,比特币系统中的挖矿算法较为成功,并未发现大的漏洞。
当然,比特币系统的挖矿算法也存在一定问题,其中最为突出的就是导致了挖矿设备的专业化,普通计算机用户难以参与进去,导致了挖矿中心化的局面产生,而这与“去中心化”这一理念相违背(初衷是one cpu,one vote)。因此,在比特币之后包括以太坊在内的许多加密货币针对该缺陷进行改进,希望做到ASIC Resistance(抗拒ASIC专用矿机)。由于ASIC芯片相对普通计算机来说,算力强但访问内存性能差距不大,因此常用的方法为Memory Hard Mining Puzzle,即增加对内存访问的需求,早期的一个例子就是莱特币
LiteCoin(莱特币)莱特币曾一度成为市值仅次于比特币的第二大货币。其基本设计大体上和比特币一致,但针对挖矿赛诺菲进行了修改。莱特币的puzzle基于Scrypt。Scrypt为一个对内存性能要求较高的哈希函 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(十八):GHOST协议
BTC系统中出块时间为10min,而以太坊中出块时间被降低到15s左右,虽然有效提高了系统反应时间和吞吐率,却也导致系统临时性分叉变成常态,且分叉数目更多。这对于共识协议来说,就存在很大挑战。在BTC系统中,不在最长合法链上的节点最后都是作废的,但如果在以太坊系统中,如果这样处理,由于系统中经常性会出现分叉,则矿工挖到矿很大可能会被废弃,这会大大降低矿工挖矿积极性。而对于个人矿工来说,和大型矿池相比更是存在天然劣势,因为大型矿池更容易成为最长合法链,相应的其他矿工也就更愿意沿着大型矿池的链挖,mining centralization越严重,形成恶性循环,有时我们叫centralization bias(中心化带来的不成比例的优势)。所以建立一个合理的共识协议是很有必要的。
对此,以太坊设计了新的公式协议——GHOST协议(该协议并非原创,而是对原本就有的Ghost协议进行了改进)。
GHOST协议最初版本如果产生了分叉,那么长的区块可以在后续区块上写入叔父区块,图中花阴影区块就是最右区块的叔父区块,然后叔父区块获得7/8的出块奖励,写入叔父区块的区块获得1/32的出块奖励,且一个区块 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(十七):ETH数据结构:交易树、收据树
每次发布一个区块时,区块中的交易会形成一颗Merkle Tree,即交易树。此外,以太坊还添加了一个收据树,每个交易执行完之后形成一个收据,记录交易相关信息。也就是说,交易树和收据树上的节点是一一对应的。
由于以太坊智能合约执行较为复杂,通过增加收据树,便于快速查询执行结果。
交易树和收据树都是M(Merkle)PT,而BTC中都采用普通的MT(Merkle Tree)。(可能就仅仅是为了三棵树代码复用好所以这样设计的)MPT的好处是支持查找操作,通过键值沿着树进行查找即可。对于状态树,查找键值为账户地址;对于交易树和收据树,查找键值为交易在发布的区块中的序号。
交易树和收据树只将当前区块中的交易组织起来,而状态树将所有账户的状态都包含进去,无论这些账户是否与当前区块中交易有关系。多个区块状态树共享节点,而交易树和收据树依照区块独立。
交易树和收据树的用途:
向轻节点提供Merkle Proof。
更加复杂的查找操作(例如:查找过去十天的交易;过去十天的众筹事件等)
Bloom filter(布隆过滤器)支持较为高效查找某个元素是否在某个集合中(如果你在集合里,不会误判你不在,如果 ...