00:00
下面就是我们要真正来介绍一下以太坊里边的账户到底是什么东西了,前面是说了以太坊跟这个比特币他们之间的区别和联系,他们用了不同的这种设计模式设计的这个模型,那么账户的这个模型到底有什么优优缺点,那现在我们看看它到底是什么东西。账户类型有两类,这个其实之前就给大家提过啊,一类叫做外部账户,正式把这个定义给出来,叫externally own the account e OA,所以之后有时候咱们如果要是简写的话,就直接写UOA了,大家看到UOA知道他说的就是外部账户就可以了。那外部账户是个。这个其实有点就是。我反正至少在我的这种观念里面,感觉外部账户怪怪的啊,就是我更喜欢叫他普通账户,或者叫用户账户,简单说就是人,他背后是人人来控制的,我们想要去建一个钱包,我们建一个账户,那这个账户就是外部账户。
01:06
就是一个大家所理解的普通账户。与之对应的另外一个概念,有普通账户就有不普通的账户,那不普通的账户就叫做合约账户,对这一类账户,它其实里边是一个合约。那就是我们所说的contract,呃,对应于外部账户,有些文章里边可能也会叫合约账户,叫内部账户,所以大家如果看到这些的话,就知道他们是一回事,呃,就是外部账户和内部账户对应,那普通账户和合约账户可能对应,我这里边写外部账户和合约账户也是可以的,大家就就知道这就是账户的两种类型就可以了。好,接下来我们看一下UA这个外部账户里边到底有什么样的东西。首先,它有一个对应的以太币余额balance。这是最主要的一个东西,咱们都知道,然后咱们就会发现它其实好像就没有别的东西了。
02:06
大家看下面,其实就没有说还还有什么了,光是最后说了一个它没有关联的代码,当然也就没有关联的存储,所以外部账户,简单说它里边主要的数据就是一个以太币余额balance。那它的作用就是主要是可以发送交易,这个交易指的是广义的交易,不是说我们去就是给别人转账的这个交易。当然,我们可以用自己的账户给别人转账,还可以用我们的账户去调用一个合约代码。大家都记得我们已经部署过,运行过我们的水龙头合约,我们在调用他的那个withdraw的时候,我们点击的时候是要我们的账户,我们的ma ma的账户是会弹出来提示的,对吧,是要我们的账户去确认需要出手C费发起一笔交易的,所以大家可以看到所有我这里可以先提前跟大家说,就是所有的交易。
03:08
就是在以太坊上的交易transaction,它的发起者都是外部账户。用户账户好,然后下面就是说他的控制权就在,就是由用户的私钥来控制,有了私钥就有了他所有的一切权利,就可以转出它里面的以太以太币,所以私钥就是仪器啊,这个外部账户,用户账户大家已经很熟悉了啊,就是咱们都用钱包嘛,所以说这个很熟悉,合约账户可能就稍微的有一点陌生。那我们来说一下合约账户是一个什么东西,哎,我这这里面写错了啊,大家回头回头自己把这个改一下,这个合约账户不是叫叫叫外部账户,什么用用户账户啊,这个写错了,可能是我直接copy前面的一个营业PPT,合约账户应该是可以叫内部账户对吧?内部账户合约账户它有的东西是。
04:09
首先也有一个对应的以太币余额,所以大家可以看到我们打开查看一个合约地址的时候,它也可以显示一个余额,它它也是跟普通账户一样,可以有一个钱钱的数量。另外,跟普通账户不一样的地方在于,它还有代码。另外,它还有自己的存储空间。所以在对于这个合约账户来讲,它关联的代码我们一般就是这是我们一般所认为的合约,我们认为的合约可能就是一个一段代码,一段程序。但事实上,在以太坊的概念里面,合约指的是一种特殊的账户类型。它包括里边的代码,包括一个以太币的余额,还包括它代码所控制的存储空间。
05:03
所以整个可以大家可以看到啊,这个外部账户它的核心的控制权其实是在代码手里边,所以它的代码里边就可以直接往出转币,大家可以看到对吧,我们的呃,水龙头账户那个合约账户,它是怎么往出转币的呢?我们在代码里面直接写了呃,Message send.transfer就转出来了,所以它是靠代码去控制的,他不用S钥去解锁,代码直接就能解锁。而且代码还可以控制它的存储空间,代码里面我们可以想要去存一个什么数的话也是可以的,它的核心控制权在代码手里。而且就是说执行代码的时候,还有一个还有一个功能,就是它还可以调别的合并。我自己是一个合约,我还可以在调代码里面去调用别的合约的方法,再去再去发起一个别的合约的应用。这是合约账户的一些特点。
06:01
给大家一张图吧,这张图当然也是我从网上扒的一张图啊,呃,这个这个图其实大概就把两种类型的账户。给大家已经列清楚了,左边这一类。叫普通账户,或者叫外部账户,右边或者或者说中间吧,这个蓝色框起来的这一类叫做合约账户或者是内部账户。他们之间的关系是什么呢?是普通账户可以发起一笔交易,发起交易之后就可以去调用合约,调用合约里面的代码,所以我们当时的水龙合合约就是由我们的普通账户,然后发起交易去调用他的方法去给我们自己转币,是这样。呃,那当然在别的方面跟人的交互怎么去交互呢?普通的账户,那肯定就是用钱包直接。把这个钱包就控制起来了,只要自己有私钥,就把这个账户控制起来了,大家可以用mama的账户,当然这里列出来就是中国人画的一张图啊,就是有IM token账户啊,有这个bit派账账户啊,呃,大大家可以用这些钱包管理自己的账户去交互。
07:16
那合约呢?合约的交互形式就没有钱包了,合约只能是由开发者去直接部署到区块链上去,那么这种方式跟人跟区块链。区块链上的账户做一个交互。大家可以这个这个图应该还是看的比较明确的啊,比较清晰的。刚才我们一直提到一个一个名词交易,我们平常都在说交易,而且我们说两个两类账户之间的,他们互相之间的交互就是由交易来出发的。我们的外部账户,呃,我们的那个普通账户,如果要去调用合约的时候,就是要发起一个交易,那交易到底是什么东西呢?这里先给一下大家这个定义啊,就是之后。
08:08
我们讲完这一部分,账户这一部分之后,再给大家详细讲交易这一部分,呃,Transaction它简单的定义就是它是一个签名的数据包。是由EOA就是普通账户发送到另一个账户的一个签名的数据包。大家注意看,所以所有的交易发起方都是EOA,都是普通账户,而发送到另一个账户,接收方有明确定义吗?没有定义,所以他发到谁都可以,我们可以发到另外一个普通账户,那就是给别人转币,也可以发到另外一个是合约账户,那就要调用合约,所以大家可以看到这两类不同的交易啊,交易里边,呃,到底有什么东西呢?主要就是这几样,其实前面我们在GA里面去查看这个交易信息的时候,已经有大概的这个了解了啊,主要就这几样,就是一个是接收方地址,呃,Receiver或者叫receive,还有一个叫发送方签名,我们前面看到那那那几项对吧,就是rsv那几项,还有一个是金额。
09:18
要发送的value,然后还有一个是数据data,这个是可选项。可以有,可以没有。之后我们讲到交易的时候,再给大家详细的就是介绍这一部分啊,分析这一部分啊,最后两个是一个叫做start gas,这个start gas呢是它就是呃,本身这个以太坊的定义里面,它的源码定义里边给的一个名字叫sta gas,我们平常在调用的时候,这个就是get limit。呃,就是它起始的时候给定一个上限,交易给定一个上限,另外还有一个叫GA price,这大家都很熟悉了,就是我们盖的单价,当然后面再讲到交易的时候,我们再跟大家好好说一说guess这到底是什么个东西,除了交易之外,另外还有一类叫做消息message。
10:11
这两类其实是容易搞混的,有些时候大家看文章或者说有一些,甚至有一些教材也会把这两样东西就是弄混,混在一起说,就是说呃,交易是什么呢?交易是一个消息,那那个消息是什么呢?消息也也是就是交易消息,有有些文章会这么说,但这这里我觉得还是我我这些。这部分内容是主要是从那个以太坊的官方文档,就是eerdox上面翻译出来的一些他的这些介绍的文档,大家如果要是感兴趣的话,可以到它那个1BOX上面去专门看看那个怎么介绍啊,这些东西都有来去找这些资料,我还是比较喜欢,就是它的这个定义的,就是把交易和消息分开。
11:01
就这两样,在以太坊里面其实是不同的东西,尽管很类似。消息是一个什么东西呢?它是合约和合约之间的通行方式,我们如果要在合约里面想要再去调另外一个合约的时候,我们给他发的那个东西不叫交易,因为它不涉及到像我们这样的直接转账。那个东西叫做消息。就是通过发送消息,让一个合约去调另外一个合约。消息呢,它不是会被序列化的虚拟对象,这也是跟我们的交易完全不同的一点,大家知道我们只要是发起的交易,但一定是会被矿工打包之后永久的存储在链上的,然后我们直接打开一一定是可以查得到,但是消息调用。是不一定能够查得到的,就假如说它涉及到了转账的话,就像我们那个水龙头一样,假如他说他是消息是转账的,涉及到转账的一笔交易,呃,那其实涉及到转账,就是其实是涉及到交易相关的东西了,那会记录在我们的就是所谓的internal传,就是内部交易里面。
12:12
但是如果说它不涉及到转账相关的话,那它是不会被序列化的,它是一个虚拟的对象,只存在于以太坊的执行环境中。以太坊的执行环境就是我们所说的以太坊虚拟机EVM。呃,这个可能也就是大家有这样一个概念就可以了啊,就是合约调合约的时候是发送消息,那消息调用可以就看成是函数调用,简单理解就是说我们这边写了一段代码,写了一个类,那边写了一个类,这个类去调用另外一个类的方法,调用一个另外一个类的函数,这就是消息调用。我们在写的时候也看到contract给一个名字,大括号,抛括号,这这种写法就跟类一样嘛,所以大家就把它当成类之间的方法,调用函数调用就可以。一个message里边包括哪些信息,跟交易其实很类似,它也包括接收方,当然这个就是消息的接收方,还有一个金额value,假如说他要去转币的话,还有就是数据data可选的一项,还有就是盖,就是给一个上限。
13:24
而这个GA price那是预先设计好的,这里是没有的,另外还有一个是他要把消息的发送方也要写在里边,就是也也要写在消息调用里面,这是为什么呢?我们的那个交易的信息里面其实是没有函数发,就是那个呃,交易的发送方这个信息的,对吧。因为我们知道所有的这个发送方本身,它的这个地址其实是可以在他的签名里边是可以解析出来的,所以说交易里面就没有。而消息里边他没有签名,所以说他要把这个发送到地址也得写在里面。
14:04
这是消息的一个数据结构。呃,那接下来我们就提到了,就是在发送这个交易的时候,我们可以由一个外部账户,普通账户发给另外一个账户,也可以发给合约账户。那我们所说的合约账户,它包含的内容是一个余额,然后还有它的代码和存储。而他所谓的这个代码,就是我们平常所理解的合约,也就是这里所说的contract这个概念。那concept到底是一个什么东西,那它是它它有这样的一些特性啊,首先我们已经明确了,它是一类特殊的账户,它包括一些东西,那里边很重要的一个,它的控制权在他的代码里面,全部靠他的代码来控制。它有什么特点呢?首先它可以读写自己的内部存储,它不是除了代码之外,还有一部分自己的内部存储吗?它是可以读写这部分内部存储的,归他的这一部分东西,他都可以随时读,随时写。
15:11
这个存储是什么东西?它就是一个KY键值数据库。它的K是32字节的value也是32个BY。所以就是这样的一个mapping关系的一个数据库,大家可以简单理解,它就像一个大的一个map一样。另外就是说合约是可以向其他合约发送消息的,前面我们已经说过了,他可以是依次出发执行,就是按照他自己定义的这个顺序,不是异步执行的啊,不像我们这个做GS,或者就是前端在调用的时候习惯异步的话,这里不是这里是依次出发的。但一旦合约运行结束的时候。并且他发送消息触发的所有子执行都结束的时候,也就是说这是一个嵌套的关系,对吧,就是前面一个合约调用了别的合约,合约又调用了合约,又调用了合约,那么如果等这一重一重全部都结束,退回来全部都结束的时候,那EVM就会终止。
16:16
那EE这个时候就进入到一个相当于是不工作的一个状态了,直到下一次有交易来的时候,E才会被唤醒。所以我们可以看到以太坊是一个状态机,它的状态改变就是靠交易来发起的,来改变它的状态。好,最后看时间是不是已经到了啊,好,我们把这段讲完吧,已经不多了啊呃,快速的把这个简单合约的应用给大家说一下,那合约这样一个东西,它有自己的代码,能操作自己的存储空间,主要它的应用的方式是哪几类呢?我们可以看到本身以太坊想要创建的是一个世界计算机,但如果是计算机的话,其实是什么应用都能做,对吧?我们想写什么应用都可以,但是以太坊毕竟还是有它的特殊性。
17:10
毕竟它是一个分布式的区块链系统,而且它是有一个内置加密货币的,是有以太币的,所以诸多的这些性质就就导致它的应用方向更多的还是跟分布式系统相关的东西,跟加密的数字货币相关的东西。所以呃,大家可以看到,首先它的一个应用在哪里呢?就是维护一个数据,数据存储,或者说就是账本。存放对其他合约或者外部世界有用的那种,简单说就是我们把它当成一个永远不能更改的存储空间,这完全可以对吧?这这个就把它当成一个数据库用吧,完全可以,这是,呃,这样的一个东西呢,就是相当于我们就是维护了一个账本而已,最典型的例子那就是我们可以去模拟一个货币了。
18:02
就相当于我们发一个代币,发一个货币,那用到的其实就是这样的一个应用方向,我们维护一个存储,那这个存储是什么呢?就是这个货币它发行多少个,然后这个货币里边一个账户就会对应一个余额,一个账户对应一个余额,这不就是一套货币吗?所以就是很简单就可以实现用这个以太坊的这个合约。所以大家会看到就是之前的ICO那么火,之前我们也说了啊,就是为什么ICO会火起来,然后那个以太坊毕价在那段时间会封着,就是因为以太坊这个平台它的最初的设计就是太适合干这件事情,它它最初的设计就是大家可以很容易的构建自己的数字资产,自己的数字货币,然后你如果这么简单的实现了一个货币值之后,那。如果就能融到钱的话,还还有人愿意买单的话,那可不是大家这个就会吵起来了啊,就会很多空气币也去各种发币嘛,呃,之前我们第一天就给大家看了一下那个BNB和和那个以胎包对吧,加密包的那个那个代码啊,BNB非常简单的就就没有多少行的代码就能达到那么高的市值,所以它就可以看到这个,呃,以太坊的这个能力啊,就它的它尽管是世界计算机,但是它的应用方向就是天生就适合在这个方向,这是第一个典型应用,第二个典型应用是通过合约。
19:35
还可以实现一个就是。别的类型的账户,可以说它是什么类型的,具有更复杂的访问策略的账户,这是什么意思?就相当于这是一个转发合同。就是说,呃,我们。我我们在什么时候触发一个一个转账呢?只有在满足某些条件的时候,我们触发一个转账,那这样的话就相当于我们对这个转账的条件有了一个限制。
20:08
如果我们把有这样限制的这个合约,然后这个合约还能自动转账,把它当成一个特殊的账户的话,那这个账户就相当于是我们的所谓的多重签名地址的账户,还在比特币里边,比特币是就是天生就支持多重签名的,对吧?呃,大家学过这个,在以太坊里边,它没有天然的支持多重签名,但是我们可以用合约来实现这个。这样的一套机制,就是说我们要求比方说啊,这里已经把这个例子写出来了,我们可以有这样的一份转发合约。我要求给定的三个私钥,也就是说三个账户,普通账户给两个,给了确认之后才能够发币,那这就相当于是就是我们所说的那个多重签名地址里边2/3的那种那种情况,对吧,三个里面有两个呃,签名它就可以生效,这就是用合约可以实现这样的功能。
21:14
呃。然后下面就是钱包合约,其实就是这类应用里面很好的例子,大家就是可以看到有一些钱包,它其实就是分层确定性钱包,他在发送交易的时候,其实就是用到了一些转发合同的,所以它的具体实现逻辑我们现在可能接触不到,看不到,大家如果感兴趣的话,可以找一些开源的代码ma ma,咱们找他的开源代码去看都是可以的。最后一个应用的领域,那就是管理多个用户之间的持续的合同,就是真正的所谓的合同contract不是本意应该是合同嘛,呃,或者是就是他们之间的某种关系,这些例子,那就是金融了,这这这些天然的就就适合干这种事情啊,就是大家之间有这种财产的协议啊,互相之间呃,转让,这些所有权的转让啊,这些大家定义好一个合同,那我们就按这个来做,所以这就是最初为什么要把它叫成所谓智能合约的一个原因,他确实天生就跟合同金融方面的应用有关系。
我来说两句