00:00
呃,我们这里因为已经提到了,就是关于账户相关的东西,那我们还是先在这个。我们在源码里面来找一找吧,看一看这个源码里边,它对应的这个数据结构的定义应该是什么?呃,这里边啊,这个这个目录结构之前跟大家简单的说过一遍,对吧,我们我们现在就直接去大家先瞄一眼这个目录结构,大家觉得这个有可能它的这个类型会定义在哪里,账户accounts里面,大家觉得在这里面对吧?啊,但是我告诉大家,其实不在这个accounts里边呢,它其实定义的主要是关于这个账户的一些操作。和其他的一些东西,那基本的数据类型的定义呢,大家可以看到里边有一个HD对吧,就是分层确定性钱包,它在里面去去做这些实现,我这边网好像有点慢啊,大家可以看到就是它这里边有caseor这些实现啊,就是相当于是整个accounts是要管理账户,相当于是就我们的GA里边要管理账户的时候,你有钱包,你有key store是这样一套系统,但是关于我们这个以太坊基础的账户的定义,它并不在这个里面,那么它在哪里边呢?这个好好看,嗯,大大家觉得有可能在哪里?呃,我还是先退回到这个get up源码的这个首页来,可以告诉大家账户本身这个数据结构定义,呃,它不在accounts里边。
01:45
它是在Co里面,那Co这个里面大家能够想到肯定就是一些核心嘛,对吧,以太坊的一些核心数据结构都在里面,这里面有一个types。
02:00
刚刚还可以啊好,现在我们又点进来了,诶这点进来怎么感觉有点不对呢,感觉好像他有些文件没有刷新出来。嗯,在这里边它有一个types,然后这个里边大家就会看到有这个block啊,有这个receipt呀,有transaction呀,大家可以看到这里就是一些基本的,应该大家能够想到是一些基本的数据结构的定义,对吧?啊,那大家就会想到,诶这里边也没有count呀。那应该在哪呢?它是在这个叫做state的一个文件夹里面,这个account确实也不好找啊,这个我也是这个查了好多资料,然后找了半天才找到他在叫做state object里边,在这个里边就是所谓的状态对象。
03:13
里边包含了我们账户数据结构的定义,好,我们点开来看一下state object,好那么大家就想到它这里面肯定就定义的状态里面的一些对象了,对吧?呃,它这是一个,大家看一开始这定义了什么叫code对吧?什么叫storage,大家看这个是不是就跟我们想要的东西很接近了。接下来它定义了一个叫做state object的东西啊,这是它主要的整个这个这个这个类这个文件,它就是要定义这个事情对吧,State状态对象,那大家看他下边还定义了一个直接搜这个看。
04:13
嗯,大家大家看到是在哪一行吗?98行是吧?诶我这里怎么没有搜到呢,我这里的版本好像有点问题啊哦,我这边这个为什么到了0.0.9版本了。呃,不,刚才大家看到这个release,这里可以切换这个分支,对吧,我这个莫名其妙的跳到0.9的版本啊,可能我之前切换版本去看过它的那个代码的历史结构,结果就默认就跳到了那里,大家看一下在这一个state object下边,它就定义了一个叫做account的结构体,对吧?结构类型它里面包含什么样的东西呢?一个叫做non,那这个是一个U64对吧。
05:06
然后还有一个balance,这个balance是一个big in啊,当然这是专门定义的这个大整形对吧?呃,在这个以太坊里面专门定义了大整型,大家我们在学这个万三的时候,大家也会发现经常就会拿到的数是一个big的类型,对吧?当然那个里面我们叫big number,大家可以认为是一回事,就是为了跟底层的这个数据类型对接嘛。另外还有一个它这里直接叫root,那么它是一个common里边的哈希类型,所以当然这个common就是定义了一些公共的组件对吧?就相当于一些公共类,那这个我们就不用去专门看了,那么root它的解释是什么呢?专门后面有一个注释叫做梅克尔跟of the storage tree,就是存储数,对吧?就是我们所说的storage root。
06:01
所以这就是storage的维克数根,另外还有一个Co塔,那它是一个字节数组啊,这里面定义的,呃,这这个我不太确定啊,就是大家学了购知之后,就是这种定义,数据类型是变成的,变成呃字符数组是吧?啊,所以它相当于是一个就相当于是一个字符型的指针,对吧,指到了一个字符数组对象里面,所以大家可以看到这就是我们真正的账户这个account的定义,它里边的东西就这么四部分内容。这就是我们上节课跟大家在黄皮书里面看到的代码里面写出来就这几个,呃,当然了,就是关于账户的那些操作的话,那肯定就会有一些别的东西了,比如说大家看到上面这个安是不是很眼熟?这个是不是很眼熟啊,我们前面提到它定义了什么叫做一个empty的账户对吧?那大家看一下代码里面怎么实现的啊,它定义了一个方式,然后呃,这个前面这相当于是这个类型调用对吧?呃,大家结构应该知道,它是就是这个state object下面的一种一种类型方法,那么它的empty这样一个方法会返回一个布尔型变量,然后呢,Return return什么东西呢?大家看就是一串判断了。
07:30
假如说这个state of draft,它的data,诶大家看一下这个state of draft是个什么东西吧,这是上面定义的这个大的这个东西对吧?它定义的里边它包含address,包含address address哈希,然后包含一个data data的类型是account,所以大家看这里边所谓的state object是不是就有点像我们说的整个存储的那个大对象,对吧?然后它真正要存储的那个data,就是其实是我们的那个。
08:05
Value对吧,真正数据库里面存在那个value,但是它这里这个对象还不仅仅是只有KV,那它这里的K是这个address的哈希,V是data,它这里还指定了啊,你用什么来存储DB,它这里还可以指定对吧?它还可以指定DB error是什么类型,还可以用这个tree是什么样的tree,所以它这是一个很宽泛的一个,就是很很抽象,层级很高的一个数据类型,这样的一个state ofra,所以我们就知道了,那这里取的state ofra,它的这个S是state of嘛,它的data那其实就是账户了,账户里边的nonun要等于零,账户里边的balance.sign等于零。诶,这是什么呢。而这其实它就是说整个的这个balance这个对象,它里边它不是这个一个begin类型的这个,呃,这个这个应该叫什么?呃,对大大整形的一个数据类型,它是一个指针指向过去的吗。
09:14
那么它里边的sign这个,呃,我没有详细的看这个类型里面的东西啊,但是大家应该能够想到返回的东西里面不是有一个有一个SE,还有一个R是吧?对大家记得,所以这个sign其实不是签名,它其实应该是我们那个S对吧?对S,所以大家记得S的话,正常情况你要不是一要不负一嘛,正数一,负数负一对吧,所以它是要求它等于零,它等于零,那其实这个balance就是零了,对吧。啊,因为它直接判断它等于零可能还比较麻烦,所以它直接它的那个S等于零,然后后面要求它的by equal equal口一个什么呢?E口一个,呃,就是后面这两项,大家一看这个E口就知道,这肯定是个方法,让后面这两项要要相等对吧,字符串比较要相等,哪两个要相等呢?一个是S点贝塔,这是我们的账负count count的Co。
10:20
它和什么相等emptysh,那当然这个就是定义的一个常量了,对吧?我们在这里可以去查一下,看看它定义的是什么。好,大家可以看到它是什么呢?是cryfle这个工具类里边的,可CATCH2呃256,然后把这个控指针传进去,所以就是空对象的哈希,开256的哈希,得到的就是叫empty塔空哈希。啊,所以这里边是不是跟我们在黄皮树里边说的那个一模一样,所以黄皮书尽管那个大家可能看那个看的确实是一头雾水,但是如果结合着这个代码找到来看的话,就会觉得一目了然,对吧?啊,他就是这么实现的,黄皮书里边写的,写出来的那个数学表达是直接就能转换成代码,所以这也就是这个黄皮书牛的地方,大家如果要是能把黄皮书彻彻底底的全看一遍的话,那其实应该把源码全部看懂就问题不大了。
11:26
呃,应该是差不多是这样一个状态啊,当然源码就是大家熟悉这个源码结构,还得去熟悉一段时间才能知道哪哪在哪对吧?啊就像我可能一开始找就怎么都找不到这个。com到底在哪里定义的,呃,各种全局搜,然后呃,最后也是看了一些资料,就别人分析出来的这个源码才知道,哦,原来他是在这里放着,一看到这里你结合着黄皮书就发现,哦,原来他就是把黄皮书实现了一下。所以大家这个就是结合着我们的黄皮书和原码来看一些这些定义。
我来说两句