00:00
主要还有一个地方,我觉得还应该再提一下,就是比特币的脚本,那这一点为什么要专门来说呢?就是因为以太坊就是扩展了比特币的脚本对吧?大家其实可以发现,本身比特币的脚本是可以实现自动化的合约这样的一个功能的,呃,比如说大家看白皮书里面这里举的例子啊,比特币的uto可以被不止一个公钥。拥有啊,同样它也可以被基于堆栈的编程语言所编写的更加复杂,我不知道之前大家学比特币的时候有没有实现过更复杂的脚本,但是这里大家可以看到,就是说为什么以太坊想要去在这方面做一些更大的改进呢?比特币用脚本系统可以实现一些基本的功能了,而且甚至还可以实现相对来讲对账户比较复杂的控制,那为什么还需要以太坊再弄出一套所谓的智能合约这样的系统呢?那我们看微神在白皮书里边给出来的四个比特币脚本语言的重大,呃,他认为的重严重的限制吧,我们可以看一下,第一个就是缺少图灵完备性,呃,这也是大家可能一说起来比特币的脚本语言和以太坊的这个编程语言,它到底有什么区别?第一反应就是。
01:30
呃,以太坊是图灵完备的,比特币图灵不是图灵完备,这里其实想说的就是主要所谓的这个图灵不完,呃,不是图灵完备呢,就是因为比特币的脚本语言里边缺少循环语句,那这个大家其实都知道了,比特币因为它是一套现金系统,所以它是要避免交易确认的时候,你既然循环嘛,那就有可能会死循环,对吧,直接无限的循环在那里,那这种情况在交易确认的时候是一定要避免的,所以比特币出于安全性和这种实用性的考虑,直接砍掉了这部分的功能,呃,这里就是V时说了一个,他就是说那对于脚本脚本程序员来说,那没有循环,没有号,没有while,其实也也还好,没关系,就是你可以一直不停的一对吧,就是像我们所说的这个,呃,如果你是一个。
02:30
For就是for I等于零,然后I于一个length,然后I加加这样一个for循环的话,那大家完全可以一开始就呃,If I等于零怎么怎么样,然后else I等于一怎么怎么样,对吧,一直if else到I等于length。那这样当然也是可以实现的,但是我们就会发发现,如果你没有循环,没有本身从语言语法上的这种支持的话,那代码代码量可就不是一般的多了,呃,就像这个所说的,如果你实施一个想要替代这个椭圆曲线签名算法的话,那可能就得256次重复乘法,那这种东西如果实现起来的话,肯定是不光是编程难度的问题,呃,就是不光是编程比较繁琐,比较费劲的问题,更重要的是这个脚本的空间,那就大幅的缩缩少缩小了,对吧?就是我们要占用很大的脚本空间来做这种看起来没有什么意义的事情,所以这就是以太坊的一个重要的考量,他想要弄一个图灵完备的语言,有循环可以实现任何的事情。另外还有一点,这里指出来的叫做价值盲。呃,他这个翻。
03:47
其实我我觉得不是很舒服,但是好像又找不到一个更适合的形容词,对吧?大家看它的英文叫value blindness,呃,什么叫这个价值盲呢?它其实就是说在比特币的系统里边,UTXO这样一个脚本对于UXO的控制,它并不能让我们对用户的这个取款额度有一个特别精细的精准的控制,为什么呢?其实大家一想就能想明白,这因为在转账的时候。
04:20
我们必须要把就是查到的当前可用的UTXO一个一个的列在输入里面,对吧,引用在输入里面,那这个事情其实就很麻烦了,因为uto本身它的值并不是确定的,对吧?我们知道它可以可大可小,而且它的精度也是就是没有一个明确的限制的,我们可以是一个,可以是两个,也可以是1.5,也可以是1.235这样的,很很奇怪的就是很长一段的小数位的这种进度,所以像这样的情况,我们想要去选择符合要求的。
05:00
一串输入的时候可能就会花费很大的功夫了,那在这里大家看到举的这个例子啊,呃,提到预言机合约,一个强大应用是对冲合约,对冲合约是什么呢?他是说A和B各自向对冲合约里边发送价值1000美元的比特币,然后过一段时间,比如说30天之后,那就是所谓的这个合约,或者说脚本就自动的把。就是给A再发送1000美元,价值1000美元的比特币,那剩余的呢,给到B那里去,所以这个其实有一点,这个对冲有一点像什么,就是就是对赌对吧,有一点像是就是两个可能一个看涨一个看跌的话,那就是我我确定要发1000美元的比特币,过一段时间之后,我再给你返回来两个人的这个账户有一个对冲,那这个这个过程啊,就是。比特币其实已经是本身完全可以做到这件事情了,对吧,大家应该能想到用比特币的脚本是可以实现这样一个功能的,但是呢,因为UTXO不可分割。
06:13
那实现为了实现这个合约的时候,那其实唯一的方法就是就是非常低效的找很多很多个u txo,不同面值的utxo,然后把它去筛选,从中选取出符合我们要求的这些,然后去构建出我们的这个输入的引用,所以大家可以看到就是U其XO的这种方式呢,确实是很容易的实现了。从从我们真就是直观意义上的钱的这种流转和归属的这种这种查询,但是它有一个问题,就是如果是说涉及到余额,涉及到一个转账精度的时候。我们可能就需要做更多的事情了,就会麻烦很多,呃,这个也可以简单有一个比喻就是大家可以想象,呃,其实我是觉得UT uto的这个设计模型跟我们真正的就是人民币,比如说我们的这种现金还是很像的。
07:15
为什么呢?因为我们的现金确实没有一个说法说哎,我拿出一张纸来,这个叫做一人民币,呃呃,应应该应该怎么说呢?我们有一元这个概念对吧,但是这只是我们的一个单位,我们并不是说一张纸它就有代表,就是就本身人民币这个概念,这个好像也确实是大家从观念上好像不太好,呃直接的去去更改这个观念,因为我们平常用的都是一块钱作为单位的嘛,但是大家可以想到我们还有别的不同的纸,就是在这里utf大家可以认为它是张纸,对吧,然后上面写着面值,写着与它的本身的这个价值,那我们可以想象平常我们买东西的时候,假如说一个东西定价,呃。
08:05
呃,120 129块,我们如果要给的时候,要付这个钞票的时候,那肯定就是说先拿出一张100的来。然后再拿两张20的,呃,有可能是直接拿三张,呃,拿拿拿两张十块的啊,有可能是拿三张十块的,当然也有可能,如果要是有完整的这个钱的话,大家会凑一张100的,两张十块的,一张五块,四张一块的这样去凑,所以这个过程其实大家看到跟我们用就是比特币的转账UTXO的输入去选取,其实是很类似的。但是比特币比我们的这种现金的选取又会麻烦一些,因为现金里边它的面值固定,就是只有那么几样,而且它都是很整的整数,我们用惯这个钱之后,其实大家就直观的就能想到,哎,我应该拿出几张100的,拿出几张十块的来,呃,这个对于大家来说其实计算难度,尽管有一些计算难度,但其实也还好。
09:09
但比特币就不是了,那比特币是相当于大家想象一下,我自己手里面有一个钱包,里边的钞票是什么呢?一张纸上写着1.2元,一张笔,呃,纸上写着。97.869元,然后还有其他的这个,这个钱上写的是对吧,各种各样的数字,这个时候让你要凑出129块钱,你可能就得算半天了,对吧?这所以说大家可以就这样直观的去想象一下utxo脚本,他没有办法提供一个非常精确的,你拿哪几个UT去做支付这样一个状态,这也就是微神在这里就是认为比特币脚本不好的一点,它的一个限制,就说它是价值盲。所以就是理解是是这样的一个一个状态啊,还有下面一点是说它缺少状态,那这个其实大家也比较好理解了,就是说u txo呢,它其实就是一个二元的状态,要不就是呃,其实UTXO本身来说的话,其实它就是一种状态,对吧?U to本身定义就是未交易的可用的这个输出,所以未未花费的交易输出,所以它本身其实就只能是一个未花费的状态,当然我们还有就是如果他已经花了之后,它就变成了已花费的状态,所以大家可以认为比特币本身系统里面的状态两种,已花费,未花费。
10:42
那如果要是只有这么两种状态的话,我们想要去做一些复杂应用的时候,比如说大家看这里提到的啊,多阶段的期权合约,就是可能我们是一个期权,而且还还是他这个期权,还是分阶段,就比方说我过一周之后是有一个什么样的一个价值体现,一个月之后是一个什么样的价值体现,那这其实是对应不同阶段有不同的状态。
11:13
UTXO如果只是两元的话,这是完全是没有办法做这件事情,所以呃,这里他还专门提到二元状态和价值盲这两个特点结合在一起。意味着另外一个重要的应用,取款限额是不可能实现的。这是什么呢?就是说我们在银行里边经常就会有一个限制,说我们当日提款你不能高过多少,对吧,就是或者说我本月的提款,本次的提款必须要低于多少,给一个提款的限额,那大家就可以发现,如果说UTX,我本身没有那么多的状态,只有。已花费未花,未花费的话,那我们就没有办法去限制他,明明这就是一个未花费的东西,你凭什么不让他花呢?所以比特币的这套系统里边缺少状态,也是导致不能做更多应用扩展的一个原因。那最后还有一个,他是说这个区块链忙,其实所谓的block chain blindness,他说的就是呃,这个utfo,或者说是在脚本里边,我们是不能去看到区块链数据的,对吧,就只是做一些交易上的控制,而并不能直接去读取,比方说我上一个区块的哈希,这个是是做不到的,所以呃,理财访白皮书里边说这个缺陷,他剥夺了脚本语言拥有的基于随机性的潜在价值。
12:43
也就是说你不能根据之前的,呃,就是当前这个区块上的其他信息,区块链上其他信息来做一些就是更多的应用的扩展,比如说它这里就是说你不能去做博彩或者是其他方面的一些应用,那大家可以想到就是因为我们区块链上有很多信息,它其实是带很多随机性的,比如说我们有时间戳,对吧,还有一些别的一些东西,所以基于这些的话,其实是可以做一些随机性的扩展的啊,尽管这个可能也有各种的考量,大家可能会觉得这个是不是尾随机啊,或者说怎么样啊,但是至少他有这种可能,但如果说。
13:23
你都没有办法去访问这些数据的话,那确实就没有任何可能了,呃,所以就是比特币它实现的非常简单,对于微神他们这样的,就是想要扩展比特币应用,扩展比特币功能的人来讲,他可能就认为比特币太简陋了。但我们其实从另外一个角度也得看到,就是就是因为比特币设计的简单。或者说它设计的很简洁,才保证了它到现在为止就是能稳定运行这么长时间,有时候可能最简单的可能就是最好的,对吧,简单粗暴是最最最好的处理事情的方式,好,那么我们这里就已经把这个比特币这一块的东西都都说完,把历史都回顾完,那大家可以看到为什么为什么会提出以太坊,他其实主要就是受限于他认为比特币会受限于这些特点。
14:19
所以他想要做一个比比特币更广泛应用的平台。那他就想要创建一个新的区块链系统,那这个系统里边要克服这些缺点,那当然就应该得图灵完备。得能够精准的确定取款的取款的额度,能够很方便的去能查到自己的余额,对吧,那另外就是我还得有更多的状态,还有就是我还能查到区块链当前的信息,所以大家可以看到这几点在以太坊的设计里面都是就是非常的得到了体现的,那接下来我们看看这个以太坊这一部分。以太坊这一部分,首先我们看一下它前面这个,这算是一个综述吧,啊,那以太坊目的是基于脚本、竞争币和链上原协议的概念进行整合和提高,所以大家看他的这个思想的来源在哪里,一个当然就是比特币和比特币的脚本,这是它一个很重要的理念,就是设计理念的来源。另外还有一个他所说的竞争币,可能主要就是说的这个彩色币,还有像域名币这些数字货币,对他也有很大的启发,因为像他看到彩色币这样,基于比特币脚本实现了一个我可以演染上颜色,就发行一个自己的子货币,所以。
15:39
那微晨就想了,那我构建一个系统之后,我肯定就要,就要很容易的能实现这个发行一个货币的这样的一个需求,而且我还不仅仅能做这些事情,所以这是关于竞争币对彩色币,这些货币对以太坊的一个启发,另外就还有链上原协议,就是前面提到的原币。
16:00
那他其实就是说在比特币的基础上,相当于自己又包了一层协议,我在完成一个比特币交易的时候,我内部的协议还可以有新的状态,比特币的交易我不能退回,但是我内部的协议我可以判定他这个到底成功不成功,我可以把它状态回退,那大家可以看到,在后来以太坊在实现的过程当中,其实对这个是有有一个很完整的实现的,对吧,就是我们在合约里边的这种操作,交易的操作,呃,所以这里就是说他的目标是。希望能够让开发者得到构建可以构建任意的基于共识的、可扩展的、标准化的特性团队的,易于开发的和协同的应用,很多个修饰词,呃,简单说就是更加好用,功能更加强大,然后便于开发者在上面开发自己的应用。主要就是这样一个目的,大家看它后边的这种描述,是说以太坊是建立了终极的抽象的基础层,内置有图灵完被编成语言的区块链,所以这件事情对于以太坊,就是咱们已经了解到的东西来讲,这其实是什么呢?这其实就是以太坊的EVMVM做的就是这件事情,它是建立了一个终极的抽象的基础层,然后内嵌这个图灵完备的编程语言去处理我们所有的合约,处理我们所有的交易,呃,所以他的这个最最后的目的就是让任何人。
17:38
都能够创建合约和第案,并且在其中设定由他们自由定义的所有权规则、交易方式和状态转换函数,也就是说每个人都可以有自己的合约,合约里边可以定义自己的状态,状态变量可以定义自己的函数,然后大家都可以按照自己定义的方式去做这些操作。呃,当然了,后面这就是还要去说一下自己的优越感,对吧?就域民币它的主体框架两行代码就可以实现,当然这个就是就是说主体框架啊,就是就是整个以太网是一个非常庞大的应用平台,你至于之前的这些币,那就随随便便几行代码就搞定了,而像这个货币和信誉系统和其他协议,只需要不到20行代码就可以实现,当然这个我们大家都已经看到了啊,确实自己发一个子代币,没有多复杂的东西,层链一体,基本上可能也就不到20号就搞定了。那。
18:38
这里面还说到就是智能合约包含价值,而且只有满满足某些条件才能打开的加密箱子,这就是说对智能合约的一个相当于是一个比较直观的一个描述吧,就是它是有一个价值的,也就是说它本身是有一个value,有一个余额的,而且呢,就是你只有满足某些条件的时候才能够去调用这样的一个加智能合约,所以它把它比喻成一个加密的箱子,呃,所以这样的东西呢,能够在平台上创建,而且因为有这个啊,这就是前面比特币的缺陷,他所认为的限制在以太坊上全部都有。
19:20
就是全部都实现了图灵完备,价值之小,那边是价值盲嘛,这边的价值之小awareness对吧,然后区块链之小和多状态四个特性。所以它就比比特币脚本能提供的智能合约强大得多,这就这是以太坊的一个基本的想法,所以我就觉得这四个特点啊,就是跟比特币相对比的这四个特点,我觉得大家应该还是要能够了解的清楚,假如说之后出去之后,大家去,呃面试也好,或者说是跟别人去,去做一些,给别人讲一讲这个以太坊比特币也好,这应该都是一个很重要的区别,或者说以太坊设计理念上很重要的点,对吧?呃呃,之前有几位同学去过那个那个星星云链,呃,当时大家应该也也听到了,就是那边的就是在做这个区块链,真正在做区块链行业的这些这些人,他们的这个技术负责人,他说当时也就是我们也问了一个问题,说如果他们想要这个招人的话,面试的时候问什么问题嘛,他更看重。
20:32
的是什么?呃,他的这个回答其实是说他更看重你对这个东西就是理解到什么程度,以太坊跟比特币有哪些区别,他为什么要这么做,所以大家可以看到,当然这只是一家之言啊,就是不一定其他的大家去面试,有可能他不是问这些,但是大家至至少大家可以看到有一些人他的关注点是在这里的,所以大家在准备的时候,或者说我我觉得这个大家也确实有必要知道,对吧,就是以后要去做这个区块链行业的话,那你说我们想要做一个新的产品,难道真的是别人告诉你说,诶,我我想去发行一个什么什么币,你给我做出来吧,我我们就只做这个事情吧,其实也可能也就很没意思了,对吧,就纯粹做这样一个,那那就是所谓大家当一个码农,那就是别人来了需求,我去买代码,大家如果要是能够对这个本身底层面的这种设计有更多的想法,有更深刻的理解。
21:32
的话,那到时大家其实就会有更多的想法涌现出来,就会觉得,哎,我利用这样的一个技术,我其实是可以解决什么什么样的问题的,这个能力可能特别是现在啊供链啊,我们现在供链上面应用还都大部分没有落地,很多企业都没有看清楚发展方向在哪里,在这个时候我觉得可能这样的能力更加重要,而且可能也更受。呃,就是一些企业欢迎他,因为他自己可能也没有想清楚该该怎么弄,如果要是我们自己就对这个很了解,也有自己的想法的话,应该还是很有优势的。好,那接下来我们就看一下以太坊上面的这些重要的概念了,呃,这这个其实我们都已经很熟悉啊,就是以太网上账户的概念,以太网系统里面状态。
22:23
以太坊的状态,那其实就是由账户和账户之间的价值转移和信息的转移来组成的,就是在以太坊上。它的最根本和最重要的一个数据结构就是账户。那这里给账户专门给了一个定义,对吧,每个账户有一个20字节的地址,呃,由一个20字节的地址,应该就是由一个20字节的地址来表示,对吧?所以我们知道以太坊的账户,每个账户都有一个地址。那这个地址是一个20字节,160位的一个字符串,所以我们平常用到的地址呢,是一个has字符串,所以它是40个has。
23:09
所以大家看到平常我们复制粘贴的那一个地址都是40个字节啊,这个还是再跟大家再强调一下,我我觉得这个有可能,如果要是面试或者什么的,有可能有人会问啊,呃,但是这个也不是很确定,呃,那就是大家可以看到状态是根据账户,账户的状态代表了整个以太坊的状态,那么账户包含哪哪几部分呢?之前我们给大家讲过,现在我们再重复一下,一个随机数north。这是用来确定每笔交易只能被处理一次的,我们之前记得这是一个计数器,从零开始,每发一次交易就加一,所以我们如果要想撤回一个交易的时候,其实是可以在他还没还在判定状态的时候,我们马上再发一个跟他nu相同的交易,就有可能能把它顶掉撤回,对吧?所以这是这个nu死。
24:04
用用途,那接下来呢,就还有就是账户目前的以太币余额balance,这是这就是所有账户都有的一个属性,另外还有就是账户可以有对应的合约代码。还有一个就是账户可以有自己的存储空间,当然了,我们知道合约代码和存储空间这两个不一定有,如果是外部账户的话,他就没有,就只有一个balance,那如果要是内部账户或者说叫合约账户的话,这两样就是可以用的好呃。另外这里再多说一句啊,就是因为我们现在已经把之前的内容都已经学了,现在相当于是一个回顾和一个就是总结和一个综合,呃,那大家在这里就给大家提一个问题,大家可以想就是。以太坊的这个账户,它本身的存储,大家可以看到它的这里有这个合约代码和账户的存储空间,那它这里的存储空间是怎么放的呢?就直接跟在自己这个账户后面的这个空间里面吗?
25:12
因为我们知道我们自己的那个账户本身就是公钥做过哈希计算之后截取出来的一部分字符串,对吧?那这个东西我们可以在以太坊整个的这个存储空间里面找到一个位置,大家可以想到对吧,然后后边它就会存一个。在后边存一个balance,那大家想象一下后面他的这个代码和这个他自己的story,特别是他自己的story。是直接就跟在后面去存储吗?还是说怎么样?哦对,大家应该能想到,就是因为你这个没有办法提前给他分配多少,对吧,因为你不知道一个这个合约它的代码有多长,也不知道它的这个存储到底有多大,而且我们知道的存储里边还有各种各样复杂的结构呢。
26:03
我们可以在存储里面再去定义数组,再去定义啊,甚至是变长的数组,对吧,定义结构体,定义映射,定义mapping,所以这个东西我们肯定不可能提前给他预留好,所以一定是这里存储的就是它本身的一个哈希值,那么我们用散裂的方式把它映射到更遥远更加广大的一个空间里面去,那个地方是我们真正的一个一个东西。好,这里先先这么提一句,之后的话我们会,呃,我我预计是明天啊,明天我们可能给大家讲黄皮书和这个呃,部分源码,因为源码还是就是说实话还是整个太复杂了,太太庞大了一些,我们可能只能挑一部分来讲,呃,那我们可能有一个比较重要的内容会给大家讲一下以太坊的底层的存储数据结构。也就是说,呃,大家比较熟悉的梅克尔树在以太坊里面还有另外一个数据结构叫帕特里下属,对吧,所以以太坊的底层数据结构叫梅克尔帕特里下属,就是我们可能会给大家详细的把这个讲一讲,也是大家。
27:18
相当于我们在之前介绍的时候,跟我们应用没有关系嘛,所以一直没有没有详细展开说,大家可能只是听到概念,明天我们给大家再详细的讲一下。
我来说两句