zoukankan      html  css  js  c++  java
  • 孤荷凌寒自学python第105天认识区块链019

    【主要内容】

    今天继续分析从github上获取的开源代码怎么实现简单区块链的入门知识,共用时间34分钟。

    (此外整理作笔记花费了约72分钟)

    详细学习过程见文末学习过程屏幕录像。

    今天主要开始分析昨天断点调试后得到的变量中间值,进而反推执行过程,以注释之前还不理解 的代码部分,发现我学习的难点还在于 密码学部分,及基础的python编码部分。

     

     

    【学习笔记】

    一、Python的字符串编码处理:

    参考博文: https://blog.csdn.net/qq_40134903/article/details/80710882感谢博主的分享

    今天才算是补学到了基础知识部分的两个方法:

    字符串对象有两个方法:

    1.

    字符串对象.encode(要转换成为的字符串编码类型描述字符串)

    encode()方法是指将【字符串对象】的编码(由unicode编码)转换为【要转换成为的字符串编码】

    如:

    str1.encode(‘utf-8’)

    就表示要将str1(str1的原本编码格式应当是:unicode编码)的编码格式转换为【utf-8】编码格式。

     

    2.

    字符串对象. decode(字符串对象目前的编码类型描述字符串)

    decode()方法是将【字符串对象】由【字符串对象目前的编码】格式转换回【unicode】编码格式。

     

    这就是说,在Python的字符串处理编码中,

    【unicode】编码作为中间交换件存在。是python3默认存在的编码格式。

     

    二、byte字符串编码处理:

    (一)python的字符串类别只有两种

    1.非byte(字节)模式的字符串:

    就是说字符串之前没有使用前缀b

    如:

    ‘我是孤荷凌寒’

    也可能是:

    u’我的qq号是:578652607’

     

    2.byte(字节)模式的字符串

    就是说字符串之前使用了前缀:b

    如:

    b’ass8932436236’

    此时分两种情况:

    第一种情况:

    前缀b后面的字符串中使用的是用转义符:

    x

    来转义表示的

    十六进制的字符编码

    如:

    x38

    这表示一个字符的编码。

    如:

        b'0x82x02]x02x01x00x02x81x81x00xbacxd7x02xfc~x02xc3x85sLxb3x84n]x8dsx19xab97xe3xb5a $xd0x93xb0xd1txe4xe5xde!xfex9ax15xfbagw x04ux1bx13u^xc6lxf4x84xadx07xcbx12xf9ox0cxeaxa7bxbaCxfbx05Hx86xadxd8~x8axc6xe6x11x173xb3xa1xaeYx91CWxaeKxf0xefx81x9d0x92Ox01xd5Txc1px0fe>xa9Qx12x07xb00xe4OMhKYxfe\xe4Dxx84QxacKHxd4x1dxddxf3x02x03x01x00x01x02x81x80x18~xe8x92x0exe6xecxacx0fx8cxd0xa6xc3x1fxd2x11xb5xefxc8xadxf3glxbdxfdx81:x1c>xdfxb82 xf7xa9x96x11`x142x7fxebx8axfcxaaxfbLxfa^xe3Kx0csxa7]xdfxd5ux8cx9fxb0xf3 xa9Jxbc~xcbA{xd0x11+8?xb1x96I*5xc9x11@x86$x90xcexafxfaxbfxc4`xfc6xb4r*xf3Px857xd2xdcl\x84xe1xb14xeax88x8exb8x04xa4d?3Bxa6xafxa2Y^xe0xce@x89x02Ax00xd8.xxbbExd4x97x9cxc8zxcdxf3xaax18*xf1k x80x18xffxfbxcaxdf$6^xe4xffx84wx93xb9W<x13etxeexbaxeeM{xc6xfc^x97 xbf~xe6C;x05xa3x9bOx05_;F]xa0 x02Ax00xdcxb8x9ex82xf6x08xf8xafxba:xe3/x1cx98xbdz(xdfixe7xb3xb8;xac|xa0>xf4xdaxefxdax18@Txabx832Wxf94x88Txb22]xc4x9exabHx86x0bxbd-Axfcx97bDxb0dxa2xabxf5xffx02Ax00xd4x0exe9xf1R3x931x81[-qxaaxd5xa02Fxffxec;x19xc7xc5x9ex93xe8x1dxb7xe6x89xebxbeexddx93x99xb798x00xf8Gxdbv;x13x12xxc1x95xdax8bxf2vxbaxa1[xa7z^+xcd%ux02Ax00x8dvx19xc9x8fx8crnx95xe9xf5xffx14xd1xe3xe6nYxbax13x91@xcbxa6!xfdxc6;xc22%Rx93xb0pxVx84xc1xa8dx93xfbxddx81xf1iLx17xe0)x97xe6pxbbExfexeaM/B~xf9xdbx02@4.o4xd4(xb7Cx8dxa3x0fxe0x80xccxd8x14x03xc2xf9xa8A1Bxcbxe1px8bk:xfex0fExe6@x19/x0fxbcx86xd1xda-xc4x04xcaxafx7fx923x1fJzx02kDx02*xf7&xbe9!xa5xf9'

     

    第二种情况:

    前缀b后面的字符串中使用的是用ascii字符编码来表示的字符

    即字符串中只有ascii字符。

    如:

        b'3082025d02010002818100ba63d702fc7e02c385734cb3846e5d8d7319ab3937e3b5610d24d093b0d174e4e5de21fe9a15fb6167772004751b13755ec66cf484ad07cb12f96f0ceaa762ba43fb054886add87e8ac6e6111733b3a1ae59914357ae4bf0ef819d30924f01d554c1700f653ea9511207b030e44f4d684b59fe5ce444788451ac4b48d41dddf30203010001028180187ee8920ee6ecac0f8cd0a6c31fd211b5efc8adf3676cbdfd813a1c3edfb83220f7a996116014327feb8afcaafb4cfa5ee34b0c73a75ddfd5758c9fb0f320a94abc7ecb417bd0112b383fb196492a35c91140862490ceaffabfc460fc36b4722af3508537d2dc6c5c84e1b134ea888eb804a4643f3342a6afa2595ee0ce4089024100d82e78bb45d4979cc87acdf3aa182af16b0d8018fffbcadf24365ee4ff847793b9573c136574eebaee4d7bc6fc5e970abf7ee6433b05a39b4f055f3b465da00d024100dcb89e82f608f8afba3ae32f1c98bd7a28df69e7b3b83bac7ca03ef4daefda184054ab833257f9348854b2325dc49eab48860bbd2d41fc976244b064a2abf5ff024100d40ee9f152339331815b2d71aad5a03246ffec3b19c7c59e93e81db7e689ebbe65dd9399b7393800f847db763b131278c195da8bf276baa15ba77a5e2bcd25750241008d7619c98f8c726e95e9f5ff14d1e3e66e59ba139140cba621fdc63bc232255293b070785684c1a86493fbdd81f1694c17e02997e670bb45feea4d2f427ef9db0240342e6f34d428b7438da30fe080ccd81403c2f9a8413142cbe1708b6b3afe0f45e640192f0fbc86d1da2dc404caaf7f92331f4a7a026b44022af726be3921a5f9'

     

    (二)不同byte字符串表示方法的互相转换

    首先要引用模块:

    import binascii

    此模块中有两个相对的方法可以实现互换;

    1.

    hexlify(十六进制编码表示的byte字符串)

    方法

    hexlify()方法将上面用【十六进制编码表示的byte字符串】,转换成用ASCII字符编码表示的字符编码,仍然是byte字符串

     

    2.

    unhexlify(其它编码格式表示的byte字符串)

    方法:

    注意这儿我并不确定此方法能转换的必须是【其它编码格式表示的byte字符串】,也许任何字符串都行,还没有作具体研究。

    unhexlify()方法将一个用ascii(其实这里也可能原本是Unicode编码)编码表示 的字符串(我估计此处不一定是byte字符串)

    转换为,用十六进制(即字符串本身内容用x转义表示编码)编码的byte字符串。

     

     

    三、对【blockchain_client.py】页面的补充注释:

    【blockchain_client.py】客户端页面

    ```

        def sign_transaction(self):

            """

            Sign transaction with private key

            """

            ls=binascii.unhexlify(self.sender_private_key)

            '''

            与hexlify()方法相反,

            unhdexlify()方法,

            将一个用ascii(其实这里也可能原本是Unicode编码)编码表示 的字符串(我估计此处不一定是byte字符串)

            表示为,用十六进制(即字符串本身内容用x转义表示编码)编码的byte字符串。

            此时ls的值是:

            b'0x82x02]x02x01x00x02x81x81x00xbacxd7x02xfc~x02xc3x85sLxb3x84n]x8dsx19xab97xe3xb5a $xd0x93xb0xd1txe4xe5xde!xfex9ax15xfbagw x04ux1bx13u^xc6lxf4x84xadx07xcbx12xf9ox0cxeaxa7bxbaCxfbx05Hx86xadxd8~x8axc6xe6x11x173xb3xa1xaeYx91CWxaeKxf0xefx81x9d0x92Ox01xd5Txc1px0fe>xa9Qx12x07xb00xe4OMhKYxfe\xe4Dxx84QxacKHxd4x1dxddxf3x02x03x01x00x01x02x81x80x18~xe8x92x0exe6xecxacx0fx8cxd0xa6xc3x1fxd2x11xb5xefxc8xadxf3glxbdxfdx81:x1c>xdfxb82 xf7xa9x96x11`x142x7fxebx8axfcxaaxfbLxfa^xe3Kx0csxa7]xdfxd5ux8cx9fxb0xf3 xa9Jxbc~xcbA{xd0x11+8?xb1x96I*5xc9x11@x86$x90xcexafxfaxbfxc4`xfc6xb4r*xf3Px857xd2xdcl\x84xe1xb14xeax88x8exb8x04xa4d?3Bxa6xafxa2Y^xe0xce@x89x02Ax00xd8.xxbbExd4x97x9cxc8zxcdxf3xaax18*xf1k x80x18xffxfbxcaxdf$6^xe4xffx84wx93xb9W<x13etxeexbaxeeM{xc6xfc^x97 xbf~xe6C;x05xa3x9bOx05_;F]xa0 x02Ax00xdcxb8x9ex82xf6x08xf8xafxba:xe3/x1cx98xbdz(xdfixe7xb3xb8;xac|xa0>xf4xdaxefxdax18@Txabx832Wxf94x88Txb22]xc4x9exabHx86x0bxbd-Axfcx97bDxb0dxa2xabxf5xffx02Ax00xd4x0exe9xf1R3x931x81[-qxaaxd5xa02Fxffxec;x19xc7xc5x9ex93xe8x1dxb7xe6x89xebxbeexddx93x99xb798x00xf8Gxdbv;x13x12xxc1x95xdax8bxf2vxbaxa1[xa7z^+xcd%ux02Ax00x8dvx19xc9x8fx8crnx95xe9xf5xffx14xd1xe3xe6nYxbax13x91@xcbxa6!xfdxc6;xc22%Rx93xb0pxVx84xc1xa8dx93xfbxddx81xf1iLx17xe0)x97xe6pxbbExfexeaM/B~xf9xdbx02@4.o4xd4(xb7Cx8dxa3x0fxe0x80xccxd8x14x03xc2xf9xa8A1Bxcbxe1px8bk:xfex0fExe6@x19/x0fxbcx86xd1xda-xc4x04xcaxafx7fx923x1fJzx02kDx02*xf7&xbe9!xa5xf9'

            '''

            private_key = RSA.importKey(ls) #对发送者的私钥进行处理

            signer = PKCS1_v1_5.new(private_key) #通过发送者的私钥来计算出发送者要添加到改善信息中的私钥的数字签名信息

            ls2=str(self.to_dict()).encode('utf8')

            h = SHA.new(ls2)

            ls3=binascii.hexlify(signer.sign(h))

            ls4=ls3.decode('ascii')

            return ls4 #这是添加有签名信息的要广播给区块链网络的信息



    #…… …… ……

     

    @app.route('/wallet/new', methods=['GET'])

    def new_wallet():

        random_gen = Crypto.Random.new().read #得到随机字符串

        '''

        Crypto.Random.new().read调用了系统 os.urandom()函数,其解释如下:

        来自博文:https://blog.csdn.net/a19990412/article/details/80934268

        os.urandom(n)函数在python官方文档中做出了这样的解释

        函数定位: Return a string of n random bytes suitable for cryptographic use.

        意思就是,返回一个有n个byte那么长的一个string,然后很适合用于加密。

        然后这个函数,在文档中,被归结于os这个库的Miscellaneous Functions,意思是不同种类的函数(也可以说是混种函数)

        原因是: This function returns random bytes from an OS-specific randomness source. (函数返回的随机字节是根据不同的操作系统特定的随机函数资源。即,这个函数是调用OS内部自带的随机函数的。有特异性)

        然后一开始的那个 u 其实我是以为是uniform(表示正态分布的),后来我发现文档中有这样的一句:The returned data should be unpredictable enough for cryptographic applications。

        注意到这个 unpredictable, 再结合之前所说的根据os底层来实现的,所以,u 应该是表示难以预料的意思。

        '''

        private_key = RSA.generate(1024, random_gen) #从随机字符串生成私钥

        public_key = private_key.publickey() #从私钥生成对应成对的公钥(即公钥和私钥之间是有对应关系的)

        ls=private_key.exportKey(format='DER')

        '''

        执行exportkey算法后,编码变成了byte字符串,

        bytes字符串的组成形式,必须是十六进制数,或者ASCII字符:

        此时是用 十六进 制来表示字符串的,因为x这个转义字符转义的就是十六进制编码

        b'0x82x02]x02x01x00x02x81x81x00xbacxd7x02xfc~x02xc3x85sLxb3x84n]x8dsx19xab97xe3xb5a $xd0x93xb0xd1txe4xe5xde!xfex9ax15xfbagw x04ux1bx13u^xc6lxf4x84xadx07xcbx12xf9ox0cxeaxa7bxbaCxfbx05Hx86xadxd8~x8axc6xe6x11x173xb3xa1xaeYx91CWxaeKxf0xefx81x9d0x92Ox01xd5Txc1px0fe>xa9Qx12x07xb00xe4OMhKYxfe\xe4Dxx84QxacKHxd4x1dxddxf3x02x03x01x00x01x02x81x80x18~xe8x92x0exe6xecxacx0fx8cxd0xa6xc3x1fxd2x11xb5xefxc8xadxf3glxbdxfdx81:x1c>xdfxb82 xf7xa9x96x11`x142x7fxebx8axfcxaaxfbLxfa^xe3Kx0csxa7]xdfxd5ux8cx9fxb0xf3 xa9Jxbc~xcbA{xd0x11+8?xb1x96I*5xc9x11@x86$x90xcexafxfaxbfxc4`xfc6xb4r*xf3Px857xd2xdcl\x84xe1xb14xeax88x8exb8x04xa4d?3Bxa6xafxa2Y^xe0xce@x89x02Ax00xd8.xxbbExd4x97x9cxc8zxcdxf3xaax18*xf1k x80x18xffxfbxcaxdf$6^xe4xffx84wx93xb9W<x13etxeexbaxeeM{xc6xfc^x97 xbf~xe6C;x05xa3x9bOx05_;F]xa0 x02Ax00xdcxb8x9ex82xf6x08xf8xafxba:xe3/x1cx98xbdz(xdfixe7xb3xb8;xac|xa0>xf4xdaxefxdax18@Txabx832Wxf94x88Txb22]xc4x9exabHx86x0bxbd-Axfcx97bDxb0dxa2xabxf5xffx02Ax00xd4x0exe9xf1R3x931x81[-qxaaxd5xa02Fxffxec;x19xc7xc5x9ex93xe8x1dxb7xe6x89xebxbeexddx93x99xb798x00xf8Gxdbv;x13x12xxc1x95xdax8bxf2vxbaxa1[xa7z^+xcd%ux02Ax00x8dvx19xc9x8fx8crnx95xe9xf5xffx14xd1xe3xe6nYxbax13x91@xcbxa6!xfdxc6;xc22%Rx93xb0pxVx84xc1xa8dx93xfbxddx81xf1iLx17xe0)x97xe6pxbbExfexeaM/B~xf9xdbx02@4.o4xd4(xb7Cx8dxa3x0fxe0x80xccxd8x14x03xc2xf9xa8A1Bxcbxe1px8bk:xfex0fExe6@x19/x0fxbcx86xd1xda-xc4x04xcaxafx7fx923x1fJzx02kDx02*xf7&xbe9!xa5xf9'

        '''

        ls2=binascii.hexlify(ls)

        '''

        hexlify()方法将上面用十六进制表示的字符编码,又换成了用ASCII字符表示的字符编码,仍然是byte字符串

        结果如下:

        b'3082025d02010002818100ba63d702fc7e02c385734cb3846e5d8d7319ab3937e3b5610d24d093b0d174e4e5de21fe9a15fb6167772004751b13755ec66cf484ad07cb12f96f0ceaa762ba43fb054886add87e8ac6e6111733b3a1ae59914357ae4bf0ef819d30924f01d554c1700f653ea9511207b030e44f4d684b59fe5ce444788451ac4b48d41dddf30203010001028180187ee8920ee6ecac0f8cd0a6c31fd211b5efc8adf3676cbdfd813a1c3edfb83220f7a996116014327feb8afcaafb4cfa5ee34b0c73a75ddfd5758c9fb0f320a94abc7ecb417bd0112b383fb196492a35c91140862490ceaffabfc460fc36b4722af3508537d2dc6c5c84e1b134ea888eb804a4643f3342a6afa2595ee0ce4089024100d82e78bb45d4979cc87acdf3aa182af16b0d8018fffbcadf24365ee4ff847793b9573c136574eebaee4d7bc6fc5e970abf7ee6433b05a39b4f055f3b465da00d024100dcb89e82f608f8afba3ae32f1c98bd7a28df69e7b3b83bac7ca03ef4daefda184054ab833257f9348854b2325dc49eab48860bbd2d41fc976244b064a2abf5ff024100d40ee9f152339331815b2d71aad5a03246ffec3b19c7c59e93e81db7e689ebbe65dd9399b7393800f847db763b131278c195da8bf276baa15ba77a5e2bcd25750241008d7619c98f8c726e95e9f5ff14d1e3e66e59ba139140cba621fdc63bc232255293b070785684c1a86493fbdd81f1694c17e02997e670bb45feea4d2f427ef9db0240342e6f34d428b7438da30fe080ccd81403c2f9a8413142cbe1708b6b3afe0f45e640192f0fbc86d1da2dc404caaf7f92331f4a7a026b44022af726be3921a5f9'

        '''

        ls3=ls2.decode('ascii')

        '''

        参见博文:https://blog.csdn.net/qq_40134903/article/details/80710882

        decode(原字符串编码格式描述)

        是将字符串从字符串的原编码格式转换成 unicode 编码。

        在ls2.decode('ascii')这一句中,是将字符串ls2从ascii编码格式转换为:unicode编码。

        现在ls3的值如下:(不再是byte字符串)

        '3082025d02010002818100ba63d702fc7e02c385734cb3846e5d8d7319ab3937e3b5610d24d093b0d174e4e5de21fe9a15fb6167772004751b13755ec66cf484ad07cb12f96f0ceaa762ba43fb054886add87e8ac6e6111733b3a1ae59914357ae4bf0ef819d30924f01d554c1700f653ea9511207b030e44f4d684b59fe5ce444788451ac4b48d41dddf30203010001028180187ee8920ee6ecac0f8cd0a6c31fd211b5efc8adf3676cbdfd813a1c3edfb83220f7a996116014327feb8afcaafb4cfa5ee34b0c73a75ddfd5758c9fb0f320a94abc7ecb417bd0112b383fb196492a35c91140862490ceaffabfc460fc36b4722af3508537d2dc6c5c84e1b134ea888eb804a4643f3342a6afa2595ee0ce4089024100d82e78bb45d4979cc87acdf3aa182af16b0d8018fffbcadf24365ee4ff847793b9573c136574eebaee4d7bc6fc5e970abf7ee6433b05a39b4f055f3b465da00d024100dcb89e82f608f8afba3ae32f1c98bd7a28df69e7b3b83bac7ca03ef4daefda184054ab833257f9348854b2325dc49eab48860bbd2d41fc976244b064a2abf5ff024100d40ee9f152339331815b2d71aad5a03246ffec3b19c7c59e93e81db7e689ebbe65dd9399b7393800f847db763b131278c195da8bf276baa15ba77a5e2bcd25750241008d7619c98f8c726e95e9f5ff14d1e3e66e59ba139140cba621fdc63bc232255293b070785684c1a86493fbdd81f1694c17e02997e670bb45feea4d2f427ef9db0240342e6f34d428b7438da30fe080ccd81403c2f9a8413142cbe1708b6b3afe0f45e640192f0fbc86d1da2dc404caaf7f92331f4a7a026b44022af726be3921a5f9'

        这时目测与byte字符串的内容本身没有区别。

        '''

        

        #----------------------

        

        ls4=public_key.exportKey(format='DER')

        ls5=binascii.hexlify(ls4)

        ls6=ls5.decode('ascii')

     

        response = {

            'private_key': ls3,

            'public_key': ls6

        }

     

        return jsonify(response), 200

     

     

    ```

     

    【学习后记】

    都说人类对宇宙了解得越多,却发现新的问题也更多。这也许就是处在文明婴儿期的人类学习之路上必经的一个阶段吧。

    而我在我的学习之路上也遇到了这样的问题,今天的学习暴露出之前在第一阶段学习过程中,被忽略掉的很多基础知识,比如编码问题,当时完整的忽略了。

    于是得出一个想法:对于学习来说,没有知识是无用的。

    为了追赶未来,终身学习,终身进步,我创建了【就是要学 终身成长】社群,欢迎立志于终身学习,终身成长的朋友们加入,共同交流学习。Qq群号码:646854445

    或访问:www.941xue.com

     

    【关于坚持自学的例行说明】

    最后例行说明下,我为什么要坚持自学。

    一、为什么一把年纪还在学习

    放弃很多去聚餐,去HI歌,去游玩,去看电影,去追剧……的时间,然后进行着这个年纪似乎已不应当再进行的学习,引来身边人们无尽的不解与鄙夷甚至可怜……

    但我不想放弃终身学习的誓言。

    因为——

    我对我今天的生活现状并不认同!

    罗伯特清崎告诉过我们,反省自己当下的生活是不是自己想要的,这难道不是最好的动力与答案?

    走过了大半生,然后才发现曾经、当下所正在进行的人生并不是自己想要的,那是一种怎样的体验?

    只有心中真切的感受才能回答这个问题,而任凭再丰富的语言也是无法描绘出来的。

    经历半生的跋涉,却发现走得并不正确,有多少人有勇气承认自己过去的一切都是错误的呢?

    而我愿意告诉过去的我:“你错了!”

    那么已经历半生错误,年岁之大又压于头顶,还有希望从这架的梯子的半端重新爬下,再蹒跚着爬上另一架梯子吗?

    我宁愿相信还有希望!

    这便是我为什么要继续坚持终身学习下去的全部理由。

    二、这个年纪还在学这些技术有意义吗

    纯的技术对这把年纪其实已没有意义。

    但兴趣可以超越意义。

    但技术可以引来思想的变革,这才是意义。

    投资自己的头脑 ,改革自己的思想,这是最保值,更长远的投资,过去我从来没有投资过,错过太多,那就从投资自己头脑开始吧。

    罗伯特清崎告诉我们,真正的富有是时间的富有;真正的自由是可以决定自己愿意做什么的自由。

    因为我愿意做我兴趣所在的事,所以我希望我有自由选择的那一天,虽然今天离那一天可能还是那么遥远,但我愿意相信,每天多赶几步,离希望就更近一步。

    再者,虽然我可能再已无法完全完整的掌握这些技术了,但技术本身却可以启迪心的觉醒,激发灵感,那么只要多了解一点,我相信我将离那个正离我而去跑得越来越快的未来更近一点,不至于被未知的那个未来抛弃得太远。

    于是我怎能放弃追逐求索的步伐?

    我要坚信:感觉太迟的时候,也许还不算太迟。

     

    感谢一直以来关注我,鼓励我的你!

    若不嫌弃这一个到了高龄才长大的可笑可叹的我,请不吝赐教。

    我的q号是:578652607,敬候你的指点。

    为了追赶未来,终身学习,终身进步,我创建了【就是要学 终身成长】社群,欢迎立志于终身学习,终身成长的朋友们加入,共同交流学习。Qq群号码:646854445

    或访问:www.941xue.com

     

    【同步语音笔记】

    https://www.ximalaya.com/keji/19103006/261066516

     

    【学习过程屏幕录屏】

    链接:https://pan.baidu.com/s/10c3ErEFxKnCN9-Bz56Mwpg

    提取码:js8y

     

    欢迎大家添加我为好友: QQ: 578652607
  • 相关阅读:
    加密算法
    git 误操作
    element项目发布
    node命令
    计划
    第一次碰见类似留几手的段子手
    【vue】---猫眼项目中使用js组件的时候-------loading 加载 无法移除的原因---------
    【异步】---异步解决方案---
    【问题-方法】---buffer---解决方法,butter 文件转字符串
    【大脑】--如何让大脑快速记忆
  • 原文地址:https://www.cnblogs.com/lhghroom/p/12384693.html
Copyright © 2011-2022 走看看