00:00
这部分内容是以太坊里边非常重要的一部分,就是以太坊里边非常重要的一个概念吧,就是我们所说的以太坊账户的概念,大家看到这个这个PPT的这个题目,大家可能会觉得有点奇怪,就是账户这么简单的东西还用还用再讲吧,我们大家都已经钱包都玩的那么那么熟了,对吧,那么那么溜了这个账户,那不就是我钱包里面那么一个一个东西嘛,有个地址嘛,这不就是我的账户吗?这么个东西还有什么好讲的呢那。那这个东西其实我觉得如果我们认为这就是一个钱包里面的地址的话,那确实没有什么好讲的,但是以太坊的账户系统远远不止这么简单,而且大家可以想到比特币里边应该是没有账户的,对吧?就是我们真正意义上比特币里边每个人拥有一个自己的地址,但是地址没有直接对应的余一个余额,对吧,就像我们这个get balance这样的直接它有一个余额就对应在这里面,这套系统比特币里面是没有的。
01:14
那比特币里边应用的是是一套什么样的系统,来跟踪我们的用户的这种余额的状态,用户的钱数呢?大家肯定还记得,当时应该一定是费了很大的力气去去学习这个东西,就是我相信左老师肯定也跟大家是反复的讲解强调过这个概念的,对吧?这个如果不讲的话,这几乎比特币就就没讲一样,就是utxo,那我们大家一定印象很深刻,就是。比特币它存储用户的钱数,用户的这个钱的余额,这个数据在哪里存储疏忽对,就在所有的输出里面,所有输出的这个状态就是存储用户钱出的一个状态,我们要想知道这个用户他有多少钱的话,我们得到这个系统当前所有的UTSO,就是就是未交易的,呃,未未花费的交易输出里边去找到这个用户他拥有的这些输出,那加起来这就是他的余额,所以大家一定记得这样一个,这个其实是很很烦我们的直觉的,我们一开始可能还还会有一点不好理解,对吧,反正我一开始理解的时候也是觉得不太好理解,但是大家可以看到,这就代表整个比特币系统它的状态。
02:38
就是基于utxo的。它的状态其实就是UTXO的集合,那每个u to呢,它是有一个所有者,然后还有一个面值,这个大家肯定都非常清楚,每一笔交易都会花费若干个输入。当然了,就会生成若干个输出对吧?呃,这都是大家很熟悉的这个比特币USO的一些基本的东西,呃,那每个引入的输入它必须是有效的,而且是没有被花费的,就这是矿工要校验的东西,要不然的话,我们这个交易是不能生效的,那对于一个交易必须要包含所有者匹配的签名,这都是非常。
03:20
大家非常熟悉的东西啊,念一遍就可以,总输入必须大于等于总输出,这都没问题,当然如果要是大出来那一部分去哪里,肯定就就变成那个交易费了,对吧?所以我们最后得出一个结论,就是用户的余额balance。比特币系统里面就是这个用户,他拥有私钥的对应的UTXO的总和。这是比特币里边的一个实现它的,我们要查询用户余额的一种方式。那我们就在想,以太坊为什么没有用这套系统呢?这套系统尽管有点违反我们的直觉,我们一开始好像不好理解,但是比特币这套系统真的用的非常的稳定。
04:07
非常的好用,到现在为止没有出过任何的问题。以太坊为什么要,为什么不用呢?其实不用呢,没错,其实主要的一个考量肯定就是uto,从效率上来讲,肯定大家会觉得,呃,存成这样的话,那其实你便利起来是很麻烦的。你要找一个用户,他有多少钱,你得找他所有的UTXO,那这个肯定是很花功夫的。那我们从直觉上也会想嘛,这个用用这样的一个东西,我们直接把这个账户存一个列表不就完了吗?然后每一个账户对应一个余额,这不就完了嘛,然后直接要拿到这个余额的时候,我们把它读出来就好了嘛,所以这也就是以太坊的做法,以太坊的这个做法其实更符合我们的直觉,就在我们真正的现实生活当中,我们我们大家平常在银行存钱,我们在支付宝里边存钱,我们怎么样怎么样做的呢,其实也就是这样,他那边也就是记一个数而已。
05:08
如果有同学做过那个,呃,银行系统或者说金融相关的一些这种跟账户相关的后台开发的话,肯定知道我们肯定是会建立一个就是用户的一个账户表,就是比方说讲一个accounts表,就是一个,然后一个用户的ID对应一个用户的balance,一定是这样建表的,所以这是很符合我们直觉的,所以以太坊就采用了这样很符合直觉,也很也也很符合,就是我们出于性能的考虑,一查就查到这样的好处,所以大家看以太网的做法,它的每个账户会包括什么东西呢?会包括一个余额,一个balance。如果要只有余额的话,那就跟银行的存储没什么区别了。但以太网不一样,以太坊还定义了一些特殊的数据结构。就是它定义的一些数据,也可以是账户的一部分,就是有一些账户可以包含一些特殊的数据,比如说可以包含代码。
06:13
比如说可以包含内部的一些存储。大家在这里可能一看到代码就已经想到了,那这个可能会跟合约就会有关系。所以之后我们就会,其实之前大家已经接触到这个概念,就是合约,其实也就是一个账户对吧?好,呃,那下面就是这个以太坊在校验这个对比比特币utxo的那种校验交易有效的方法,以太坊怎么做呢?它其实就是很简单,你要发送一个一笔交易,我要给别人转钱的时候,那就先去判断一下要发的这个账户里边余额够不够啊,余额不够的话,那你肯定是不行的。只有余额够的时候交易那就有效,有效的话,那么我们就是账户先扣款,然后收收款的那个账户余额,再把这笔款加上。
07:07
两个余额变动,我这边加个数,我这边减个数,那边加个数,然后只要我们能保证这个交易的原子性,大家可能了解过,就是这个特性,对吧,Acid什么的,保证这个原子性,那么。这就是成立的,这个交易就肯定没问题的,我这边先了,那边加上没问题,就这么简单就搞定。这其实就是我们传统的做法啊,就是所有的银行系统,所有的关于金金融,或者说这个金钱相关的这种扣款的这种项目都是这么做的,在一个交易里面就是这么做的。而另外有一部分就跟传统东西不一样了,就是假如说接收的账户它有相关代码的话,这样一笔交易还会触发代码的自动运行。它是可以相当于一笔交易,可以。提起他的。
08:01
代码里边的函数可以调用它的函数。而且在这个自动运行的过程当中,它的内部存储也有可能会被更改。所以这就牵扯到不光是余额的变动,还有代码的调用和内部存储的更改。另外。代码还有可能再去向别的账户去发,去发一些以态,再去提起这样的一些交易,那所以这就会导致进一步的,就相当于这是借贷资金的这种关系啊,就是你给我,我给你各种各样的复杂的这种金融应用就能出来了。从这里大家其实也就可以看到以太坊为什么要这么做,它其实借鉴的就是我们现在金融体系里面的就是某些东西,首先是银行账户啊,这种体系方便查询,方便转账,另外一方面就是他考虑到它的扩展性,我们要做更多的应用,它不是要做一个智能合约和DF的平台嘛,那所以他要支持执行它的程序,程序里面还可以再发起交易,所以它是提供了各种各样功能的扩展的。
09:10
那在以太坊的里,这个系统设计里边,比特币的状态,其实说白了就是所有UTXO的集合,那以太坊里面的状态呢,其实就是所有账户的列表。那所有的账户的列表就包括每一个账户里面的余额,还包括它里面的代码,还包括它里面的存储,所以所有这些加起来就是我们所说的以太坊的状态,以太坊的状态机嘛。那呃,问题就来了,就是。以太坊他觉得这个传统的模式比较好,切换到了这个账户体系来,那我们肯定就会想到那比特币为什么当时那么那么轴就没有用传统的这个这个东西要提UT uto这样一个概念呢?
10:01
呃,大家之前学过比特币之后,对这个有有想法吗?为什么中本通他要弄一个这套东西出来,让大家感觉一看又看不明白,而且看起来效果就是效率还没那么高。呃,当然在这里我是简单的给出了两点,主要的UTXO模式的优点就是跟账户体系相关,就是如果做对比的话,一个一个明显的优点,首先udo它有很高程度的隐私性。大家可以想,想象的到就是你既然查一个,就是查一个一个人的账户,他能控制多少UUO本来就比较复杂,那其实本来这个其实也是增加了一些门槛的,对本来的这个隐私就是有保的。另外就是说,如果说。用户为每一笔交易如果都去用新地址的话,那其实就是你已经很难把他的就是账户能够联系起来了。
11:09
呃,大家之前也也学习这个就是分层确定性钱包的时候,肯定也也见到过啊,就是我们一个私钥可以导出多个私钥,然后可以用不同的交易,呃,不同的地址去发送交易,那其实在这种模式下。可以说用户的账户是完全可见的,可以说这个隐私是完全被保护起来。这也就是,呃。就是说这个比特币为什么一开始它的应用会在哪里应用呢?就是在所谓的暗网交易啊,在一些啊,当然有很多是比方说跨国的这种大额支付,它它会它会比较方便,不用过银行的这种结算了,呃,另外更多的交易就是比方说这种这种。呃,摆不到明面上的一些交易对吧,像什么走私啊,像什么洗钱啊,对,有很多人会用这个,因为它隐私性非常的好,这也是u utxo带来的,呃,但是同时他可能就会就会有一些问题,就是如果说他只是钱的话,只是一个货币的话,这个是非常的。
12:20
适合。因为本来货币本身它就是匿名的,我们谁拿着。就是同样一张人民币,不管是谁拿,他都是一张人民币,100块钱出去都能花,都都能认,而且所有的这个钱拿过来之后都是一样用的,所以这个特性是很适合货币来用的,但是呢,如果我们想要去开发智能合约开发D的话。可能就没那么简单了,因为我们要考虑的不仅仅是货币的状态。还要考虑用户数据,还要考虑代码之类的各种各样跟跟用户绑定的这些复杂的逻辑和状态。
13:01
那这个时候我们就不应该可能就不能用这么简单的划分方案了,这也就是以太坊为什么没有选用UTXO的一个原因,另外还有一个算是UTXO的一个优点吧,就是UT在理论上。它的扩展性可扩展,可扩展性会更强,这是什么意思呢?就是说对于我们去去这个维护我们的这个区块链的时候,我们怎么样保证它的这个稳定性,或者说这个可扩展性的,我们只要依赖。有uto的那些人,他们去维护这个维克尔树,然后他们去做所有权的证明,去做各种各样的校验判断就可以了,为什么他们最关心这个事情呢?因为我们查的时候。看他有多少钱,就看他有多少utxo,那如果这些UTXO的状态他没有,他没有维护好,他没有把这些数据就是广播出来,然后让大家知道。
14:09
那这些东西如果要丢掉的话,所有这些东西就是你的损失,你的uto你都不管,那那我们都没有能力去管,没关系的。就是你这个如果丢掉的话,只是影响到他的所有人的权益,他的他的他的损失,他就没有这些钱了,但是对于别人而言的话,其实不影响。大家可以想到我要给你转账,那其实你的那个UTSO丢了,我给我该给你转多少还是转过去,我再新建一个UTSO给你转过去吧。而如果要在账户,账户的模式,模式里面可能就不一样了,因为它直接存的就是一个余额,就是一个账户最终的钱数,如果这个没有维护好的话。那就不仅仅说是这个用户可能有损失的问题了,是别人连查都查不到,而且我要给你转账,可能没法没法转了,因为连你的账户信息都没有,这怎么转?
15:07
所以大家可以看到就是。就是有优点的地方一定也就有缺点,那带来一个优势的同时,也就会面临很多很多缺陷。呃,那账户模式如果说要是舍弃了UTXO的话,在这一部分,在这种可扩展性上,稳定性上肯定就要比UT的模型要差一些。而且另外还有一个这里没有列出来的问题。就是大家肯定想到过,就是之前在学比特币的时候,肯定介绍过所谓的双花攻击,或者叫大家学可能叫重放攻击。有各种各样的名字啊,或者叫双重支付对吧,各种各样的名字,呃,他什么意思,就是说就包括我们的那个51%算的击,其实也是想要最后做这样的一个一个攻击嘛,我一个USO可以用两次,呃,为什么呢?就是我如果要是有钱的话,我们都知道,在实际的现实世界里面,如果是钱,他为什么没有这样的考,就是没有这样的问题存在,就是因为它就是实体的一个东西。
16:18
我花了这笔钱,我就要把这张这张纸,这个纸币,这个硬币直接给到别人手里边,那自然我对他就没有所有权了,我在把它复制,复制出来那叫假币,那怎么跟真的也不一样,所以说呃,大家大家都认为这个只要我把这个东西给到别人手里面,这就算这笔交易完成,这个所有权转让完成,但是数字世界里面,数字货币的世界里面就没那么简单了,因为它就是一串数而已,我们能说是啊,这串数是属于我的,它在我硬盘里面存着,所以这个这个uto,或者说这个大家有些人就直接就说这个比特币对吧,这个比特币是我的。
17:04
那别人如果把这一块数复制一遍的话,那难道这这个就变成他们的了吗?那我这儿应该还有啊。那他复制一遍,这就相当于他也多了一个比特币吧,那也不可能啊,这这所以在数字世界,数字货币的世界里边,这套所有权的确认是不可能实现的。而中本通就想起就是他,他就会发现,那如果我们用传统的这种账号账户的这种模式的话,我们直接去发送一笔交易出去,比方说我给某一个同学想要转一个比特币,我提起了一笔交易,那怎么样大家确认这笔交易是不是我发出的呢?肯定我在上面有个数字签名,大家对大家一校验,是我的数字签名,好,大家说这是我同意了,我要发出来的一笔交易。那但是这笔交易大家全都能看到,全都能拿到这个数据。假如说呃,我我要转给齐磊。
18:02
那我要是没有别的一些限制的话,齐磊拿到所有的这些数据之后,齐磊就说了,诶,那这这好啊,这不就是一个交易,然后加了加了这个。呃,吴老师的签名之后,这个钱就归我了吧,那我把这个再复制一份。他前面给我转了一个比特币,我再复制一份,我再广播到。那个网络当中去,他他这不相当于他又发了一份他签名的一个一个交易吗。那这不是我就又来一个比特币吗?所以本身我们的这种就是传统的这种交易模式是这样的问题。为了解决这样的问题,这也就是就是说我是不是同样的一个一个一个交易,可以去重复的去去广播出去啊,当然就是说这有一整套的这个体系来做保证了,就是首先呃,大家知道我们要有各种各样的这种哈希啊,各种各样的这些校验,但是如果说是同样是转一个比特币这样的东西,怎么样去校验呢?
19:08
那好像这个东西。就是也不太好校验对吧,就是说呃,大家知道在本身那个比特币的这种签名的过程当中,肯定是把这个问题是规避掉的啊,就是说因为我们里边要有这个呃时间戳啊,要有一些就是你不可能去完全一样的东西,你只要稍微改一点点东西,那最后的这个签名,最后的这个哈希一定是不一样的,呃,但大家考虑过没有,就是说那如果说是完全一样的东西呢?第二次发起这笔交易,那会怎么样呢?如果说我们没有别的限制,那他就是成立的,因为他有同样就是哈希也是也是符合验证的,而且它也是真正拥有我合法签名的一个一笔交易。那这个东西怎么避免呢?
20:02
中本聪,或者说比特币的这种设计里边就是用UEXO解决了这个问题,就是说你不要说发出一个交易来之后,诶一个比特币就转过去了,呃,不存在这么简单的事情,我们要考察的是UFO,我们跟踪的是utxo的状态,那你如果发了一个比特币已经出来,那你对应的那个输入它就对,它就已经变对,它就不再是UTSO了,所以你下次还要再用那个UTXO的时候,那不好意思,这个已经用过了。所以uto其实是很完美的解决了这个问题,大家可以看到,诶,那对应的大家现在就想到了,那假如说现在一太坊舍弃了uo。那他到底是有什么样的好处,他肯定就要面对这个问题了,对吧,他怎么样解决这个问题呢?这是一个问题,先给大家先留下一个疑问,然后我们现在先说用账户模式到底有什么好处啊,当然这个好处可能相对来讲就比较简单一些了,呃,首先就是它这个节省大量空间了,大家知道当然就是查询也会更快嘛,对吧,一方面节省空间也节省时间啊uto如果说我们要是分别去跟踪他的状态的话,那就相当于本来我的账户里面就是一个数。
21:28
结果呢,我们要跟踪不同的uto,那就相当于我本来十个比特币,结果你你会发现它有可能是七个uto,这边一个,那边2.5个,这边0.3个,对吧,所有的这些油田都加起来的一个状态。一一,当然就不需要跟踪这么多数据的状态,我就一个数,我就是十,这不完了吗?所以说这还是很非常节省空间的,而且就是说它不光是说我们存储的时候节省空间,节省状态的存储,而且就是每个交易的时候,大家可以看到比特币在构建交易的时候,是要有很多个输入很多个输出的,对吧?对是是允许这种多输入多输出的,但是以太以太坊上的交易不需要那么麻烦啊,当然可能也就没那么灵活啊,就是它的一笔交易就是一个输入,一个输出,一笔转账,这就是我们传统世界银行,我们支付宝、微信都是这么转的,这就是以太坊这个账户模式的一个特点,另外还有一个特点是所谓的可替代性,这个怎么理解呢?就是说货币其实本质上它都是一样的东西。
22:41
怎么说,就是我这里边有有十块钱硬币,那这十个硬币它都是一样的,放放在我这里每个硬币都一样,我把它花出去,它也都是一样的硬币,到了别人那里还是一样的硬币,它本质这个没有任何的变化。
23:01
或者说,对于比特币来讲,所有的u to,它的本质不一样吗?其实没有不一样的东西。那以太坊可能就会就是或者说威神他的团队可能就会想了,那你为什么非要说我这个uto它有一个特殊的属性叫就是这是33.5个比特币,另外一个utxo有一个属性,说这是1.6个比特币。没有必要吧?其实我们就是钱的概念,那那你说其实我们就是都是同质化的钱,它不就是钱而已嘛,你为什么要多那么多兴趣去把它分分化开呢?另外就是说。我们在UX的处理里边,你还要把它分成有一些是用过的,有一些是没用过的,才叫UTX。那以太坊就想,你既然都是钱嘛,用过了就不叫钱了嘛,只不过他到了另外一个人的账户里而已嘛,你为什么要跟踪这么多用过的这些数据呢?
24:02
那所以说在这个设计里面,就如果要是我们用传统的账户模型的话,可以说也就没有这样的问题了,因为他确实跟我们常规的这种认知也是符合的,就是一样的钱从我这里转到别人那里,也不是说这个东西就不可用了。我没有必要再去新建一个,就是新的utxo来说,它是一个新的钱。它本身就是原来的钱,所以大家可以看到就是这在实际当中呢,就是还是实际应用当中,大家如果要做APP的话。那肯定还是账户模型应用更广泛,尤其so确实是会少见一些。呃,另外两点就简单跟大家说一下吧,就是一方面就更加简单了,账户模型。比UTSO理解起来就容易太多了,代码可能也是更容易理解一些,呃,就是特别是设计复杂脚本的时候啊,就是UTSO大家不知道写过那个复杂脚本没有,不知道啊,写过是吧,那大家肯定很有经验了,那个肯定会觉得很少觉得会这个东西怎么觉得那么不好使呢,是吧,这个这字写出画是吧,会写出写写,比如说你再回头找的话,很难找哦,出了哪一步好像很难哦,对对对,就是因为这这就是确实是uo这个设计,它是比特币设计的时候,它就是为了系统的稳定性,为了安全性考虑的。
25:32
而他没有考虑太多这些,我们是否方便去开发,方便去和应用去接轨,他说我就是货币,就是钱,你不要想搞别的,所以大家可以看到为什么有这么多的不同,跟最初他们的定位,他们的设计是相关的,那最终还有还有一个特点啊,就是它便于维护持久的清洁点,这个简单说就是说清洁点是什么呢?它就是只存储最后用户的状态。最后所有我们账户的状态,而不存储历史数据,对吧?就是没有那些数据,我只存储一个最后的状态就可以,那如果说用账账户的这个模型,那就非常简单了,你所有的状态就是一个数码,最后的这个账户里面的余额,那我只要是沿着特定的方向扫描这个状态数谁的,呃,余额里面它有多少钱,是怎么样变化过来的,很容易就可以校验出来。
26:27
但是UTSO的话,那那个那个算法肯定就会很复杂了,大家都实现过,肯定都知道这个这个坑还是比较大,所以这就是以太坊账户模型。呃,可以说这些都是很明显的一些优点啊,好,我们在这里做一个总结。我们所有的这些特点总结起来,大家就会发现,根本上根源就在于他们俩的设计定位完全不同。比特币设计定位是什么?比特币,一种点对点的电子现金系统,定位在现金系统,所以他说我就是钱。
27:08
那至于你说你要开发的方便,你要你要阅读方便,你要脚本控制方便,对不起,不是我考虑的范围,那钱我要考虑什么东西呢?对我要安全,我要稳定,我不能让人觉得我这个就是挖矿挖出来的这个钱有点不对了,我我这个转账这个交易验证有问题了,我容易出现双花攻击了,别人拿了我的签名的这个这个。这个钱然后再发一遍,他就又能赚我的钱了,这些事情是绝对要绝对要杜绝掉的,这是比特币共享的时候,他设计的一个理念,所以大家才会看到那么多很奇怪很复杂的,好像不太好理解的东西,在比特币里面有应用,有实现。而以太坊的设计定位呢,就不一样。以太坊说的是以太坊,一个下一代智能合约和去中心化应用的平台。
28:08
所以它的定位是去中心化应用DF平台。如果要是DAPP平台的话,那首先你就得和实际应用相相挂钩啊,我们实际应用的过程当中,大家做一个APP,做这个前后端开发的时候,你不可能设计用户的体系的时候,你不给用户设一个账户的余额这样一个属性,而是你设计说他有这个UTXO,他有那个UTXO,谁谁都不会那么设计表结构对吧,那你要那么管理的话,就太复杂了。所以实际应用。就是适合用账户模型的。而且另外就是说,呃,就是在我们这个直观的这种理解和和这种表达上,肯定大家要做开发也是账户模型更方便,前面我们在GA里面去查的时候,ETh.accounts直接就可以查账户,ETH是点get balance,然后给一个账户就查到他的余额,非常的方便,呃,那。
29:07
设计定位不同,所以他们的数据结构设计就不一样,数据组成就不一样。比特币现金系统,所以它的数据组成是一串账本交易列表,就是所有的这个它的定位的这种数据结构,其实就是一个一个的交一块。最后组成的就是把我们的UTX都是都放在这个交易里面作为输出,然后来表达我们这个系统的状态,而以以太坊呢,直接就判断的是交易和账户的状态。就主要就是余额,当然我们这里说的主要就是余额交易,就是改变了这个余额嘛,所以最后跟踪的就是一个余额状态,那交易对象都不用说了,一个是UTXO,一个是cos。最后还有就是代码控制,比特币的设计理念里面,代码控制就会。
30:01
好像没,就是它的功能能实现的很少,他砍掉了很多功能,说咱们都说它是不是图灵晚辈的对吧,我们第一天就给大家专门说过图灵完备那比特币所有的,而他这个就是功能少,而且大家还大家还会发现开发脚本的时候还特别麻烦,特别特别的不好用,对吧。这就是比特币,最初它的设计理念就是你就不要开发复杂的东西,我这个东西就是钱,就是转账,你用人民币的时候,你还想着在人民币上画个花吗?对吧,那叫那叫涂抹人民币,那叫这是这不是正确的用法,所以在比特币里面,它的脚本大家就会发现很不好用。但是一般拿它就不要实现太复杂的东西了,但是以太坊不一样,以太坊一开始定位就是说我是Di平台,那你就应该是给开发人员用的,你就应该他是一个有很强的可编程性质的一个一个。
31:01
区块链系统,所以它的代码控制是更复杂的智能合约来做的,它是图灵完备的,它能做很多很多复杂的事情,所以大家就是从它的设计定位入手,大家就能理解很多他们不同的地方,他们为什么要这么做。
我来说两句