美文网首页
「币圈小白进阶计划」“区块链的骨骼”之编码算法

「币圈小白进阶计划」“区块链的骨骼”之编码算法

作者: 韩大楠楠啊 | 来源:发表于2019-05-19 10:10 被阅读0次

    文/韩大楠

    原文首发币乎

    「币圈小白进阶计划」“区块链的骨骼”之编码算法

    大家好,我是大楠呀!

    这是「币圈小白进阶计划」的第十六篇,希望大家多多给出建议。

    谢谢大家!

    写在前面

    最近大楠再看各种算法,共识写完了,也写完了加密算法,但是还有编码/解码算法......

    你可知道密码学么?在此之前,我只知道栅栏加密法和凯撒密码这两种。密码学它是一种隐藏信息的科学和艺术,它们是保密的,也可以说是一种秘密消息传递的科学。

    在计算机语言中,要对信息进行加密。而区块链的世界中也是样的,要对信息进行加密,保证数据安全,使之不被篡改。

    而这篇文章写的只是区块链骨骼中的一部分——编码/解码算法。编码算法包括Base64、Base6458、Base58Check。

    文章会写的比较硬,你可能真心看不懂,但大楠也是在探索中,有些的东西也搞得不是很明白,所以,这可以作为小白进阶资料。

    编码/解码算法

    计算机使用二进制进行编码,而不是我们熟悉的十进制,最重要的原因是二进制物理上更容易实现。二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。

    比如说,数字2323,转化为二进制就是100100010011。但是,二进制考验人的记忆力,人们很难记住16进制的信息,如果是16进制编码的文本字符串就相对好记好读一些了。

    那这里就有一张ASCII码表(其中的一部分)。

    (图片来自网络)

    我们来看上图,07是一个Bell(响铃),如果用计算机程序去打印,结果是,只能听到一声铃声。而比特币的地址是16进制的数,不做转换,人们根本不知道那是什么。

    假如,你的账户有77块钱,根据10进制的编码就是大写字符M。如果把数字77转换成文本“77”(16进制编码是3737)后再打印,那么显示在屏幕上的文本就是77。

    咱们来看这个表:

    Base64

    Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单。

    用64个字符来表示任意二进制数据的方法,通常exe、jpg、pdf等文件都是二进制文件,

    Base64,就是通过64个字符来编码的,具体请见下表:

    Base64的编码过程:

    Base64可以将ASCII字符串或者是二进制编码成只包含A—Z,a—z,0—9,+,/ 这64个字符( 26个大写字母,26个小写字母,10个数字,1个+,一个 / 刚好64个字符)。

    这64个字符用6个bit位就可以全部表示出来,一个字节有8个bit 位,那么还剩下两个bit位,这两个bit位用0来补充。

    一个Base64字符仍然是8个bit位,但是有效部分只有右边的6个 bit,左边两个永远是0。

    Base64的编码规则是将3个8位字节(3×8=24位)编码成4个6位的字节(4×6=24位),之后在每个6位字节前面,补充两个0,形成4个8位字节的形式,那么取值范围就变成了0~63。

    2的6次方等于64,所以每6个位组成一个单元。

    Base58

    Base58是基于58个字母和数字组成的,Base58实际上就是Base64的一个子集,相对于Base64来说,Base58不包括以下Base64的字符:

    数字0

    大写字母O

    大写字母I

    小写字母l

    +与/

    小写o和大写O很容易和数字0混淆,小写l和大写I很容易和数字1混淆,Base58就是Base64去除了几个看起来容易混淆的字符以及容易导致转义的/和+。

    Base58的编码表如下:

    123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

    必须注意,不同的应用实现使用的编码表内容是一样的,但是顺序可能不一样,比如:

    1)比特币地址:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

    2)Ripple 地址:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz

    Ripple (一个开源、分布式的支付协议)

    Base58Check

    Base58Check可以说是Base58的一种编码形式,在比特币系统中生成钱包地址的时候就使用到了这种编码形式,Base58Check就是Base58加上校验码。

    在二进制数据的传输过程中,为了防止数据传输的错误,保护数据安全,通常会加一个校验码。

    Base58Check的编码方式是这样的:进行编码前,在待编码的内容字符串中加入一个字节的版本信息,版本信息可以自行约定。

    比如比特币地址采用了0×00作为版本信息,然后再计入编码内容字符串的哈希值,通常只要取得哈希值中的4个字节就可以了,加到一起后,然后再整体进行Base58编码。

    比特币地址的生成过程中,是将版本字节放在了头部,而将4个字节的哈希值放在了尾部,然后进行编码生成。

    经过整理编码后的数据在传输过程中如果有发生损坏或者篡改,接收方在得到数据后,会对原始数据进行同样的校验码计算,并且和接收到的结果中的校验码进行比较。

    由于哈希算法的特点,只要原始数据有任何更改,计算出的哈希值都会发生变更,因此只要校验码不一致就说明数据不是合法的。

    参考资料

    1、https://ke.qq.com/course/322857?taid=2781154533240105

    https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii%E7%A0%81%E8%A1%A8&fromid=19660475&fr=aladdin

    https://baike.baidu.com/item/base64/8545775?fr=aladdin

    https://en.bitcoin.it/wiki/Base58Check_encoding

    https://mistydew.github.io/blog/2018/05/base58-encoding.html

    2、参考书籍《白话区块链》、《区块链:定义未来金融和经济新格局》

    写在后面

    以上就是大楠的小白科普第十六篇——“区块链的骨骼”之编码算法,你要是发现了什么不对的地方,要和大楠说啊,就在评论区,留言给我啦。

    感谢大家啊!


    大楠是谁?

    一个很偶然撞进币乎的币圈小白,是个正在不断成长的大楠。

    那你喜欢她么?

    当然喜欢啦,大楠欢迎来撩哦。

    微信:15222567477,加大楠也要备注的呢,就叫简书~

    相关文章

      网友评论

          本文标题:「币圈小白进阶计划」“区块链的骨骼”之编码算法

          本文链接:https://www.haomeiwen.com/subject/ddbfzqtx.html